Forráskód Böngészése

feat: 重置密码修改密码加密&加水印

ai0197 4 hónapja
szülő
commit
49c0abfa8a

+ 20 - 5
src/App.vue

@@ -1,17 +1,31 @@
 <template>
   <div id="app">
-    <Nav v-if="!isFixedScreen" />
-    <div class="content" :class="{ 'fixed-screen': isFixedScreen }">
-      <router-view />
-    </div>
+    <el-watermark :content="[username, realname]" :font="font" :width="90" :gap="[150, 150]">
+      <Nav v-if="!isFixedScreen" />
+      <div class="content" :class="{ 'fixed-screen': isFixedScreen }">
+        <router-view />
+      </div>
+    </el-watermark>
   </div>
 </template>
 
 <script setup lang="ts">
   import { useRoute } from 'vue-router';
-  import { computed } from 'vue';
+  import { computed, reactive } from 'vue';
+  import { storeToRefs } from 'pinia';
+  import { useUserStore } from '@/store/modules/user';
   import Nav from '@/components/Nav.vue';
 
+  const userStore = useUserStore();
+  const { getUserInfo } = storeToRefs(userStore);
+
+  const username = computed(() => getUserInfo.value.username);
+  const realname = computed(() => getUserInfo.value.realname);
+
+  const font = reactive({
+    color: 'rgba(0,0,0,.05)',
+  });
+
   const route = useRoute();
   const isFixedScreen = computed(
     () => route.matched.some((r) => r.meta?.fixedScreen === true) || route.path.startsWith('/institute-safety'),
@@ -26,6 +40,7 @@
     height: 100vh;
   }
   .content {
+    height: 100%;
     flex: 1;
     overflow-y: auto;
     overflow-x: hidden;

+ 19 - 2
src/components/UpdatePwd.vue

@@ -67,6 +67,8 @@
   import exitIcon from 'assets/svg/exit.svg';
   import { useUserStore } from '@/store/modules/user';
   import router from '@/router';
+  import md5 from 'blueimp-md5';
+  import { checkPwdRegexp, PWD_KEY, PWD_MESSAGE } from '@/utils/pwd';
 
   const userStore = useUserStore();
 
@@ -102,6 +104,16 @@
     showOverlay.value = false;
   };
 
