140 lines
5.6 KiB
Java
Raw Normal View History

package com.ruoyi.web.controller;
2020-02-13 10:48:51 +08:00
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
2022-05-06 18:08:16 +08:00
import cn.hutool.core.util.RandomUtil;
import com.ruoyi.common.core.constant.GlobalConstants;
2022-01-29 11:48:41 +08:00
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.reflect.ReflectUtils;
import com.ruoyi.common.mail.config.properties.MailProperties;
import com.ruoyi.common.mail.utils.MailUtils;
import com.ruoyi.common.redis.utils.RedisUtils;
import com.ruoyi.common.sms.core.SmsTemplate;
import com.ruoyi.common.sms.entity.SmsResult;
import com.ruoyi.common.web.config.properties.CaptchaProperties;
import com.ruoyi.common.web.enums.CaptchaType;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.web.domain.vo.CaptchaVo;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
2022-05-06 18:08:16 +08:00
import org.springframework.validation.annotation.Validated;
2020-02-13 10:48:51 +08:00
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
2020-02-13 10:48:51 +08:00
/**
* 验证码操作处理
*
* @author Lion Li
2020-02-13 10:48:51 +08:00
*/
@SaIgnore
@Slf4j
2022-05-06 18:08:16 +08:00
@Validated
@RequiredArgsConstructor
2020-02-13 10:48:51 +08:00
@RestController
public class CaptchaController {
Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue  Conflicts:  pom.xml  ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java  ruoyi-admin/src/main/resources/application.yml  ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java  ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java  ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java  ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java  ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java  ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java  ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java  ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java  ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml  ruoyi-generator/src/main/resources/vm/vue/index.vue.vm  ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java  ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml  ruoyi-ui/babel.config.js  ruoyi-ui/package.json  ruoyi-ui/src/api/tool/gen.js  ruoyi-ui/src/assets/styles/ruoyi.scss  ruoyi-ui/src/components/HeaderSearch/index.vue  ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue  ruoyi-ui/src/main.js  ruoyi-ui/src/utils/ruoyi.js  ruoyi-ui/src/views/login.vue  ruoyi-ui/src/views/monitor/job/index.vue  ruoyi-ui/src/views/monitor/logininfor/index.vue  ruoyi-ui/src/views/monitor/online/index.vue  ruoyi-ui/src/views/monitor/operlog/index.vue  ruoyi-ui/src/views/system/config/index.vue  ruoyi-ui/src/views/system/dept/index.vue  ruoyi-ui/src/views/system/dict/data.vue  ruoyi-ui/src/views/system/dict/index.vue  ruoyi-ui/src/views/system/menu/index.vue  ruoyi-ui/src/views/system/notice/index.vue  ruoyi-ui/src/views/system/post/index.vue  ruoyi-ui/src/views/system/role/index.vue  ruoyi-ui/src/views/system/user/index.vue  ruoyi-ui/src/views/tool/gen/genInfoForm.vue  ruoyi-ui/src/views/tool/gen/index.vue  ruoyi-ui/vue.config.js  sql/ry_20200724.sql
2020-08-02 18:31:47 +08:00
private final CaptchaProperties captchaProperties;
private final MailProperties mailProperties;
private final ISysConfigService configService;
Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue  Conflicts:  pom.xml  ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java  ruoyi-admin/src/main/resources/application.yml  ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java  ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java  ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java  ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java  ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java  ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java  ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java  ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java  ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java  ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml  ruoyi-generator/src/main/resources/vm/vue/index.vue.vm  ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java  ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml  ruoyi-ui/babel.config.js  ruoyi-ui/package.json  ruoyi-ui/src/api/tool/gen.js  ruoyi-ui/src/assets/styles/ruoyi.scss  ruoyi-ui/src/components/HeaderSearch/index.vue  ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue  ruoyi-ui/src/main.js  ruoyi-ui/src/utils/ruoyi.js  ruoyi-ui/src/views/login.vue  ruoyi-ui/src/views/monitor/job/index.vue  ruoyi-ui/src/views/monitor/logininfor/index.vue  ruoyi-ui/src/views/monitor/online/index.vue  ruoyi-ui/src/views/monitor/operlog/index.vue  ruoyi-ui/src/views/system/config/index.vue  ruoyi-ui/src/views/system/dept/index.vue  ruoyi-ui/src/views/system/dict/data.vue  ruoyi-ui/src/views/system/dict/index.vue  ruoyi-ui/src/views/system/menu/index.vue  ruoyi-ui/src/views/system/notice/index.vue  ruoyi-ui/src/views/system/post/index.vue  ruoyi-ui/src/views/system/role/index.vue  ruoyi-ui/src/views/system/user/index.vue  ruoyi-ui/src/views/tool/gen/genInfoForm.vue  ruoyi-ui/src/views/tool/gen/index.vue  ruoyi-ui/vue.config.js  sql/ry_20200724.sql
2020-08-02 18:31:47 +08:00
2022-05-06 18:08:16 +08:00
/**
* 短信验证码
*
* @param phonenumber 用户手机号
2022-05-06 18:08:16 +08:00
*/
@GetMapping("/sms/code")
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
if (!Convert.toBool(configService.selectConfigByKey("sys.account.smsEnabled"))) {
return R.fail("当前系统没有开启短信功能!");
2022-05-06 18:08:16 +08:00
}
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
2022-05-06 18:08:16 +08:00
String code = RandomUtil.randomNumbers(4);
Integer captchaExpired = Convert.toInt(configService.selectConfigByKey("sys.account.captchaExpired"));
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(captchaExpired));
// 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = configService.selectConfigByKey("sys.account.templateId");
Map<String, String> map = new HashMap<>(1);
map.put("code", code);
SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
SmsResult result = smsTemplate.send(phonenumber, templateId, map);
if (!result.isSuccess()) {
log.error("验证码短信发送异常 => {}", result);
return R.fail(result.getMessage());
}
2022-05-06 18:08:16 +08:00
return R.ok();
}
/**
* 邮箱验证码
*
* @param email 邮箱
*/
@GetMapping("/email/code")
public R<Void> emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
if (!mailProperties.getEnabled()) {
return R.fail("当前系统没有开启邮箱功能!");
}
String key = GlobalConstants.CAPTCHA_CODE_KEY + email;
String code = RandomUtil.randomNumbers(4);
Integer captchaExpired = Convert.toInt(configService.selectConfigByKey("sys.account.captchaExpired"));
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(captchaExpired));
try {
MailUtils.sendText(email, "登录验证码", "您本次验证码为:%s有效性为%d分钟请尽快填写。".formatted(code, captchaExpired));
} catch (Exception e) {
log.error("验证码短信发送异常 => {}", e.getMessage());
return R.fail(e.getMessage());
}
return R.ok();
}
/**
* 生成验证码
*/
@GetMapping("/code")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnable();
2022-07-27 18:34:45 +08:00
if (!captchaEnabled) {
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.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 = captcha.getCode();
if (isMath) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
code = exp.getValue(String.class);
}
Integer captchaExpired = Convert.toInt(configService.selectConfigByKey("sys.account.captchaExpired"));
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(captchaExpired));
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
}
2020-02-13 10:48:51 +08:00
}