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