+  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 !== formValue.newPwd) {
       callback(new Error('两次输入密码不一致'));
@@ -114,7 +126,8 @@
     oldPwd: [{ required: true, message: '原密码不能为空', trigger: 'blur' }],
     newPwd: [
       { required: true, message: '新密码不能为空', trigger: 'blur' },
-      { min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
+      { validator: validateNewPassword, trigger: 'blur' },
+      // { min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
     ],
     confirmPwd: [
       { required: true, message: '请确认新密码', trigger: 'blur' },
@@ -128,7 +141,11 @@
       if (valid) {
         startLoadingAnimation();
         userStore
-          .changePassword(formValue)
+          .changePassword({
+            userId: userStore.getUserInfo().id,
+            newPwd: md5(PWD_KEY + formValue.newPwd),
+            oldPwd: md5(PWD_KEY + formValue.oldPwd),
+          })
           .then(() => {
             emit('close');
             setTimeout(() => {

+ 8 - 1
src/hooks/setting/index.ts

@@ -4,7 +4,12 @@ import { warn } from '@/utils/log';
 import { getAppEnvConfig } from '@/utils/env';
 
 export const useGlobSetting = (): Readonly<GlobConfig> => {
-  const { VITE_GLOB_APP_TITLE, VITE_GLOB_API_URL_PREFIX, VITE_GLOB_DRILL_SIGN_URL } = getAppEnvConfig();
+  const {
+    VITE_GLOB_APP_TITLE,
+    VITE_GLOB_API_URL_PREFIX,
+    VITE_GLOB_DRILL_SIGN_URL,
+    // VITE_GLOB_TENANT_CODE
+  } = getAppEnvConfig();
 
   // Take global configuration
   const glob: Readonly<GlobConfig> = {
@@ -13,6 +18,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
     urlPrefix: VITE_GLOB_API_URL_PREFIX || '',
 
     drillSignUrl: VITE_GLOB_DRILL_SIGN_URL || '',
+
+    // tenantCode: VITE_GLOB_TENANT_CODE,
   };
   return glob as Readonly<GlobConfig>;
 };

+ 7 - 2
src/utils/pwd.ts

@@ -1,7 +1,12 @@
 const PWD_KEY = 'NavieAdmin_';
 
 // 中密码正则(字母+数字,可含特殊字符)
-const PWD_REGEXP = /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z0-9!@#$%^&*`~()-+=]{6,18}$/;
+// const PWD_REGEXP = /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z0-9!@#$%^&*`~()-+=]{6,18}$/;
+// 强密码:大小写+数字+特殊字符,长度≥6
+// const PWD_REGEXP = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{6,12}$/;
+const PWD_REGEXP = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[#@$!%*?&])[a-zA-Z\d#@$!%*?&]{6,12}$/;
+
+const PWD_MESSAGE = '密码6-12位包含 数字 字母 特殊字符(#@$!%*?&)';
 const checkPwdRegexp = (pwd: string) => PWD_REGEXP.test(pwd);
 
-export { PWD_KEY, PWD_REGEXP, checkPwdRegexp };
+export { PWD_KEY, PWD_REGEXP, checkPwdRegexp, PWD_MESSAGE };

+ 50 - 51
src/views/system/user/ResetCodeDrawer.vue

@@ -1,22 +1,11 @@
 <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 :model="formParams" :rules="rules" ref="formRef" label-placement="left" :label-width="80">
       <el-form-item label="登录账号" prop="username">
         <el-input placeholder="请输入登录账号" v-model="formParams.username" disabled />
       </el-form-item>
       <el-form-item label="新密码" prop="password">
-        <el-input
-          type="password"
-          show-password-on="mousedown"
-          placeholder="请输入密码"
-          v-model="formParams.password"
-        />
+        <el-input type="password" show-password-on="mousedown" placeholder="请输入密码" v-model="formParams.password" />
       </el-form-item>
       <el-form-item label="确认密码" prop="passwordRe">
         <el-input
@@ -40,25 +29,40 @@
 <script lang="ts" setup>
   import { ref } from 'vue';
   import { FormRules, ElMessage } from 'element-plus';
-  import { cloneDeep } from 'lodash-es';
+  import type { FormInstance } from 'element-plus';
+  // import { cloneDeep } from 'lodash-es';
   import { UserType, resetCode } from '@/api/system/user-operate';
+  import md5 from 'blueimp-md5';
+  import { checkPwdRegexp, PWD_KEY, PWD_MESSAGE } from '@/utils/pwd';
+
+  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: {
-      required: true,
-      message: '登录账号不能为空',
-      trigger: 'blur',
-    },
-    password: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
-    passwordRe: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
+    username: [{ 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' },
+    ],
   };
   const emit = defineEmits(['change']);
 
@@ -79,13 +83,13 @@
   });
 
   const message = ElMessage;
-  const formRef: any = ref(null);
+  const formRef = ref<FormInstance>();
   const isDrawer = ref(false);
   const subLoading = ref(false);
 
   const formParams = ref<UserType>(defaultValueRef());
 
-  async function openDrawer(username?, userId? ) {
+  async function openDrawer(username?, userId?) {
     formParams.value.username = username;
     formParams.value.userId = userId;
     isDrawer.value = true;
@@ -96,31 +100,26 @@
   }
 
   function formSubmit() {
-    formRef.value.validate((valid) => {
-      if (!valid) {
-        return message.error('请填写完整信息');
-      }
-      // 克隆
-      const params = cloneDeep(formParams.value);
-      if (params.password != params.passwordRe) {
-        return message.error('两次密码不一致');
-      }
-      const addData = {
-        newPwd: formParams.value.password as string,
-        userId: Number(formParams.value.userId),
-      };
-      resetCode(addData).then(() => {
-        emit('change');
-        handleReset();
-        closeDrawer();
-        ElMessage.success('重置成功');
-      });
+    if (!formRef.value) return;
+    formRef.value.validate((valid: boolean) => {
+      if (valid) {
+        const addData = {
+          userId: Number(formParams.value.userId),
+          newPwd: md5(PWD_KEY + formParams.value.password),
+        };
 
-      //然后进行调接口
+        resetCode(addData).then(() => {
+          emit('change');
+          handleReset();
+          closeDrawer();
+          ElMessage.success('重置成功');
+        });
+      }
     });
   }
 
   function handleReset() {
+    if (!formRef.value) return;
     formRef.value.resetFields();
     formParams.value = Object.assign(formParams.value, defaultValueRef());
   }

+ 4 - 0
types/config.d.ts

@@ -56,6 +56,8 @@ export interface GlobConfig {
   urlPrefix: string;
   // 签到二维码地址
   drillSignUrl: string;
+  // 租户code
+  // tenantCode?: string;
 }
 
 export interface GlobEnvConfig {
@@ -65,6 +67,8 @@ export interface GlobEnvConfig {
   VITE_GLOB_API_URL_PREFIX: string;
   // 签到二维码地址
   VITE_GLOB_DRILL_SIGN_URL: string;
+  // 租户code
+  VITE_GLOB_TENANT_CODE: string;
 }
 
 // export interface GlobConfig {