request.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import axios from "axios";
  2. import NProgress from "nprogress";
  3. import "nprogress/nprogress.css";
  4. import { ElMessage } from "element-plus";
  5. import { endsWith } from "lodash-es";
  6. import { storage } from "/@/cool/utils";
  7. import { useBase } from "/$/base";
  8. import { router } from "../router";
  9. import { config, isDev } from "/@/config";
  10. const request = axios.create({
  11. timeout: import.meta.env.VITE_TIMEOUT,
  12. withCredentials: false
  13. });
  14. NProgress.configure({
  15. showSpinner: true
  16. });
  17. // 请求队列
  18. let queue: Array<(token: string) => void> = [];
  19. // 是否刷新中
  20. let isRefreshing = false;
  21. // 请求
  22. request.interceptors.request.use(
  23. (req: any) => {
  24. const { user } = useBase();
  25. if (req.url) {
  26. // 请求进度条
  27. if (
  28. !config.ignore.NProgress.some((e) => req.url.match(new RegExp(`${e}.*`))) &&
  29. (req.NProgress ?? true)
  30. ) {
  31. NProgress.start();
  32. }
  33. }
  34. // 请求信息
  35. if (isDev) {
  36. console.group(req.url);
  37. console.log("method:", req.method);
  38. console.table("data:", req.method == "get" ? req.params : req.data);
  39. console.groupEnd();
  40. }
  41. // 验证 token
  42. if (user.token) {
  43. // 请求标识
  44. if (req.headers && req.headers["Authorization"] !== null) {
  45. req.headers["Authorization"] = user.token;
  46. }
  47. // 忽略
  48. if (["eps", "refreshToken"].some((e) => endsWith(req.url, e))) {
  49. return req;
  50. }
  51. // 判断 token 是否过期
  52. if (storage.isExpired("token")) {
  53. // 判断 refreshToken 是否过期
  54. if (storage.isExpired("refreshToken")) {
  55. ElMessage.error("登录状态已失效,请重新登录");
  56. user.logout();
  57. } else {
  58. // 是否在刷新中
  59. if (!isRefreshing) {
  60. isRefreshing = true;
  61. user.refreshToken()
  62. .then((token) => {
  63. queue.forEach((cb) => cb(token));
  64. queue = [];
  65. isRefreshing = false;
  66. })
  67. .catch(() => {
  68. user.logout();
  69. });
  70. }
  71. return new Promise((resolve) => {
  72. // 继续请求
  73. queue.push((token) => {
  74. // 重新设置 token
  75. if (req.headers) {
  76. req.headers["Authorization"] = token;
  77. }
  78. resolve(req);
  79. });
  80. });
  81. }
  82. }
  83. }
  84. return req;
  85. },
  86. (error) => {
  87. return Promise.reject(error);
  88. }
  89. );
  90. // 响应
  91. request.interceptors.response.use(
  92. (res) => {
  93. NProgress.done();
  94. if (!res?.data) {
  95. return res;
  96. }
  97. const { code, data, message } = res.data;
  98. if (!code) {
  99. return res.data;
  100. }
  101. switch (code) {
  102. case 1000:
  103. return data;
  104. default:
  105. return Promise.reject({ code, message });
  106. }
  107. },
  108. async (error) => {
  109. NProgress.done();
  110. if (error.response) {
  111. const { status } = error.response;
  112. const { user } = useBase();
  113. if (status == 401) {
  114. user.logout();
  115. } else {
  116. if (!isDev) {
  117. switch (status) {
  118. case 403:
  119. router.push("/403");
  120. break;
  121. case 500:
  122. router.push("/500");
  123. break;
  124. case 502:
  125. router.push("/502");
  126. break;
  127. }
  128. }
  129. }
  130. }
  131. return Promise.reject({ message: error.message });
  132. }
  133. );
  134. export { request };