request.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import axios from 'axios' // 引入axios
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import { useUserStore } from '@/pinia/modules/user'
  4. import { emitter } from '@/utils/bus.js'
  5. import router from '@/router/index'
  6. const service = axios.create({
  7. baseURL: import.meta.env.VITE_BASE_API,
  8. timeout: 99999
  9. })
  10. let acitveAxios = 0
  11. let timer
  12. const showLoading = () => {
  13. acitveAxios++
  14. if (timer) {
  15. clearTimeout(timer)
  16. }
  17. timer = setTimeout(() => {
  18. if (acitveAxios > 0) {
  19. emitter.emit('showLoading')
  20. }
  21. }, 400)
  22. }
  23. const closeLoading = () => {
  24. acitveAxios--
  25. if (acitveAxios <= 0) {
  26. clearTimeout(timer)
  27. emitter.emit('closeLoading')
  28. }
  29. }
  30. // http request 拦截器
  31. service.interceptors.request.use(
  32. config => {
  33. if (!config.donNotShowLoading) {
  34. showLoading()
  35. }
  36. const userStore = useUserStore()
  37. config.headers = {
  38. 'Content-Type': 'application/json',
  39. 'x-token': userStore.token,
  40. 'x-user-id': userStore.userInfo.ID,
  41. ...config.headers
  42. }
  43. return config
  44. },
  45. error => {
  46. if (!error.config.donNotShowLoading) {
  47. closeLoading()
  48. }
  49. ElMessage({
  50. showClose: true,
  51. message: error,
  52. type: 'error'
  53. })
  54. return error
  55. }
  56. )
  57. // http response 拦截器
  58. service.interceptors.response.use(
  59. response => {
  60. const userStore = useUserStore()
  61. if (!response.config.donNotShowLoading) {
  62. closeLoading()
  63. }
  64. if (response.headers['new-token']) {
  65. userStore.setToken(response.headers['new-token'])
  66. }
  67. if (response.data.code === 0 || response.headers.success === 'true') {
  68. if (response.headers.msg) {
  69. response.data.msg = decodeURI(response.headers.msg)
  70. }
  71. return response.data
  72. } else {
  73. ElMessage({
  74. showClose: true,
  75. message: response.data.msg || decodeURI(response.headers.msg),
  76. type: 'error'
  77. })
  78. if (response.data.data && response.data.data.reload) {
  79. userStore.token = ''
  80. localStorage.clear()
  81. router.push({ name: 'Login', replace: true })
  82. }
  83. return response.data.msg ? response.data : response
  84. }
  85. },
  86. error => {
  87. if (!error.config.donNotShowLoading) {
  88. closeLoading()
  89. }
  90. if (!error.response) {
  91. ElMessageBox.confirm(`
  92. <p>检测到请求错误</p>
  93. <p>${error}</p>
  94. `, '请求报错', {
  95. dangerouslyUseHTMLString: true,
  96. distinguishCancelAndClose: true,
  97. confirmButtonText: '稍后重试',
  98. cancelButtonText: '取消'
  99. })
  100. return
  101. }
  102. switch (error.response.status) {
  103. case 500:
  104. // ElMessageBox.confirm(`
  105. // <p>检测到接口错误${error}</p>
  106. // <p>错误码<span style="color:red"> 500 </span>:此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存</p>
  107. // `, '接口报错', {
  108. // dangerouslyUseHTMLString: true,
  109. // distinguishCancelAndClose: true,
  110. // confirmButtonText: '清理缓存',
  111. // cancelButtonText: '取消'
  112. // })
  113. // .then(() => {
  114. // const userStore = useUserStore()
  115. // userStore.token = ''
  116. // localStorage.clear()
  117. // router.push({ name: 'Login', replace: true })
  118. // })
  119. ElMessage({
  120. type: 'error',
  121. message: '请稍后重试'
  122. })
  123. break
  124. case 404:
  125. ElMessageBox.confirm(`
  126. <p>检测到接口错误${error}</p>
  127. <p>错误码<span style="color:red"> 404 </span>:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格</p>
  128. `, '接口报错', {
  129. dangerouslyUseHTMLString: true,
  130. distinguishCancelAndClose: true,
  131. confirmButtonText: '我知道了',
  132. cancelButtonText: '取消'
  133. })
  134. break
  135. }
  136. return error
  137. }
  138. )
  139. export default service