123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package com.ruoyi.web.controller.common;
- import cn.hutool.captcha.AbstractCaptcha;
- import cn.hutool.captcha.generator.CodeGenerator;
- import cn.hutool.core.convert.Convert;
- import cn.hutool.core.util.IdUtil;
- import cn.hutool.core.util.RandomUtil;
- import com.ruoyi.common.constant.Constants;
- import com.ruoyi.common.core.domain.R;
- import com.ruoyi.common.enums.CaptchaType;
- import com.ruoyi.common.utils.StringUtils;
- import com.ruoyi.common.utils.redis.RedisUtils;
- import com.ruoyi.common.utils.reflect.ReflectUtils;
- import com.ruoyi.common.utils.spring.SpringUtils;
- import com.ruoyi.framework.config.properties.CaptchaProperties;
- import com.ruoyi.sms.config.properties.SmsProperties;
- import com.ruoyi.sms.core.SmsTemplate;
- import com.ruoyi.sms.entity.SmsResult;
- import com.ruoyi.system.service.ISysConfigService;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import io.swagger.annotations.ApiParam;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
- import javax.validation.constraints.NotBlank;
- import java.time.Duration;
- import java.util.HashMap;
- import java.util.Map;
- /**
- * 验证码操作处理
- *
- * @author Lion Li
- */
- @Slf4j
- @Validated
- @Api(value = "验证码操作处理", tags = {"验证码管理"})
- @RequiredArgsConstructor
- @RestController
- public class CaptchaController {
- private final CaptchaProperties captchaProperties;
- private final SmsProperties smsProperties;
- private final SmsTemplate smsTemplate;
- private final ISysConfigService configService;
- /**
- * 短信验证码
- */
- @ApiOperation("短信验证码")
- @GetMapping("/captchaSms")
- public R<Void> smsCaptcha(@ApiParam("用户手机号")
- @NotBlank(message = "{user.phonenumber.not.blank}")
- String phonenumber) {
- if (smsProperties.getEnabled()) {
- R.fail("当前系统没有开启短信功能!");
- }
- String key = Constants.CAPTCHA_CODE_KEY + phonenumber;
- String code = RandomUtil.randomNumbers(4);
- RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
- // 验证码模板id 自行处理 (查数据库或写死均可)
- String templateId = "";
- Map<String, String> map = new HashMap<>(1);
- map.put("code", code);
- SmsResult result = smsTemplate.send(phonenumber, templateId, map);
- if (!result.isSuccess()) {
- log.error("验证码短信发送异常 => {}", result);
- return R.fail(result.getMessage());
- }
- return R.ok();
- }
- /**
- * 生成验证码
- */
- @ApiOperation("生成验证码")
- @GetMapping("/captchaImage")
- public R<Map<String, Object>> getCode() {
- Map<String, Object> ajax = new HashMap<>();
- boolean captchaOnOff = configService.selectCaptchaOnOff();
- ajax.put("captchaOnOff", captchaOnOff);
- if (!captchaOnOff) {
- return R.ok(ajax);
- }
- // 保存验证码信息
- String uuid = IdUtil.simpleUUID();
- String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
- // 生成验证码
- CaptchaType captchaType = captchaProperties.getType();
- boolean isMath = CaptchaType.MATH == captchaType;
- Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
- CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
- AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
- captcha.setGenerator(codeGenerator);
- captcha.createCode();
- String code = isMath ? getCodeResult(captcha.getCode()) : captcha.getCode();
- RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
- ajax.put("uuid", uuid);
- ajax.put("img", captcha.getImageBase64());
- return R.ok(ajax);
- }
- private String getCodeResult(String capStr) {
- int numberLength = captchaProperties.getNumberLength();
- int a = Convert.toInt(StringUtils.substring(capStr, 0, numberLength).trim());
- char operator = capStr.charAt(numberLength);
- int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
- switch (operator) {
- case '*':
- return Convert.toStr(a * b);
- case '+':
- return Convert.toStr(a + b);
- case '-':
- return Convert.toStr(a - b);
- default:
- return StringUtils.EMPTY;
- }
- }
- }
|