automated_admin/src/cool/service/request.ts
2025-01-09 16:13:14 +08:00

159 lines
3.0 KiB
TypeScript

import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { ElMessage } from "element-plus";
import { endsWith } from "lodash-es";
import { storage } from "/@/cool/utils";
import { useBase } from "/$/base";
import { router } from "../router";
import { config, isDev } from "/@/config";
const request = axios.create({
timeout: import.meta.env.VITE_TIMEOUT,
withCredentials: false
});
NProgress.configure({
showSpinner: true
});
// 请求队列
let queue: Array<(token: string) => void> = [];
// 是否刷新中
let isRefreshing = false;
// 请求
request.interceptors.request.use(
(req: any) => {
const { user } = useBase();
if (req.url) {
// 请求进度条
if (
!config.ignore.NProgress.some((e) => req.url.match(new RegExp(`${e}.*`))) &&
(req.NProgress ?? true)
) {
NProgress.start();
}
}
// 请求信息
if (isDev) {
console.group(req.url);
console.log("method:", req.method);
console.table("data:", req.method == "get" ? req.params : req.data);
console.groupEnd();
}
// 验证 token
if (user.token) {
// 请求标识
if (req.headers && req.headers["Authorization"] !== null) {
req.headers["Authorization"] = user.token;
}
// 忽略
if (["eps", "refreshToken"].some((e) => endsWith(req.url, e))) {
return req;
}
// 判断 token 是否过期
if (storage.isExpired("token")) {
// 判断 refreshToken 是否过期
if (storage.isExpired("refreshToken")) {
ElMessage.error("登录状态已失效,请重新登录");
user.logout();
} else {
// 是否在刷新中
if (!isRefreshing) {
isRefreshing = true;
user.refreshToken()
.then((token) => {
queue.forEach((cb) => cb(token));
queue = [];
isRefreshing = false;
})
.catch(() => {
user.logout();
});
}
return new Promise((resolve) => {
// 继续请求
queue.push((token) => {
// 重新设置 token
if (req.headers) {
req.headers["Authorization"] = token;
}
resolve(req);
});
});
}
}
}
return req;
},
(error) => {
return Promise.reject(error);
}
);
// 响应
request.interceptors.response.use(
(res) => {
NProgress.done();
if (!res?.data) {
return res;
}
const { code, data, message } = res.data;
if (!code) {
return res.data;
}
switch (code) {
case 1000:
return data;
default:
return Promise.reject({ code, message });
}
},
async (error) => {
NProgress.done();
if (error.response) {
const { status } = error.response;
const { user } = useBase();
if (status == 401) {
user.logout();
} else {
if (!isDev) {
switch (status) {
case 403:
router.push("/403");
break;
case 500:
router.push("/500");
break;
case 502:
router.push("/502");
break;
}
}
}
}
return Promise.reject({ message: error.message });
}
);
export { request };