import axios from "axios";
import { Message } from "element-ui";
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
});
const sendRequest = ({ url, method = "get", data = {}, isUploadFile = false, responseType, headers = {} } = {}) => service.request({ url, method, data, isUploadFile, responseType, headers });
const isEnableMock = false;
function enableMockHandler(config) {
config.method = "get";
const urlList = config.url.split("/");
const lastUrl = urlList[urlList.length - 1];
const url = urlList[urlList.length - 2] + lastUrl.slice(0, 1).toUpperCase() + lastUrl.slice(1);
config.baseURL = "/";
config.url = `/mock/${url}.json`;
}
function downloadFileByBlob(blob, type, fileName) {
let url = window.URL.createObjectURL(new Blob([blob], { type }));
let aDom = document.createElement("a");
aDom.setAttribute("href", url);
aDom.setAttribute("download", fileName);
document.body.appendChild(aDom);
aDom.click();
document.body.removeChild(aDom);
window.URL.revokeObjectURL(url);
}
function judgeErrorByResponseType(response) {
return new Promise((resolve, reject) => {
if (response.headers["content-type"].includes("json")) {
const { data } = response;
const reader = new FileReader();
reader.onload = () => {
const { result } = reader;
const res = JSON.parse(result);
reject(res);
};
reader.onerror = (err) => {
reject(err);
};
reader.readAsText(data);
} else {
resolve();
}
});
}
service.interceptors.request.use(
(config) => {
if (process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase() === "development" && isEnableMock) {
enableMockHandler(config);
}
const token = window.vm.$store.state.token;
if (token) {
config.headers.Authorization = token;
}
if (["get", "delete", "head"].includes(config.method)) {
config.params = config.data;
}
if (config.isUploadFile) {
config.headers["content-type"] = "multipart/form-data";
}
return config;
},
(e) => {
console.error("interceptors.request is error", e);
Message.error("请求错误");
return Promise.reject(e);
}
);
let bizErrorMsgInstance = null;
let errorCode = "";
let httpErrorMsgInstance = null;
let statusErrorMsgInstance = null;
service.interceptors.response.use(
async (response) => {
const {
status,
statusText,
data: { data, message, code, promptLevel },
config,
headers: { "content-disposition": contentDisposition, "content-type": contentType },
} = response;
if (status !== 200) {
if (!statusErrorMsgInstance) {
statusErrorMsgInstance = Message.error({ message: statusText, duration: 3000 });
setTimeout(() => {
statusErrorMsgInstance = null;
}, 3100);
}
return Promise.reject(statusText);
}
if (config.responseType === "blob") {
await judgeErrorByResponseType(response).catch(({ code, message }) => {
Message.error({ message, duration: 3000 });
return Promise.reject({ code, message });
});
let fileName = "";
try {
fileName = contentDisposition.slice(contentDisposition.lastIndexOf(";")).split("=")[1];
} catch (error) {
console.error("error", error);
}
return downloadFileByBlob(response.data, contentType, fileName);
}
if (code !== "000000") {
if (promptLevel?.toUpperCase() === "POP") {
if (!bizErrorMsgInstance || !(code === errorCode)) {
errorCode = code;
bizErrorMsgInstance = Message.error({ message, duration: 3000 });
setTimeout(() => {
bizErrorMsgInstance = null;
}, 3100);
}
}
return Promise.reject({ message, code, data });
}
return data;
},
(error) => {
const responseType = error?.config?.responseType ?? "json";
if (responseType === "blob") {
Message.error({ message: "下载失败", duration: 3000 });
return Promise.reject(error.message);
}
if (!httpErrorMsgInstance) {
httpErrorMsgInstance = Message.error({
message: "请求出错,请稍候重试",
duration: 3000,
});
setTimeout(() => {
httpErrorMsgInstance = null;
}, 3100);
}
return Promise.reject(error.message);
}
);
export default sendRequest;