request.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import axios, { AxiosError } from 'axios'
  2. import { AxiosInstance, AxiosRequestConfig, AxiosResponse, ExtraConfig } from './request.d'
  3. import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
  4. import { ls, debounce } from '@/utils'
  5. import router from '@/router'
  6. import useStore from '@/store'
  7. // ElLoading service 创建的单例
  8. let loading: any = null
  9. // 创建axios实例
  10. const axiosInstance: AxiosInstance = axios.create({
  11. baseURL: import.meta.env.VITE_APP_BASE_API, // api 的 base_url
  12. timeout: 50000 // 请求超时时间
  13. })
  14. // token 过期
  15. const tokenLoseHandler = debounce(
  16. function () {
  17. // const { user } = useStore()
  18. ls.clear() // 清除浏览器全部缓存
  19. router.push('/login')
  20. ElMessageBox.alert('当前页面已失效,请重新登录', '提示', {})
  21. },
  22. 3000,
  23. true
  24. )
  25. // 判断是否配置加载 页面级别Loading 执行相关操作
  26. const showFullPageLoadingHandler = (config: AxiosRequestConfig, cb: () => any) => {
  27. const extraConfig: ExtraConfig = config.extraConfig || {}
  28. const bool = extraConfig.showFullscreenLoading || false
  29. bool && cb && cb()
  30. }
  31. // request 拦截器
  32. axiosInstance.interceptors.request.use(
  33. (config: AxiosRequestConfig) => {
  34. if (!config.headers) {
  35. throw new Error(`Expected 'config' and 'config.headers' not to be undefined`)
  36. }
  37. const token = ls.get('token')
  38. // const { token } = useStore().user
  39. // 让每个请求携带自定义token 请根据实际情况自行修改
  40. if (!config.headers['accessToken'] && token) {
  41. config.headers['accessToken'] = token
  42. }
  43. showFullPageLoadingHandler(config, () => {
  44. // 目前只有两种语言 若有新增 请另外处理 todo...
  45. const text = useStore().app.language === 'zh-cn' ? '加载中...' : 'Loading...'
  46. loading = ElLoading.service({
  47. // lock: true,
  48. text,
  49. background: 'rgba(0, 0, 0, 0.3)'
  50. })
  51. })
  52. return config
  53. },
  54. (error: any) => {
  55. return Promise.reject({ from: 'request_error', response: error })
  56. }
  57. )
  58. // let testTimeOut = null
  59. // response 拦截器
  60. axiosInstance.interceptors.response.use(
  61. async (response: AxiosResponse) => {
  62. const { extraConfig = {} } = response.config
  63. showFullPageLoadingHandler(response.config, () => {
  64. loading.close()
  65. })
  66. /* eslint-disable */
  67. // @ts-ignore
  68. let { code, message, data } = response.data || {}
  69. /* eslint-enable */
  70. if (code === 200) {
  71. /**配置有 responseAll 将会返回 接口整体数据 默认返回 接口返回 对象.data*/
  72. return extraConfig.responseAll ? response.data : data
  73. } else {
  74. if (code === 4100) {
  75. tokenLoseHandler()
  76. } else {
  77. ElMessage({
  78. message: message || '系统出错',
  79. type: 'error'
  80. })
  81. }
  82. return Promise.reject({ from: 'response_success:code!=200', response })
  83. }
  84. },
  85. (error: AxiosError) => {
  86. // eslint-disable-next-line
  87. // @ts-ignore
  88. const response: AxiosResponse = error.response || {}
  89. const { data } = response
  90. showFullPageLoadingHandler(error.config || {}, () => {
  91. loading.close()
  92. })
  93. if (!error.response || !data) {
  94. let message = '未知错误,请联系管理员'
  95. // 请求超时状态
  96. if (error.message.includes('timeout')) {
  97. message = '请求超时,请检查网络是否连接正常'
  98. }
  99. ElMessage.error(message)
  100. return Promise.reject({ from: 'response_error:no_res||no_res.data', response })
  101. }
  102. const { code, message } = data
  103. // /** 如果是通过 transformResponse 对 data 自定义 */
  104. // if (data.isCustomize === true) {
  105. // return Promise.reject(error.response)
  106. // }
  107. if (code === 4100) {
  108. tokenLoseHandler()
  109. } else {
  110. const _statusText: any = {
  111. 4000: '业务相关错误代码',
  112. 4100: '授权token已过期,请重新登录',
  113. 4101: '谷歌验证失败'
  114. }
  115. ElMessage({
  116. message: message || _statusText[code] || '系统出错!',
  117. type: 'error'
  118. })
  119. return Promise.reject({ from: 'response_error:code!=200', response })
  120. }
  121. }
  122. )
  123. // 导出 axios 实例
  124. export default axiosInstance
  125. // 用于 数据 取消上次请求绑定 使用
  126. export const CancelToken = axios.CancelToken
  127. // import request from '@/utils/request'
  128. //
  129. // //列表
  130. // export function getList(params) {
  131. // return request({
  132. // url: '/api/getList',
  133. // method: 'get',
  134. // params: params
  135. // })
  136. // }