index.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. // baseUrl = '/api
  34. const service = axios.create({
  35. baseURL: process.env.VUE_APP_BASE_API,
  36. timeout: 50000
  37. });
  38. // 请求拦截器
  39. service.interceptors.request.use(
  40. config => {
  41. const { NODE_ENV } = process.env
  42. if (loadingCount == 0 && NODE_ENV !== 'development') {
  43. loadingInstance = Loading.service({
  44. lock: false,
  45. customClass: 'z-index999',
  46. text: '加载中,请稍后...',
  47. spinner: 'ui-icon-loading',
  48. background: 'rgba(0, 0, 0, 0.7)',
  49. });
  50. }
  51. if (store.getters.token) {
  52. config.headers['token'] = getToken();
  53. }
  54. loadingCount++;
  55. // 在请求发送之前做一些处理
  56. let jsonStr = config.data;
  57. let data = jsonStr;
  58. config.data = data;
  59. return config;
  60. },
  61. error => {
  62. // 发送失败
  63. Promise.reject(error);
  64. },
  65. );
  66. // 响应拦截器
  67. service.interceptors.response.use(
  68. response => {
  69. loadingCount--;
  70. if (loadingInstance && loadingCount == 0) {
  71. loadingInstance.close();
  72. }
  73. const dataAxios = response.data;
  74. const { code } = dataAxios;
  75. // 根据 code 进行判断}
  76. if (code === 200) {
  77. // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 VXAdmin 请求最新版本
  78. return dataAxios;
  79. } else {
  80. if (code == -1) {
  81. messageOnce.error({
  82. message: `${dataAxios.msg}`,
  83. type: 'error',
  84. duration: 5 * 1000,
  85. });
  86. setToken('');
  87. // 清除缓存的权限菜单
  88. sessionStorage.removeItem("route");
  89. //跳转登录页面
  90. router.push({path:`/login`})
  91. return
  92. }
  93. messageOnce.error({
  94. message: `${dataAxios.msg}`,
  95. type: 'error',
  96. duration: 5 * 1000,
  97. });
  98. return Promise.reject(dataAxios.data);
  99. // // 发送的接口为response.config.url,进行报错处理
  100. }
  101. },
  102. error => {
  103. loadingCount--;
  104. if (loadingInstance && loadingCount == 0) {
  105. loadingInstance.close();
  106. }
  107. if (error && error.response) {
  108. switch (error.response.status) {
  109. case 400:
  110. error.message = '请求错误';
  111. break;
  112. case 401:
  113. error.message = '未授权,请登录';
  114. break;
  115. case 403:
  116. error.message = '拒绝访问';
  117. break;
  118. case 404:
  119. error.message = `请求地址出错: ${error.response.config.url}`;
  120. break;
  121. case 408:
  122. error.message = '请求超时';
  123. break;
  124. case 500:
  125. error.message = '服务器内部错误';
  126. break;
  127. case 501:
  128. error.message = '服务未实现';
  129. break;
  130. case 502:
  131. error.message = '网关错误';
  132. break;
  133. case 503:
  134. error.message = '服务不可用';
  135. break;
  136. case 504:
  137. error.message = '网关超时';
  138. break;
  139. case 505:
  140. error.message = 'HTTP版本不受支持';
  141. break;
  142. default:
  143. break;
  144. }
  145. }
  146. errorLog(error);
  147. return Promise.reject(error);
  148. },
  149. );
  150. export default service;