http.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import axios from 'axios';
  2. import { getToken } from '@/utils/auth';
  3. import { getRuntimeServices } from '@/utils/runtime-services';
  4. import { Message } from 'element-ui';
  5. const service = axios.create({
  6. baseURL: process.env.VUE_APP_EEP,
  7. timeout: 300000,
  8. });
  9. /**
  10. * 获取请求错误信息
  11. * @param {object} error 请求错误对象
  12. * @returns {string} 返回错误提示信息
  13. */
  14. function getRequestErrorMessage(error) {
  15. const status = error.response?.status;
  16. const code = error.code;
  17. if (code === 'ECONNABORTED' || /timeout/i.test(error.message || '')) {
  18. return '请求超时:服务器长时间未响应。下一步:请稍后重试,若持续出现请联系管理员检查服务状态。';
  19. }
  20. if (!error.response) {
  21. if (typeof navigator !== 'undefined' && navigator.onLine === false) {
  22. return '网络不可用:当前设备似乎已断网。下一步:请检查网络连接恢复后重新操作。';
  23. }
  24. if (code === 'ERR_NETWORK') {
  25. return '网络异常:当前无法连接到服务器。下一步:请检查网络、服务地址或浏览器安全限制后重试。';
  26. }
  27. return `请求失败:${error.message || '无法连接服务器'}。下一步:请检查网络连接和服务地址后重试。`;
  28. }
  29. if (status === 401) {
  30. return '登录状态已失效:当前请求未通过身份校验。下一步:请重新登录后再试。';
  31. }
  32. if (status === 403) {
  33. return '没有操作权限:服务器拒绝了本次请求。下一步:请确认账号权限或联系管理员开通权限。';
  34. }
  35. if (status === 404) {
  36. return '接口不存在:当前请求的服务或资源未找到。下一步:请确认请求地址或联系后端排查接口配置。';
  37. }
  38. if (status >= 500) {
  39. return '服务异常:服务器处理请求时发生错误。下一步:请稍后重试,若持续出现请联系管理员查看服务日志。';
  40. }
  41. if (status >= 400) {
  42. return `请求异常:服务器返回 ${status}。下一步:请核对提交内容后重试,必要时联系管理员排查。`;
  43. }
  44. return `请求失败:${error.message || '未知错误'}。下一步:请稍后重试。`;
  45. }
  46. // 请求拦截器
  47. service.interceptors.request.use(
  48. (config) => {
  49. config.headers['Content-Type'] = 'application/json';
  50. return config;
  51. },
  52. (error) => {
  53. return Promise.reject(error);
  54. },
  55. );
  56. // 响应拦截器
  57. service.interceptors.response.use(
  58. (response) => {
  59. const res = response.data;
  60. const { code, status, message, error } = res;
  61. if (code === 404) {
  62. Message({
  63. message: '请求的资源不存在',
  64. type: 'error',
  65. duration: 3 * 1000,
  66. });
  67. return Promise.reject(new Error(message || 'Error'));
  68. }
  69. // 返回数据失败
  70. if (status === 0) {
  71. Message({
  72. message: `${error}`,
  73. type: 'error',
  74. duration: 3 * 1000,
  75. });
  76. return Promise.reject(new Error(`${error}` || 'Error'));
  77. }
  78. // 无效的操作用户
  79. if (status === -1) {
  80. Message({
  81. message: error,
  82. type: 'error',
  83. duration: 3 * 1000,
  84. });
  85. const { store, router } = getRuntimeServices();
  86. store?.dispatch('user/signOut');
  87. router?.push('/login');
  88. }
  89. return res;
  90. },
  91. (error) => {
  92. if (error.code === 'ERR_CANCELED') {
  93. return Promise.reject(error);
  94. }
  95. Message({
  96. message: getRequestErrorMessage(error),
  97. type: 'error',
  98. duration: 3 * 1000,
  99. });
  100. return Promise.reject(error);
  101. },
  102. );
  103. /**
  104. * 得到必需的请求参数
  105. * @param {boolean} noTransmit 不传递旧的请求参数
  106. * @param {object} options 其他选项
  107. * @param {boolean} options.newAccessToken 是否使用新的AccessToken
  108. * @returns {object} 返回必需的请求参数
  109. * */
  110. function getRequestParams(noTransmit = false, options = { newAccessToken: false }) {
  111. const { newAccessToken } = options;
  112. const token = getToken();
  113. let AccessToken = token?.access_token ?? '';
  114. if (newAccessToken) {
  115. AccessToken = token?.gcls_sys_session_info?.access_token || AccessToken;
  116. }
  117. const params = {
  118. UserCode: token?.gcls_sys_session_info?.user_id ?? '',
  119. UserType: token?.gcls_sys_session_info?.user_type ?? '',
  120. SessionID: token?.gcls_sys_session_info?.session_id ?? '',
  121. };
  122. return {
  123. AccessToken,
  124. ...(!noTransmit && params),
  125. };
  126. }
  127. /**
  128. * @description http 请求封装
  129. */
  130. export const http = {
  131. /**
  132. * @param {String} url 请求地址
  133. * @param {object} config 请求配置
  134. */
  135. get: (url, config) => service.get(url, config),
  136. /**
  137. * @param {string} url 请求地址
  138. * @param {object} data 请求数据
  139. * @param {object} config 请求配置
  140. * @param {boolean} noTransmit 不传递旧的请求参数
  141. * @param {object} options 其他选项
  142. * @param {boolean} options.newAccessToken 是否使用新的AccessToken
  143. */
  144. post: (url, data = {}, config = {}, noTransmit = false, options = { newAccessToken: false }) => {
  145. config.params = {
  146. ...config.params,
  147. ...getRequestParams(noTransmit, options),
  148. };
  149. return service.post(url, data, config);
  150. },
  151. postForm: (url, data = {}, config = {}, noTransmit = false, options = { newAccessToken: false }) => {
  152. config.params = {
  153. ...config.params,
  154. ...getRequestParams(noTransmit, options),
  155. };
  156. return service.postForm(url, data, config);
  157. },
  158. put: (url, data, config) => service.put(url, data, config),
  159. delete: (url, data, config) => service.delete(url, data, config),
  160. };
  161. /**
  162. * 更新axios的baseURL
  163. * @param {string} address 新的baseURL地址
  164. */
  165. export function updateBaseURL(address = '') {
  166. service.defaults.baseURL = address || process.env.VUE_APP_EEP;
  167. }