From ba3cb9849a452b760bd8566934b65cd534b536bb Mon Sep 17 00:00:00 2001
From: feige <feige@qq.com>
Date: 星期二, 21 十月 2025 08:09:55 +0800
Subject: [PATCH] 修改忘记密码

---
 ruoyi-ui/src/views/login.vue |  333 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 284 insertions(+), 49 deletions(-)

diff --git a/ruoyi-ui/src/views/login.vue b/ruoyi-ui/src/views/login.vue
index e27dce1..1d197f8 100644
--- a/ruoyi-ui/src/views/login.vue
+++ b/ruoyi-ui/src/views/login.vue
@@ -1,18 +1,18 @@
 <template>
   <div>
-  
+
 
   <div class="login Group_132">
 	  <div class="navbar topHeight">
 	<!--     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-	  
+
 	     <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
 	     <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
 	  -->
 	     <div class="right-menu">
-	     
-	  
-	     
+
+
+
 	         <div class="avatar-wrapper">
 			   <el-button @click="login">
 	           <img :src="avatar" class="user-avatar">
@@ -20,14 +20,19 @@
 			   <span>鐧诲綍</span>
 			   </el-button>
 			   <el-button @click="openReg">
-			 
+
 			   <span>娉ㄥ唽</span>
 			   </el-button>
 	         </div>
-	     
+
 	     </div>
 	   </div>
-	  
+  
+      <!-- 娣诲姞QQ瀹㈡湇鎸夐挳 -->
+      <div class="qq-service-btn" @click="openQQChat">
+        <img :src="require('@/assets/image/qq.png')" alt="QQ瀹㈡湇">
+        <span>QQ瀹㈡湇</span>
+      </div>
 	    <el-dialog  :visible.sync="open" style="margin: 0px;" customClass="customWidth" width="620px">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" style="margin: 0px;">
       <h3 class="title">鐧诲綍鏈兘閮藉缃�</h3>
@@ -107,7 +112,7 @@
         </div>
 
         <div class="code" @click="getCode" style="width: 24px;
-        
+
         height: 16px;
         font-size: 12px;
         font-family: Microsoft YaHei-Regular, Microsoft YaHei;
@@ -134,24 +139,29 @@
           <span v-if="!loading" style="width: 97px;height: 62px;">鐧诲綍</span>
           <span v-else>鐧� 褰� 涓�...</span>
         </el-button>
-      
+
+      </el-form-item>
+
+           <!-- 娣诲姞蹇樿瀵嗙爜鎸夐挳 -->
+           <el-form-item>
+        <el-link type="primary" @click="openForgotPasswordDialog">蹇樿瀵嗙爜</el-link>
       </el-form-item>
 	  <el-form-item>
 		  <a href="https://www.bendudu.com:8080/profile/upload/2023/10/10/Bendudu20231010_20231010203358A033.apk">鐐瑰嚮姝ゅ涓嬭浇搴旂敤绋嬪簭</a>
-		
+
 	  </el-form-item>
     </el-form>
 	</el-dialog>
-	
-	
-	
-	
+
+
+
+
 	<el-dialog :visible.sync="openRegister" customClass="customWidth" width="450px">
 		<div class="register">
 		  <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
 		    <h3 class="title">鏂扮敤鎴锋敞鍐�</h3>
-		    <el-form-item prop="nickName">
-		      <el-input v-model="registerForm.nickName" type="text" auto-complete="off" placeholder="璐﹀彿">
+		    <el-form-item prop="nickname">
+		      <el-input v-model="registerForm.nickname" type="text" auto-complete="off" placeholder="璐﹀彿">
 		        <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
 		      </el-input>
 		    </el-form-item>
@@ -193,35 +203,127 @@
 		    </el-form-item>
 		    <el-form-item style="width:100%;">
 		      <el-button
-		        :loading="loading"
+		        :loading="loadingr"
 		        size="medium"
 		        type="primary"
 		        style="width:100%;"
 		        @click.native.prevent="handleRegister"
 		      >
-		        <span v-if="!loading">娉� 鍐�</span>
+		        <span v-if="!loadingr">娉� 鍐�</span>
 		        <span v-else>娉� 鍐� 涓�...</span>
 		      </el-button>
-		   
+
 		    </el-form-item>
 		  </el-form>
 		  <!--  搴曢儴  -->
-		
+
 		</div>
 	</el-dialog>
