axios.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. const axiosInstance = axios.create({
  11. baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}${axiosPre}`,
  12. timeout: ResultEnum.TIMEOUT,
  13. })
  14. axiosInstance.interceptors.request.use(
  15. (config: AxiosRequestConfig) => {
  16. // 白名单校验
  17. if (includes(fetchAllowList, config.url)) return config
  18. // 获取 token
  19. const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
  20. // 重新登录
  21. if (!info) {
  22. routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  23. return config
  24. }
  25. config.headers = {
  26. ...config.headers,
  27. [RequestHttpHeaderEnum.TOKEN]: info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN] || ''
  28. }
  29. return config
  30. },
  31. (err: AxiosRequestConfig) => {
  32. Promise.reject(err)
  33. }
  34. )
  35. // 响应拦截器
  36. axiosInstance.interceptors.response.use(
  37. (res: AxiosResponse) => {
  38. const { code } = res.data as { code: number }
  39. // 成功
  40. if (code === ResultEnum.SUCCESS) {
  41. return Promise.resolve(res.data)
  42. }
  43. // 登录过期
  44. if (code === ResultEnum.TOKEN_OVERDUE) {
  45. window['$message'].error(window['$t']('http.token_overdue_message'))
  46. routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  47. return Promise.resolve(res.data)
  48. }
  49. // 固定错误码重定向
  50. if (ErrorPageNameMap.get(code)) {
  51. redirectErrorPage(code)
  52. return Promise.resolve(res.data)
  53. }
  54. // 提示错误
  55. window['$message'].error(window['$t']((res.data as any).msg))
  56. return Promise.resolve(res.data)
  57. },
  58. (err: AxiosResponse) => {
  59. httpErrorHandle()
  60. Promise.reject(err)
  61. }
  62. )
  63. export default axiosInstance