Browse Source

feat: 60天未修改密码时,在登录之后立即开启修改框进行提示

zhangying 7 months ago
parent
commit
1f6bb6e5a9

+ 14 - 2
vue/src/layout/header/index.vue

@@ -42,7 +42,7 @@
 </template>
 
 <script lang="tsx" setup>
-import {computed, type CSSProperties, nextTick, onMounted, ref} from 'vue';
+import {computed, type CSSProperties, nextTick, onMounted, ref, watch} from 'vue';
 import {useRoute, useRouter} from 'vue-router';
 import {LockOutlined, PoweroffOutlined, QuestionCircleOutlined,} from '@ant-design/icons-vue';
 import {type MenuTheme, message, Modal, Space, Tooltip,} from 'ant-design-vue';
@@ -68,6 +68,7 @@ const userStore = useUserStore();
 const themeStore = useThemeStore();
 /*const lockscreenStore = useLockscreenStore();*/
 const keepAliveStore = useKeepAliveStore();
+const updateDatNum = ref<any>(userStore.getUpdateDayNum);
 
 const router = useRouter();
 const route = useRoute();
@@ -112,7 +113,7 @@ const doLogout = () => {
 function onUpdatePassword() {
   const userInfo = JSON.parse(JSON.stringify(userStore.getUserInfo));
   console.log(userInfo)
-  updatePasswordRef.value.show(userInfo.userID, userInfo.name, userInfo.loginID);
+  updatePasswordRef.value.show(userInfo.userID, userInfo.name, userInfo.loginID, true);
   // updatePasswordRef.value.show(userStore.getUserInfo, data.userName, 111);
 };
 
@@ -122,6 +123,17 @@ onMounted(() => {
   }, () => {
     isDev.value = true;
   })
+
+  // 监听登录用户的上一次修改距今天数
+  watch(updateDatNum, (newValue: any, oldValue: any) => {
+    // 检查是否已经触发过监听
+    const hasTriggered = localStorage.getItem("passwordUpdateTriggered");
+    if (!hasTriggered && newValue !== oldValue && newValue >= 60) {
+      onUpdatePassword();
+      // 设置标记值到 localStorage,表示已经触发过
+      localStorage.setItem("passwordUpdateTriggered", 'true');
+    }
+  }, {deep: true, immediate: true})
 })
 
 </script>

+ 16 - 0
vue/src/store/modules/user.ts

@@ -9,6 +9,7 @@ import { logout, getInfo, permmenu } from '@/api/account';
 import { generatorDynamicRouter } from '@/router/generator-router';
 import { resetRouter } from '@/router';
 import {oauthLogin} from "@/api/oauth";
+import dayjs from "dayjs";
 
 interface UserState {
   token: string;
@@ -20,6 +21,7 @@ interface UserState {
   userInfo: Partial<API.AdminUserInfo>;
   dataRangeList: Partial<API.DataRange>[];
   avtImage: number;
+  updateDayNum: number;
 }
 
 export const useUserStore = defineStore({
@@ -33,6 +35,7 @@ export const useUserStore = defineStore({
     userInfo: {},
     dataRangeList: Storage.get(ACCESS_DATA_RANGE_KEY, null),
     avtImage: 0,
+    updateDayNum: 0,
   }),
   getters: {
     getToken(): string {
@@ -56,6 +59,9 @@ export const useUserStore = defineStore({
     },
     getAvtImage(): number {
       return this.avtImage;
+    },
+    getUpdateDayNum(): number {
+      return this.updateDayNum;
     }
   },
   actions: {
@@ -136,6 +142,10 @@ export const useUserStore = defineStore({
         const generatorResult = await generatorDynamicRouter(menus);
         this.menus = generatorResult.menus.filter((item) => !item.meta?.hideInMenu);
         //!wsStore.client && wsStore.initSocket();
+        // 通过修改时间判断,上一次修改是否距离今天超过60天
+        const today = dayjs();
+        this.updateDayNum = today.diff(userInfo.updateTime, "day");
+        console.log("上次修改是:" + this.updateDayNum + "天前");
 
         return { menus, perms, userInfo };
       } catch (error) {
@@ -149,12 +159,18 @@ export const useUserStore = defineStore({
       //const wsStore = useWsStore();
       //wsStore.closeSocket();
       this.resetToken();
+      this.setUpdateDayNum();
       resetRouter();
     },
     /** 修改头像通知 */
     setAvtImageNum() {
       this.avtImage += 1;
       console.log(this.avtImage);
+    },
+    /** 重置修改 */
+    setUpdateDayNum() {
+      Storage.remove("passwordUpdateTriggered");
+      this.updateDayNum = 0;
     }
   },
 });

+ 1 - 1
vue/src/views/system/users/index.vue

@@ -183,7 +183,7 @@
       };
 
       const onUpdatePassword = (item) => {
-        updatePasswordRef.value.show(item.UserID, item.Name, item.LoginID);
+        updatePasswordRef.value.show(item.UserID, item.Name, item.LoginID, false);
       };
 
       const loadData = async function () {

+ 14 - 2
vue/src/views/system/users/updatePassword.vue

@@ -11,6 +11,9 @@
     :mask-closable="false"
   >
     <a-form autocomplete="off">
+      <p style="width:100%; color: red; text-align: center;margin-bottom: 5px"
+         v-if="isShowUpdateMsg && updateDatNum >= 60">
+        距离上次修改密码已过去{{ updateDatNum }}天,建议修改密码</p>
       <a-row :gutter="24">
         <a-col :span="24">
           <a-form-item label="用户名" :label-col="{span:8}" name="userName">
@@ -48,6 +51,7 @@
 import {defineComponent, reactive, ref} from "vue";
 import {Form} from "ant-design-vue";
 import {updateUserPassword} from "@/api/system/user";
+import {useUserStore} from "@/store/modules/user";
 
 export default defineComponent({
   props: {
@@ -57,6 +61,8 @@ export default defineComponent({
     }
   },
   setup() {
+    const userStore = useUserStore();
+    const updateDatNum = ref<any>(userStore.getUpdateDayNum);
     const visible = ref<boolean>(false);
     const confirmLoading = ref<boolean>(false);
     const useForm = Form.useForm;
@@ -92,8 +98,9 @@ export default defineComponent({
       ]
     });
     const {validate, validateInfos} = useForm(dataModel, rulesRef);
+    const isShowUpdateMsg = ref(false);
 
-    const show = (userID: any, userName: any, loginID: any) => {
+    const show = (userID: any, userName: any, loginID: any, showUpdateMsg: any) => {
       console.log(userID, userName, loginID)
       visible.value = true;
       dataModel.value.userID = userID;
@@ -101,6 +108,7 @@ export default defineComponent({
       dataModel.value.loginID = loginID;
       dataModel.value.pwd_default = "";
       dataModel.value.pwd_confirm = "";
+      isShowUpdateMsg.value = showUpdateMsg;
     };
 
     const handleOk = () => {
@@ -108,6 +116,8 @@ export default defineComponent({
         updateUserPassword(dataModel.value).then(result => {
           if (result) {
             visible.value = false;
+            userStore.setUpdateDayNum();
+            updateDatNum.value = 0;
           }
         });
       });
@@ -126,7 +136,9 @@ export default defineComponent({
       handleCancel,
       formState,
       validateInfos,
-      validate
+      validate,
+      updateDatNum,
+      isShowUpdateMsg
     };
   },
   created() {