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