From 3757f6ed330476060930dec7f7165db635a13f57 Mon Sep 17 00:00:00 2001 From: Odboy Date: Sun, 22 Jun 2025 16:53:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(system):=20=E9=87=8D=E6=9E=84=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 SystemCaptchaService 接口及其实现 - 将验证码相关功能整合到 SystemEmailService 中 - 优化验证码发送和验证逻辑 - 使用 CsResourceTemplateUtil 工具类渲染邮件模板 - 更新相关控制器和前端 API --- cutejava-front/src/api/system/code.js | 4 +- .../src/main/resources/application-dev.yml | 1 + .../constant/system/SystemCaptchaBizEnum.java | 12 ++- .../system/SystemCaptchaController.java | 30 ++----- .../system/SystemEmailController.java | 2 +- .../system/SystemUserController.java | 4 +- .../templatefile/CsResourceTemplateUtil.java | 21 +++++ .../service/system/SystemCaptchaService.java | 24 ------ .../system/SystemCaptchaServiceImpl.java | 60 ------------- .../service/system/SystemEmailService.java | 13 ++- .../system/SystemEmailServiceImpl.java | 86 ++++++++++++++----- 11 files changed, 114 insertions(+), 143 deletions(-) create mode 100644 cutejava/cutejava-system/src/main/java/cn/odboy/core/framework/templatefile/CsResourceTemplateUtil.java delete mode 100644 cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaService.java delete mode 100644 cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaServiceImpl.java diff --git a/cutejava-front/src/api/system/code.js b/cutejava-front/src/api/system/code.js index d13d8b6d..ea436175 100644 --- a/cutejava-front/src/api/system/code.js +++ b/cutejava-front/src/api/system/code.js @@ -14,9 +14,9 @@ export function sendResetPasswordCaptcha(data) { }) } -export function checkCodeAvailable(email, code, codeBi) { +export function checkEmailCaptcha(email, code, codeBi) { return request({ - url: `api/code/checkCodeAvailable?email=${email}&code=${code}&codeBi=${codeBi}`, + url: `api/code/checkEmailCaptcha?email=${email}&code=${code}&codeBi=${codeBi}`, method: 'post' }) } diff --git a/cutejava/cutejava-starter/src/main/resources/application-dev.yml b/cutejava/cutejava-starter/src/main/resources/application-dev.yml index c60f0dd8..e946cf88 100644 --- a/cutejava/cutejava-starter/src/main/resources/application-dev.yml +++ b/cutejava/cutejava-starter/src/main/resources/application-dev.yml @@ -33,6 +33,7 @@ server: spring: application: name: cutejava + title: CuteJava后台管理系统 lifecycle: # 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用 timeout-per-shutdown-phase: 30s diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/constant/system/SystemCaptchaBizEnum.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/constant/system/SystemCaptchaBizEnum.java index eab9e373..ba7d73bd 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/constant/system/SystemCaptchaBizEnum.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/constant/system/SystemCaptchaBizEnum.java @@ -11,16 +11,16 @@ import lombok.Getter; public enum SystemCaptchaBizEnum { /* 通过手机号码重置邮箱 */ - PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "通过手机号码重置邮箱"), + PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "email.ftl","通过手机号码重置邮箱"), /* 通过旧邮箱重置邮箱 */ - EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "通过旧邮箱重置邮箱"), + EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "email.ftl","通过旧邮箱重置邮箱"), /* 通过手机号码重置密码 */ - PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "通过手机号码重置密码"), + PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "email.ftl","通过手机号码重置密码"), /* 通过邮箱重置密码 */ - EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "通过邮箱重置密码"); + EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "email.ftl","通过邮箱重置密码"); /** * 业务编码 @@ -30,6 +30,10 @@ public enum SystemCaptchaBizEnum { * redis中的key */ private final String redisKey; + /** + * resources template中的模版名称 + */ + private final String templateName; /** * 业务描述 */ diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemCaptchaController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemCaptchaController.java index da91f9c6..e3cffaa2 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemCaptchaController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemCaptchaController.java @@ -1,7 +1,6 @@ package cn.odboy.core.controller.system; import cn.odboy.core.constant.system.SystemCaptchaBizEnum; -import cn.odboy.core.service.system.SystemCaptchaService; import cn.odboy.core.service.system.SystemEmailService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -13,49 +12,32 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.Objects; - @RestController @RequiredArgsConstructor @RequestMapping("/api/code") @Api(tags = "系统:验证码管理") public class SystemCaptchaController { - private final SystemCaptchaService captchaService; - private final SystemEmailService emailService; + private final SystemEmailService systemEmailService; - /** - * 除了这个其他的接口都没有用上 - * - * @param email 邮件地址 - */ @ApiOperation("重置邮箱,发送验证码") @PostMapping(value = "/sendResetEmailCaptcha") public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { - emailService.sendEmail(captchaService.renderCodeTemplate(email, SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getRedisKey())); + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); return new ResponseEntity<>(HttpStatus.OK); } @ApiOperation("重置密码,发送验证码") @PostMapping(value = "/sendResetPasswordCaptcha") public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { - emailService.sendEmail(captchaService.renderCodeTemplate(email, SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE.getRedisKey())); + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); return new ResponseEntity<>(HttpStatus.OK); } @ApiOperation("验证码验证") - @PostMapping(value = "/checkCodeAvailable") - public ResponseEntity checkCodeAvailable(@RequestParam String email, @RequestParam String code, @RequestParam String codeBi) { + @PostMapping(value = "/checkEmailCaptcha") + public ResponseEntity checkEmailCaptcha(@RequestParam String email, @RequestParam String code, @RequestParam String codeBi) { SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(codeBi); - switch (Objects.requireNonNull(biEnum)) { - case EMAIL_RESET_EMAIL_CODE: - captchaService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), email, code); - break; - case EMAIL_RESET_PWD_CODE: - captchaService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE.getBizCode(), email, code); - break; - default: - break; - } + systemEmailService.checkEmailCaptcha(biEnum, email, code); return new ResponseEntity<>(HttpStatus.OK); } } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemEmailController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemEmailController.java index 3eab5c1a..4c32bc82 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemEmailController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemEmailController.java @@ -27,7 +27,7 @@ public class SystemEmailController { @ApiOperation("查询配置") @PostMapping(value = "/queryEmailConfig") public ResponseEntity queryEmailConfig() { - return new ResponseEntity<>(systemEmailService.queryEmailConfig(), HttpStatus.OK); + return new ResponseEntity<>(systemEmailService.getEmailConfig(), HttpStatus.OK); } @ApiOperation("配置邮件") diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemUserController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemUserController.java index 847845b2..6bc8030c 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemUserController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/controller/system/SystemUserController.java @@ -47,7 +47,7 @@ public class SystemUserController { private final SystemDataService systemDataService; private final SystemDeptService systemDeptService; private final SystemRoleService systemRoleService; - private final SystemCaptchaService verificationCodeService; + private final SystemEmailService systemEmailService; private final AppProperties properties; @ApiOperation("导出用户数据") @@ -169,7 +169,7 @@ public class SystemUserController { if (!passwordEncoder.matches(password, user.getPassword())) { throw new BadRequestException("密码错误"); } - verificationCodeService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), resources.getEmail(), code); + systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, resources.getEmail(), code); systemUserService.modifyUserEmailByUsername(user.getUsername(), resources.getEmail()); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/framework/templatefile/CsResourceTemplateUtil.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/framework/templatefile/CsResourceTemplateUtil.java new file mode 100644 index 00000000..b839e7c4 --- /dev/null +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/framework/templatefile/CsResourceTemplateUtil.java @@ -0,0 +1,21 @@ +package cn.odboy.core.framework.templatefile; + +import cn.hutool.core.lang.Dict; +import cn.hutool.extra.template.Template; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; + +/** + * Resources模版工具 + * + * @author odboy + * @date 2025-06-22 + */ +public class CsResourceTemplateUtil { + public static String render(String filename, Dict params) { + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + Template template = engine.getTemplate(filename); + return template.render(params); + } +} diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaService.java deleted file mode 100644 index ed7d3e10..00000000 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaService.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.odboy.core.service.system; - - -import cn.odboy.core.dal.model.system.SendSystemEmailArgs; - -public interface SystemCaptchaService { - /** - * 发送验证码 - * - * @param email / - * @param key / - * @return / - */ - SendSystemEmailArgs renderCodeTemplate(String email, String key); - - - /** - * 验证 - * - * @param code / - * @param key / - */ - void checkCodeAvailable(String key, String email, String code); -} diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaServiceImpl.java deleted file mode 100644 index 38827a2e..00000000 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemCaptchaServiceImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.odboy.core.service.system; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.extra.template.Template; -import cn.hutool.extra.template.TemplateConfig; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.TemplateUtil; -import cn.odboy.core.dal.model.system.SendSystemEmailArgs; -import cn.odboy.exception.BadRequestException; -import cn.odboy.redis.RedisHelper; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collections; - -@Service -@RequiredArgsConstructor -public class SystemCaptchaServiceImpl implements SystemCaptchaService { - private final RedisHelper redisHelper; - @Value("${app.captcha.expireTime}") - private Long expiration; - - @Override - @Transactional(rollbackFor = Exception.class) - public SendSystemEmailArgs renderCodeTemplate(String email, String key) { - SendSystemEmailArgs sendEmailRequest; - String content; - String redisKey = key + email; - // 如果不存在有效的验证码,就创建一个新的 - TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); - Template template = engine.getTemplate("email.ftl"); - String oldCode = redisHelper.get(redisKey, String.class); - if (oldCode == null) { - String code = RandomUtil.randomNumbers(6); - // 存入缓存 - if (!redisHelper.set(redisKey, code, expiration)) { - throw new BadRequestException("服务异常,请联系网站负责人"); - } - // 存在就再次发送原来的验证码 - content = template.render(Dict.create().set("code", code)); - } else { - content = template.render(Dict.create().set("code", oldCode)); - } - sendEmailRequest = new SendSystemEmailArgs(Collections.singletonList(email), "CuteJava后台管理系统", content); - return sendEmailRequest; - } - - @Override - public void checkCodeAvailable(String key, String email, String code) { - String value = redisHelper.get(key + email, String.class); - if (value == null || !value.equals(code)) { - throw new BadRequestException("无效验证码"); - } else { - redisHelper.del(key); - } - } -} diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailService.java index e89c5c42..53777075 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailService.java @@ -1,5 +1,6 @@ package cn.odboy.core.service.system; +import cn.odboy.core.constant.system.SystemCaptchaBizEnum; import cn.odboy.core.dal.dataobject.system.SystemEmailConfigTb; import cn.odboy.core.dal.model.system.SendSystemEmailArgs; import com.baomidou.mybatisplus.extension.service.IService; @@ -23,11 +24,15 @@ public interface SystemEmailService extends IService { */ void sendEmail(SendSystemEmailArgs sendEmailRequest); + /** + * 校验邮箱验证码 + */ + void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code); /** - * 查询配置 - * - * @return EmailConfig 邮件配置 + * 发送给邮箱验证码 */ - SystemEmailConfigTb queryEmailConfig(); + void sendCaptcha(SystemCaptchaBizEnum biEnum, String email); + + SystemEmailConfigTb getEmailConfig(); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailServiceImpl.java index 5942511a..c23f67ce 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/core/service/system/SystemEmailServiceImpl.java @@ -1,59 +1,67 @@ package cn.odboy.core.service.system; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.mail.Mail; import cn.hutool.extra.mail.MailAccount; +import cn.odboy.core.constant.system.SystemCaptchaBizEnum; import cn.odboy.core.dal.dataobject.system.SystemEmailConfigTb; -import cn.odboy.core.dal.mysql.system.SystemEmailConfigMapper; import cn.odboy.core.dal.model.system.SendSystemEmailArgs; +import cn.odboy.core.dal.mysql.system.SystemEmailConfigMapper; +import cn.odboy.core.framework.templatefile.CsResourceTemplateUtil; import cn.odboy.exception.BadRequestException; +import cn.odboy.redis.RedisHelper; import cn.odboy.util.DesEncryptUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.context.annotation.Lazy; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; @Service +@RequiredArgsConstructor public class SystemEmailServiceImpl extends ServiceImpl implements SystemEmailService { + private final RedisHelper redisHelper; + @Value("${app.captcha.expireTime}") + private Long captchaExpireTime; + @Value("${spring.application.title}") + private String applicationTitle; @Override @Transactional(rollbackFor = Exception.class) public void modifyEmailConfigOnPassChange(SystemEmailConfigTb emailConfig) throws Exception { - SystemEmailConfigTb localConfig = queryEmailConfig(); - if (!emailConfig.getPassword().equals(localConfig.getPassword())) { + SystemEmailConfigTb systemEmailConfigTb = getEmailConfig(); + if (!emailConfig.getPassword().equals(systemEmailConfigTb.getPassword())) { // 对称加密 - emailConfig.setPassword(DesEncryptUtil.desEncrypt(emailConfig.getPassword())); + systemEmailConfigTb.setPassword(DesEncryptUtil.desEncrypt(emailConfig.getPassword())); } - emailConfig.setId(1L); - saveOrUpdate(emailConfig); + systemEmailConfigTb.setId(1L); + saveOrUpdate(systemEmailConfigTb); } @Override - @Transactional(rollbackFor = Exception.class) public void sendEmail(SendSystemEmailArgs sendEmailRequest) { - SystemEmailConfigTb emailConfig = queryEmailConfig(); - if (emailConfig.getId() == null) { + SystemEmailConfigTb systemEmailConfigTb = getEmailConfig(); + if (systemEmailConfigTb.getId() == null) { throw new BadRequestException("请先配置,再操作"); } // 封装 MailAccount account = new MailAccount(); // 设置用户 - String user = emailConfig.getFromUser().split("@")[0]; + String user = systemEmailConfigTb.getFromUser().split("@")[0]; account.setUser(user); - account.setHost(emailConfig.getHost()); - account.setPort(Integer.parseInt(emailConfig.getPort())); + account.setHost(systemEmailConfigTb.getHost()); + account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); account.setAuth(true); try { // 对称解密 - account.setPass(DesEncryptUtil.desDecrypt(emailConfig.getPassword())); + account.setPass(DesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); } catch (Exception e) { throw new BadRequestException(e.getMessage()); } - account.setFrom(emailConfig.getUser() + "<" + emailConfig.getFromUser() + ">"); + account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); // ssl方式发送 account.setSslEnable(true); // 使用STARTTLS安全连接 @@ -79,8 +87,42 @@ public class SystemEmailServiceImpl extends ServiceImpl