import axios, { AxiosError } from "axios"; import { message } from "ant-design-vue"; import { loadProgressBar } from "axios-progress-bar"; import { signToken } from "@/plugins/signToken"; import { filterConfigEmpty } from "@/plugins/configFilter"; import { downloadBlob, exitLogin } from "@/utils/common"; const request = axios.create({ baseURL: import.meta.env.VITE_APP_API_HOST, withCredentials: true, timeout: 180000, method: "post", transformRequest: [], }); request.interceptors.request.use( (config) => { if (!config.url) { throw new AxiosError( "request must should a url parameter", "REQUEST_PARAMETER_ERROR", config ); } config.headers = config.headers || {}; if (!config.noAuth) { const { token, timestamp } = signToken(config.url, config.method); config.headers["Authorization"] = token; config.headers["time"] = timestamp; } config.headers["Content-Type"] = config.headers["Content-Type"] || "application/x-www-form-urlencoded"; if (!config.headers["Content-Type"]?.toString().includes("multipart")) { config.transformRequest = (d) => new URLSearchParams(d); } if (config.download) { config.responseType = config.responseType || "blob"; } filterConfigEmpty(config); return config; }, (error: AxiosError) => { if (!error.config.noToast) { message.error(error.message || error.name || error.code); } return Promise.reject(error); } ); request.interceptors.response.use( (response) => { if (response.config.download) { downloadBlob(response); return response; } if (response.data.hasError) { const errMsg = response.data?.errMsg?.join("\n"); message.error(errMsg); return Promise.reject(response.data); } return response.data; }, async (error: AxiosError) => { if (error.isAxiosError && !error.config.noToast) { if ( error.response && ([401, 403].includes(error.response.status) || error.response.data?.code?.toString()?.startsWith("401")) ) { exitLogin(false); message.error({ content: "登录状态已过期", key: "token-valid" }); return Promise.reject(error); } let msg = ""; if (error.config?.responseType === "blob") { try { const e = JSON.parse(await error?.response?.data?.text()); msg = e.message || e.error || e; } catch (error) { console.error(error); } } if (!msg) { msg = error?.response?.data?.message || error.message || error.name || error.code; } message.error(msg); } else if (!error.isAxiosError) { error.message && message.error(error.message); } return Promise.reject(error); } ); loadProgressBar(null, request); export default request;