From f56e474c81bb25845b46cf99c85bd313dbfcd3b5 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期六, 31 一月 2026 19:26:25 +0800
Subject: [PATCH] 项目初始化+首页+公告详情页面

---
 src/utils/axios.js |  195 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 195 insertions(+), 0 deletions(-)

diff --git a/src/utils/axios.js b/src/utils/axios.js
new file mode 100644
index 0000000..86cea2e
--- /dev/null
+++ b/src/utils/axios.js
@@ -0,0 +1,195 @@
+import axios from 'axios'
+import $qxueyou from '@/config/qxueyou.js'
+import { getUUID } from "@/utils/tool.js";
+
+let createAxios = axios.create({
+  baseURL: $qxueyou.serverRoot,
+  timeout: 30000,
+  headers: {
+    "Content-Type": `application/json;charset=utf-8`
+  }
+})
+
+createAxios.all = axios.all
+createAxios.spread = axios.spread
+
+// Token 宸ュ叿鍑芥暟
+const ACCESS_TOKEN_KEY = $qxueyou.ACCESS_TOKEN_KEY;
+const REFRESH_TOKEN_KEY = $qxueyou.REFRESH_TOKEN_KEY;
+export const tokenUtils = {
+  // 鑾峰彇 Access Token
+  getAccessToken() {
+    return localStorage.getItem(ACCESS_TOKEN_KEY);
+  },
+  // 鑾峰彇 Refresh Token
+  getRefreshToken() {
+    return localStorage.getItem(REFRESH_TOKEN_KEY);
+  },
+  // 璁剧疆 Token
+  setTokens(accessToken, refreshToken) {
+    if (accessToken) {
+      localStorage.setItem(ACCESS_TOKEN_KEY, accessToken);
+    }
+    if (refreshToken) {
+      localStorage.setItem(REFRESH_TOKEN_KEY, refreshToken);
+    }
+  },
+  // 娓呴櫎 Token
+  clearTokens() {
+    localStorage.removeItem(ACCESS_TOKEN_KEY);
+    localStorage.removeItem(REFRESH_TOKEN_KEY);
+  },
+  // 妫�鏌� Token 鏄惁瀛樺湪
+  hasTokens() {
+    return !!(this.getAccessToken() && this.getRefreshToken());
+  },
+}
+let isRefreshing = false;
+// 鍒锋柊 token 鏈熼棿鐨勮姹傞槦鍒�
+let refreshQueue = [];
+// 鍒锋柊 Access Token
+export async function refreshAccessToken() {
+  const currentRefreshToken = tokenUtils.getRefreshToken();
+  if (!currentRefreshToken) {
+    throw new Error("No refresh token available");
+  }
+  try {
+    const response = await createAxios.post(
+      `/system/auth/refresh-token?refreshToken=${currentRefreshToken}`
+    );
+
+    if (response.data && response.data.code === 0) {
+      const { accessToken, refreshToken: newRefreshToken } = response.data.data;
+      tokenUtils.setTokens(accessToken, newRefreshToken);
+      return accessToken;
+    } else {
+      throw new Error("Token refresh failed");
+    }
+  } catch (error) {
+    console.error('Token refresh error:', error);
+    throw error;
+  }
+}
+
+let strTrim = function(data) {
+  let newData = {...data}
+  Object.keys(newData).forEach((key) => {
+    if (typeof newData[key] === 'string') {
+      newData[key] = newData[key].trim()
+    }
+  })
+  return newData
+}
+
+//缃戠粶璇锋眰鐩戝惉
+createAxios.interceptors.request.use(
+  function(config) {
+    // 鍒锋柊 token 鐨勮姹備笉闇�瑕佹坊鍔� Authorization header
+    if (!config.url.includes('/auth/refresh-token')) {
+      config.headers = {
+        ...config.headers,
+        Authorization: localStorage.getItem('accessToken')
+      }
+    }
+    config.flag = getUUID().toString().slice(-4)
+    if (config.data) {
+      console.log(`data-${config.flag} `, config.data)
+      // config.data = JSON.stringify(config.data)
+    }
+    if (config.params) {
+      console.log(`params-${config.flag} `, config.params)
+      // config.params = strTrim(config.params)
+    }
+    return config
+  },
+  function(error) {
+    return Promise.reject(error)
+  }
+)
+
+createAxios.interceptors.response.use(
+  async response => {
+    const resultCode = response.data.code;
+    const originalRequest = response.config;
+    if (response.data && [500, 400].includes(resultCode)) {
+      console.log(response)
+      return response
+    }
+    if (response.data && resultCode == '401') {
+      if (!originalRequest._retry && tokenUtils.getRefreshToken) {
+        originalRequest._retry = true;
+
+        if (isRefreshing) {
+          // 濡傛灉姝e湪鍒锋柊锛屽皢璇锋眰鍔犲叆闃熷垪
+          return new Promise((resolve, reject) => {
+            refreshQueue.push({ resolve, reject, config: originalRequest });
+          });
+        }
+
+        isRefreshing = true;
+
+        try {
+          const newAccessToken = await refreshAccessToken();
+
+          // 澶勭悊闃熷垪涓殑璇锋眰
+          refreshQueue.forEach(({ resolve, config }) => {
+            config.headers.Authorization = newAccessToken;
+            resolve(createAxios(config));
+          });
+          refreshQueue = [];
+
+          // 閲嶆柊鍙戦�佸師濮嬭姹�
+          originalRequest.headers.Authorization = newAccessToken;
+          return createAxios(originalRequest)
+        } catch (refreshError) {
+          console.log(refreshError)
+          // 鍒锋柊澶辫触锛屽鐞嗛槦鍒椾腑鐨勮姹�
+          refreshQueue.forEach(({ reject }) => {
+            reject(refreshError);
+          });
+          refreshQueue = [];
+          tokenUtils.clearTokens();
+          // $store.commit("session/loginFlag", false);
+          // $store.commit("session/userInfo", {});
+          // 鍙互鍦ㄨ繖閲岃Е鍙戠櫥褰曢〉闈㈣烦杞�
+        } finally {
+          isRefreshing = false;
+        }
+      } else {
+        tokenUtils.clearTokens();
+        // $store.commit("session/loginFlag", false);
+        // $store.commit("session/userInfo", {});
+      }
+    }
+
+    console.log(`url-${response.config.flag} `, response.config.url, response.data)
+    return response
+  },
+  error => {
+    // store.commit('network/changeNetworkState', false)
+    if (!error.response) return Promise.reject(error)
+
+    // store.commit('network/status', error.response.status)
+    if (401 === error.response.status) {
+      // 鍒锋柊 token 鐨勮姹傝繑鍥� 401 鏃讹紝鐩存帴杩斿洖閿欒锛屼笉瑕佹姏鍑烘柊鐨勯敊璇�
+      if (error.config && error.config.url && error.config.url.includes('/auth/refresh-token')) {
+        return Promise.reject(error)
+      }
+      // store.commit('session/clearUser')
+      // store.commit('endea/clearShareK')
+      // store.commit('network/logout')
+      throw new Error('鐧诲綍澶辨晥')
+    }
+    return Promise.reject(error)
+  }
+)
+
+export default createAxios
+
+
+
+
+
+
+
+

--
Gitblit v1.8.0