import axios from "axios"; import router from "@/router/index.js"; import { ElMessage } from 'element-plus'; let isRefreshing = false; let requests = []; // 错误处理函数 const handleResponseError = (result) => { if (result.status !== 200) { router.push("/login"); } if (result.data.message === "NOT_LOGIN" || [2, 3, 4].includes(result.data.code)) { // 检测到token过期 if (isRefreshing == false) { isRefreshing = true; // 这里需要替换为实际的refresh token请求 return axios.post('https://uc.ljsea.top/user/refresh_token', { refresh_token: localStorage.getItem("refresh_token") },{ headers: { 'Authorization': `Bearer ${localStorage.getItem("refresh_token")}` } }).then(res => { const token = res.data["data"]["access_token"]; localStorage.setItem("token", token); // 重试所有挂起的请求 requests.forEach(cb => cb(token)); requests = []; isRefreshing = false; // 重试当前请求 const config = result.config; config.headers.Authorization = `Bearer ${token}`; return request(config); }).catch(err => { // 刷新token失败,跳转登录 ElMessage.error('登录已过期,请重新登录!12'); router.push("/login"); return Promise.reject(err); }); } else if (isRefreshing) { // 正在刷新token,将请求放入队列 return new Promise(resolve => { requests.push(token => { result.config.headers.Authorization = `Bearer ${token}`; resolve(request(result.config)); }); }); } } if (result.data.code === 7) { ElMessage.error('该用户已存在,请重新输入!'); return null; } if (result.data.code === 1) { ElMessage.error('请求失败,请稍后重试!'); } return result.data; }; // 请求实例缓存 const instances = new Map(); // 请求工厂函数(单例模式) export const createRequestInstance = (baseURL, config = {}) => { // 检查是否已存在该域名的实例 if (instances.has(baseURL)) { return instances.get(baseURL); } // 创建新实例 const instance = axios.create({ baseURL, timeout: 10000, // 默认超时时间 headers: { 'Content-Type': 'application/json' }, ...config }); // 添加响应拦截器 instance.interceptors.response.use( result => handleResponseError(result), error => { ElMessage.error('请求失败,请稍后重试!'); return Promise.reject(error); } ); // 缓存实例 instances.set(baseURL, instance); return instance; }; // 默认导出原有的阿里云请求实例 export default createRequestInstance("https://tx.ljsea.top/");