request.js 3.9 KB

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