159 lines
3.0 KiB
TypeScript
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 };
|