index2.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import store from '@/store';
  2. import axios from 'axios';
  3. import { Message, Loading } from 'element-ui';
  4. import { getToken, setToken, removeToken } from '@/utils/auth';
  5. import router from '@/router'
  6. import domMessage from '@/utils/messageOnce'
  7. const messageOnce = new domMessage()
  8. // 公共数据
  9. let loadingInstance = null; // 声明loading
  10. let loadingCount = 0; // 声明接口并发计数器
  11. // 记录和显示错误
  12. function errorLog(error) {
  13. // 添加到日志
  14. store.dispatch('vxadmin/log/push', {
  15. message: '数据请求异常',
  16. type: 'danger',
  17. meta: {
  18. error,
  19. },
  20. });
  21. // 打印到控制台
  22. if (process.env.NODE_ENV === 'development') {
  23. console.log(error);
  24. }
  25. // 显示提示
  26. messageOnce.error({
  27. message: error.message,
  28. type: 'error',
  29. duration: 5 * 1000,
  30. });
  31. }
  32. // 创建一个 axios 实例
  33. const service2 = axios.create({
  34. baseURL: process.env.VUE_APP_BASE_API2,
  35. timeout: 50000
  36. });
  37. // 请求拦截器
  38. service2.interceptors.request.use(
  39. config => {
  40. const { NODE_ENV } = process.env
  41. if (loadingCount == 0 && NODE_ENV !== 'development') {
  42. loadingInstance = Loading.service({
  43. lock: false,
  44. customClass: 'z-index999',
  45. text: '加载中,请稍后...',
  46. spinner: 'ui-icon-loading',
  47. background: 'rgba(0, 0, 0, 0.7)',
  48. });
  49. }
  50. if (store.getters.token) {
  51. config.headers['token'] = getToken();
  52. }
  53. loadingCount++;
  54. // 在请求发送之前做一些处理
  55. let jsonStr = config.data;
  56. let data = jsonStr;
  57. config.data = data;
  58. return config;
  59. },
  60. error => {
  61. // 发送失败
  62. Promise.reject(error);
  63. },
  64. );
  65. // 响应拦截器
  66. service2.interceptors.response.use(
  67. response => {
  68. loadingCount--;
  69. if (loadingInstance && loadingCount == 0) {
  70. loadingInstance.close();
  71. }
  72. const dataAxios = response.data;
  73. const { code } = dataAxios;
  74. // 根据 code 进行判断}
  75. if (code === 200) {
  76. // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 VXAdmin 请求最新版本
  77. return dataAxios;
  78. } else {
  79. if (code == -1) {
  80. messageOnce.error({
  81. message: `${dataAxios.msg}`,
  82. type: 'error',
  83. duration: 5 * 1000,
  84. });
  85. setToken('');
  86. // 清除缓存的权限菜单
  87. sessionStorage.removeItem("route");
  88. //跳转登录页面
  89. router.push({path:`/login`})
  90. return
  91. }
  92. messageOnce.error({
  93. message: `${dataAxios.msg}`,
  94. type: 'error',
  95. duration: 5 * 1000,
  96. });
  97. return Promise.reject(dataAxios.data);
  98. // // 发送的接口为response.config.url,进行报错处理
  99. }
  100. },
  101. error => {
  102. loadingCount--;
  103. if (loadingInstance && loadingCount == 0) {
  104. loadingInstance.close();
  105. }
  106. if (error && error.response) {
  107. switch (error.response.status) {
  108. case 400:
  109. error.message = '请求错误';
  110. break;
  111. case 401:
  112. error.message = '未授权,请登录';
  113. break;
  114. case 403:
  115. error.message = '拒绝访问';
  116. break;
  117. case 404:
  118. error.message = `请求地址出错: ${error.response.config.url}`;
  119. break;
  120. case 408:
  121. error.message = '请求超时';
  122. break;
  123. case 500:
  124. error.message = '服务器内部错误';
  125. break;
  126. case 501:
  127. error.message = '服务未实现';
  128. break;
  129. case 502:
  130. error.message = '网关错误';
  131. break;
  132. case 503:
  133. error.message = '服务不可用';
  134. break;
  135. case 504:
  136. error.message = '网关超时';
  137. break;
  138. case 505:
  139. error.message = 'HTTP版本不受支持';
  140. break;
  141. default:
  142. break;
  143. }
  144. }
  145. errorLog(error);
  146. return Promise.reject(error);
  147. },
  148. );
  149. export default service2;