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