request.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import axios from 'axios'
  2. import {
  3. // baseURL,
  4. contentType,
  5. debounce,
  6. requestTimeout,
  7. successCode,
  8. tokenName,
  9. } from '@/config'
  10. import store from '@/store'
  11. import qs from 'qs'
  12. import router from '@/router'
  13. import { isArray } from '@/utils/validate'
  14. import { message } from 'ant-design-vue'
  15. // console.log(successCode, tokenName, contentType)
  16. let loadingInstance
  17. /**
  18. * @author chuzhixin 1204505056@qq.com
  19. * @description 处理code异常
  20. * @param {*} code
  21. * @param {*} msg
  22. */
  23. const handleCode = (code, msg) => {
  24. switch (code) {
  25. case 401:
  26. message.error(msg || '登录失效')
  27. store.dispatch('user/resetAll').catch(() => { })
  28. break
  29. case 403:
  30. router.push({ path: '/401' }).catch(() => { })
  31. break
  32. default:
  33. message.error(msg || `后端接口${code}异常`)
  34. break
  35. }
  36. }
  37. /**
  38. * @author chuzhixin 1204505056@qq.com
  39. * @description axios初始化
  40. */
  41. const baseURL = window.PLATFROM_CONFIG.baseUrl
  42. // console.log(baseURL)
  43. const instance = axios.create({
  44. baseURL,
  45. timeout: requestTimeout,
  46. headers: {
  47. 'Content-Type': contentType,
  48. },
  49. })
  50. /**
  51. * @author chuzhixin 1204505056@qq.com
  52. * @description axios请求拦截器
  53. */
  54. instance.interceptors.request.use(
  55. (config) => {
  56. if (store.getters['user/accessToken'])
  57. config.headers[tokenName] = store.getters['user/accessToken']
  58. if (
  59. config.data &&
  60. config.headers['Content-Type'] ===
  61. 'application/x-www-form-urlencoded;charset=UTF-8'
  62. )
  63. config.data = qs.stringify(config.data)
  64. if (debounce.some((item) => config.url.includes(item))) {
  65. //这里写加载动画
  66. }
  67. return config
  68. },
  69. (error) => {
  70. return Promise.reject(error)
  71. }
  72. )
  73. /**
  74. * @author chuzhixin 1204505056@qq.com
  75. * @description axios响应拦截器
  76. */
  77. instance.interceptors.response.use(
  78. (response) => {
  79. if (loadingInstance) loadingInstance.close()
  80. const { data, config } = response
  81. const { code, msg } = data
  82. // 操作正常Code数组
  83. const codeVerificationArray = isArray(successCode)
  84. ? [...successCode]
  85. : [...[successCode]]
  86. // 是否操作正常
  87. if (codeVerificationArray.includes(parseInt(code))) {
  88. return data
  89. } else {
  90. handleCode(code, msg)
  91. return Promise.reject(
  92. 'vue-admin-beautiful请求异常拦截:' +
  93. JSON.stringify({ url: config.url, code, msg }) || 'Error'
  94. )
  95. }
  96. },
  97. (error) => {
  98. if (loadingInstance) loadingInstance.close()
  99. const { response, message } = error
  100. if (error.response && error.response.data) {
  101. const { status, data } = response
  102. handleCode(status, data.msg || message)
  103. return Promise.reject(error)
  104. } else {
  105. let { message } = error
  106. if (message === 'Network Error') {
  107. message = '后端接口连接异常'
  108. }
  109. if (message.includes('timeout')) {
  110. message = '后端接口请求超时'
  111. }
  112. if (message.includes('Request failed with status code')) {
  113. const code = message.substr(message.length - 3)
  114. message = '后端接口' + code + '异常'
  115. }
  116. message.error(message || `后端接口未知异常`)
  117. return Promise.reject(error)
  118. }
  119. }
  120. )
  121. export default instance