From 4bb966f16d4d41c9799522069bc6c3cf70cfde89 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 17 四月 2026 20:02:24 +0800
Subject: [PATCH] feat:短信对接

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppSmsCodeService.java |   64 ++++++++++++++++++++++----------
 1 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppSmsCodeService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppSmsCodeService.java
index 29c7445..1b8ee69 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppSmsCodeService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/auth/service/AppSmsCodeService.java
@@ -14,6 +14,10 @@
 @Service
 public class AppSmsCodeService {
 
+    private static final String SCENE_LOGIN = "login";
+    private static final String SCENE_REGISTER = "register";
+    private static final String SCENE_PASSWORD_RESET = "password-reset";
+    private static final String SCENE_PHONE_CHANGE = "phone-change";
     private static final String LOGIN_CODE_CACHE_PREFIX = "app:sms:login:";
     private static final String REGISTER_CODE_CACHE_PREFIX = "app:sms:register:";
     private static final String PASSWORD_RESET_CODE_CACHE_PREFIX = "app:sms:password-reset:";
@@ -66,28 +70,28 @@
      * 校验登录验证码,成功后销毁缓存中的一次性验证码。
      */
     public void validateLoginCode(String phone, String code) {
-        validateCode(phone, code, LOGIN_CODE_CACHE_PREFIX);
+        validateCode(phone, code, LOGIN_CODE_CACHE_PREFIX, SCENE_LOGIN);
     }
 
     /**
      * 校验注册验证码,成功后销毁缓存中的一次性验证码。
      */
     public void validateRegisterCode(String phone, String code) {
-        validateCode(phone, code, REGISTER_CODE_CACHE_PREFIX);
+        validateCode(phone, code, REGISTER_CODE_CACHE_PREFIX, SCENE_REGISTER);
     }
 
     /**
      * 校验忘记密码验证码,成功后销毁缓存中的一次性验证码。
      */
     public void validatePasswordResetCode(String phone, String code) {
-        validateCode(phone, code, PASSWORD_RESET_CODE_CACHE_PREFIX);
+        validateCode(phone, code, PASSWORD_RESET_CODE_CACHE_PREFIX, SCENE_PASSWORD_RESET);
     }
 
     /**
      * 校验修改手机号验证码,成功后销毁缓存中的一次性验证码。
      */
     public void validatePhoneChangeCode(String phone, String code) {
-        validateCode(phone, code, PHONE_CHANGE_CODE_CACHE_PREFIX);
+        validateCode(phone, code, PHONE_CHANGE_CODE_CACHE_PREFIX, SCENE_PHONE_CHANGE);
     }
 
     /**
@@ -95,30 +99,30 @@
      */
     private AppSmsCodeSendResponse createCode(String phone, String cachePrefix, String scene) {
         String code = generateCode();
+        if (SCENE_LOGIN.equals(scene)) {
+            appSmsSender.sendLoginCode(phone, code);
+        } else if (SCENE_REGISTER.equals(scene)) {
+            appSmsSender.sendRegisterCode(phone, code);
+        } else if (SCENE_PASSWORD_RESET.equals(scene)) {
+            appSmsSender.sendPasswordResetCode(phone, code);
+        } else {
+            appSmsSender.sendPhoneChangeCode(phone, code);
+        }
         stringRedisTemplate.opsForValue().set(
                 buildCacheKey(cachePrefix, phone),
                 code,
                 appSmsAuthProperties.getExpireSeconds(),
                 TimeUnit.SECONDS
         );
-        if ("login".equals(scene)) {
-            appSmsSender.sendLoginCode(phone, code);
-        } else if ("register".equals(scene)) {
-            appSmsSender.sendRegisterCode(phone, code);
-        } else if ("password-reset".equals(scene)) {
-            appSmsSender.sendPasswordResetCode(phone, code);
-        } else {
-            appSmsSender.sendPhoneChangeCode(phone, code);
-        }
         return new AppSmsCodeSendResponse(appSmsAuthProperties.getExpireSeconds());
     }
 
     /**
      * 统一校验指定场景的验证码并执行一次性销毁。
      */
-    private void validateCode(String phone, String code, String cachePrefix) {
-        if (matchesDebugCode(code)) {
-            // 开发环境允许固定验证码直通,便于前后端联调。
+    private void validateCode(String phone, String code, String cachePrefix, String scene) {
+        if (matchesDebugCode(scene, code)) {
+            // 调试验证码按场景控制,生产环境仅放开短信登录场景。
             return;
         }
         String cacheKey = buildCacheKey(cachePrefix, phone);
@@ -142,17 +146,37 @@
     }
 
     /**
-     * 判断是否命中本地调试验证码。
+     * 判断当前场景是否命中调试验证码。
      */
-    private boolean matchesDebugCode(String code) {
-        if (!appSmsAuthProperties.isDebugEnabled()) {
+    private boolean matchesDebugCode(String scene, String code) {
+        AppSmsAuthProperties.DebugScene debugScene = resolveDebugScene(scene);
+        if (debugScene == null || !debugScene.isEnabled()) {
             return false;
         }
-        String debugCode = appSmsAuthProperties.getDebugCode();
+        String debugCode = debugScene.getCode();
         return debugCode != null && !debugCode.trim().isEmpty() && debugCode.equals(code);
     }
 
     /**
+     * 读取指定场景的调试验证码配置。
+     */
+    private AppSmsAuthProperties.DebugScene resolveDebugScene(String scene) {
+        if (SCENE_LOGIN.equals(scene)) {
+            return appSmsAuthProperties.getLogin();
+        }
+        if (SCENE_REGISTER.equals(scene)) {
+            return appSmsAuthProperties.getRegister();
+        }
+        if (SCENE_PASSWORD_RESET.equals(scene)) {
+            return appSmsAuthProperties.getPasswordReset();
+        }
+        if (SCENE_PHONE_CHANGE.equals(scene)) {
+            return appSmsAuthProperties.getPhoneChange();
+        }
+        return null;
+    }
+
+    /**
      * 构造手机号维度的验证码缓存 key。
      */
     private String buildCacheKey(String cachePrefix, String phone) {

--
Gitblit v1.7.1