chat-pc/src/utils/erpRequest.js

149 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 };