Bladeren bron

Merge branch 'dev'

yangdamao 9 maanden geleden
bovenliggende
commit
9623b09bce

+ 137 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CaptchaController.java

@@ -0,0 +1,137 @@
+package com.zhongzheng.controller.cmmon;
+
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.CircleCaptcha;
+import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.ShearCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.captcha.generator.MathGenerator;
+import cn.hutool.captcha.generator.RandomGenerator;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.redis.RedisCache;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 验证码操作处理
+ *
+ * @author hjl
+ */
+@Api(tags ="系统操作管理")
+@ApiSupport(order = 1)
+@RestController
+public class CaptchaController {
+
+	// 圆圈干扰验证码
+	@Resource(name = "CircleCaptcha")
+	private CircleCaptcha circleCaptcha;
+	// 线段干扰的验证码
+	@Resource(name = "LineCaptcha")
+	private LineCaptcha lineCaptcha;
+	// 扭曲干扰验证码
+	@Resource(name = "ShearCaptcha")
+	private ShearCaptcha shearCaptcha;
+
+	@Autowired
+	private RedisCache redisCache;
+
+	// 验证码类型
+	@Value("${captcha.captchaType}")
+	private String captchaType;
+	// 验证码类别
+	@Value("${captcha.captchaCategory}")
+	private String captchaCategory;
+	// 数字验证码位数
+	@Value("${captcha.captchaNumberLength}")
+	private int numberLength;
+	// 字符验证码长度
+	@Value("${captcha.captchaCharLength}")
+	private int charLength;
+
+	/**
+	 * 生成验证码
+	 */
+	@ApiOperation("")
+	@DynamicResponseParameters(name = "CodeMapModel",properties = {
+			@DynamicParameter(name = "uuid",value = "验证码uuid"),
+			@DynamicParameter(name = "img",value = "验证码图片base64"),
+	})
+	@GetMapping("/captchaImage")
+	public AjaxResult getCode() {
+		// 保存验证码信息
+		String uuid = IdUtil.simpleUUID();
+		String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+		String code = null;
+		// 生成验证码
+		CodeGenerator codeGenerator;
+		AbstractCaptcha captcha;
+		switch (captchaType) {
+			case "math":
+				codeGenerator = new MathGenerator(numberLength);
+				break;
+			case "char":
+				codeGenerator = new RandomGenerator(charLength);
+				break;
+			default:
+				throw new IllegalArgumentException("验证码类型异常");
+		}
+		switch (captchaCategory) {
+			case "line":
+				captcha = lineCaptcha;
+				break;
+			case "circle":
+				captcha = circleCaptcha;
+				break;
+			case "shear":
+				captcha = shearCaptcha;
+				break;
+			default:
+				throw new IllegalArgumentException("验证码类别异常");
+		}
+		captcha.setGenerator(codeGenerator);
+		captcha.createCode();
+		if ("math".equals(captchaType)) {
+			code = getCodeResult(captcha.getCode());
+		} else if ("char".equals(captchaType)) {
+			code = captcha.getCode();
+		}
+		redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+		Map<String,Object> map = new HashMap();
+		map.put("uuid", uuid);
+		map.put("img", captcha.getImageBase64());
+		return AjaxResult.success(map);
+	}
+
+	private String getCodeResult(String capStr) {
+		int a = Convert.toInt(StrUtil.sub(capStr, 0, numberLength).trim());
+		char operator = capStr.charAt(numberLength);
+		int b = Convert.toInt(StrUtil.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
+		switch (operator) {
+			case '*':
+				return a * b + "";
+			case '+':
+				return a + b + "";
+			case '-':
+				return a - b + "";
+			default:
+				return "";
+		}
+	}
+
+}

+ 33 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/SmsController.java

@@ -1,7 +1,12 @@
 package com.zhongzheng.controller.user;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.alisms.bo.SmsAddBo;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import io.swagger.annotations.Api;
@@ -23,19 +28,20 @@ import org.springframework.web.bind.annotation.*;
 public class SmsController extends BaseController {
 
     private final IAliSmsService iSmsService;
-
+    private final RedisCache redisCache;
 
     @ApiOperation("获取注册短信")
     @PostMapping("/register")
     public AjaxResult register(@RequestBody SmsAddBo bo) {
+        checkImageCode(bo.getImageUuid(),bo.getImageCode());
         iSmsService.sendRegisterSms(bo.getTel());
         return AjaxResult.success();
     }
 
-
     @ApiOperation("获取登录短信")
     @PostMapping("/login")
     public AjaxResult login(@RequestBody SmsAddBo bo) {
+        checkImageCode(bo.getImageUuid(),bo.getImageCode());
         iSmsService.sendLoginSms(bo.getTel());
         return AjaxResult.success();
     }
@@ -43,6 +49,7 @@ public class SmsController extends BaseController {
     @ApiOperation("获取忘记短信")
     @PostMapping("/forget")
     public AjaxResult forget(@RequestBody SmsAddBo bo) {
+        checkImageCode(bo.getImageUuid(),bo.getImageCode());
         iSmsService.sendForgetSms(bo.getTel());
         return AjaxResult.success();
     }
@@ -53,4 +60,28 @@ public class SmsController extends BaseController {
         iSmsService.sendBindNewTelSms(bo.getTel());
         return AjaxResult.success();
     }
+
+    private void checkImageCode(String uuid,String imageCode){
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isBlank(tenantId)){
+            tenantId = ServletUtils.getResponse().getHeader("TenantId");
+        }
+        if (!tenantId.equals("867735392558919680")){
+            return;
+        }
+        if (StringUtils.isBlank(imageCode)){
+            throw new CustomException("图形验证码不能为空!");
+        }
+        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+        String captcha = redisCache.getCacheObject(verifyKey);
+        redisCache.deleteObject(verifyKey);
+        if (captcha == null)
+        {
+            throw new CustomException("图形验证码已失效!");
+        }
+        if (!imageCode.equalsIgnoreCase(captcha))
+        {
+            throw new CustomException("图形验证码验证失败!请重新输入");
+        }
+    }
 }

+ 4 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -25,12 +25,16 @@ import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.UserStatus;
 import com.zhongzheng.common.exception.BaseException;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.exception.user.CaptchaException;
+import com.zhongzheng.common.exception.user.CaptchaExpireException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.*;
 import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.manager.AsyncManager;
+import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/bo/SmsAddBo.java

@@ -9,4 +9,7 @@ public class SmsAddBo {
     private String tel;
     @ApiModelProperty("唯一识别码")
     private String uuid;
+
+    private String imageCode;
+    private String imageUuid;
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;

+ 0 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppForgetBo.java

@@ -20,5 +20,4 @@ public class UserAppForgetBo {
     private String pwd;
     @ApiModelProperty("验证码")
     private String code;
-
 }