From f2a9cb154099a59a97de312ea2bb45d37639868b Mon Sep 17 00:00:00 2001
From: lohir <3399054449@qq.com>
Date: 星期四, 17 十月 2024 19:46:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/login/index.vue |  146 ++++++++++++++++++++++++++++++++++--------------
 1 files changed, 104 insertions(+), 42 deletions(-)

diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 4e59a46..d1b9a0e 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -1,14 +1,15 @@
 <template>
   <div class="login-container">
-    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
+    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on"
+             label-position="left">
 
       <div class="title-container">
-        <h3 class="title">瀛︿箣鎬濈鐞嗙郴缁�</h3>
+        <h3 class="title">姹熻タ璇煶瑙嗛鍩硅绯荤粺</h3>
       </div>
 
       <el-form-item prop="userName">
         <span class="svg-container">
-          <svg-icon icon-class="user" />
+          <svg-icon icon-class="user"/>
         </span>
         <el-input
           ref="userName"
@@ -24,7 +25,7 @@
       <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
         <el-form-item prop="password">
           <span class="svg-container">
-            <svg-icon icon-class="password" />
+            <svg-icon icon-class="password"/>
           </span>
           <el-input
             :key="passwordType"
@@ -40,53 +41,86 @@
             @keyup.enter.native="handleLogin"
           />
           <span class="show-pwd" @click="showPwd">
-            <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
+            <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'"/>
           </span>
         </el-form-item>
       </el-tooltip>
 
       <el-checkbox v-model="loginForm.remember" style="margin-bottom: 20px;margin-left: 5px;">璁颁綇瀵嗙爜</el-checkbox>
 
-      <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">鐧诲綍</el-button>
+      <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;"
+                 @click.native.prevent="handleLogin">鐧诲綍
+      </el-button>
 
     </el-form>
 
-    <div class="account-foot-copyright">
-      <span>Copyright 漏2019-2024 姝︽眽鎬濈淮璺宠穬绉戞妧鏈夐檺鍏徃 鐗堟潈鎵�鏈�</span>
-    </div>
+    <el-dialog
+      title="淇敼瀵嗙爜"
+      :visible.sync="forceUpdateShow"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      width="400px"
+      :show-close="false"
+    >
+      <div style="margin-bottom: 10px; color: #aa1111">鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡锛岃閲嶆柊璁剧疆~</div>
+      <el-form ref="updatePasswordForm" :model="updatePasswordForm" :rules="updatePasswordRules">
+        <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+          <el-input v-model="updatePasswordForm.newPassword" placeholder="搴斿寘鍚ぇ灏忓啓銆佹暟瀛�" show-password></el-input>
+        </el-form-item>
+        <el-form-item label="纭瀵嗙爜">
+          <el-input v-model="updatePasswordForm.confirmPassword" placeholder="纭瀵嗙爜" show-password></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="forceUpdateShow = false">鍏� 闂�</el-button>
+        <el-button type="primary" @click="updatePassword">淇� 鏀�</el-button>
+      </span>
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
 import { mapMutations } from 'vuex'
 import loginApi from '@/api/login'
