request.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * axios 实例
  3. */
  4. import axios from 'axios';
  5. import router from '@/router';
  6. import { MessageBox } from 'element-ui';
  7. import { API_BASE_URL, TOKEN_HEADER_NAME, LAYOUT_PATH } from '@/config/setting';
  8. import { getToken, setToken } from './token-util';
  9. import { logout } from './page-tab-util';
  10. import JSONBIG from 'json-bigint';
  11. const service = axios.create({
  12. baseURL: API_BASE_URL,
  13. transformResponse: [
  14. function (data) {
  15. const json = JSONBIG({
  16. storeAsString: true
  17. });
  18. const res = json.parse(data);
  19. return res;
  20. }
  21. ]
  22. });
  23. /**
  24. * 添加请求拦截器
  25. */
  26. service.interceptors.request.use(
  27. (config) => {
  28. // 添加 token 到 header
  29. const token = getToken();
  30. if (token && config.headers) {
  31. config.headers.common[TOKEN_HEADER_NAME] = token;
  32. }
  33. return config;
  34. },
  35. (error) => {
  36. return Promise.reject(error);
  37. }
  38. );
  39. /**
  40. * 添加响应拦截器
  41. */
  42. service.interceptors.response.use(
  43. (res) => {
  44. // token 自动续期
  45. const token = res.headers[TOKEN_HEADER_NAME.toLowerCase()];
  46. if (token) {
  47. setToken(token);
  48. }
  49. return res;
  50. },
  51. (error) => {
  52. // 登录过期处理
  53. if (error?.response?.status === 401) {
  54. const currentPath = router.currentRoute.path;
  55. if (currentPath === LAYOUT_PATH) {
  56. logout(true);
  57. } else {
  58. MessageBox.alert('登录状态已过期, 请退出重新登录!', '系统提示', {
  59. confirmButtonText: '重新登录',
  60. callback: (action) => {
  61. if (action === 'confirm') {
  62. logout(false, currentPath);
  63. }
  64. },
  65. beforeClose: () => {
  66. MessageBox.close();
  67. }
  68. });
  69. }
  70. return Promise.reject(new Error(error.response.data?.message));
  71. }
  72. return Promise.reject(error);
  73. }
  74. );
  75. export default service;