axios.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. "use strict";
  2. import Vue from 'vue';
  3. import axios from "axios";
  4. import constants from "@/utils/constants";
  5. import storage from "@/utils/storage";
  6. import { Notification, Loading } from 'element-ui'
  7. import Store from '@/store'
  8. import Api from '@/api'
  9. import Config from '@/config'
  10. import Router from '@/router'
  11. // Full config: https://github.com/axios/axios#request-config
  12. // axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
  13. // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  14. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  15. // 是否正在刷新的标记
  16. let isRefreshing = false
  17. // 重试队列,每一项将是一个待执行的函数形式
  18. let retryRequests = []
  19. let loadingInstance = {}
  20. let config = {
  21. baseURL: Config.baseURL,
  22. // timeout: 60 * 1000, // Timeout
  23. // withCredentials: true, // Check cross-site Access-Control
  24. retries:3
  25. };
  26. const _axios = axios.create(config);
  27. _axios.interceptors.request.use(
  28. async function (config) {
  29. // Do something before request is sent
  30. const token = storage.getStr(constants.token)
  31. if (token) {
  32. // config.headers[constants.tokenHeader] = token
  33. }
  34. config.headers['x-project-id'] = Store.getters.projectId || ''
  35. if (config.loading) {
  36. loadingInstance = Loading.service({})
  37. }
  38. //重试
  39. if(config.retry){
  40. config.timeout = 5000
  41. }
  42. return config;
  43. },
  44. function (error) {
  45. // Do something with request error
  46. return Promise.reject(error);
  47. }
  48. );
  49. // Add a response interceptor
  50. _axios.interceptors.response.use(
  51. function (response) {
  52. const config = response.config
  53. if (config.loading) {
  54. loadingInstance.close()
  55. }
  56. let { code, message } = response.data
  57. if (code === 200 || config.responseType === 'blob') {
  58. isRefreshing = false
  59. return response.data
  60. }
  61. if (code === 401) {
  62. Router.push({
  63. path: `/login`
  64. }).then(r => {})
  65. return Promise.reject(response.data)
  66. }
  67. if (code === 402 || code===201) {
  68. Notification.error({
  69. title: '权限不足',
  70. message: message
  71. })
  72. return Promise.reject(response.data)
  73. }
  74. if(code == 806){
  75. Notification.error({
  76. title: '账号未启用',
  77. message: message
  78. })
  79. return Promise.reject(response.data)
  80. }
  81. if (code === 500) {
  82. // TODO
  83. if(response.data == '未登录'){
  84. Router.push({
  85. path: `/login`
  86. }).then(r => {})
  87. }
  88. return Promise.reject(response.data)
  89. } else if (code === 0) {
  90. isRefreshing = false
  91. Notification.error({
  92. title: '请求错误',
  93. message: message
  94. })
  95. return Promise.reject(response.data)
  96. } else if (code !== 401) {
  97. }
  98. // Do something with response data
  99. // return response;
  100. },
  101. function (error) {
  102. const obj = error.config
  103. if(error.code =='ECONNABORTED' && obj.retry){
  104. obj.__retryCount = obj.__retryCount || 0
  105. // 检查是否达到最大重试次数
  106. if (obj.__retryCount >= config.retries) {
  107. return Promise.reject(error)
  108. }
  109. obj.isPagination = false
  110. // 增加重试计数器
  111. obj.__retryCount += 1
  112. // 创建一个新的Promise来处理每次重试之前等待一段时间
  113. const backoff = new Promise((resolve) => {
  114. setTimeout(() => {
  115. resolve('重新请求:' + obj.__retryCount)
  116. }, obj.timeout || 3000)
  117. })
  118. // 返回Promise,以便Axios知道我们已经处理了错误
  119. return backoff.then((txt) => {
  120. console.log(txt)
  121. obj.url = obj.url.replace('/api','')
  122. return _axios(obj)
  123. })
  124. }
  125. if(error.response.status == 404){
  126. Notification.error({
  127. title: '接口不存在',
  128. message: error.response.data.message
  129. })
  130. }else{
  131. // Do something with response error
  132. Notification.error({
  133. title: '系统错误',
  134. message: error.response.data.message
  135. })
  136. }
  137. isRefreshing = false
  138. return Promise.reject(error);
  139. }
  140. );
  141. Plugin.install = function (Vue) {
  142. Vue.axios = _axios;
  143. window.axios = _axios;
  144. Object.defineProperties(Vue.prototype, {
  145. axios: {
  146. get() {
  147. return _axios;
  148. }
  149. },
  150. $axios: {
  151. get() {
  152. return _axios;
  153. }
  154. },
  155. });
  156. };
  157. Vue.use(Plugin)
  158. export default _axios;