From 8fde755dd2a8b2fcd99483a5b603974c9df95fe5 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 25 九月 2025 18:28:24 +0800
Subject: [PATCH] 商家端token过期问题

---
 seller/src/libs/axios.js |  147 ++++++++++++++++++++++++++++--------------------
 1 files changed, 86 insertions(+), 61 deletions(-)

diff --git a/seller/src/libs/axios.js b/seller/src/libs/axios.js
index a3dbfdc..a56faf8 100644
--- a/seller/src/libs/axios.js
+++ b/seller/src/libs/axios.js
@@ -20,10 +20,54 @@
 
 export const uploadFile2 = commonUrl + "/common/lmk/file/upload";
 
-var isRefreshToken = 0;
-const refreshToken = getTokenDebounce();
-const service = axios.create({
+// 浣跨敤鐘舵�佹爣璁版浛浠h鏁板櫒锛岄伩鍏嶇珵鎬佹潯浠�
+let isRefreshing = false;
+let failedQueue = [];
 
+const processQueue = (error, token = null) => {
+  failedQueue.forEach(prom => {
+    if (error) {
+      prom.reject(error);
+    } else {
+      prom.resolve(token);
+    }
+  });
+  
+  failedQueue = [];
+};
+
+// 鏀硅繘鐨則oken鍒锋柊闃叉姈鏈哄埗
+let refreshTokenPromise = null;
+const refreshToken = () => {
+  if (refreshTokenPromise) {
+    return refreshTokenPromise;
+  }
+  
+  refreshTokenPromise = new Promise((resolve, reject) => {
+    let oldRefreshToken = getStore("refreshToken");
+    handleRefreshToken(oldRefreshToken)
+      .then(res => {
+        if (res.success) {
+          let { accessToken, refreshToken } = res.result;
+          setStore("accessToken", accessToken);
+          setStore("refreshToken", refreshToken);
+          resolve("success");
+        } else {
+          reject("fail");
+        }
+      })
+      .catch(err => {
+        reject("fail");
+      })
+      .finally(() => {
+        refreshTokenPromise = null;
+      });
+  });
+  
+  return refreshTokenPromise;
+};
+
+const service = axios.create({
   baseURL: baseUrl
 });
 axios.defaults.timeout = 100000
@@ -49,10 +93,16 @@
       setStore('uuid', uuid);
     }
 
+    // 鍔ㄦ�佽幏鍙栧苟璁剧疆accessToken
+    const accessToken = getStore("accessToken");
+    if (accessToken) {
+      config.headers["accessToken"] = accessToken;
+    }
+    
     config.headers["uuid"] = uuid;
     return config;
   },
-  err => {
+  err => {  
     Message.error("璇锋眰瓒呮椂");
     return Promise.resolve(err);
   }
@@ -107,25 +157,44 @@
       } else if (error.response.status === 404) {
         // 閬垮厤鍒锋柊token鎶ラ敊
       } else if (error.response.status === 403) {
-        isRefreshToken++;
-        if (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);
+        // 澶勭悊403閿欒锛岃繘琛宼oken鍒锋柊
+        const originalRequest = error.config;
+        
+        if (!isRefreshing) {
+          isRefreshing = true;
+          
+          try {
+            const getTokenRes = await refreshToken();
+            if (getTokenRes === "success") {
+              processQueue(null, getStore("accessToken"));
+              // 鏇存柊璇锋眰澶翠腑鐨則oken骞堕噸鏂板彂閫佽姹�
+              originalRequest.headers["accessToken"] = getStore("accessToken");
+              return service(originalRequest);
             } else {
-              router.go(0);
+              processQueue(new Error("Token refresh failed"), null);
+              Cookies.set("userInfoSeller", "");
+              setStore("accessToken", "");
+              redirectLogin();
             }
-          } else {
+          } catch (err) {
+            processQueue(err, null);
             Cookies.set("userInfoSeller", "");
+            setStore("accessToken", "");
             redirectLogin();
+          } finally {
+            isRefreshing = false;
           }
-          isRefreshToken = 0;
         }
+        
+        // 濡傛灉姝e湪鍒锋柊token锛屽垯灏嗚姹傚姞鍏ラ槦鍒�
+        return new Promise((resolve, reject) => {
+          failedQueue.push({ resolve, reject });
+        }).then(token => {
+          originalRequest.headers["accessToken"] = token;
+          return service(originalRequest);
+        }).catch(err => {
+          return Promise.reject(err);
+        });
       } else {
         // 鍏朵粬閿欒澶勭悊
         Message.error(error.response.data.message);
@@ -136,50 +205,6 @@
     return Promise.resolve(error);
   }
 );
-
-// 闃叉姈闂寘鏉ヤ竴娉�
-function getTokenDebounce() {
-  let lock = false;
-  let success = false;
-  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); // 杞鏃堕棿闂撮殧
-    });
-  };
-}
 
 export const getRequest = (url, params, resBlob) => {
   let accessToken = getStore("accessToken");

--
Gitblit v1.8.0