chat-pc/src/utils/erpRequest.js

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