From 4502f650f4816e55b5c7bf751ffce3aa0dce72dd Mon Sep 17 00:00:00 2001
From: zqy <2522236926@qq.com>
Date: 星期二, 14 十月 2025 18:13:07 +0800
Subject: [PATCH] 找回密码功能

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmailService.java            |  177 +++++++++++++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VerificationCodeService.java |   30 +++++
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                       |    4 
 zhang-content/pom.xml                                                                 |    5 
 ruoyi-admin/src/main/resources/application.yml                                        |   19 +++
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java    |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java      |    8 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java     |   49 ++++++++
 zhang-content/src/main/java/com/ruoyi/domain/sysUserAndUserInfo.java                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java              |    8 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/ZInfoUserController.java     |    1 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                 |    9 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java      |    9 +
 14 files changed, 322 insertions(+), 4 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 8d8fa3c..9994f0a 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -9,7 +9,10 @@
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.framework.web.domain.server.Sys;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.impl.EmailService;
+import com.ruoyi.system.service.impl.VerificationCodeService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.constant.Constants;
@@ -41,6 +44,12 @@
 
     @Autowired
     private ISysUserService userService;
+
+    @Autowired
+    private EmailService emailService;
+
+    @Autowired
+    private VerificationCodeService codeService;
 
     /**
      * 鐧诲綍鏂规硶
@@ -150,4 +159,44 @@
         System.out.println(menus);
         return AjaxResult.success(menuService.buildMenus(menus));//杩欓噷涔嬪悗灏卞皝瑁呭ソ浜嗗彂缁欏墠绔殑vo
     }
+
+    // 姝ラ1锛氳姹傚彂閫侀獙璇佺爜
+    @PostMapping("/getCode")
+    public AjaxResult requestPasswordReset(@RequestBody SysUser sysUser) {
+        // 楠岃瘉璐﹀彿鍜岄偖绠辨槸鍚﹀尮閰�
+        SysUser user = userService.checkEmail(sysUser.getNickName(),sysUser.getEmail());
+        if (user == null) {
+            return AjaxResult.error("璐﹀彿鎴栭偖绠变笉鍖归厤");
+        }
+
+        // 鐢熸垚骞跺彂閫侀獙璇佺爜
+        String verificationCode = codeService.generateCode();
+        codeService.saveCode(sysUser.getNickName(), verificationCode);
+        emailService.sendVerificationCode(sysUser.getEmail(), verificationCode);
+
+        return AjaxResult.success("楠岃瘉鐮佸凡鍙戦�佽嚦鎮ㄧ殑閭");
+    }
+
+    // 姝ラ2锛氶獙璇侀獙璇佺爜骞堕噸缃瘑鐮�
+    @PostMapping("/reset")
+    public AjaxResult resetPassword(@RequestParam String nickName,
+                                           @RequestParam String verificationCode,
+                                           @RequestParam String newPassword) {
+        // 楠岃瘉楠岃瘉鐮�
+        if (!codeService.validateCode(nickName, verificationCode)) {
+            return AjaxResult.error("楠岃瘉鐮佹棤鏁堟垨宸茶繃鏈�");
+        }
+
+        // 鏇存柊瀵嗙爜
+        SysUser user = userService.selectUserByNickName(nickName);
+        System.out.println(user);
+        if (user != null) {
+            newPassword = SecurityUtils.encryptPassword(newPassword);
+            user.setPassword(newPassword);
+            userService.updateUser(user);// 瀹為檯搴旂敤涓簲瀵瑰瘑鐮佸姞瀵�
+            return AjaxResult.success("瀵嗙爜閲嶇疆鎴愬姛");
+        }
+        return AjaxResult.error("鐢ㄦ埛涓嶅瓨鍦�");
+    }
+
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 6944147..e2c875b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -197,7 +197,8 @@
         us.setRoleId(user.getRoleId());      // 瑙掕壊ID锛�102=瀹跺涵鎴愬憳锛�
         us.setSex(user.getSex());            // 鎬у埆锛�0鐢�/1濂筹級
         us.setStatus(user.getStatus());      // 璐︽埛鐘舵�侊紙鍚敤/绂佺敤锛�
-        us.setRemark(user.getRemark());      // 澶囨敞淇℃伅
+        us.setRemark(user.getRemark());
+        us.setEmail(user.getEmail());// 澶囨敞淇℃伅
         userService.updateUser(us);          // 鎵цSysUser琛ㄦ洿鏂�
 
         // ===== 2. 瀹跺涵鎴愬憳涓撳睘澶勭悊锛堜粎瑙掕壊ID=102鏃舵墽琛岋級=====
@@ -209,7 +210,8 @@
             infoUser.setNickName(user.getNickName());      // 褰撳墠鏄电О
             infoUser.setIsMyFamily(user.getIsMyFamily()); // 瀹跺涵鎴愬憳鏍囪锛�0/1锛�
             infoUser.setMomId(user.getMid());             // 姣嶄翰ID锛堝彲涓虹┖锛�
-            infoUser.setFatherId(user.getFid());           // 鐖朵翰ID锛堝彲涓虹┖锛�
+            infoUser.setFatherId(user.getFid());
+            infoUser.setEmail(user.getEmail());// 鐖朵翰ID锛堝彲涓虹┖锛�
             // 濠氬Щ鐘舵�佺┖鍊间繚鎶わ紙0鏈/1宸插/2绂诲锛�
             infoUser.setMaritalStatus(user.getMaritalStatus() == null ? null : user.getMaritalStatus());
             // 鎬у埆鏍煎紡杞崲锛圫tring 鈫� Integer锛�
@@ -412,6 +414,7 @@
         user.setUpdateBy(userAll.getUpdateBy());    // 鏇存柊浜�
         user.setClanId(userAll.getClanId());        // 瀹舵棌ID
         user.setPaid(userAll.getPaid());
+        user.setEmail(userAll.getEmail());
 
         // ===================== 2. 鍞竴鎬ф牎楠岋紙鐧诲綍鍚�/鎵嬫満鍙�/閭锛� =====================
         // 2.1 鐧诲綍鍚嶆牎楠�
@@ -451,7 +454,7 @@
             infoUser.setNickName(userAll.getNickName()); // 褰撳墠鏄电О
             infoUser.setOldName(userAll.getUserName());  // 鍘嗗彶鍚嶇О锛堜繚鐣欒褰曪級
             infoUser.setPhoneNumber(userAll.getPhonenumber()); // 鑱旂郴鏂瑰紡
-
+            infoUser.setEmail(userAll.getEmail());
             String originalString=userAll.getUserName()+"-"+userAll.getPhonenumber();
 
             String uniqueId = UUID.nameUUIDFromBytes(originalString.getBytes()).toString();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/ZInfoUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/ZInfoUserController.java
index 025b517..5d8542e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/ZInfoUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/ZInfoUserController.java
@@ -192,6 +192,7 @@
         user.setSex(zInfoUser.getSex()+"");
         user.setUserName(zInfoUser.getOldName());
         user.setPhonenumber(zInfoUser.getPhoneNumber());
+        user.setEmail(zInfoUser.getEmail());
         String oriUaid = zInfoUser.getUaid();
 
         String originalString = zInfoUser.getOldName()+"-"+zInfoUser.getPhoneNumber();
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index b50dfb0..bdf55c7 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -102,6 +102,24 @@
         max-active: 8
         # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
         max-wait: -1ms
+  #閭閰嶇疆
+  mail:
+    host: smtp.qq.com
+    port: 587
+    #閭
+    username: 3224414357@qq.com
+    #鎺堟潈鐮�
+    password: wmsreabbwlmacjhe
+    protocol: smtp
+    properties:
+#      mail.debug: true
+      mail.smtp.auth: true
+      mail.smtp.starttls.enable: true
+      mail.smtp.starttls.required: true
+      mail.smtp.ehlo: true # 鍏抽敭淇
+      mail.smtp.ssl.trust: smtp.qq.com
+      mail.smtp.ssl.protocols: TLSv1.2
+    default-encoding: UTF-8
 
 # token閰嶇疆
 token:
@@ -158,3 +176,4 @@
 
 
 
+
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index f375947..ac0e27b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@
                 // 杩囨护璇锋眰
                 .authorizeRequests()
                 // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
-                .antMatchers("/login", "/register", "/captchaImage","/qrCode/getInf","/common/downLoadFile").permitAll()
+                .antMatchers("/login", "/register", "/captchaImage","/qrCode/getInf","/common/downLoadFile","/getCode","/reset").permitAll()
                 // 闈欐�佽祫婧愶紝鍙尶鍚嶈闂�
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index 5fb90a6..856846b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -287,4 +287,7 @@
         sysUser.setLoginDate(DateUtils.getNowDate());
         userService.updateUserProfile(sysUser);
     }
+
+
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 402bcbd..25ea268 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -148,4 +148,13 @@
      * @return 缁撴灉
      */
     public SysUser checkEmailUnique(String email);
