From b8be56fe7c3b38bb21cc36a245e2b86cb2ce3e0d Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期二, 02 九月 2025 11:27:05 +0800
Subject: [PATCH] 解决访问不稳定的问题

---
 manager/src/libs/axios.js |  116 ++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 65 insertions(+), 51 deletions(-)

diff --git a/manager/src/libs/axios.js b/manager/src/libs/axios.js
index be90be5..f1f2832 100644
--- a/manager/src/libs/axios.js
+++ b/manager/src/libs/axios.js
@@ -21,15 +21,19 @@
 
 const service = axios.create({
   timeout: 8000,
-  baseURL: managerUrl,
-  headers: {
-    accessToken: getStore("accessToken")
-  },
+  baseURL: managerUrl
+  // 绉婚櫎鍥哄畾鐨刟ccessToken璁剧疆锛屾敼鍦ㄨ姹傛嫤鎴櫒涓姩鎬佽缃�
 });
 var isRefreshToken = 0;
 const refreshToken = getTokenDebounce();
 service.interceptors.request.use(
   config => {
+    // 鍔ㄦ�佽缃產ccessToken
+    const accessToken = getStore("accessToken");
+    if (accessToken) {
+      config.headers.accessToken = accessToken;
+    }
+    
     if (config.method == "get") {
       config.params = {
         _t: Date.parse(new Date()) / 1000,
@@ -101,24 +105,34 @@
       } else if (error.response.status === 404) {
         // 閬垮厤鍒锋柊token鎶ラ敊
       } else if (error.response.status === 403 || error.response.data.code === 20004) {
-        isRefreshToken++;
-        if (isRefreshToken === 1) {
+        // 鏀硅繘鐨則oken鍒锋柊鏈哄埗锛岄伩鍏嶇珵鎬佹潯浠�
+        if (isRefreshToken === 0) {
+          isRefreshToken = 1;
           const getTokenRes = await refreshToken();
           if (getTokenRes === "success") {
-            // 鍒锋柊token
-            if (isRefreshToken === 1) {
-              error.response.config.headers.accessToken = getStore(
-                "accessToken"
-              );
-              return service(error.response.config);
-            } else {
-              router.go(0);
-            }
+            // 鍒锋柊token鎴愬姛锛岄噸鏂板彂璧疯姹�
+            error.response.config.headers.accessToken = getStore("accessToken");
+            isRefreshToken = 0;
+            return service(error.response.config);
           } else {
+            // 鍒锋柊澶辫触锛岃烦杞埌鐧诲綍椤�
+            isRefreshToken = 0;
             Cookies.set("userInfoManager", "");
+            setStore("accessToken", "");
+            setStore("refreshToken", "");
             router.push("/login");
           }
-          isRefreshToken = 0;
+        } else {
+          // 濡傛灉宸茬粡鏈夎姹傚湪鍒锋柊token锛岀瓑寰呬竴灏忔鏃堕棿鍚庨噸璇�
+          await new Promise(resolve => setTimeout(resolve, 100));
+          if (isRefreshToken === 0) {
+            // token鍒锋柊瀹屾垚锛岄噸鏂板彂璧疯姹�
+            error.response.config.headers.accessToken = getStore("accessToken");
+            return service(error.response.config);
+          } else {
+            // 瓒呮椂鎴栧叾浠栭敊璇紝璺宠浆鍒扮櫥褰曢〉
+            router.push("/login");
+          }
         }
       } else {
         // 鍏朵粬閿欒澶勭悊
@@ -133,46 +147,46 @@
 // 鍘熷鐨刟xios鏆撮湶鍑哄幓鐢ㄥ嵆鍙�
 export default service
 
-// 闃叉姈闂寘鏉ヤ竴娉�
+// 鏀硅繘鐨勯槻鎶栨満鍒�
 function getTokenDebounce() {
   let lock = false;
   let success = false;
+  let resolveCallbacks = []; // 瀛樺偍绛夊緟鐨勫洖璋�
+  
   return function() {
-    if (!lock) {
-      lock = true;
-      let oldRefreshToken = getStore("refreshToken");
-      handleRefreshToken(oldRefreshToken)
-        .then(res => {
-          if (res.success) {
-            let { accessToken, refreshToken } = res.result;
-            setStore("accessToken", accessToken);
-            setStore("refreshToken", refreshToken);
-
-            success = true;
-            lock = false;
-          } else {
-            success = false;
-            lock = false;
-            router.push("/login");
-          }
-        })
-        .catch(err => {
-          success = false;
-          lock = false;
-        });
-    }
     return new Promise(resolve => {
-      // 涓�鐩寸湅lock,鐩村埌璇锋眰澶辫触鎴栬�呮垚鍔�
-      const timer = setInterval(() => {
-        if (!lock) {
-          clearInterval(timer);
-          if (success) {
-            resolve("success");
-          } else {
-            resolve("fail");
-          }
-        }
-      }, 500); // 杞鏃堕棿闂撮殧
+      if (!lock) {
+        lock = true;
+        resolveCallbacks = [resolve]; // 鍒濆鍖栧洖璋冩暟缁�
+        
+        let oldRefreshToken = getStore("refreshToken");
+        handleRefreshToken(oldRefreshToken)
+          .then(res => {
+            if (res.success) {
+              let { accessToken, refreshToken } = res.result;
+              setStore("accessToken", accessToken);
+              setStore("refreshToken", refreshToken);
+              success = true;
+            } else {
+              success = false;
+              router.push("/login");
+            }
+          })
+          .catch(err => {
+            console.error('Token鍒锋柊澶辫触:', err);
+            success = false;
+          })
+          .finally(() => {
+            lock = false;
+            // 鍚屾椂瑙e喅鎵�鏈夌瓑寰呯殑Promise
+            const result = success ? "success" : "fail";
+            resolveCallbacks.forEach(callback => callback(result));
+            resolveCallbacks = [];
+          });
+      } else {
+        // 濡傛灉姝e湪鍒锋柊锛屽皢鍥炶皟鍔犲叆绛夊緟闃熷垪
+        resolveCallbacks.push(resolve);
+      }
     });
   };
 }

--
Gitblit v1.8.0