http.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import axios from 'axios'
  2. import store from '@/store'
  3. import router from '../router'
  4. import Vue from 'vue'
  5. let vue = new Vue()
  6. // import qs from 'qs'
  7. const exceptUrls = ['/sso/user/logout', '/sso/user/sendUserInfo', '/user/order/queryOrderStatus', '/user/checkToken']
  8. // axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? 'https://test.4dkankan.com/api' : '/api'
  9. axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? '/api' : '/api'
  10. // axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? 'http://192.168.0.207:8087/api' : '/api'
  11. // 请求超时时限
  12. axios.defaults.timeout = 1500000
  13. // 请求次数
  14. axios.defaults.retry = 2
  15. // 请求的间隙
  16. axios.defaults.retryDelay = 1000
  17. // 拦截请求,做登陆,或head处理
  18. axios.interceptors.request.use(function (config) {
  19. if (config.method === 'post') {
  20. config.data = {
  21. ...config.data
  22. }
  23. // config.data = qs.stringify(config.data)
  24. } else if (config.method === 'get') {
  25. config.params = {
  26. rnd: Math.random(),
  27. ...config.params
  28. }
  29. // config.params = qs.stringify(config.params)
  30. }
  31. for (let i = 0; i < exceptUrls.length; i++) {
  32. let url = exceptUrls[i]
  33. if (config.url === url) {
  34. return config
  35. }
  36. }
  37. if (store.state.user.token) {
  38. config.headers = {
  39. token: store.state.user.token
  40. }
  41. }
  42. // vue.$toast.showLoading()
  43. vue.$toast.showLoading()
  44. return config
  45. }, function (error) {
  46. // 对请求错误做些什么
  47. return Promise.reject(error)
  48. })
  49. // // 拦截返回,做错误统一处理
  50. axios.interceptors.response.use(
  51. response => {
  52. vue.$toast.hideLoading()
  53. let code = Number(response.data.code)
  54. for (let i = 0; i < exceptUrls.length; i++) {
  55. let url = response.config.baseURL + exceptUrls[i]
  56. if (response.config.url === url) {
  57. return response
  58. }
  59. }
  60. switch (code) {
  61. case 3004:
  62. let msg = localStorage.getItem('language') === 'en' ? 'Please re-log in.' : '请重新登录'
  63. store.state.user.token && vue.$toast.show('warn', msg, async () => {
  64. await store.dispatch('logout')
  65. router.push('/login/login')
  66. })
  67. break
  68. default:
  69. break
  70. }
  71. return response
  72. },
  73. error => {
  74. // 请求超时的之后,抛出 error.code = ECONNABORTED的错误..错误信息是 timeout of xxx ms exceeded
  75. let err = localStorage.getItem('language') === 'en' ? 'Network request failed' : '网络请求失败'
  76. if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
  77. var config = error.config
  78. config.__retryCount = config.__retryCount || 0
  79. if (config.__retryCount >= config.retry) {
  80. // Reject with the error
  81. // window.location.reload();
  82. vue.$toast.show('error', err, function () {
  83. vue.$toast.hideLoading()
  84. })
  85. return Promise.reject(error)
  86. }
  87. // Increase the retry count
  88. config.__retryCount += 1
  89. // Create new promise to handle exponential backoff
  90. var backoff = new Promise(function (resolve) {
  91. setTimeout(function () {
  92. resolve()
  93. }, config.retryDelay || 1)
  94. })
  95. return backoff.then(function () {
  96. return axios(config)
  97. })
  98. } else {
  99. vue.$toast.show('error', err, function () {
  100. vue.$toast.hideLoading()
  101. })
  102. return Promise.reject(error)
  103. }
  104. }
  105. )
  106. export default axios