+import UserApi from '@/api/user'
 
 export default {
   name: 'Login',
   data () {
-    const validateUsername = (rule, value, callback) => {
-      if (value.length < 5) {
-        callback(new Error('鐢ㄦ埛鍚嶄笉鑳藉皯浜�5涓瓧绗�'))
-      } else {
-        callback()
-      }
-    }
     const validatePassword = (rule, value, callback) => {
-      if (value.length < 5) {
-        callback(new Error('瀵嗙爜涓嶈兘灏戜簬5涓瓧绗�'))
+      if (value === '') {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else if (!/[A-Z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓ぇ鍐欏瓧姣�'))
+      } else if (!/[a-z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓皬鍐欏瓧姣�'))
+      } else if (!/[0-9]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓暟瀛�'))
       } else {
         callback()
       }
     }
     return {
+      forceUpdateShow: false,
+      updatePasswordForm: {
+        userId: null,
+        newPassword: '',
+        confirmPassword: ''
+      },
+      updatePasswordRules: {
+        newPassword: [
+          { validator: validatePassword, trigger: 'blur' }
+        ]
+      },
       loginForm: {
         userName: '',
         password: '',
         remember: false
       },
       loginRules: {
-        userName: [{ required: true, trigger: 'blur', validator: validateUsername }],
-        password: [{ required: true, trigger: 'blur', validator: validatePassword }]
+        userName: [{ required: true, trigger: 'blur' }],
+        password: [{ required: true, trigger: 'blur' }]
       },
       passwordType: 'password',
       capsTooltip: false,
@@ -108,6 +142,26 @@
     // window.removeEventListener('storage', this.afterQRScan)
   },
   methods: {
+    updatePassword () {
+      let _this = this
+      _this.$refs.updatePasswordForm.validate(valid => {
+        if (valid) {
+          if (this.updatePasswordForm.newPassword !== this.updatePasswordForm.confirmPassword) {
+            _this.$message.error('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�')
+            return
+          }
+          UserApi.updatePassword(this.updatePasswordForm).then(res => {
+            if (res.code === 1) {
+              _this.$message.success('瀵嗙爜淇敼鎴愬姛銆傝閲嶆柊鐧诲綍')
+              _this.loginForm.password = ''
+              _this.forceUpdateShow = false
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
     checkCapslock ({ shiftKey, key } = {}) {
       if (key && key.length === 1) {
         // eslint-disable-next-line no-mixed-operators
@@ -136,10 +190,18 @@
       this.$refs.loginForm.validate(valid => {
         if (valid) {
           this.loading = true
-          loginApi.login(this.loginForm).then(function (result) {
+          loginApi.login(this.loginForm).then(result => {
+            // 濡傛灉code涓�205锛屽垯寮哄埗淇敼瀵嗙爜
+            if (result && result.code === 205) {
+              this.updatePasswordForm.userId = result.data
+              this.forceUpdateShow = true
+              this.loading = false
+              return
+            }
             if (result && result.code === 1) {
               _this.setUserName(_this.loginForm.userName)
-              _this.$router.push({ path: '/' })
+              _this.setUserInfo(result.data)
+              _this.$router.push({ path: '/dashboard' })
             } else {
               _this.loading = false
               _this.$message({
@@ -155,7 +217,7 @@
         }
       })
     },
-    ...mapMutations('user', ['setUserName'])
+    ...mapMutations('user', ['setUserName', 'setUserInfo'])
   }
 }
 </script>
@@ -164,13 +226,12 @@
 /* 淇input 鑳屾櫙涓嶅崗璋� 鍜屽厜鏍囧彉鑹� */
 /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
 
-$bg:#283443;
-$light_gray:#fff;
+$bg: #283443;
+$light_gray: #fff;
 $cursor: #fff;
 
 @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
   .login-container .el-input input {
-    color: $cursor;
   }
 }
 
@@ -182,50 +243,52 @@
     width: 85%;
 
     input {
-      background: transparent;
+      background: white;
       border: 0px;
       -webkit-appearance: none;
       border-radius: 0px;
       padding: 12px 5px 12px 15px;
-      color: $light_gray;
+      color: black;
       height: 47px;
-      caret-color: $cursor;
+      caret-color: black;
 
       &:-webkit-autofill {
-        box-shadow: 0 0 0px 1000px $bg inset !important;
-        -webkit-text-fill-color: $cursor !important;
+        box-shadow: 0 0 0px 1000px white inset !important;
+        -webkit-text-fill-color: black !important;
       }
     }
   }
 
   .el-form-item {
-    border: 1px solid rgba(255, 255, 255, 0.1);
-    background: rgba(0, 0, 0, 0.1);
+    border: 1px solid darkgrey;
     border-radius: 5px;
-    color: #454545;
+    color: white;
   }
 }
 </style>
 
 <style lang="scss" scoped>
-$bg:#2d3a4b;
-$dark_gray:#889aa4;
-$light_gray:#eee;
+$bg: #2d3a4b;
+$dark_gray: #889aa4;
+$light_gray: #eee;
 
 .login-container {
+  background-image: url('../../assets/loginBackground.png');
+  background-size: cover;
+  background-attachment: fixed;
   min-height: 100%;
   width: 100%;
-  background-color: $bg;
+  background-color: white;
   overflow: hidden;
 
   .login-form {
     position: relative;
     width: 520px;
     max-width: 100%;
-    padding:30px 50px 10px 50px;
-    margin:120px auto auto auto;
+    padding: 30px 50px 10px 50px;
+    margin: 200px auto auto auto;
     overflow: hidden;
-    background: rgba(252, 254, 255, 0.11)
+    background: white;
   }
 
   .tips {
@@ -253,7 +316,6 @@
 
     .title {
       font-size: 26px;
-      color: $light_gray;
       margin: 0px auto 40px auto;
       text-align: center;
       font-weight: bold;

--
Gitblit v1.8.0