/* * @Descripttion: * @version: 1.0.0 * @Author: LyMy * @Date: 2025-04-11 15:56:12 * @LastEditors: LyMy * @LastEditTime: 2025-04-12 14:17:15 * @FilePath: \go_fish_web\src\utils\request.js */ import axios from "axios"; import { ElMessage } from "element-plus"; import router from "@/router"; let isRefreshing = false; let requestQueue = []; // 创建 axios 实例 // 清理登录状态的函数 export function clearLoginState() { localStorage.removeItem("token"); localStorage.removeItem("fishingLogs"); } const request = axios.create({ baseURL: "http://49.235.165.171:31001", timeout: 5000, }); // 设置默认 Content-Type request.defaults.headers["Content-Type"] = "application/json"; // 请求拦截器:添加 token request.interceptors.request.use( (config) => { const token = localStorage.getItem("token"); if (token) { config.headers.Authorization = `Bearer ${token}`; // 登录成功后重试队列中的请求 if (requestQueue.length > 0) { requestQueue.forEach(({ resolve, config }) => { resolve(request(config)); }); requestQueue = []; } } return config; }, (error) => Promise.reject(error) ); // 响应拦截器 request.interceptors.response.use( (response) => response.data, (error) => { console.dir(error); const status = error.response?.status; const config = error.config; if (status === 400) { // 处理400错误,解析并显示具体的验证错误信息 const errorData = error.response?.data; if (errorData?.errors) { // 收集所有错误信息 const errorMessages = []; Object.entries(errorData.errors).forEach(([field, messages]) => { if (Array.isArray(messages)) { messages.forEach((msg) => errorMessages.push(msg)); } }); // 显示合并后的错误信息 if (errorMessages.length > 0) { ElMessage.error(errorMessages.join("\n")); } else { ElMessage.error("请求参数验证失败"); } } else { // 如果没有详细的错误信息,显示通用错误消息 ElMessage.error(errorData?.title || "请求参数错误"); } return Promise.reject(error); } else if (status === 401) { // 避免重复处理 401 if (!isRefreshing) { isRefreshing = true; ElMessage.warning("登录已过期,请重新登录"); clearLoginState(); // 清空请求队列 requestQueue = []; router.push("/login"); // 重置标志位,避免死锁 setTimeout(() => { isRefreshing = false; }, 3000); // 避免多次跳转,给 3 秒冷却时间 } // 将请求加入队列 return new Promise((resolve) => { requestQueue.push({ resolve, config, }); }); } else { ElMessage.error(error.response?.data?.message || "请求失败,请稍后再试"); } return Promise.reject(error); } ); export default request;