+  <el-dialog :visible.sync="forgotPasswordDialogVisible" :title="forgotPasswordStep === 1 ? '蹇樿瀵嗙爜' : '閲嶇疆瀵嗙爜'" width="30%">
+    <!-- 姝ラ 1锛氳緭鍏ラ偖绠卞彂閫侀獙璇佺爜 -->
+    <div v-if="forgotPasswordStep === 1">
+      <p style="margin-bottom: 20px; color: #666;">蹇樿瀵嗙爜锛屽彲浠ラ�氳繃閭鎵惧洖锛岃杈撳叆娉ㄥ唽閭鑾峰彇楠岃瘉鐮�</p>
+      <el-form ref="forgotPasswordFormStep1" :model="forgotPasswordForm" :rules="forgotPasswordRulesStep1">
+        <el-form-item prop="nickName">
+          <el-input
+            v-model="forgotPasswordForm.nickName"
+            type="text"
+            auto-complete="off"
+            placeholder="璇疯緭鍏ョ敤鎴峰悕"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="email">
+          <el-input
+            v-model="forgotPasswordForm.email"
+            type="text"
+            auto-complete="off"
+            placeholder="璇疯緭鍏ユ敞鍐岄偖绠�"
+          ></el-input>
+        </el-form-item>
+    
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="forgotPasswordDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="sendVerificationCode">鍙戦�侀獙璇佺爜</el-button>
+      </span>
+    </div>
+    <!-- 姝ラ 2锛氳緭鍏ラ獙璇佺爜鍜屾柊瀵嗙爜杩涜淇敼 -->
+    <div v-else>
+      <p style="margin-bottom: 20px; color: #666;">璇疯緭鍏ユ敹鍒扮殑楠岃瘉鐮佸拰鏂板瘑鐮侀噸缃瘑鐮�</p>
+      <el-form ref="forgotPasswordFormStep2" :model="forgotPasswordForm" :rules="forgotPasswordRulesStep2">
+        <el-form-item prop="nickName">
+          <el-input
+            v-model="forgotPasswordForm.nickName"
+            type="text"
+            auto-complete="off"
+            placeholder="璇疯緭鍏ョ敤鎴峰悕"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="code">
+          <el-input
+            v-model="forgotPasswordForm.code"
+            auto-complete="off"
+            placeholder="璇疯緭鍏ラ獙璇佺爜"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="newPassword">
+          <el-input
+            v-model="forgotPasswordForm.newPassword"
+            type="password"
+            auto-complete="off"
+            placeholder="璇疯緭鍏ユ柊瀵嗙爜"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="confirmNewPassword">
+          <el-input
+            v-model="forgotPasswordForm.confirmNewPassword"
+            type="password"
+            auto-complete="off"
+            placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="goBackToStep1">杩斿洖</el-button>
+        <el-button @click="forgotPasswordDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="submitPasswordReset">纭畾</el-button>
+      </span>
+    </div>
+  </el-dialog>
+
+  <el-dialog :visible.sync="qqDialogVisible" title="QQ瀹㈡湇" width="400px">
+  <div style="text-align: center; padding: 20px;">
+    <img :src="require('@/assets/image/qq.png')" alt="QQ瀹㈡湇" style="width: 80px; height: 80px; margin-bottom: 15px;">
+    <h3 style="margin-bottom: 15px;">瀹㈡湇QQ: 3224414357</h3>
+    <p style="margin-bottom: 20px; color: #666;">璇锋坊鍔犲ソ鍙嬪悗鍙戣捣浼氳瘽</p>
+    <div style="display: flex; justify-content: center; gap: 15px;">
+      <el-button type="primary" @click="copyQQ" plain>
+        澶嶅埗QQ鍙�
+      </el-button>
+      <el-button type="success" @click="addQQFriend">
+        娣诲姞濂藉弸
+      </el-button>
+    </div>
+  </div>
+</el-dialog>
     <!--  搴曢儴  -->
     <div class="el-login-footer" >
-      <span style="color: black; ">Copyright 漏 GDUT All Rights Reserved.<span v-html="'\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'"></span></span>
+      <span style="color: black; "><span v-html="'\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'"></span></span>
       <a href="https://beian.miit.gov.cn/" target="_blank" style="color: black; ">绮CP澶�2023050334鍙�<span v-html="'\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'"></span>鍏畨澶囨鍙�44010402003045</a>
     </div>
   </div>
-  
-  <div class="gpr"></div>
+
+  <div class="gpr">
+<!-- 	   <img :key="url" :src="url" style="width:100%;height:30%"></img> -->
+  </div>
+
+
+
 </div>
 </template>
 
 <script>
-import { getCodeImg,Download } from "@/api/login";
+import { getCodeImg,Download,register,getEmailCode, resetPassword } from "@/api/login";
 import Cookies from "js-cookie";
 import { encrypt, decrypt } from '@/utils/jsencrypt'
 
@@ -233,10 +335,60 @@
 	      callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"));
 	    } else {
 	      callback();
+
 	    }
 	  };
