apiRequest.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import type { AxiosResponse } from 'axios'
  2. import axios from 'axios'
  3. // import qs from 'qs'
  4. import { ElLoading, ElMessage } from 'element-plus'
  5. import router from '@/router/index'
  6. import useSettingsStore from '@/store/modules/settings'
  7. import useUserStore from '@/store/modules/user'
  8. let loading: { close: () => void }
  9. // 全局拦截请求发送前提交的参数
  10. const settingsStore = useSettingsStore()
  11. const toLogin = () => {
  12. useUserStore().logout().then(() => {
  13. router.push({
  14. path: '/login',
  15. query: {
  16. redirect: router.currentRoute.value.path !== '/login' ? router.currentRoute.value.fullPath : undefined,
  17. },
  18. })
  19. })
  20. }
  21. const apiRequest = axios.create({
  22. baseURL: import.meta.env.DEV ? settingsStore.settings.base.devServerUrl : settingsStore.settings.base.serverUrl,
  23. timeout: 1000 * 60,
  24. responseType: 'json',
  25. })
  26. apiRequest.interceptors.request.use(
  27. (request) => {
  28. loading = ElLoading.service({ text: 'LOADING……' })
  29. const userStore = useUserStore()
  30. // 设置请求头
  31. if (request.headers) {
  32. request.headers['Accept-Language'] = settingsStore.settings.app.defaultLang
  33. request.headers.AppID = settingsStore.settings.base.appID
  34. request.headers.AppKey = settingsStore.settings.base.appKey
  35. request.headers.AppSecret = settingsStore.settings.base.appSecret
  36. if (userStore.isLogin) {
  37. request.headers.Authorization = `Bearer ${userStore.token}`
  38. }
  39. }
  40. // 是否将 POST 请求参数进行字符串化处理
  41. if (request.method === 'post') {
  42. // request.data = qs.stringify(request.data, {
  43. // arrayFormat: 'brackets',
  44. // })
  45. }
  46. return request
  47. },
  48. )
  49. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  50. apiRequest.interceptors.response.use(
  51. (response: AxiosResponse<any>) => {
  52. loading.close()
  53. /**
  54. * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示
  55. * 假设返回数据格式为:{ status: 0, error: '', data: '' }
  56. * 规则是当 status 为 0 时表示请求成功,为 0 时表示接口需要登录或者登录状态失效,需要重新登录
  57. * 请求出错时 error 会返回错误信息
  58. */
  59. if (response.config.responseType === 'blob') {
  60. // 如果是文件流,直接过
  61. return response
  62. }
  63. else if (response.data.code === 200) {
  64. return response.data
  65. }
  66. else {
  67. ElMessage.error(response.data.msg)
  68. if (response.data.code === 401) {
  69. toLogin()
  70. return Promise.reject(response.data)
  71. }
  72. else {
  73. return Promise.reject(response.data)
  74. }
  75. }
  76. },
  77. (error) => {
  78. loading.close()
  79. let message = error.message
  80. if (message === 'Network Error') {
  81. message = '后端网络故障'
  82. }
  83. else if (message.includes('timeout')) {
  84. message = '接口请求超时'
  85. }
  86. else if (message.includes('Request failed with status code')) {
  87. message = `接口${message.substr(message.length - 3)}异常`
  88. }
  89. ElMessage({
  90. message,
  91. type: 'error',
  92. })
  93. return Promise.reject(error)
  94. },
  95. )
  96. export default apiRequest