api.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import axios from "axios";
  2. import { useUserStore } from '@/stores/user'
  3. import i18n from '@/i18n/index.js'
  4. import { ElLoading, ElMessage } from "element-plus";
  5. let current = (localStorage && localStorage.getItem('language')) || 'zh'
  6. let token = (localStorage && localStorage.getItem('token')) || 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxNTkxNTgxNjA0MSIsImxvZ2luVHlwZSI6InVzZXIiLCJ1c2VyTmFtZSI6IjE1OTE1ODE2MDQxIiwiaWF0IjoxNjgxODAzNzY1LCJqdGkiOiJhMDU4M2EwZS01M2EzLTQ1YTUtOTI1ZS1kZDgzYzU5Y2Y5MGMifQ.bdu5jqbSxSlo9LH4w_uPEuP67DUJk6w5Yqnu633OtQI'
  7. // request是一个axios实例,每一个实例你都可以单独定制它的baseURL,超时时间,请求头和一些其他配置项。
  8. const baseUrl = import.meta.env.VITE_BASE_URL; //接口统一域名
  9. let store = null
  10. const timeZone = new Date().getTimezoneOffset()
  11. const lang = i18n.global.locale;
  12. const instance = axios.create({
  13. baseURL: baseUrl,
  14. // timeout: 60 * 1000, //设置超时
  15. headers: {
  16. "Content-Type": "application/json;charset=UTF-8;",
  17. "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
  18. ".AspNetCore.Culture": "c=zh-Hans|uic=zh-Hans",
  19. token: token,
  20. current,
  21. lang: current,
  22. },
  23. });
  24. let loading;
  25. //正在请求的数量
  26. let requestCount = 0;
  27. //显示loading
  28. const showLoading = () => {
  29. if (requestCount === 0) {
  30. loading = ElLoading.service({
  31. fullscreen: true,
  32. text: "Loading ",
  33. background: "rgba(0, 0, 0, 0.7)",
  34. });
  35. }
  36. requestCount++;
  37. };
  38. //隐藏loading
  39. const hideLoading = () => {
  40. requestCount--;
  41. if (requestCount == 0) {
  42. loading.close();
  43. }
  44. };
  45. //请求拦截器
  46. instance.interceptors.request.use(
  47. (config) => {
  48. if (!store) store = useUserStore()
  49. console.log('config', config.loading, 'if', store)
  50. token = store.token
  51. if (token) {
  52. // 判断是否存在token,如果存在的话,则每个http header都加上token
  53. config.headers.token = token //请求头加上token
  54. }
  55. if (!config.loading) {
  56. showLoading();
  57. }
  58. // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
  59. //若请求方式为post,则将data参数转为JSON字符串
  60. if (config.method === "POST") {
  61. config.data = JSON.stringify(config.data);
  62. }
  63. return config;
  64. },
  65. (error) =>
  66. // 对请求错误做些什么
  67. Promise.reject(error)
  68. );
  69. //响应拦截器
  70. instance.interceptors.response.use(
  71. (response) => {
  72. console.log('response', i18n, response.data)
  73. let t = i18n.global.t;
  74. let code = Number(response.data.code)
  75. hideLoading();
  76. if(code == 3004){
  77. ElMessage.error(t(`toast.${code}`) || response.data.message);
  78. throw response.data.msg || response.data.message;
  79. // window.location.href = '/#/login/login?from=%2F'
  80. }else if (code !== 200 && code !== 0) {
  81. ElMessage.error(t(`toast.${code}`) || response.data.message);
  82. return Promise.reject(response.data)
  83. // router.push("/");
  84. }
  85. else return response.data?.data;
  86. },
  87. (error) => {
  88. hideLoading();
  89. //响应错误
  90. let message = "";
  91. if (error.response && error.response.status) {
  92. const status = error.response.status;
  93. console.log('Error', error.response)
  94. switch (status) {
  95. case 400:
  96. message = "请求错误";
  97. break;
  98. case 401:
  99. message = "请求错误";
  100. break;
  101. case 404:
  102. message = "请求地址出错";
  103. break;
  104. case 408:
  105. message = "请求超时";
  106. break;
  107. case 500:
  108. message = "服务器内部错误!";
  109. break;
  110. case 501:
  111. message = "服务未实现!";
  112. break;
  113. case 502:
  114. message = "网关错误!";
  115. break;
  116. case 503:
  117. message = "服务不可用!";
  118. break;
  119. case 504:
  120. message = "网关超时!";
  121. break;
  122. case 505:
  123. message = "HTTP版本不受支持";
  124. break;
  125. default:
  126. message = "请求失败";
  127. }
  128. ElMessage.error(message);
  129. return Promise.reject(error);
  130. }
  131. return Promise.reject(error);
  132. }
  133. );
  134. export default instance;