request.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import Vue from "vue";
  2. import axios from "axios";
  3. import {
  4. baseURL,
  5. contentType,
  6. debounce,
  7. invalidCode,
  8. noRoleCode,
  9. requestTimeout,
  10. successCode,
  11. tokenName,
  12. title,
  13. } from "@/config/settings";
  14. import store from "@/store";
  15. import qs from "qs";
  16. import router from "@/router";
  17. import {
  18. isArray
  19. } from "@/utils/validate";
  20. import {
  21. getEnToken
  22. } from "@/utils/accessToken";
  23. let loadingInstance;
  24. /**
  25. * @description 处理code异常
  26. * @param {*} code
  27. * @param {*} msg
  28. */
  29. const handleCode = (code, msg) => {
  30. Vue.prototype.$baseColorfullLoading().close();
  31. switch (code) {
  32. case invalidCode:
  33. Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
  34. store.dispatch("user/resetAll").catch(() => {});
  35. break;
  36. case noRoleCode:
  37. router.push({
  38. path: "/401"
  39. }).catch(() => {});
  40. break;
  41. default:
  42. Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, "error");
  43. break;
  44. }
  45. };
  46. /**
  47. * @description axios初始化
  48. */
  49. const instance = axios.create({
  50. baseURL,
  51. timeout: requestTimeout,
  52. // responseType: "arraybuffer",
  53. headers: {
  54. "Content-Type": contentType,
  55. },
  56. });
  57. /**
  58. * @description axios请求拦截器
  59. */
  60. instance.interceptors.request.use(
  61. (config) => {
  62. if (store.getters["user/accessToken"]) {
  63. config.headers[tokenName] = store.getters["user/accessToken"];
  64. }
  65. if (getEnToken()) {
  66. config.headers.Token = getEnToken();
  67. }
  68. if (store.getters["MUser/systemType"] === 2) {
  69. config.headers["SHOP-TOKEN"] =
  70. store.getters["MUser/storeData"].token || "";
  71. }
  72. if (
  73. config.data &&
  74. config.headers["Content-Type"] ===
  75. "application/x-www-form-urlencoded;charset=UTF-8"
  76. )
  77. config.data = qs.stringify(config.data);
  78. if (debounce.some((item) => config.url.includes(item)))
  79. loadingInstance = Vue.prototype.$baseLoading();
  80. return config;
  81. },
  82. (error) => {
  83. return Promise.reject(error);
  84. }
  85. );
  86. /**
  87. * @description axios响应拦截器
  88. */
  89. instance.interceptors.response.use(
  90. (response) => {
  91. // console.log(response);
  92. if (loadingInstance) loadingInstance.close();
  93. const {
  94. data,
  95. config
  96. } = response;
  97. if (data.errorcode >= 0) {
  98. const code = data.errorcode;
  99. const msg = data.data;
  100. // 操作正常Code数组
  101. const codeVerificationArray = isArray(successCode) ?
  102. [...successCode] :
  103. [...[successCode]];
  104. // 是否操作正常
  105. if (codeVerificationArray.includes(code)) {
  106. return data;
  107. } else {
  108. handleCode(code, msg);
  109. return Promise.reject(
  110. title +
  111. "请求异常拦截:" +
  112. JSON.stringify({
  113. url: config.url,
  114. code,
  115. msg
  116. }) || "Error"
  117. );
  118. }
  119. } else if (data.size) {
  120. /*
  121. * 导出
  122. * */
  123. // 时间戳
  124. let fileName = Date.parse(new Date()) + ".csv";
  125. // 创建a标签
  126. let link = document.createElement("a");
  127. // 打开url
  128. // link.href = window.URL.createObjectURL(data);
  129. link.href = window.URL.createObjectURL(
  130. new Blob([data], {
  131. type: "application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  132. })
  133. );
  134. // 下载
  135. link.download = fileName;
  136. link.click();
  137. // 释放内存
  138. window.URL.revokeObjectURL(link.href);
  139. return data;
  140. }
  141. },
  142. (error) => {
  143. if (loadingInstance) loadingInstance.close();
  144. const {
  145. response,
  146. message
  147. } = error;
  148. if (error.response && error.response.data) {
  149. const {
  150. status,
  151. data
  152. } = response;
  153. handleCode(status, data.msg || message);
  154. return Promise.reject(error);
  155. } else {
  156. let {
  157. message
  158. } = error;
  159. if (message === "Network Error") {
  160. message = "后端接口连接异常";
  161. }
  162. if (message.includes("timeout")) {
  163. message = "-1";
  164. // message = "后端接口请求超时";
  165. }
  166. if (message.includes("Request failed with status code")) {
  167. const code = message.substr(message.length - 3);
  168. message = "后端接口" + code + "异常";
  169. }
  170. if (message !== "-1") {
  171. Vue.prototype.$baseMessage(message || `后端接口未知异常`, "error");
  172. }
  173. return Promise.reject(error);
  174. }
  175. }
  176. );
  177. export default instance;