113 lines
3.0 KiB
JavaScript
113 lines
3.0 KiB
JavaScript
/*
|
|
* @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;
|