request.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import axios from 'axios' // 引入axios
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import { useUserStore } from '@/pinia/modules/user'
  4. import router from '@/router/index'
  5. import { ElLoading } from 'element-plus'
  6. const service = axios.create({
  7. baseURL: import.meta.env.VITE_BASE_API,
  8. timeout: 99999
  9. })
  10. let activeAxios = 0
  11. let timer
  12. let loadingInstance
  13. const showLoading = (option = {
  14. target: null,
  15. }) => {
  16. const loadDom = document.getElementById('gva-base-load-dom')
  17. activeAxios++
  18. if (timer) {
  19. clearTimeout(timer)
  20. }
  21. timer = setTimeout(() => {
  22. if (activeAxios > 0) {
  23. if (!option.target) option.target = loadDom
  24. loadingInstance = ElLoading.service(option)
  25. }
  26. }, 400)
  27. }
  28. const closeLoading = () => {
  29. activeAxios--
  30. if (activeAxios <= 0) {
  31. clearTimeout(timer)
  32. loadingInstance && loadingInstance.close()
  33. }
  34. }
  35. // http request 拦截器
  36. service.interceptors.request.use(
  37. config => {
  38. if (!config.donNotShowLoading) {
  39. showLoading(config.loadingOption)
  40. }
  41. const userStore = useUserStore()
  42. config.headers = {
  43. 'Content-Type': 'application/json',
  44. 'x-token': userStore.token,
  45. 'x-user-id': userStore.userInfo.ID,
  46. ...config.headers
  47. }
  48. return config
  49. },
  50. error => {
  51. if (!error.config.donNotShowLoading) {
  52. closeLoading()
  53. }
  54. ElMessage({
  55. showClose: true,
  56. message: error,
  57. type: 'error'
  58. })
  59. return error
  60. }
  61. )
  62. // http response 拦截器
  63. service.interceptors.response.use(
  64. response => {
  65. const userStore = useUserStore()
  66. if (!response.config.donNotShowLoading) {
  67. closeLoading()
  68. }
  69. if (response.headers['new-token']) {
  70. userStore.setToken(response.headers['new-token'])
  71. }
  72. if (response.data.code === 0 || response.headers.success === 'true') {
  73. if (response.headers.msg) {
  74. response.data.msg = decodeURI(response.headers.msg)
  75. }
  76. return response.data
  77. } else {
  78. ElMessage({
  79. showClose: true,
  80. message: response.data.msg || decodeURI(response.headers.msg),
  81. type: 'error'
  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.ClearStorage()
  116. router.push({ name: 'Login', replace: true })
  117. })
  118. break
  119. case 404:
  120. ElMessageBox.confirm(`
  121. <p>检测到接口错误${error}</p>
  122. <p>错误码<span style="color:red"> 404 </span>:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格</p>
  123. `, '接口报错', {
  124. dangerouslyUseHTMLString: true,
  125. distinguishCancelAndClose: true,
  126. confirmButtonText: '我知道了',
  127. cancelButtonText: '取消'
  128. })
  129. break
  130. case 401:
  131. ElMessageBox.confirm(`
  132. <p>无效的令牌</p>
  133. <p>错误码:<span style="color:red"> 401 </span>错误信息:${error}</p>
  134. `, '身份信息', {
  135. dangerouslyUseHTMLString: true,
  136. distinguishCancelAndClose: true,
  137. confirmButtonText: '重新登录',
  138. cancelButtonText: '取消'
  139. })
  140. .then(() => {
  141. const userStore = useUserStore()
  142. userStore.ClearStorage()
  143. router.push({ name: 'Login', replace: true })
  144. })
  145. break
  146. }
  147. return error
  148. }
  149. )
  150. export default service