+
+
+    /**
+     * 鍖归厤閭
+     * @param nickName 鐢ㄦ埛璐﹀彿鍚�
+     * @param email 鐢ㄦ埛閭
+     * @return 缁撴灉
+     */
+    SysUser checkEmail(@Param("nickName") String nickName,@Param("email") String email);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index deda0e7..45a2a47 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -236,4 +236,12 @@
      * @return 缁撴灉
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+    /**
+     * 鍖归厤閭
+     * @param nickName 鐢ㄦ埛璐﹀彿鍚�
+     * @param email 鐢ㄦ埛閭
+     * @return 缁撴灉
+     */
+    SysUser checkEmail(String nickName,String email);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmailService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmailService.java
new file mode 100644
index 0000000..0c5b4d0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmailService.java
@@ -0,0 +1,177 @@
+package com.ruoyi.system.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Service;
+
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+@Service
+public class EmailService {
+    @Autowired
+    private JavaMailSender mailSender;
+
+    @Value("${spring.mail.username}")
+    private String fromEmail;
+
+    public void sendVerificationCode(String toEmail, String verificationCode) {
+        try {
+            MimeMessage message = mailSender.createMimeMessage();
+            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
+
+            helper.setFrom(new InternetAddress(fromEmail, "鏈槦鍢熷缃�"));
+            helper.setTo(toEmail);
+            helper.setSubject("鏈槦鍢熷缃� - 鐧诲綍楠岃瘉鐮�");
+
+            // 鏋勫缓HTML鍐呭
+            String htmlContent = buildVerificationEmail(verificationCode);
+            helper.setText(htmlContent, true); // true琛ㄧず鍐呭涓篐TML
+
+            mailSender.send(message);
+        } catch (Exception e) {
+            throw new RuntimeException("閭欢鍙戦�佸け璐�", e);
+        }
+    }
+
+    private String buildVerificationEmail(String verificationCode) {
+        return "<!DOCTYPE html>\n" +
+                "<html>\n" +
+                "<head>\n" +
+                "    <meta charset=\"UTF-8\">\n" +
+                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
+                "    <title>鏈槦鍢熷缃� - 瀹夊叏楠岃瘉鐮�</title>\n" +
+                "    <style>\n" +
+                "        body {\n" +
+                "            font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;\n" +
+                "            line-height: 1.6;\n" +
+                "            color: #333333;\n" +
+                "            background-color: #f5f7fa;\n" +
+                "            margin: 0;\n" +
+                "            padding: 0;\n" +
+                "        }\n" +
+                "        .email-container {\n" +
+                "            max-width: 600px;\n" +
+                "            margin: 20px auto;\n" +
+                "            background-color: #ffffff;\n" +
+                "            border-radius: 8px;\n" +
+                "            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);\n" +
+                "            overflow: hidden;\n" +
+                "        }\n" +
+                "        .header {\n" +
+                "            background: linear-gradient(135deg, #1e88e5, #0d47a1);\n" +
+                "            padding: 25px 30px;\n" +
+                "            text-align: center;\n" +
+                "            color: white;\n" +
+                "        }\n" +
+                "        .header h1 {\n" +
+                "            margin: 0;\n" +
+                "            font-size: 22px;\n" +
+                "            font-weight: 600;\n" +
+                "            letter-spacing: 0.5px;\n" +
+                "        }\n" +
+                "        .content {\n" +
+                "            padding: 30px;\n" +
+                "        }\n" +
+                "        .security-notice {\n" +
+                "            background-color: #fff8e1;\n" +
+                "            border-left: 4px solid #ffc107;\n" +
+                "            padding: 15px;\n" +
+                "            margin-bottom: 25px;\n" +
+                "            border-radius: 4px;\n" +
+                "            font-size: 14px;\n" +
+                "            color: #5d4037;\n" +
+                "        }\n" +
+                "        .verification-section {\n" +
+                "            text-align: center;\n" +
+                "            margin: 30px 0;\n" +
+                "            padding: 20px;\n" +
+                "            background-color: #f0f7ff;\n" +
+                "            border-radius: 8px;\n" +
+                "        }\n" +
+                "        .code-label {\n" +
+                "            font-size: 16px;\n" +
+                "            color: #1565c0;\n" +
+                "            margin-bottom: 15px;\n" +
+                "        }\n" +
+                "        .code-display {\n" +
+                "            display: inline-block;\n" +
+                "            background: linear-gradient(to right, #2196f3, #21cbf3);\n" +
+                "            color: white;\n" +
+                "            font-size: 36px;\n" +
+                "            font-weight: 700;\n" +
+                "            padding: 15px 40px;\n" +
+                "            border-radius: 8px;\n" +
+                "            letter-spacing: 8px;\n" +
+                "            box-shadow: 0 4px 15px rgba(33, 150, 243, 0.3);\n" +
+                "            margin: 15px 0;\n" +
+                "            text-decoration: none;\n" +
+                "        }\n" +
+                "        .instructions {\n" +
+                "            font-size: 15px;\n" +
+                "            color: #555555;\n" +
+                "            margin-bottom: 25px;\n" +
+                "            line-height: 1.7;\n" +
+                "        }\n" +
+                "        .validity {\n" +
+                "            background-color: #e3f2fd;\n" +
+                "            padding: 15px;\n" +
+                "            border-radius: 6px;\n" +
+                "            text-align: center;\n" +
+                "            font-size: 14px;\n" +
+                "            color: #0d47a1;\n" +
+                "            margin-top: 25px;\n" +
+                "        }\n" +
+                "        .footer {\n" +
+                "            text-align: center;\n" +
+                "            padding: 20px;\n" +
+                "            background-color: #f5f7fa;\n" +
+                "            color: #78909c;\n" +
+                "            font-size: 13px;\n" +
+                "            border-top: 1px solid #e0e0e0;\n" +
+                "        }\n" +
+                "        .footer p {\n" +
+                "            margin: 5px 0;\n" +
+                "        }\n" +
+                "        .highlight {\n" +
+                "            color: #d32f2f;\n" +
+                "            font-weight: 600;\n" +
+                "        }\n" +
+                "    </style>\n" +
+                "</head>\n" +
+                "<body>\n" +
+                "    <div class=\"email-container\">\n" +
+                "        <div class=\"header\">\n" +
+                "            <h1>鏈槦鍢熷缃� - 瀹夊叏楠岃瘉</h1>\n" +
+                "        </div>\n" +
+                "        \n" +
+                "        <div class=\"content\">\n" +
+                "            <div class=\"security-notice\">\n" +
+                "                <strong>瀹夊叏鎻愮ず锛�</strong> 鎮ㄦ鍦ㄧ櫥褰曟湰鍢熷槦瀹剁綉锛岄獙璇佺爜璇峰嬁鍛婄煡浠栦汉锛屾硠闇蹭細瀵艰嚧璐﹀彿琚洍锛屼娇瀹舵棌鍙婁釜浜轰俊鎭硠闇层�俓n" +
+                "            </div>\n" +
+                "            \n" +
+                "            <p class=\"instructions\">璇蜂娇鐢ㄤ互涓嬮獙璇佺爜瀹屾垚鐧诲綍楠岃瘉锛�</p>\n" +
+                "            \n" +
+                "            <div class=\"verification-section\">\n" +
+                "                <div class=\"code-label\">鎮ㄧ殑楠岃瘉鐮�</div>\n" +
+                "                <div class=\"code-display\">" + verificationCode + "</div>\n" +
+                "                <p class=\"instructions\">璇峰皢涓婅堪楠岃瘉鐮佽緭鍏ュ埌鐧诲綍椤甸潰鐨勯獙璇佺爜杈撳叆妗嗕腑</p>\n" +
+                "            </div>\n" +
+                "            \n" +
+                "            <div class=\"validity\">\n" +
+                "                <strong>璇锋敞鎰忥細</strong> 姝ら獙璇佺爜灏嗗湪 <strong>5鍒嗛挓</strong> 鍚庡け鏁堬紝璇峰敖蹇娇鐢ㄣ�俓n" +
+                "            </div>\n" +
+                "        </div>\n" +
+                "        \n" +
+                "        <div class=\"footer\">\n" +
+                "            <p>姝や负绯荤粺鑷姩鍙戦�侀偖浠讹紝璇峰嬁鐩存帴鍥炲</p>\n" +
+                "            <p>濡傛灉鎮ㄦ湭杩涜姝ゆ搷浣滐紝璇峰拷鐣ユ閭欢鎴栬仈绯诲鏈�</p>\n" +
+                "            <p>漏 2023 鏈槦鍢熷缃� 鐗堟潈鎵�鏈�</p>\n" +
+                "        </div>\n" +
+                "    </div>\n" +
+                "</body>\n" +
+                "</html>";
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index f198463..8d0c68a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -659,6 +659,14 @@
     }
 
     @Override
+    public SysUser checkEmail(String nickName, String email) {
+        System.out.println(nickName);
+         SysUser sysUser = userMapper.checkEmail(nickName, email);
+        System.out.println(sysUser);
+        return sysUser ;
+    }
+
+    @Override
     public boolean saveBatch(Collection<SysUser> entityList, int batchSize) {
         return false;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VerificationCodeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VerificationCodeService.java
new file mode 100644
index 0000000..f7fa748
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VerificationCodeService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class VerificationCodeService {
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    public String generateCode() {
+        Random random = new Random();
+        return String.format("%04d", random.nextInt(10000));
+    }
+
+    public void saveCode(String username, String code) {
+        String key = "verification_code:" + username;
+        redisTemplate.opsForValue().set(key, code, 5, TimeUnit.MINUTES); // 5鍒嗛挓鏈夋晥
+    }
+
+    public boolean validateCode(String username, String inputCode) {
+        String key = "verification_code:" + username;
+        String storedCode = redisTemplate.opsForValue().get(key);
+        return inputCode.equals(storedCode);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 5911126..7e19a66 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -199,6 +199,10 @@
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
 
+	<select id="checkEmail" parameterType="SysUser" resultMap="SysUserResult">
+		select user_id, email,nick_name from sys_user where email = #{email} and nick_name = #{nickName} and del_flag = '0' limit 1
+	</select>
+
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
diff --git a/zhang-content/pom.xml b/zhang-content/pom.xml
index 4884f2c..c103ad2 100644
--- a/zhang-content/pom.xml
+++ b/zhang-content/pom.xml
@@ -101,6 +101,11 @@
             <version>2.8.8</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/zhang-content/src/main/java/com/ruoyi/domain/sysUserAndUserInfo.java b/zhang-content/src/main/java/com/ruoyi/domain/sysUserAndUserInfo.java
index dabf4b9..0062313 100644
--- a/zhang-content/src/main/java/com/ruoyi/domain/sysUserAndUserInfo.java
+++ b/zhang-content/src/main/java/com/ruoyi/domain/sysUserAndUserInfo.java
@@ -33,6 +33,8 @@
     @Excel(name = "鐢ㄦ埛鏄电О")
     private String nickName;
 
+    private String email;
+
 
 
 

--
Gitblit v1.9.1