From a10c7076f59177b04861b3a27eb618ef9a9c4d06 Mon Sep 17 00:00:00 2001
From: zhouwenxuan <1175765986@qq.com>
Date: 星期四, 04 一月 2024 16:02:08 +0800
Subject: [PATCH] 修改密码
---
src/api/systemManage/user/index.ts | 7 +
src/views/system/user/index.vue | 23 +++++
src/layout/navBars/breadcrumb/user.vue | 12 ++
src/views/bigScreen/components/screen.vue | 2
src/views/loginPage/component/accountLogin.vue | 1
src/components/updatePwd/index.vue | 186 ++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 226 insertions(+), 5 deletions(-)
diff --git a/src/api/systemManage/user/index.ts b/src/api/systemManage/user/index.ts
index 17c5453..63a2f9c 100644
--- a/src/api/systemManage/user/index.ts
+++ b/src/api/systemManage/user/index.ts
@@ -17,6 +17,13 @@
data: data
});
},
+ updatePwd: (data: any) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + `/account/user/update/password`,
+ method: 'post',
+ data: data
+ });
+ },
getExpertsList: (data: any) => {
return request({
diff --git a/src/components/updatePwd/index.vue b/src/components/updatePwd/index.vue
new file mode 100644
index 0000000..06e2da5
--- /dev/null
+++ b/src/components/updatePwd/index.vue
@@ -0,0 +1,186 @@
+<template>
+ <div class="system-add-gas-container">
+ <el-dialog
+ title="修改密码"
+ v-model="state.isShowUserDialog"
+ width="600px"
+ >
+ <el-form :model="state.infoForm" size="default" ref="pwdRef" label-width="120px" :rules="state.rules" style="padding: 10px 20px ">
+ <el-form-item label="原密码:" prop="oldPwd" v-if="showOld">
+ <el-input
+ v-model="state.infoForm.oldPwd"
+ type="password"
+ size="large"
+ placeholder="请输入原密码"
+ show-password
+ />
+ </el-form-item>
+ <el-form-item label="新密码:" prop="newPwd">
+ <el-input
+ v-model="state.infoForm.newPwd"
+ type="password"
+ size="large"
+ placeholder="请输入新密码"
+ show-password
+ />
+ </el-form-item>
+ <el-form-item label="重复新密码:" prop="reNewPwd">
+ <el-input
+ v-model="state.infoForm.reNewPwd"
+ type="password"
+ size="large"
+ placeholder="请再次输入新密码"
+ show-password
+ />
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="handleClose" size="default">取 消</el-button>
+ <el-button type="primary" @click="onSubmit" size="default">确 定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup lang="ts">
+import {reactive, ref} from "vue";
+import { userApi } from "/@/api/systemManage/user";
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {ElMessageBox} from "element-plus/es";
+import {useLoginApi} from "/@/api/login";
+import {Session} from "/@/utils/storage";
+import {useI18n} from "vue-i18n";
+
+
+const validatePwd2 = (rule:any, value:any, callback:any)=>{
+ if(value === ''){
+ callback(new Error('请再次输入密码'))
+ }else if(value !== state.infoForm.newPwd){
+ callback(new Error('两次输入密码不同'))
+ }else{
+ callback()
+ }
+}
+const verifyPwd =(val:any) => {
+ // false: 强密码不正确
+ if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[.\-/!@#$%^&*()_+])[A-Za-z\d.\-/!@#$%^&*()_+]{8,}$/.test(val)) return false;
+ // true: 强密码正确
+ else return true;
+}
+
+let validatePwd = (rule:any, value:any, callback:any)=>{
+ if(value === ''){
+ callback(new Error('请输入密码'))
+ }else{
+ if(!verifyPwd(value)){
+ callback(new Error('密码须包含大小写字母、数字、特殊字符,长度不少于8位'))
+ }else{
+ callback()
+ }
+ }
+}
+
+
+const pwdRef = ref();
+const emit = defineEmits(["getInfoData"]);
+const state = reactive({
+ title: '',
+ isShowUserDialog: false,
+ disabled: false,
+ infoForm: {
+ uid: '',
+ oldPwd: '',
+ newPwd: '',
+ reNewPwd: ''
+ },
+ rules: {
+ oldPwd: [{ required: true, message: '请输入原密码', trigger: 'blur'}],
+ newPwd: [{ required: true, validator: validatePwd, trigger: 'blur'}],
+ reNewPwd: [{ required: true, validator: validatePwd2, trigger: 'blur'}]
+ }
+});
+
+const showOld = ref(false);
+const openDialog = (type: string,value: any) => {
+ if(type == 'all'){
+ state.infoForm.uid = Cookies.get('uid');
+ showOld.value = true;
+ }else {
+ state.infoForm.uid = value;
+ showOld.value = false;
+ }
+ state.isShowUserDialog = true;
+};
+
+const { t } = useI18n();
+const onSubmit = async () => {
+ const valid = await pwdRef.value.validate();
+ if(valid) {
+ let {reNewPwd, ...data} = state.infoForm
+ const res = await userApi().updatePwd(data);
+ if(res.data.code == 100) {
+ ElMessageBox({
+ closeOnClickModal: false,
+ closeOnPressEscape: false,
+ title: t('message.user.logOutTitle'),
+ message: t('密码修改成功,请重新登陆!'),
+ showCancelButton: true,
+ confirmButtonText: t('message.user.logOutConfirm'),
+ cancelButtonText: t('message.user.logOutCancel'),
+ buttonSize: 'default',
+ beforeClose: (action, instance, done) => {
+ if (action === 'confirm') {
+ instance.confirmButtonLoading = true;
+ instance.confirmButtonText = t('message.user.logOutExit');
+ setTimeout(() => {
+ done();
+ setTimeout(() => {
+ instance.confirmButtonLoading = false;
+ }, 300);
+ }, 700);
+ } else {
+ done();
+ }
+ }
+ })
+ .then(async () => {
+
+ let res = await useLoginApi().signOut();
+ if (res.data.code === 100) {
+ Session.clear(); // 清除缓存/token等
+ // 使用 reload 时,不需要调用 resetRoute() 重置路由
+ window.location.reload();
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ })
+ .catch(() => {});
+ handleClose();
+ }else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ }
+}
+const handleClose = () => {
+ state.infoForm = {
+ uid: '',
+ oldPwd: '',
+ newPwd: '',
+ reNewPwd: ''
+ };
+ state.isShowUserDialog = false;
+ pwdRef.value.clearValidate();
+}
+defineExpose({
+ openDialog
+});
+</script>
diff --git a/src/layout/navBars/breadcrumb/user.vue b/src/layout/navBars/breadcrumb/user.vue
index bbfacd4..1062bb3 100644
--- a/src/layout/navBars/breadcrumb/user.vue
+++ b/src/layout/navBars/breadcrumb/user.vue
@@ -65,6 +65,7 @@
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="/bigScreen">{{ $t('message.user.dropdown1') }}</el-dropdown-item>
+ <el-dropdown-item command="password">修改密码</el-dropdown-item>
<!-- <el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</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>-->
@@ -74,8 +75,11 @@
</template>
</el-dropdown>
<Search ref="searchRef" />
+ <updatePwd ref="pwdRef" />
</div>
+
</div>
+
</template>
<script lang="ts">
@@ -93,7 +97,7 @@
import Search from '/@/layout/navBars/breadcrumb/search.vue';
import { useLoginApi } from '/@/api/login';
import { useMenuApi } from '/@/api/systemManage/menu/index';
-
+import updatePwd from '/@/components/updatePwd/index.vue'
const menuApi = useMenuApi();
import { backEndComponent, getBackEndControlRoutes, initBackEndControlRoutes, setAddRoute, setFilterMenuAndCacheTagsViewRoutes } from '../../../router/backEnd';
import { NextLoading } from '/@/utils/loading';
@@ -104,7 +108,7 @@
export default defineComponent({
name: 'layoutBreadcrumbUser',
- components: { UserNews, Search },
+ components: { UserNews, Search, updatePwd },
setup() {
const { t } = useI18n();
const { proxy } = <any>getCurrentInstance();
@@ -114,6 +118,7 @@
const storesThemeConfig = useThemeConfig();
const { userInfos } = storeToRefs(stores);
const { themeConfig } = storeToRefs(storesThemeConfig);
+ const pwdRef = ref();
const searchRef = ref();
const state = reactive({
isScreenfull: false,
@@ -188,6 +193,8 @@
.catch(() => {});
} else if (path === 'wareHouse') {
window.open('https://gitee.com/lyt-top/vue-next-admin');
+ } else if (path === 'password') {
+ pwdRef.value.openDialog('all');
} else {
router.push(path);
}
@@ -268,6 +275,7 @@
onComponentSizeChange,
onLanguageChange,
searchRef,
+ pwdRef,
layoutUserFlexNum,
...toRefs(state)
};
diff --git a/src/views/bigScreen/components/screen.vue b/src/views/bigScreen/components/screen.vue
index 1bdcde1..1de6388 100644
--- a/src/views/bigScreen/components/screen.vue
+++ b/src/views/bigScreen/components/screen.vue
@@ -1842,7 +1842,7 @@
width: 350px;
right: 20px;
top: 20px;
- z-index: 99999;
+ z-index: 2000;
.el-select{
width: 60%;
diff --git a/src/views/loginPage/component/accountLogin.vue b/src/views/loginPage/component/accountLogin.vue
index e12a221..800e75a 100644
--- a/src/views/loginPage/component/accountLogin.vue
+++ b/src/views/loginPage/component/accountLogin.vue
@@ -205,6 +205,7 @@
await userInfo.setUserInfos(res.data.data);
Cookies.set('token', res.data.data.tk);
Cookies.set('uid', res.data.data.uid);
+ Cookies.set('roles', JSON.stringify(res.data.data.roles));
if (state.saveCode) {
localStorage.setItem('userCode', state.ruleForm.name)
localStorage.setItem('userPassword', Base64.encode(state.ruleForm.pwd),)
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 04ac9fb..27bcc22 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -37,10 +37,11 @@
</template>
</el-table-column>
<el-table-column prop="idSerial" label="证件号码"></el-table-column>
- <el-table-column label="操作" width="100">
+ <el-table-column label="操作" width="150">
<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 v-if="isAdmin" size="small" text type="primary" @click="updatePwd(scope.row)">重置密码</el-button>
</template>
</el-table-column>
</el-table>
@@ -50,6 +51,7 @@
<br />
</el-card>
<userDialog ref="userRef" @getUserList="initUserTableData"/>
+ <update-pwd ref="pwdRef"></update-pwd>
</div>
</template>
@@ -60,6 +62,8 @@
import { userApi } from '/@/api/systemManage/user';
import { departmentApi } from '/@/api/systemManage/department';
import { useRoleApi } from '/@/api/systemManage/role';
+import updatePwd from '/@/components/updatePwd/index.vue'
+import Cookies from 'js-cookie';
// 定义接口来定义对象的类型
interface TableDataRow {
@@ -105,9 +109,11 @@
export default defineComponent({
name: 'systemUser',
- components: { userDialog },
+ components: { userDialog, updatePwd },
setup() {
const userRef = ref();
+ const pwdRef = ref();
+ const isAdmin = ref(false);
const state = reactive<TableDataState>({
userTableData: {
data: [],
@@ -248,6 +254,7 @@
state.userTableData.listQuery.pageIndex = val;
initUserTableData();
};
+ let roles = [];
// 页面加载时
onMounted(() => {
initUserTableData();
@@ -255,16 +262,28 @@
getRoleData();
// getExpertsData();
getDepList()
+ roles = JSON.parse(Cookies.get('roles'))
+ roles.forEach((item:any) => {
+ if(item.roleId && item.roleName == '超级管理员'){
+ isAdmin.value = true
+ }
+ })
});
+ const updatePwd = (val: any) => {
+ pwdRef.value.openDialog('',val.id);
+ }
return {
userRef,
reset,
onOpenUserDialog,
onRowDel,
+ pwdRef,
onHandleSizeChange,
initUserTableData,
searchByName,
+ updatePwd,
onHandleCurrentChange,
+ isAdmin,
...toRefs(state)
};
}
--
Gitblit v1.9.2