From 64902cc758c99e31e274e7ebb36b9502908a24ea Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 10 七月 2024 15:39:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/api/sysConfig.js            |   18 ++++
 src/api/user.js                 |    1 
 src/views/login/index.vue       |   79 ++++++++++++++++---
 src/router.js                   |   17 ++++
 src/views/sys/SysSetting.vue    |   56 ++++++++++++++
 src/views/user/student/edit.vue |   60 +++++++++++---
 6 files changed, 202 insertions(+), 29 deletions(-)

diff --git a/src/api/sysConfig.js b/src/api/sysConfig.js
new file mode 100644
index 0000000..a2bd09e
--- /dev/null
+++ b/src/api/sysConfig.js
@@ -0,0 +1,18 @@
+import axios from './request'
+
+// 鑾峰彇绯荤粺閰�
+export const getSysConfig = () => {
+  return axios({
+    url: '/api/sys-config',
+    method: 'GET'
+  })
+}
+
+// 淇敼绯荤粺閰嶇疆琛�
+export const editSysConfig = (params) => {
+  return axios({
+    url: '/api/sys-config/',
+    method: 'PUT',
+    data: params
+  })
+}
diff --git a/src/api/user.js b/src/api/user.js
index 34afe94..b870d15 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -12,4 +12,5 @@
   selectByUserName: query => post('/api/admin/user/selectByUserName', query),
   studentList: () => get('/api/admin/user/student/list'),
   getClassesCurrentUserList: (param) => get('/api/admin/user/classes/students', param),
+  updatePassword: (data) => post('/api/admin/user/update/password', data)
 }
diff --git a/src/router.js b/src/router.js
index 8fc0cf1..1e2c89f 100644
--- a/src/router.js
+++ b/src/router.js
@@ -313,6 +313,23 @@
       }
     ]
   },
+  {
+    path: '/config',
+    component: Layout,
+    children: [
+      {
+        path: '/setting',
+        name: 'SysSetting',
+        meta: {
+          title: '绯荤粺閰嶇疆',
+          icon: 'answer',
+          affix: true
+        },
+        component: () => import('@/views/sys/SysSetting')
+      },
+    ]
+  },
+
   // {
   //   path: '/message',
   //   component: Layout,
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 6b3f396..4fc37a6 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -1,6 +1,7 @@
 <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>
@@ -8,7 +9,7 @@
 
       <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,17 +41,40 @@
             @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>
 
+    <el-dialog
+      title="淇敼瀵嗙爜"
+      :visible.sync="forceUpdateShow"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      width="400px"
+      :show-close="false"
+    >
+      <el-form :model="updatePasswordForm">
+        <el-form-item label="鏂板瘑鐮�">
+          <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>
@@ -58,6 +82,7 @@
 <script>
 import { mapMutations } from 'vuex'
 import loginApi from '@/api/login'
+import UserApi from '@/api/user'
 
 export default {
   name: 'Login',
@@ -77,6 +102,12 @@
       }
     }
     return {
+      forceUpdateShow: false,
+      updatePasswordForm: {
+        userId: null,
+        newPassword: '',
+        confirmPassword: ''
+      },
       loginForm: {
         userName: '',
         password: '',
@@ -106,6 +137,19 @@
     // window.removeEventListener('storage', this.afterQRScan)
   },
   methods: {
+    updatePassword () {
+      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
+        }
+      })
+    },
     checkCapslock ({ shiftKey, key } = {}) {
       if (key && key.length === 1) {
         // eslint-disable-next-line no-mixed-operators
@@ -134,7 +178,14 @@
       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: '/dashboard' })
