Sfoglia il codice sorgente

feat: 添加用户加强密码校验和加密&修改密码弹窗逻辑修改

ai0197 3 mesi fa
parent
commit
0c2e91a005

+ 2 - 0
src/api/system/user-operate.ts

@@ -78,6 +78,7 @@ export interface UserLisItem {
   updatedAt: string;
   updatedBy: null;
   username: string;
+  certify: string;
 }
 
 /** root用户给某个租户添加管理员 */
@@ -236,6 +237,7 @@ export interface AddTenantAdminProps {
   isDisabled: boolean | number;
   password: string;
   userId?: number;
+  deptId?: number;
   passwordRe?: string;
 }
 

+ 5 - 3
src/components/Nav.vue

@@ -24,7 +24,7 @@
   </header>
   <Login v-if="userStore.showLogin" @close="userStore.showLogin = false" class="fadeIn" />
   <SwitchAccount v-if="userStore.showSwitchAccount" @close="userStore.showSwitchAccount = false" class="fadeIn" />
-  <UpdatePwd v-if="userStore.showUpdatePwd || firstLogin" @close="handleUpdatePwdClose" class="fadeIn" />
+  <UpdatePwd v-if="userStore.showUpdatePwd || getUserInfo.isFirstLogin" @close="handleUpdatePwdClose" class="fadeIn" />
 </template>
 
 <script lang="ts" setup>
@@ -41,10 +41,12 @@
   import { NAV_LIST } from '@/constant/nav';
   import logo from 'assets/images/home/comac-logo@1X.png';
   import { ElMessage } from 'element-plus';
+  import { storeToRefs } from 'pinia';
   // import searchIcon from 'assets/svg/search.svg';
 
   const userStore = useUserStore();
-  const firstLogin = userStore.getUserInfo.isFirstLogin;
+  const { getUserInfo } = storeToRefs(userStore);
+
   // const activeNav = ref(NAV_LIST[0].name);
   const router = useRouter();
   // const searchValue = ref('');
