index.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import axios from "axios";
  2. import router from "@/router";
  3. import { getAuthorization } from "./crypto";
  4. import { useUserStore } from "@/store";
  5. const env = import.meta.env;
  6. const axiosInstance = axios.create({
  7. baseURL: env.VITE_ENV === "dev" ? "" : env.VITE_API_HOST,
  8. timeout: 60000,
  9. withCredentials: false,
  10. headers: {
  11. "Access-Control-Allow-Origin": "*",
  12. "Content-Type": "application/json",
  13. },
  14. });
  15. function setAuth(config) {
  16. let userStorage = localStorage.getItem("user");
  17. if (userStorage && !config.noAuth) {
  18. let loginInfo = JSON.parse(userStorage).loginInfo;
  19. const timestamp = Date.now();
  20. const authorization = getAuthorization(
  21. {
  22. method: config.method,
  23. uri: config.url.split("?")[0].trim(),
  24. timestamp,
  25. sessionId: loginInfo.sessionId,
  26. token: loginInfo.token,
  27. },
  28. "token"
  29. );
  30. config.headers["Authorization"] = authorization;
  31. config.headers["time"] = timestamp;
  32. }
  33. }
  34. axiosInstance.interceptors.request.use(
  35. (config) => {
  36. setAuth(config);
  37. if (config.loading) {
  38. allowMultipleToast();
  39. config.toast = showLoadingToast({
  40. forbidClick: true,
  41. loadingType: "spinner",
  42. duration: 0,
  43. });
  44. }
  45. return config;
  46. },
  47. (error) => {
  48. return Promise.reject(error);
  49. }
  50. );
  51. axiosInstance.interceptors.response.use(
  52. async (response) => {
  53. if (response.config.loading) {
  54. response.config.toast?.close();
  55. }
  56. return response.data;
  57. // if (response.request.responseType === "blob") {
  58. // return { code: 200, data: response.data, msg: "success" };
  59. // }
  60. // const { code, msg } = response.data;
  61. // if (code === 200) {
  62. // return response.data;
  63. // } else {
  64. // const errMsg = msg
  65. // ? typeof msg === "string"
  66. // ? msg
  67. // : msg.detail
  68. // : "服务器异常";
  69. // showToast(errMsg);
  70. // return Promise.reject(errMsg);
  71. // }
  72. },
  73. (error) => {
  74. console.log("[request error] > ", error);
  75. if (error && error.response) {
  76. error.response.config.toast?.close();
  77. switch (error.response.status) {
  78. case 400:
  79. error.message = "请求参数错误(400)";
  80. break;
  81. case 401:
  82. // error.message = "请重新登录(401)";
  83. // router.replace({ name: "Login" });
  84. const userStore = useUserStore();
  85. userStore.logout(true);
  86. location.reload();
  87. break;
  88. case 403:
  89. error.message = "拒绝访问(403)";
  90. break;
  91. case 404:
  92. error.message = "请求出错(404)";
  93. break;
  94. case 405:
  95. error.message = "请求方法不支持(405)";
  96. break;
  97. case 408:
  98. error.message = "请求超时(408)";
  99. break;
  100. case 500:
  101. error.message = "服务器异常(500)";
  102. break;
  103. case 501:
  104. error.message = "服务未实现(501)";
  105. break;
  106. case 502:
  107. error.message = "网络错误(502)";
  108. break;
  109. case 503:
  110. error.message = "网络超时(503)";
  111. break;
  112. case 504:
  113. error.message = "网络超时(504)";
  114. break;
  115. case 505:
  116. error.message = "HTTP版本不受支持(505)";
  117. break;
  118. default:
  119. error.message = `连接出错(${error.response.status})!`;
  120. }
  121. } else {
  122. error.message = "服务连接失败";
  123. }
  124. if (error?.response?.data?.message) {
  125. error.message = error?.response?.data?.message;
  126. }
  127. const whiteUrls = ["/api/student/login/get/openid"];
  128. !whiteUrls.includes(error?.config?.url) && showToast(error.message);
  129. return Promise.reject(error);
  130. }
  131. );
  132. const request = (options) => {
  133. return axiosInstance(options);
  134. };
  135. export default request;