149 lines
3.9 KiB
JavaScript
149 lines
3.9 KiB
JavaScript
import axios from "axios";
|
||
import $router from "../router";
|
||
import { message } from "ant-design-vue";
|
||
import { Local } from "@/utils/erpStorage.js";
|
||
import { getAccessToken } from "@/utils/auth";
|
||
const service = axios.create({
|
||
baseURL: import.meta.env.VITE_EPR_BASEURL,
|
||
timeout: 60 * 60 * 1000,
|
||
authToken: true,
|
||
responseType: "json", // 请求数据格式
|
||
});
|
||
service.interceptors.request.use(
|
||
(config) => {
|
||
// set header Content-Type
|
||
if (config.method === "get") {
|
||
// || config.method === "delete"
|
||
config.headers["Content-Type"] = "application/x-www-form-urlencoded";
|
||
} else {
|
||
config.headers["Content-Type"] = "application/json";
|
||
}
|
||
if (config.isFormData) {
|
||
config.headers["Content-Type"] = "multipart/form-data";
|
||
config.headers.Authorization = Local.get("token") || "";
|
||
} else config.headers.Authorization = Local.get("token") || "";
|
||
if(!config.headers.Authorization && import.meta.env.MODE === 'test'){
|
||
// 测试环境直接启动项目时,没有token,使用auth写死的token
|
||
config.headers.Authorization = getAccessToken()
|
||
}
|
||
return config;
|
||
},
|
||
(error) => {
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
let isRefreshing = false;
|
||
let refreshSubscribers = [];
|
||
|
||
service.interceptors.response.use(
|
||
(response) => {
|
||
let isResourse = response.config.responseType;
|
||
if (response && response.data.status === 409) {
|
||
// 账户另一处登录 此处踢下线
|
||
message.error('您的账号已在其他设备登录')
|
||
$router.push("/login");
|
||
return;
|
||
}
|
||
if (response && response.data.code === 401) {
|
||
// 若token过期则态获取RefreshToken重新获取token
|
||
return getRefreshToken(response);
|
||
}
|
||
if (
|
||
response.status === 200 ||
|
||
response.status === 201 ||
|
||
response.status === 204
|
||
) {
|
||
return isResourse == "blob" ? response : response.data;
|
||
} else {
|
||
message.success(res.msg);
|
||
Promise.reject(response);
|
||
}
|
||
},
|
||
(error) => {
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
const getRefreshToken = async (response) => {
|
||
if (!isRefreshing) {
|
||
isRefreshing = true;
|
||
const refreshToken = Local.get("RefreshToken");
|
||
if (refreshToken) {
|
||
try {
|
||
const data = { refreshToken };
|
||
const res = await fetch(
|
||
"/user/refresh/token",
|
||
data,
|
||
"POST",
|
||
"json",
|
||
"application/json",
|
||
false
|
||
);
|
||
if (res.code === 200) {
|
||
Local.set("token", res.data.Token);
|
||
Local.set("userInfo", res.data.AccountInfo);
|
||
Local.set("RefreshToken", res.data.RefreshToken);
|
||
|
||
return Promise.resolve(service(response.config));
|
||
} else {
|
||
// 跳转登录页
|
||
$router.push("/login");
|
||
res.message = res.message || res.msg;
|
||
return Promise.reject(res);
|
||
}
|
||
} catch (error) {
|
||
return Promise.reject(error);
|
||
} finally {
|
||
isRefreshing = false;
|
||
refreshSubscribers.forEach((callback) => callback());
|
||
refreshSubscribers = [];
|
||
}
|
||
} else {
|
||
$router.push("/login");
|
||
return Promise.reject(response);
|
||
}
|
||
} else {
|
||
return new Promise((resolve) => {
|
||
refreshSubscribers.push(() => {
|
||
resolve(service(response.config));
|
||
});
|
||
});
|
||
}
|
||
};
|
||
|
||
const fetch = async (
|
||
url = "",
|
||
data = {},
|
||
method = "",
|
||
responseType = "json",
|
||
contentType = "",
|
||
authToken = true,
|
||
isFormData = false
|
||
) => {
|
||
if (!method) {
|
||
method = "GET";
|
||
}
|
||
let args = { url, method };
|
||
if (method === "GET") {
|
||
// || method === "DELETE"
|
||
args.params = data;
|
||
} else {
|
||
args.data = data;
|
||
}
|
||
if (contentType) {
|
||
args = Object.assign({}, args, {
|
||
headers: {
|
||
"Content-Type": contentType,
|
||
},
|
||
});
|
||
}
|
||
|
||
// 请求数据格式
|
||
args.responseType = responseType;
|
||
args.authToken = authToken;
|
||
args.isFormData = isFormData;
|
||
return service(args);
|
||
};
|
||
export default { fetch, getRefreshToken };
|