request.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import Vue from "vue";
  2. import axios from "axios";
  3. import {
  4. baseURL,
  5. contentType,
  6. debounce,
  7. invalidCode,
  8. noPermissionCode,
  9. requestTimeout,
  10. successCode,
  11. tokenName,
  12. } from "@/config/settings";
  13. import store from "@/store";
  14. import qs from "qs";
  15. import router from "@/router";
  16. import { isArray } from "@/utils/validate";
  17. let loadingInstance;
  18. /**
  19. * @copyright chuzhixin 1204505056@qq.com
  20. * @description 判断当前url是否需要加loading
  21. * @param {*} config
  22. * @returns
  23. */
  24. const needLoading = (config) => {
  25. let status = false;
  26. debounce.forEach((item) => {
  27. if (Vue.prototype.$baseLodash.includes(config.url, item)) {
  28. status = true;
  29. }
  30. });
  31. return status;
  32. };
  33. /**
  34. * @copyright chuzhixin 1204505056@qq.com
  35. * @description 处理code异常
  36. * @param {*} code
  37. * @param {*} msg
  38. */
  39. const handleCode = (code, msg) => {
  40. switch (code) {
  41. case invalidCode:
  42. Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
  43. store.dispatch("user/resetAccessToken").catch(() => {});
  44. break;
  45. case noPermissionCode:
  46. router.push({ path: "/401" }).catch(() => {});
  47. break;
  48. default:
  49. Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
  50. break;
  51. }
  52. };
  53. const instance = axios.create({
  54. baseURL,
  55. timeout: requestTimeout,
  56. headers: {
  57. "Content-Type": contentType,
  58. },
  59. });
  60. instance.interceptors.request.use(
  61. (config) => {
  62. if (store.getters["user/accessToken"]) {
  63. config.headers[tokenName] = store.getters["user/accessToken"];
  64. }
  65. //这里会过滤所有为空、0、false的key,如果不需要请自行注释
  66. if (config.data)
  67. config.data = Vue.prototype.$baseLodash.pickBy(
  68. config.data,
  69. Vue.prototype.$baseLodash.identity
  70. );
  71. if (
  72. process.env.NODE_ENV !== "preview" &&
  73. contentType === "application/x-www-form-urlencoded;charset=UTF-8" &&
  74. config.data
  75. ) {
  76. config.data = qs.stringify(config.data);
  77. }
  78. if (needLoading(config)) {
  79. loadingInstance = Vue.prototype.$baseLoading();
  80. }
  81. return config;
  82. },
  83. (error) => {
  84. return Promise.reject(error);
  85. }
  86. );
  87. instance.interceptors.response.use(
  88. (response) => {
  89. if (loadingInstance) loadingInstance.close();
  90. const { status, data, config } = response;
  91. const { code, msg } = data;
  92. // 操作正常Code数组
  93. const codeVerificationArray = isArray(successCode)
  94. ? [...successCode]
  95. : [...[successCode]];
  96. // 是否操作正常
  97. if (codeVerificationArray.includes(code)) {
  98. return data;
  99. } else {
  100. handleCode(code, msg);
  101. return Promise.reject(
  102. "vue-admin-beautiful请求异常拦截:" +
  103. JSON.stringify({ url: config.url, code, msg }) || "Error"
  104. );
  105. }
  106. },
  107. (error) => {
  108. if (loadingInstance) loadingInstance.close();
  109. const { response, message } = error;
  110. if (error.response && error.response.data) {
  111. const { status, data } = response;
  112. handleCode(status, data.msg || message);
  113. return Promise.reject(error);
  114. } else {
  115. let { message } = error;
  116. if (message === "Network Error") {
  117. message = "后端接口连接异常";
  118. }
  119. if (message.includes("timeout")) {
  120. message = "后端接口请求超时";
  121. }
  122. if (message.includes("Request failed with status code")) {
  123. const code = message.substr(message.length - 3);
  124. message = "后端接口" + code + "异常";
  125. }
  126. Vue.prototype.$baseMessage(message || `后端接口未知异常`, "error");
  127. return Promise.reject(error);
  128. }
  129. }
  130. );
  131. export default instance;