From 1f26c30a8d1c5e3d9ab262b382284c8ea96f29b2 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期二, 05 十一月 2024 15:47:17 +0800
Subject: [PATCH] 修改密码
---
src/api/systemManage/user/index.ts | 17 ++++
src/views/system/user/index.vue | 43 ++++++++++
src/layout/navBars/breadcrumb/user.vue | 13 ++
src/views/loginPage/loginPage.vue | 2
src/utils/toolsValidate.ts | 5
src/views/loginPage/component/accountLogin.vue | 2
src/api/systemManage/menu/index.ts | 2
src/views/system/user/component/resetPwd.vue | 155 ++++++++++++++++++++++++++++++++++++++
8 files changed, 228 insertions(+), 11 deletions(-)
diff --git a/src/api/systemManage/menu/index.ts b/src/api/systemManage/menu/index.ts
index 84e24af..4f7ac4c 100644
--- a/src/api/systemManage/menu/index.ts
+++ b/src/api/systemManage/menu/index.ts
@@ -17,7 +17,7 @@
// },
getMenuAdmin: () => {
return request({
- url: import.meta.env.VITE_API_URL + `/sys/console/menu/get/all`,
+ url: import.meta.env.VITE_API_URL + `/sys/menu/get/u`,
method: 'get'
});
},
diff --git a/src/api/systemManage/user/index.ts b/src/api/systemManage/user/index.ts
index 17c5453..d748f5d 100644
--- a/src/api/systemManage/user/index.ts
+++ b/src/api/systemManage/user/index.ts
@@ -69,6 +69,21 @@
url: import.meta.env.VITE_API_URL + `/account/list`,
method: 'get'
});
- }
+ },
+
+ modPwd: (data: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + `/account/user/update/password`,
+ method: 'post',
+ data: data
+ });
+ },
+ resetPwd: (data: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + `/account/user/update/resetPassword`,
+ method: 'post',
+ data: data
+ });
+ },
};
}
diff --git a/src/layout/navBars/breadcrumb/user.vue b/src/layout/navBars/breadcrumb/user.vue
index 9f7f963..18deb10 100644
--- a/src/layout/navBars/breadcrumb/user.vue
+++ b/src/layout/navBars/breadcrumb/user.vue
@@ -67,7 +67,7 @@
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="/project">{{ $t('message.user.dropdown1') }}</el-dropdown-item>
- <!-- <el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</el-dropdown-item>-->
+ <el-dropdown-item @click="openResetPwd">修改密码</el-dropdown-item>
<!-- <el-dropdown-item command="/personal">{{ $t('message.user.dropdown2') }}</el-dropdown-item>-->
<!-- <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item>-->
<!-- <el-dropdown-item command="/401">{{ $t('message.user.dropdown4') }}</el-dropdown-item>-->
@@ -75,6 +75,7 @@
</el-dropdown-menu>
</template>
</el-dropdown>
+ <reset-pwd ref="pwdRef"></reset-pwd>
<Search ref="searchRef" />
</div>
</div>
@@ -103,10 +104,11 @@
import { dynamicRoutes } from '/@/router/route';
import Cookies from 'js-cookie';
import {useRoutesList} from "/@/stores/routesList";
+import ResetPwd from "/@/views/system/user/component/resetPwd.vue";
export default defineComponent({
name: 'layoutBreadcrumbUser',
- components: { UserNews, Search },
+ components: { UserNews, Search, ResetPwd},
setup() {
const { t } = useI18n();
const { proxy } = <any>getCurrentInstance();
@@ -117,6 +119,7 @@
const { userInfos } = storeToRefs(stores);
const { themeConfig } = storeToRefs(storesThemeConfig);
const searchRef = ref();
+ const pwdRef = ref()
const state = reactive({
isScreenfull: false,
disabledI18n: 'zh-cn',
@@ -199,6 +202,10 @@
const onSearchClick = () => {
searchRef.value.openSearch();
};
+
+ const openResetPwd = () => {
+ pwdRef.value.openDialog()
+ }
// 组件大小改变
const onComponentSizeChange = (size: string) => {
Local.remove('themeConfig');
@@ -282,6 +289,7 @@
return {
userInfos,
toHome,
+ openResetPwd,
onLayoutSetingClick,
onHandleCommandClick,
onScreenfullClick,
@@ -289,6 +297,7 @@
onComponentSizeChange,
onLanguageChange,
searchRef,
+ pwdRef,
layoutUserFlexNum,
...toRefs(state)
};
diff --git a/src/utils/toolsValidate.ts b/src/utils/toolsValidate.ts
index da8421e..8033a29 100644
--- a/src/utils/toolsValidate.ts
+++ b/src/utils/toolsValidate.ts
@@ -256,9 +256,10 @@
* @param val 当前值字符串
* @returns 返回 true: 强密码正确
*/
-export function verifyPasswordPowerful(val: string) {
+
+export function verifyPwd(val: string) {
// false: 强密码不正确
- if (!/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val)) return false;
+ if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[.\-/!@#$%^&*()_+])[A-Za-z\d.\-/!@#$%^&*()_+]{8,}$/.test(val)) return false;
// true: 强密码正确
else return true;
}
diff --git a/src/views/loginPage/component/accountLogin.vue b/src/views/loginPage/component/accountLogin.vue
index 9f69a09..d0c412f 100644
--- a/src/views/loginPage/component/accountLogin.vue
+++ b/src/views/loginPage/component/accountLogin.vue
@@ -19,7 +19,7 @@
</el-form-item>
<el-form-item class="login-animation4 codeDeal">
<el-checkbox v-model="saveCode" label="记住密码" size="large" />
- <span class="forgetCode" @click="identify">忘记密码?</span>
+<!-- <span class="forgetCode" @click="identify">忘记密码?</span>-->
</el-form-item>
<div class="btnBox">
<el-button type="primary" class="login-content-submit" round @click="onSignIn" :loading="loading.signIn">
diff --git a/src/views/loginPage/loginPage.vue b/src/views/loginPage/loginPage.vue
index 0fa360d..0bfc8b9 100644
--- a/src/views/loginPage/loginPage.vue
+++ b/src/views/loginPage/loginPage.vue
@@ -169,7 +169,7 @@
letter-spacing: 6px;
white-space: nowrap;
position: relative;
- z-index: 9999;
+ z-index: 999;
text-shadow: 0 3px 5px rgba(72,91,212,.4);
}
diff --git a/src/views/system/user/component/resetPwd.vue b/src/views/system/user/component/resetPwd.vue
new file mode 100644
index 0000000..e3b441c
--- /dev/null
+++ b/src/views/system/user/component/resetPwd.vue
@@ -0,0 +1,155 @@
+<template>
+ <el-dialog title="修改" v-model="isShowUserDialog" width="400px">
+ <el-form :model="userForm" size="default" ref="userRef" :rules="userFormRules" label-width="100px">
+ <el-row :gutter="35">
+ <el-col class="mb20">
+ <el-form-item label="原密码" prop="oldPwd">
+ <el-input v-model.trim="userForm.oldPwd" placeholder="原密码" type="password" show-password>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col class="mb20">
+ <el-form-item label="新密码" prop="newPwd">
+ <el-input v-model.trim="userForm.newPwd" placeholder="新密码" type="password" show-password>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col class="mb20">
+ <el-form-item label="确认新密码" prop="reNewPwd">
+ <el-input v-model.trim="userForm.reNewPwd" placeholder="再次确认新密码" type="password" show-password>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="isShowUserDialog = !isShowUserDialog" size="default">取 消</el-button>
+ <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue';
+import { ElMessage } from 'element-plus';
+import { userApi } from '/@/api/systemManage/user'
+import {verifyPwd} from "/@/utils/toolsValidate"
+import {useUserInfo} from "/@/stores/userInfo";
+import {storeToRefs} from "pinia";
+import {useLoginApi} from "/@/api/login";
+import {Session} from "/@/utils/storage";
+const userInfo = useUserInfo();
+const { userInfos } = storeToRefs(userInfo);
+interface UserState {
+ isShowUserDialog: boolean;
+ userForm: {
+ uid: null | number | string,
+ oldPwd: string,
+ newPwd: string,
+ reNewPwd: string
+ };
+ userFormRules:{},
+}
+
+export default defineComponent({
+ name: 'pwdDialog',
+ setup(props, context) {
+ const userRef = ref()
+ const validatePwd = (rule: any, value: any, callback: any)=>{
+ if(value === ''){
+ callback(new Error('请输入密码'))
+ }else{
+ if(!verifyPwd(value)){
+ callback(new Error('密码须包含大小写字母、数字、特殊字符,长度不少于8位'))
+ }else{
+ callback()
+ }
+ }
+ }
+
+ const validatePass2 = (rule: any, value: any, callback: any) => {
+ if (value === '') {
+ callback(new Error('该内容不能为空'))
+ } else if (value !== state.userForm.newPwd) {
+ callback(new Error("两次输入的密码不一致!"))
+ } else {
+ callback()
+ }
+ }
+
+ const state = reactive<UserState>({
+ isShowUserDialog: false,
+ userForm: {
+ uid: null,
+ oldPwd: '',
+ newPwd: '',
+ reNewPwd: ''
+ },
+ userFormRules:{
+ oldPwd: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
+ newPwd: [{ required: true, validator: validatePwd, trigger: 'blur' }],
+ reNewPwd: [{ required: true, validator: validatePass2, trigger: 'blur' }],
+ },
+ })
+
+
+ // 打开弹窗
+ const openDialog = () => {
+ state.userForm = {
+ uid: null,
+ oldPwd: '',
+ newPwd: '',
+ reNewPwd: ''
+ }
+ state.isShowUserDialog = true
+ state.userForm.uid = Number(userInfos.value.uid)
+ }
+
+ // 新增修改
+ const onSubmit = async () => {
+ userRef.value.validate(async (valid:Boolean) => {
+ if(valid){
+ const {reNewPwd,...data} = state.userForm
+ const res = await userApi().modPwd(data)
+ if(res.data.code == 100){
+ ElMessage({
+ type:'success',
+ message: '密码修改成功,需重新登录'
+ })
+ useLoginApi()
+ .signOut()
+ .then(() => {
+ Session.clear();
+ window.location.href = '/';
+ });
+ }else{
+ ElMessage({
+ type:'warning',
+ message: res.data.msg
+ })
+ }
+ }else{
+ ElMessage({
+ type:'warning',
+ message:'请完善基本信息'
+ })
+ }
+ })
+
+ }
+
+ // 页面加载时
+ onMounted(() => {
+
+ });
+ return {
+ userRef,
+ openDialog,
+ onSubmit,
+ ...toRefs(state)
+ };
+ }
+});
+</script>
\ No newline at end of file
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 473f805..3227346 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -44,8 +44,9 @@
<el-table-column prop="idSerial" label="证件号码"></el-table-column>
<el-table-column label="操作" width="100">
<template #default="scope">
- <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('修改', scope.row)">修改</el-button>
- <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+ <el-button :disabled="scope.row.name === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('修改', scope.row)">修改</el-button>
+ <el-button style="color: red" :disabled="scope.row.name === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+ <el-button v-if="scope.row.name !== 'admin'" style="color: red" :disabled="!isAdmin" size="small" text type="primary" @click="onResetPwd(scope.row)">重置密码</el-button>
</template>
</el-table-column>
</el-table>
@@ -65,7 +66,10 @@
import { userApi } from '/@/api/systemManage/user';
import { departmentApi } from '/@/api/systemManage/department';
import { useRoleApi } from '/@/api/systemManage/role';
-
+import {useUserInfo} from "/@/stores/userInfo";
+import {storeToRefs} from "pinia";
+const userInfo = useUserInfo();
+const { userInfos } = storeToRefs(userInfo);
// 定义接口来定义对象的类型
interface TableDataRow {
userName: string;
@@ -87,6 +91,7 @@
}
interface TableDataState {
+ isAdmin: boolean
userTableData: {
data: Array<TableDataRow>;
total: number;
@@ -115,6 +120,7 @@
setup() {
const userRef = ref();
const state = reactive<TableDataState>({
+ isAdmin: false,
userTableData: {
data: [],
total: 0,
@@ -168,6 +174,31 @@
const searchByName = ()=>{
initUserTableData()
+ }
+
+ const onResetPwd = (row: TableDataRow)=>{
+ ElMessageBox.confirm(`此操作将重置:“${row.name}”的密码,是否继续?`, '提示', {
+ confirmButtonText: '确认',
+ cancelButtonText: '取消',
+ type: 'warning'
+ })
+ .then(async () => {
+ let res = await userApi().resetPwd({uid: row.id});
+ if (res.data.code === 100) {
+ ElMessage({
+ type: 'success',
+ duration: 2000,
+ message: '密码重置成功'
+ });
+ await initUserTableData();
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ })
+ .catch(() => {});
}
const reset = () =>{
@@ -267,9 +298,15 @@
getRoleData();
getExpertsData();
getDepList()
+ if(userInfos.value.roles.find(i=>i.roleId == 6 || i.roleId == 7)){
+ state.isAdmin = true
+ }else{
+ state.isAdmin = false
+ }
});
return {
userRef,
+ onResetPwd,
reset,
onOpenUserDialog,
onRowDel,
--
Gitblit v1.9.2