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