axios.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
  2. import { ResultEnum, RequestHttpHeaderEnum } from "@/enums/httpEnum"
  3. import { PageEnum, ErrorPageNameMap } from "@/enums/pageEnum"
  4. import { StorageEnum } from '@/enums/storageEnum'
  5. import { axiosPre } from '@/settings/httpSetting'
  6. import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
  7. import { redirectErrorPage, getLocalStorage, routerTurnByName, httpErrorHandle } from '@/utils'
  8. import { fetchAllowList } from './axios.config'
  9. import includes from 'lodash/includes'
  10. interface MyResponseType {
  11. code: number;
  12. msg: string;
  13. data: any;
  14. }
  15. const axiosInstance = axios.create({
  16. baseURL: axiosPre,
  17. timeout: ResultEnum.TIMEOUT,
  18. })
  19. axiosInstance.interceptors.request.use(
  20. (config: AxiosRequestConfig) => {
  21. // 白名单校验
  22. if (includes(fetchAllowList, config.url)) return config
  23. // 获取 token
  24. const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
  25. // 重新登录
  26. if (!info) return routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  27. config.headers = {
  28. [RequestHttpHeaderEnum.TOKEN]: info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN] || ''
  29. }
  30. return config
  31. },
  32. (error: AxiosRequestConfig) => {
  33. Promise.reject(error)
  34. }
  35. )
  36. // 响应拦截器
  37. axiosInstance.interceptors.response.use(
  38. (res: AxiosResponse) => {
  39. const { code } = res.data as { code: number }
  40. // 成功
  41. if (code === ResultEnum.SUCCESS) {
  42. return Promise.resolve(res.data)
  43. }
  44. // 登录过期
  45. if (code === ResultEnum.TOKEN_OVERDUE) {
  46. window['$message'].error(window['$t']('http.token_overdue_message'))
  47. routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  48. return
  49. }
  50. // 固定错误码重定向
  51. if (ErrorPageNameMap.get(code)) {
  52. redirectErrorPage(code)
  53. return
  54. }
  55. // 提示错误
  56. window['$message'].error(window['$t']((res.data as any).msg))
  57. return Promise.resolve(res.data)
  58. },
  59. (err: AxiosResponse) => {
  60. const { code } = err.data as { code: number }
  61. if (ErrorPageNameMap.get(code)) redirectErrorPage(code)
  62. httpErrorHandle()
  63. Promise.reject(err)
  64. }
  65. )
  66. export default axiosInstance