@@ -72,7 +74,7 @@
   };
 
   const handleUpdatePwdClose = () => {
-    if (firstLogin) {
+    if (getUserInfo.value.isFirstLogin) {
       ElMessage({
         message: '首次登录请修改密码',
         type: 'warning',

+ 8 - 5
src/components/UpdatePwd.vue

@@ -61,7 +61,7 @@
 </template>
 
 <script lang="ts" setup>
-  import { ref, reactive } from 'vue';
+  import { ref, reactive, nextTick } from 'vue';
   import { ElMessage } from 'element-plus';
   import type { FormInstance } from 'element-plus';
   import exitIcon from 'assets/svg/exit.svg';
@@ -142,17 +142,20 @@
         startLoadingAnimation();
         userStore
           .changePassword({
-            userId: userStore.getUserInfo().id,
+            userId: userStore.getUserInfo.id,
             newPwd: md5(PWD_KEY + formValue.newPwd),
             oldPwd: md5(PWD_KEY + formValue.oldPwd),
           })
           .then(() => {
-            emit('close');
             setTimeout(() => {
               stopLoadingAndRedirect();
-            }, 20000);
+            }, 2000);
             userStore.logout();
-            router.push({ path: '/home' });
+            router.replace({ path: '/home' });
+            nextTick(() => {
+              ElMessage.success('修改密码成功');
+              emit('close');
+            });
           })
           .catch(() => {
             ElMessage.error('修改密码失败');

+ 12 - 11
src/views/system/user/CreateAdminDrawer.vue

@@ -1,4 +1,5 @@
 <template>
+  <!-- 该组件并未被使用 -->
   <el-drawer v-model="isDrawer" :size="width" :title="props.title" @close="handleReset">
     <el-form :model="formParams" :rules="rules" ref="formRef" label-placement="left" :label-width="80">
       <el-form-item label="登录账号" prop="username">
@@ -198,17 +199,17 @@
     });
   }
 
-  watch(
-    () => props,
-    () => {
-      if (props.isCanAddTenant && !props.isTargetTenantSys) {
-        rules!.roleIdList!.required = false;
-      }
-    },
-    {
-      immediate: true,
-    },
-  );
+  // watch(
+  //   () => props,
+  //   () => {
+  //     if (props.isCanAddTenant && !props.isTargetTenantSys) {
+  //       rules!.roleIdList!.required = false;
+  //     }
+  //   },
+  //   {
+  //     immediate: true,
+  //   },
+  // );
 
   defineExpose({
     openDrawer,

+ 48 - 17
src/views/system/user/CreateDrawer.vue

@@ -58,7 +58,7 @@
       <el-form-item v-if="isAddUser" label="密码" prop="password">
         <el-input type="password" show-password-on="mousedown" placeholder="请输入密码" v-model="formParams.password" />
       </el-form-item>
-      <el-form-item v-if="isAddUser" label="确认密码" :prop="!formParams.username ? 'passwordRe' : ''">
+      <el-form-item v-if="isAddUser" label="确认密码" prop="passwordRe">
         <el-input
           type="password"
           show-password-on="mousedown"
@@ -97,6 +97,26 @@
     TransformedTreeNode,
     removeParentheses,
   } from '@/utils/findUserByWorkNo';
+  import { checkPwdRegexp, PWD_KEY, PWD_MESSAGE } from '@/utils/pwd';
+  import md5 from 'blueimp-md5';
+
+  const validateNewPassword = (rule: any, value: string, callback: any) => {
+    if (value.length < 6) {
+      callback(new Error('密码长度不能小于6位'));
+    } else if (!checkPwdRegexp(value)) {
+      callback(new Error(PWD_MESSAGE));
+    } else {
+      callback();
+    }
+  };
+
+  const validateConfirmPassword = (rule: any, value: string, callback: any) => {
+    if (value !== formParams.value.password) {
+      callback(new Error('两次输入密码不一致'));
+    } else {
+      callback();
+    }
+  };
 
   const rules: FormRules = {
     username: {
@@ -116,16 +136,22 @@
       trigger: 'change',
       type: 'array',
     },
-    password: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
-    passwordRe: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
+    password: [
+      {
+        required: true,
+        message: '密码不能为空',
+        trigger: 'blur',
+      },
+      { validator: validateNewPassword, trigger: 'blur' },
+    ],
+    passwordRe: [
+      {
+        required: true,
+        message: '密码不能为空',
+        trigger: 'blur',
+      },
+      { validator: validateConfirmPassword, trigger: 'blur' },
+    ],
     realname: {
       required: true,
       message: '用户名不能为空',
@@ -226,7 +252,7 @@
       formParams.value.username = findUser.idtUserWorkNo;
       formParams.value.roleIdList = JSON.parse(findUser.useTypes);
       formParams.value.mobile = findUser.idtUserMobile;
-      formParams.value.deptId = findOrgCodeByWorkNo(OrganizationSourceData.value, value);
+      formParams.value.deptId = Number(findOrgCodeByWorkNo(OrganizationSourceData.value, value));
     }
   };
 
@@ -246,7 +272,7 @@
   function formSubmit() {
     formRef.value.validate((valid) => {
       if (!valid) {
-        return message.error('请填写完整信息');
+        return message.error('请填写正确完整信息');
       }
       // 克隆
       const params = cloneDeep(formParams.value);
@@ -254,11 +280,16 @@
       if (params.deptId) {
         params.deptId = params.deptId;
       }
-      if (params.password != params.passwordRe) {
-        return message.error('两次密码不一致');
-      }
-      params.staffNo = removeParentheses(params.staffNo);
+      // if (params.password != params.passwordRe) {
+      //   return message.error('两次密码不一致');
+      // }
+
+      params.password = md5(PWD_KEY + formParams.value.password);
+      params.passwordRe = '';
+
+      params.staffNo = removeParentheses(params.staffNo!);
       formParams.value.isDisabled ? (params.isDisabled = DisabledEnum.NO) : (params.isDisabled = DisabledEnum.YES);
+
       if (isAddUser.value) {
         addSingleUser(params)
           .then((res) => {