144 lines
3.6 KiB
JavaScript
144 lines
3.6 KiB
JavaScript
import axios from "axios";
|
|
import $router from "../router";
|
|
import { message } from "ant-design-vue";
|
|
import { Local } from "@/utils/erpStorage.js";
|
|
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") || "";
|
|
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 };
|