request.js 3.7 KB

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