axios.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. "use strict";
  2. import axios from "axios";
  3. import store from "@/store";
  4. import { getAllPromise } from "@/utils/tools";
  5. import { objKeySort, dateChange } from "@/filters";
  6. import { Toast } from "vant";
  7. import md5 from "js-md5";
  8. import { getCookie } from "@/utils/cookie";
  9. // 完整配置参考: https://github.com/axios/axios#request-config
  10. axios.defaults.headers.post["Content-Type"] = "application/json;charset=utf-8";
  11. let config = {
  12. baseURL: process.env.BASE_URL || process.env.VUE_APP_JTXT_URL || "",
  13. timeout: 60 * 1000,
  14. withCredentials: false,
  15. crossDomain: true
  16. };
  17. const _axios = axios.create(config);
  18. // 注册all方法,执行多个并发请求
  19. // 可传入Promise、包含Promise的数组、返回值为Promise的方法
  20. _axios.all = (...requsets) => {
  21. // 获取所有Promise对象
  22. let promiseList = getAllPromise(requsets);
  23. return new Promise((resolve, reject) => {
  24. axios.all(promiseList)
  25. .then(axios.spread((...response) => {
  26. // 两个请求现在都执行完成
  27. resolve(response);
  28. }))
  29. .catch(error => {
  30. reject(error);
  31. });
  32. });
  33. };
  34. _axios.interceptors.request.use(
  35. config => {
  36. if (config.url.includes("api/sys/file")) {
  37. // 上传图片请求,不带请求头参数
  38. } else {
  39. let paramsNew = "";
  40. if (config.method === "get" && config.params) {
  41. paramsNew = objKeySort(config.params);
  42. } else if (config.method === "post" && config.data) {
  43. paramsNew = objKeySort(config.data);
  44. }
  45. config.headers.common["Content-Type"] = "application/json;charset=utf-8";
  46. config.headers.common["Access-Control-Allow-Origin"] = "*";
  47. config.headers.common["userSig"] = "userSig";
  48. config.headers.common["clientType"] = "h5";
  49. config.headers.common["timestamp"] = dateChange();
  50. config.headers.common["sign"] = md5(encodeURIComponent(paramsNew + config.headers.common.clientType + config.headers.common.timestamp + "n8R7vPaF3nJc"));
  51. config.headers.common["Authorization"] = getCookie("token");
  52. }
  53. return config;
  54. },
  55. error => {
  56. return Promise.reject(error);
  57. }
  58. );
  59. // 拦截响应
  60. _axios.interceptors.response.use(
  61. response => {
  62. // 用来判断是否请求成功
  63. const success = response.status === 200;
  64. let message = "";
  65. if (!success) {
  66. if (typeof response.data === "string") {
  67. message = "服务器错误,未获取到响应数据";
  68. } else {
  69. if (response.status === 200 && response.data.code === 0) {
  70. return Promise.reject(response);
  71. }
  72. // 请求成功,但在业务上为失败
  73. message = response.data.message || response.data.errorData || "操作执行失败";
  74. }
  75. Toast(message);
  76. return Promise.reject(response);
  77. }
  78. return {
  79. data: response.data,
  80. success,
  81. message
  82. };
  83. },
  84. error => {
  85. let message = "";
  86. if (!navigator.onLine) {
  87. message = "网络连接异常,请检查网络";
  88. Toast(message);
  89. return Promise.reject(error);
  90. }
  91. if (!error.response) {
  92. message = "连接服务器失败";
  93. Toast(message);
  94. return Promise.reject(error);
  95. }
  96. let status = error.response.status;
  97. if (status === 401) {
  98. message = "您已在其他地方登录";
  99. store.dispatch("logout");
  100. Toast(message);
  101. return Promise.reject(error);
  102. }
  103. if (status < 200) {
  104. message = `未处理的消息响应,状态码:${status}`;
  105. } else if (status >= 300 && status < 400) {
  106. message = `未处理的重定向响应,状态码:${status}`;
  107. } else if (status === 406) {
  108. message = "已经参加过该考试";
  109. window.history.back();
  110. } else if (status >= 400 && status < 500) {
  111. message = `客户端错误,状态码:${status}`;
  112. } else if (status >= 500) {
  113. message = `服务器错误,状态码:${status}`;
  114. }
  115. Toast(message);
  116. // 系统请求失败
  117. return Promise.reject(error);
  118. }
  119. );
  120. export default _axios;