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