axios.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import axios, { AxiosResponse, AxiosRequestConfig, Axios } from 'axios'
  2. import { ResultEnum, ModuleTypeEnum } 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, isPreview } from '@/utils'
  8. import { fetchAllowList } from './axios.config'
  9. import includes from 'lodash/includes'
  10. export interface MyResponseType {
  11. code: ResultEnum
  12. data: any
  13. message: string
  14. }
  15. export interface MyRequestInstance extends Axios {
  16. (config: AxiosRequestConfig): Promise<MyResponseType>
  17. }
  18. const axiosInstance = axios.create({
  19. baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}${axiosPre}`,
  20. timeout: ResultEnum.TIMEOUT,
  21. }) as unknown as MyRequestInstance
  22. axiosInstance.interceptors.request.use(
  23. (config: AxiosRequestConfig) => {
  24. // 白名单校验
  25. if (includes(fetchAllowList, config.url)) return config
  26. // 获取 token
  27. const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
  28. // 重新登录
  29. if (!info) {
  30. routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  31. return config
  32. }
  33. const userInfo = info[SystemStoreEnum.USER_INFO]
  34. config.headers = {
  35. ...config.headers,
  36. [userInfo[SystemStoreUserInfoEnum.TOKEN_NAME] || 'token']: userInfo[SystemStoreUserInfoEnum.USER_TOKEN] || ''
  37. }
  38. return config
  39. },
  40. (err: AxiosRequestConfig) => {
  41. Promise.reject(err)
  42. }
  43. )
  44. // 响应拦截器
  45. axiosInstance.interceptors.response.use(
  46. (res: AxiosResponse) => {
  47. // 预览页面错误不进行处理
  48. if (isPreview()) {
  49. return Promise.resolve(res.data)
  50. }
  51. const { code } = res.data as { code: number }
  52. // 成功
  53. if (code === ResultEnum.SUCCESS) {
  54. return Promise.resolve(res.data)
  55. }
  56. // 登录过期
  57. if (code === ResultEnum.TOKEN_OVERDUE) {
  58. window['$message'].error(window['$t']('http.token_overdue_message'))
  59. routerTurnByName(PageEnum.BASE_LOGIN_NAME)
  60. return Promise.resolve(res.data)
  61. }
  62. // 固定错误码重定向
  63. if (ErrorPageNameMap.get(code)) {
  64. redirectErrorPage(code)
  65. return Promise.resolve(res.data)
  66. }
  67. // 提示错误
  68. window['$message'].error(window['$t']((res.data as any).msg))
  69. return Promise.resolve(res.data)
  70. },
  71. (err: AxiosResponse) => {
  72. Promise.reject(err)
  73. }
  74. )
  75. export default axiosInstance