+    const validateEmail = (rule, value, callback) => {
+      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+      if (!value) {
+        return callback(new Error('璇疯緭鍏ラ偖绠�'));
+      }
+      if (!emailRegex.test(value)) {
+        return callback(new Error('璇疯緭鍏ユ纭殑閭鏍煎紡'));
+      }
+      callback();
+    };
+    const equalToNewPassword = (rule, value, callback) => {
+      if (this.forgotPasswordForm.newPassword !== value) {
+        callback(new Error("涓ゆ杈撳叆鐨勬柊瀵嗙爜涓嶄竴鑷�"));
+      } else {
+        callback();
+      }
+    };
     return {
+       // ... existing code ...
+       nnme: '',
+       forgotPasswordDialogVisible: false,
+      forgotPasswordStep: 1, // 1 琛ㄧず杈撳叆閭姝ラ锛�2 琛ㄧず杈撳叆楠岃瘉鐮佸拰鏂板瘑鐮佹楠�
+      forgotPasswordForm: {
+        nickName: '',
+        email: '',
+        code: '',
+        newPassword: '',
+        confirmNewPassword: ''
+      },
+      forgotPasswordRulesStep1: {
+        email: [
+          { validator: validateEmail, trigger: 'blur' }
+        ]
+      },
+      forgotPasswordRulesStep2: {
+        code: [
+          { required: true, trigger: 'blur', message: '璇疯緭鍏ラ獙璇佺爜' }
+        ],
+        newPassword: [
+          { required: true, trigger: 'blur', message: '璇疯緭鍏ユ柊瀵嗙爜' },
+          { min: 5, max: 20, message: '鏂板瘑鐮侀暱搴﹀繀椤讳粙浜� 5 鍜� 20 涔嬮棿', trigger: 'blur' }
+        ],
+        confirmNewPassword: [
+          { required: true, trigger: 'blur', message: '璇峰啀娆¤緭鍏ユ柊瀵嗙爜' },
+          { validator: equalToNewPassword, trigger: 'blur' }
+        ]
+      },
+      qqDialogVisible: false,
+	  url: require('../assets/images/index.png'),
 		openRegister: false,
+    avatar: undefined,
 	  open: false,
       codeUrl: "",
       loginForm: {
@@ -258,26 +410,27 @@
         code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }]
       },
       loading: false,
+	  loadingr: false,
       // 楠岃瘉鐮佸紑鍏�
       captchaEnabled: true,
       // 娉ㄥ唽寮�鍏�
-      register: true,
+    //  register: true,
       redirect: undefined,
