2020-07-15 15:48:47 +08:00

136 lines
3.3 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 {
baseURL,
contentType,
invalidCode,
messageDuration,
noPermissionCode,
requestTimeout,
successCode,
tokenName,
debounce,
} from "@/config/settings";
import { Loading, Message } from "element-ui";
import store from "@/store";
import qs from "qs";
import router from "@/router";
import _ from "lodash";
import { isArray, isNumber } from "@/utils/validate";
const service = axios.create({
baseURL,
timeout: requestTimeout,
headers: {
"Content-Type": contentType,
},
});
let loadingInstance;
service.interceptors.request.use(
(config) => {
if (store.getters["user/accessToken"]) {
config.headers[tokenName] = store.getters["user/accessToken"];
}
if (config.data) {
//这里会过滤所有为空、0、fasle的key如果不需要请自行注释
config.data = _.pickBy(config.data, _.identity);
}
if (process.env.NODE_ENV !== "preview") {
if (contentType === "application/x-www-form-urlencoded;charset=UTF-8") {
if (config.data && !config.data.param) {
config.data = qs.stringify(config.data);
}
}
}
const needLoading = () => {
let status = false;
debounce.forEach((item) => {
if (_.includes(config.url, item)) {
status = true;
}
});
return status;
};
if (needLoading()) {
loadingInstance = Loading.service();
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
const errorMsg = (message) => {
return Message({
message: message,
type: "error",
duration: messageDuration,
});
};
service.interceptors.response.use(
(response) => {
if (loadingInstance) {
loadingInstance.close();
}
const { status, data, config } = response;
const { code, msg } = data;
let codeVerification = false;
if (isNumber(successCode)) {
codeVerification = code !== successCode;
}
if (isArray(successCode)) {
for (let i = 0; i < successCode.length; i++) {
if (code === i) {
codeVerification = code !== i;
break;
}
}
}
if (codeVerification) {
switch (code) {
case invalidCode:
errorMsg(msg || `后端接口${code}异常`);
store.dispatch("user/resetAccessToken");
break;
case noPermissionCode:
router.push({
path: "/401",
});
break;
default:
errorMsg(msg || `后端接口${code}异常`);
break;
}
return Promise.reject(
"vue-admin-beautiful请求异常拦截:" +
JSON.stringify({ url: config.url, code, msg }) || "Error"
);
} else {
return data;
}
},
(error) => {
if (loadingInstance) {
loadingInstance.close();
}
/*网络连接过程异常处理*/
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
}
if (message.includes("timeout")) {
message = "后端接口请求超时";
}
if (message.includes("Request failed with status code")) {
message = "后端接口" + message.substr(message.length - 3) + "异常";
}
errorMsg(message || "后端接口未知异常");
return Promise.reject(error);
}
);
export default service;