Files
go_fish_web/src/utils/request.js
T
lvjin 709cf29b6d feat: 新增钓鱼日志组件并优化钓鱼页面交互
新增钓鱼日志组件,用于展示钓鱼记录。优化钓鱼页面的交互体验,增加动画效果和状态提示。同时,修复了请求拦截器中的错误处理逻辑,并改进了登录和注册页面的UI设计。
2025-04-15 16:52:12 +08:00

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;