-	  
-	  
-	  
+
+
+
 
 	  registerForm: {
-	    nickName: "",
+	    nickname: "",
 	    password: "",
 	    confirmPassword: "",
 	    code: "",
 	    uuid: ""
 	  },
 	  registerRules: {
-	    nickName: [
+	    nickname: [
 	      { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
-	      { min: 2, max: 20, message: '鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' }
+	    //  { min: 2, max: 20, message: '鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' }
 	    ],
 	    password: [
 	      { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
@@ -305,20 +458,90 @@
     this.getCookie();
   },
   methods: {
+    openForgotPasswordDialog() {
+      this.forgotPasswordDialogVisible = true;
+      this.forgotPasswordStep = 1;
+      this.forgotPasswordForm = {
+        nickName: '',
+        email: '',
+        code: '',
+        newPassword: '',
+        confirmNewPassword: ''
+      };
+    },
+    sendVerificationCode() {
+      this.nnme = this.forgotPasswordForm.nickName;
+      this.$refs.forgotPasswordFormStep1.validate(valid => {
+        if (valid) {
+          getEmailCode({ nickName:this.forgotPasswordForm.nickName, email: this.forgotPasswordForm.email }).then(() => {
+            this.$message.success('楠岃瘉鐮佸凡鍙戦�佽嚦鎮ㄧ殑閭锛岃鏌ユ敹');
+            this.forgotPasswordStep = 2;
+          }).catch(() => {
+            this.$message.error('楠岃瘉鐮佸彂閫佸け璐ワ紝璇烽噸璇�');
+          });
+        }
+      });
+    },
+    submitPasswordReset() {
+      this.$refs.forgotPasswordFormStep2.validate(valid => {
+        if (valid) {
+          var formData = new FormData();
+          formData.append('nickName', this.forgotPasswordForm.nickName); 
+          formData.append('verificationCode', this.forgotPasswordForm.code);
+          formData.append('newPassword', this.forgotPasswordForm.newPassword);
+          resetPassword(formData).then(() => {
+            this.$message.success('瀵嗙爜淇敼鎴愬姛');
+            this.forgotPasswordDialogVisible = false;
+          }).catch(() => {
+            this.$message.error('瀵嗙爜淇敼澶辫触锛岃閲嶈瘯');
+          });
+        }
+      });
+    },
+    goBackToStep1() {
+      this.forgotPasswordStep = 1;
+    },
+
+    openQQChat() {
+    this.qqDialogVisible = true;
+  },
+    copyQQ() {
+    const qq = '3224414357';
+    navigator.clipboard.writeText(qq).then(() => {
+      this.$message.success('QQ鍙峰凡澶嶅埗鍒板壀璐存澘');
+    }).catch(() => {
+      // 鍏煎涓嶆敮鎸乧lipboard API鐨勬祻瑙堝櫒
+      const input = document.createElement('input');
+      input.value = qq;
+      document.body.appendChild(input);
+      input.select();
+      document.execCommand('copy');
+      document.body.removeChild(input);
+      this.$message.success('QQ鍙峰凡澶嶅埗');
+    });
+  },
+  addQQFriend() {
+    window.open('tencent://message/?Menu=yes&uin=3224414357&Site=xxx&Service=10&sigT=10&sigU=10', '_blank');
+  },
 	  handleRegister() {
+		  //alert(this.registerForm.nickname)
 	    this.$refs.registerForm.validate(valid => {
 	      if (valid) {
-	        this.loading = true;
+	        this.loadingr = false;
+			//alert(this.registerForm.nickname)
 	        register(this.registerForm).then(res => {
-	          const nickName = this.registerForm.nickName;
+	          const nickName = this.registerForm.nickname;
 	          this.$alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + nickName + " 娉ㄥ唽鎴愬姛锛�</font>", '绯荤粺鎻愮ず', {
 	            dangerouslyUseHTMLString: true,
 	            type: 'success'
 	          }).then(() => {
-	            this.$router.push("/login");
+				  this.openRegister = false;
+				  this.resetForm("registerForm");
+	         //   this.$router.push("/login");
+		
 	          }).catch(() => {});
 	        }).catch(() => {
-	          this.loading = false;
+	          this.loadingr = true;
 	          if (this.captchaEnabled) {
 	            this.getCode();
 	          }
@@ -327,7 +550,7 @@
 	    });
 	  },
 	  openReg(){
-		  this.openRegister = true; 
+		  this.openRegister = true;
 	  },
 	  login(){
 		  this.open = true;
@@ -340,6 +563,7 @@
         if (this.captchaEnabled) {
           this.codeUrl = "data:image/gif;base64," + res.data.img;
           this.loginForm.uuid = res.data.uuid;
+		      this.registerForm.uuid = res.data.uuid;
         }
       });
     },
@@ -385,20 +609,31 @@
 <style rel="stylesheet/scss" lang="scss">
 .gpr{
 	width:100%;
-	height:600px;
-	background: no-repeat center/40% url("../assets/images/Group 132.png");
+	// height:1000px;
+
+	//background: no-repeat center/100% url("../assets/images/index.png");
 }
 	 .customWidth{
 	      width:40%;  // 璁剧疆寮瑰嚭妗嗗搴︾殑鏁板��
 	  }
 .topHeight{
 	height: 40px;
+
 	margin-right: 20px;
+	top:5px;
+	position: absolute;
 }
 .Group_132{
+	// background-image: url("../assets/images/index.png");
+
+
+
   // background: no-repeat center/40% url("../assets/images/Group 132.png");
-  height: 100%;
-  width:  100%;
+  // height: 1200px;
+	min-width: 1300px;
+    width: 100vw;
+    height: 100vh;
+
   background-color: #FEF7FC;
   //background-position: 49.5% 16.2% ;
   // background-position: 81.7px 71.3px;
@@ -410,17 +645,17 @@
   display: flex;
   justify-content: flex-end;
   align-items: center;
-  height: 100%;
+  // height: 60px;
   width:  100%;
-  background: no-repeat center/40% url("../assets/images/login_logo.png");
+  background: no-repeat center/100% url("../assets/images/index.png");
   background-color: #FEF7FC;
 
-  
+
   //background-image: url("../assets/images/login-background.jpg");
   //background-size: cover;
 }
 .title {
-  
+
   width:355px;
   height: 58px;
   font-size: 44px;
@@ -516,7 +751,7 @@
   width: 108px;
   height: 48px;
   float: right;
-  
+
 
 
   img {
@@ -544,7 +779,7 @@
 }
 
 .code {
-  
+
 }
 
 .register {
@@ -553,10 +788,10 @@
   align-items: center;
   height: 100%;
   //background-image: url("../assets/images/login-background.jpg");
- 
+
  width:400px;
   background-color: #FEF7FC;
-  
+
   //background-size: cover;
 }
 .title {

--
Gitblit v1.9.1