From c2e8526f8f857be5e3a8c6f2b39c5efd424de33e Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 15 十月 2026 11:50:24 +0800
Subject: [PATCH] refactor(auth): 优化认证逻辑和界面组件结构

---
 src/store/auth.ts |   48 ++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/src/store/auth.ts b/src/store/auth.ts
index 15fd19e..c2b1dd6 100644
--- a/src/store/auth.ts
+++ b/src/store/auth.ts
@@ -29,6 +29,8 @@
   const router = useRouter();
 
   const loginLoading = ref(false);
+  let sessionVersion = 0;
+  let logoutTask: Promise<void> | null = null;
 
   /**
    * 寮傛澶勭悊鐧诲綍鎿嶄綔
@@ -44,6 +46,7 @@
   ) {
     // 寮傛澶勭悊鐢ㄦ埛鐧诲綍鎿嶄綔骞惰幏鍙� accessToken
     let userInfo: null | UserInfo = null;
+    const version = ++sessionVersion;
     try {
       let loginResult: AuthApi.LoginResult;
       loginLoading.value = true;
@@ -65,6 +68,7 @@
         }
       }
       const { accessToken, refreshToken } = loginResult;
+      if (version !== sessionVersion) return { userInfo: null };
 
       // 濡傛灉鎴愬姛鑾峰彇鍒� accessToken
       if (accessToken) {
@@ -78,6 +82,7 @@
         //   // getAccessCodesApi(),
         // ]);
         const fetchUserInfoResult = await fetchUserInfo();
+        if (version !== sessionVersion) return { userInfo: null };
 
         userInfo = fetchUserInfoResult.user;
 
@@ -98,8 +103,11 @@
           });
         }
       }
+    } catch (error) {
+      if (version === sessionVersion) throw error;
+      return { userInfo: null };
     } finally {
-      loginLoading.value = false;
+      if (version === sessionVersion) loginLoading.value = false;
     }
 
     return {
@@ -107,16 +115,28 @@
     };
   }
 
-  async function logout(redirect: boolean = true) {
+  function logout(redirect: boolean = true): Promise<void> {
+    if (logoutTask) return logoutTask;
+    const accessToken = accessStore.accessToken;
+    const tenant = { tenantId: accessStore.tenantId, visitTenantId: accessStore.visitTenantId };
+    const fullPath = router.currentRoute.value.fullPath;
+    ++sessionVersion;
+    // 鏈嶅姟鍣ㄦ敞閿�鐙珛鎵ц锛屾湰鍦版竻鐞嗕笌璺宠浆涓嶇瓑寰呯綉缁溿��
+    // 浣跨敤閫�鍑哄墠鐨� token 鍜岀鎴峰揩鐓э紝閬垮厤娓呯悊鍚庝涪澶辨敞閿�涓婁笅鏂囥��
+    if (accessToken) void logoutApi(accessToken, tenant).catch(() => {});
+    logoutTask = clearSessionAndNavigate(redirect, fullPath).finally(() => { logoutTask = null; });
+    return logoutTask;
+  }
+
+  async function clearSessionAndNavigate(redirect: boolean, fullPath: string) {
     try {
-      const accessToken = accessStore.accessToken as string;
-      if (accessToken) {
-        await logoutApi(accessToken);
-      }
-    } catch {
-      // 涓嶅仛浠讳綍澶勭悊
+      resetAllStores();
+    } catch (error) {
+      console.error('Failed to reset business stores during logout', error);
     }
-    resetAllStores();
+    // 璁よ瘉娓呯悊涓嶈兘渚濊禆涓氬姟 store 鐨勯噸缃粨鏋溿��
+    accessStore.$reset();
+    userStore.$reset();
     accessStore.setLoginExpired(false);
 
     // 鍥炵櫥褰曢〉甯︿笂褰撳墠璺敱鍦板潃
@@ -124,18 +144,26 @@
       path: LOGIN_PATH,
       query: redirect
         ? {
-            redirect: encodeURIComponent(router.currentRoute.value.fullPath),
+            redirect: encodeURIComponent(fullPath),
           }
         : {},
     });
   }
 
   async function fetchUserInfo() {
+    const version = sessionVersion;
+    const accessToken = accessStore.accessToken;
     // 鍔犺浇
     // eslint-disable-next-line no-useless-assignment
     let authPermissionInfo: AuthPermissionInfo | null = null;
     authPermissionInfo = await getAuthPermissionInfoApi();
+    if (version !== sessionVersion || accessToken !== accessStore.accessToken) {
+      throw new Error('鐧诲綍鐘舵�佸凡鍙樺寲锛屽拷鐣ユ棫浼氳瘽鐨勭敤鎴蜂俊鎭�');
+    }
     await loadAuditPolicy();
+    if (version !== sessionVersion || accessToken !== accessStore.accessToken) {
+      throw new Error('鐧诲綍鐘舵�佸凡鍙樺寲锛屽拷鐣ユ棫浼氳瘽鐨勭敤鎴蜂俊鎭�');
+    }
     // userStore
     userStore.setUserInfo(authPermissionInfo.user);
     userStore.setUserRoles(authPermissionInfo.roles);

--
Gitblit v1.9.3