zhangzengfei
2021-11-24 dccd5c9cfc33d33ea405e3a5311c7c85d9c09f68
src/utils/request.js
@@ -1,5 +1,5 @@
import Vue from 'vue'
import axios from 'axios'
import Vue from "vue";
import axios from "axios";
import {
  baseURL,
  contentType,
@@ -10,116 +10,118 @@
  successCode,
  tokenName,
  loginInterception,
} from '@/config'
import store from '@/store'
import qs from 'qs'
import router from '@/router'
import { isArray } from '@/utils/validate'
} from "@/config";
import store from "@/store";
import qs from "qs";
import router from "@/router";
import { isArray } from "@/utils/validate";
let loadingInstance
let loadingInstance;
/**
 * @author chuzhixin 1204505056@qq.com (不想保留author可删除)
 * @description 处理code异常
 * @param {*} code
 * @param {*} msg
 */
const handleCode = (code, msg) => {
  console.log(code, msg);
  switch (code) {
    case invalidCode:
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, 'error')
      store.dispatch('user/resetAccessToken').catch(() => {})
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
      store.dispatch("user/resetAccessToken").catch(() => {});
      if (loginInterception) {
        location.reload()
        location.reload();
      }
      break
      break;
    case noPermissionCode:
      router.push({ path: '/401' }).catch(() => {})
      break
      router.push({ path: "/login" }).catch(() => {});
      break;
    default:
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, 'error')
      break
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
      break;
  }
}
};
const instance = axios.create({
  baseURL,
  timeout: requestTimeout,
  headers: {
    'Content-Type': contentType,
    "Content-Type": contentType,
  },
})
});
instance.interceptors.request.use(
  (config) => {
    if (store.getters['user/accessToken']) {
      config.headers[tokenName] = store.getters['user/accessToken']
    if (store.getters["user/accessToken"]) {
      config.headers["Authorization"] =
        "Bearer " + store.getters["user/accessToken"];
    }
    //这里会过滤所有为空、0、false的key,如果不需要请自行注释
    if (config.data)
      config.data = Vue.prototype.$baseLodash.pickBy(
        config.data,
        Vue.prototype.$baseLodash.identity
      )
      );
    if (
      config.data &&
      config.headers['Content-Type'] ===
        'application/x-www-form-urlencoded;charset=UTF-8'
      config.headers["Content-Type"] ===
        "application/x-www-form-urlencoded;charset=UTF-8"
    )
      config.data = qs.stringify(config.data)
      config.data = qs.stringify(config.data);
    if (debounce.some((item) => config.url.includes(item)))
      loadingInstance = Vue.prototype.$baseLoading()
    return config
      loadingInstance = Vue.prototype.$baseLoading();
    return config;
  },
  (error) => {
    return Promise.reject(error)
    return Promise.reject(error);
  }
)
);
instance.interceptors.response.use(
  (response) => {
    if (loadingInstance) loadingInstance.close()
    if (loadingInstance) loadingInstance.close();
    const { data, config } = response
    const { code, msg } = data
    const { data, config } = response;
    const { code, msg } = data;
    // 操作正常Code数组
    const codeVerificationArray = isArray(successCode)
      ? [...successCode]
      : [...[successCode]]
      : [...[successCode]];
    // 是否操作正常
    if (codeVerificationArray.includes(code)) {
      return data
      return data;
    } else {
      handleCode(code, msg)
      handleCode(code, msg);
      return Promise.reject(
        'vue-admin-beautiful请求异常拦截:' +
          JSON.stringify({ url: config.url, code, msg }) || 'Error'
      )
        "请求异常拦截:" + JSON.stringify({ url: config.url, code, msg }) ||
          "Error"
      );
    }
  },
  (error) => {
    if (loadingInstance) loadingInstance.close()
    const { response, message } = 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)
      const { status, data } = response;
      handleCode(status, data.msg || message);
      return Promise.reject(error);
    } else {
      let { message } = error
      if (message === 'Network Error') {
        message = '后端接口连接异常'
      let { message } = error;
      if (message === "Network Error") {
        message = "后端接口连接异常";
      }
      if (message.includes('timeout')) {
        message = '后端接口请求超时'
      if (message.includes("timeout")) {
        message = "后端接口请求超时";
      }
      if (message.includes('Request failed with status code')) {
        const code = message.substr(message.length - 3)
        message = '后端接口' + code + '异常'
      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)
      Vue.prototype.$baseMessage(message || `后端接口未知异常`, "error");
      return Promise.reject(error);
    }
  }
)
);
export default instance
export default instance;