@@ -162,8 +213,8 @@
 /* 淇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)) {
@@ -204,12 +255,12 @@
 </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-image: url('../../assets/loginBackground.png');
   background-size: cover;
   background-attachment: fixed;
   min-height: 100%;
@@ -221,8 +272,8 @@
     position: relative;
     width: 520px;
     max-width: 100%;
-    padding:30px 50px 10px 50px;
-    margin:200px auto auto auto;
+    padding: 30px 50px 10px 50px;
+    margin: 200px auto auto auto;
     overflow: hidden;
     background: white;
   }
diff --git a/src/views/sys/SysSetting.vue b/src/views/sys/SysSetting.vue
new file mode 100644
index 0000000..d5dfdfe
--- /dev/null
+++ b/src/views/sys/SysSetting.vue
@@ -0,0 +1,56 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" status-icon :rules="rules" ref="form" label-width="150px">
+      <el-form-item label="瀵嗙爜杩囨湡鏃堕棿(澶�)" prop="passwordExpireTime">
+        <el-input v-model="form.passwordExpireTime" type="number" autocomplete="off" placeholder="姣斿锛�30澶╁瘑鐮佽繃鏈�"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="edit()">淇濆瓨</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { getSysConfig, editSysConfig } from '@/api/sysConfig'
+
+export default {
+  name: 'SysSetting',
+  data () {
+    return {
+      form: {
+        id: null,
+        passwordExpireTime: null
+      },
+      rules: {
+        passwordExpireTime: [
+          { required: true, message: '璇疯緭鍏ュ瘑鐮佽繃鏈熸椂闂�', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  mounted () {
+    this.getConfig()
+  },
+  methods: {
+    getConfig () {
+      getSysConfig().then(res => {
+        this.form = res.data.data
+      })
+    },
+    edit () {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          editSysConfig(this.form).then(res => {
+            this.$message.success('淇敼鎴愬姛')
+          })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/user/student/edit.vue b/src/views/user/student/edit.vue
index 71c7118..6323e4d 100644
--- a/src/views/user/student/edit.vue
+++ b/src/views/user/student/edit.vue
@@ -2,14 +2,17 @@
   <div class="app-container">
 
     <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
-      <el-form-item label="鐢ㄦ埛鍚嶏細"  prop="userName" required>
-        <el-input v-model="form.userName"></el-input>
-      </el-form-item>
-      <el-form-item label="瀵嗙爜锛�"  required>
-        <el-input v-model="form.password"></el-input>
-      </el-form-item>
       <el-form-item label="鐪熷疄濮撳悕锛�" prop="realName" required>
         <el-input v-model="form.realName"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵嬫満锛�" prop="phone" required>
+        <el-input v-model="form.phone"></el-input>
+      </el-form-item>
+      <el-form-item label="鐧诲綍璐﹀彿锛�" prop="userName" required>
+        <el-input v-model="form.userName" autocomplete="off"></el-input>
+      </el-form-item>
+      <el-form-item label="鐧诲綍瀵嗙爜锛�" prop="password" required>
+        <el-input v-model="form.password" show-password autocomplete="off"></el-input>
       </el-form-item>
       <el-form-item label="骞撮緞锛�">
         <el-input v-model="form.age"></el-input>
@@ -20,16 +23,13 @@
         </el-select>
       </el-form-item>
       <el-form-item label="鍑虹敓鏃ユ湡锛�">
-        <el-date-picker v-model="form.birthDay" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" />
+        <el-date-picker v-model="form.birthDay" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"/>
       </el-form-item>
-      <el-form-item label="鎵嬫満锛�">
-        <el-input v-model="form.phone"></el-input>
-      </el-form-item>
-<!--      <el-form-item label="骞寸骇锛�" prop="userLevel" required>-->
-<!--        <el-select v-model="form.userLevel" placeholder="骞寸骇">-->
-<!--          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>-->
-<!--        </el-select>-->
-<!--      </el-form-item>-->
+      <!--      <el-form-item label="骞寸骇锛�" prop="userLevel" required>-->
+      <!--        <el-select v-model="form.userLevel" placeholder="骞寸骇">-->
+      <!--          <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
       <el-form-item label="鐘舵�侊細" required>
         <el-select v-model="form.status" placeholder="鐘舵��">
           <el-option v-for="item in statusEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
@@ -49,6 +49,30 @@
 
 export default {
   data () {
+    var validatePassword = (rule, value, callback) => {
+      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()
+      }
+    }
+    var validatePhone = (rule, value, callback) => {
+      // 鎵嬫満鍙烽獙璇侀�昏緫
+      const phoneRegex = /^1[3-9]\d{9}$/;
+      if (!value) {
+        callback(new Error('璇疯緭鍏ユ墜鏈哄彿'));
+      } else if (!phoneRegex.test(value)) {
+        callback(new Error('鎵嬫満鍙锋牸寮忎笉姝g‘'));
+      } else {
+        callback();
+      }
+    }
     return {
       form: {
         id: null,
@@ -70,6 +94,12 @@
         ],
         realName: [
           { required: true, message: '璇疯緭鍏ョ湡瀹炲鍚�', trigger: 'blur' }
+        ],
+        password: [
+          { validator: validatePassword, trigger: 'blur' }
+        ],
+        phone: [
+          { validator: validatePhone, trigger: 'blur' }
         ]
       }
     }

--
Gitblit v1.8.0