123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import Vue from "vue";
- import axios from "axios";
- import {
- baseURL,
- contentType,
- debounce,
- invalidCode,
- noPermissionCode,
- requestTimeout,
- successCode,
- tokenName,
- } from "@/config/settings";
- import store from "@/store";
- import qs from "qs";
- import router from "@/router";
- import { isArray } from "@/utils/validate";
- let loadingInstance;
- /**
- * @copyright chuzhixin 1204505056@qq.com
- * @description 判断当前url是否需要加loading
- * @param {*} config
- * @returns
- */
- const needLoading = (config) => {
- let status = false;
- debounce.forEach((item) => {
- if (Vue.prototype.$baseLodash.includes(config.url, item)) {
- status = true;
- }
- });
- return status;
- };
- /**
- * @copyright chuzhixin 1204505056@qq.com
- * @description 处理code异常
- * @param {*} code
- * @param {*} msg
- */
- const handleCode = (code, msg) => {
- switch (code) {
- case invalidCode:
- Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
- store.dispatch("user/resetAccessToken").catch(() => {});
- break;
- case noPermissionCode:
- router.push({ path: "/401" }).catch(() => {});
- break;
- default:
- Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
- break;
- }
- };
- const instance = axios.create({
- baseURL,
- timeout: requestTimeout,
- headers: {
- "Content-Type": contentType,
- },
- });
- instance.interceptors.request.use(
- (config) => {
- if (store.getters["user/accessToken"]) {
- config.headers[tokenName] = store.getters["user/accessToken"];
- }
- //这里会过滤所有为空、0、false的key,如果不需要请自行注释
- if (config.data)
- config.data = Vue.prototype.$baseLodash.pickBy(
- config.data,
- Vue.prototype.$baseLodash.identity
- );
- if (
- process.env.NODE_ENV !== "preview" &&
- contentType === "application/x-www-form-urlencoded;charset=UTF-8" &&
- config.data
- ) {
- config.data = qs.stringify(config.data);
- }
- if (needLoading(config)) {
- loadingInstance = Vue.prototype.$baseLoading();
- }
- return config;
- },
- (error) => {
- return Promise.reject(error);
- }
- );
- instance.interceptors.response.use(
- (response) => {
- if (loadingInstance) loadingInstance.close();
- const { status, data, config } = response;
- const { code, msg } = data;
- // 操作正常Code数组
- const codeVerificationArray = isArray(successCode)
- ? [...successCode]
- : [...[successCode]];
- // 是否操作正常
- if (codeVerificationArray.includes(code)) {
- return data;
- } else {
- handleCode(code, msg);
- return Promise.reject(
- "vue-admin-beautiful请求异常拦截:" +
- JSON.stringify({ url: config.url, code, msg }) || "Error"
- );
- }
- },
- (error) => {
- if (loadingInstance) loadingInstance.close();
- const { response, message } = error;
- if (error.response && error.response.data) {
- const { status, data } = response;
- handleCode(status, data.msg || message);
- return Promise.reject(error);
- } else {
- let { message } = error;
- if (message === "Network Error") {
- message = "后端接口连接异常";
- }
- if (message.includes("timeout")) {
- message = "后端接口请求超时";
- }
- if (message.includes("Request failed with status code")) {
- const code = message.substr(message.length - 3);
- message = "后端接口" + code + "异常";
- }
- Vue.prototype.$baseMessage(message || `后端接口未知异常`, "error");
- return Promise.reject(error);
- }
- }
- );
- export default instance;
|