request.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import axios, { AxiosRequestConfig } from "axios";
  2. import { showLoadingToast, closeToast, showFailToast } from 'vant';
  3. import { useCookies } from '@vueuse/integrations/useCookies';
  4. const { VITE_TOKEN_KEY } = import.meta.env;
  5. const token = useCookies().get(VITE_TOKEN_KEY as string);
  6. interface ResponseData<T = any> {
  7. code: number;
  8. message: string;
  9. data: T;
  10. }
  11. let loadingCount = 0
  12. const MODE = import.meta.env.MODE; // 环境变量
  13. console.log("MODE: ", MODE);
  14. const service = axios.create({
  15. // 开发环境请求本地代理,生产环境请求域名
  16. // 开发环境在接口面前自动加上 api,配合 本地代理使用,无需在每个接口前写 /api
  17. // baseURL: MODE === "development" ? "/service" : "http://ab.svip52.com/api",
  18. headers: {
  19. "X-Requested-With": "XMLHttpRequest",
  20. "Content-Type": "application/json",
  21. },
  22. });
  23. // 两层泛型,一层是 axios 提供的,AxiosRequestConfig
  24. // 一层是自定义的,ResponseData<T>
  25. // 实现响应的 data 以及 data.data 的类型提示
  26. // request 函数传入一个 data.data 的类型
  27. const request = async <T = any>(
  28. config: AxiosRequestConfig
  29. ): Promise<ResponseData<T>> => {
  30. // 请求前加上 token
  31. service.interceptors.request.use((config) => {
  32. addToast()
  33. if (config?.headers) {
  34. config.headers.wxOpenId = token || "";
  35. }
  36. return config;
  37. });
  38. //response拦截器
  39. service.interceptors.response.use(
  40. response => {
  41. reduce()
  42. return response;
  43. },
  44. error => {
  45. reduce()
  46. return Promise.reject(error)
  47. }
  48. );
  49. const { data } = await service.request<ResponseData<T>>(config);
  50. // 请求失败
  51. console.log('request',data)
  52. // reduce()
  53. if (typeof data !== "object") {
  54. showFailToast({
  55. message:'服务器错误,请联系管理员',
  56. icon: 'warning-o',
  57. });
  58. return Promise.reject(data);
  59. }
  60. if (data.code != 200) {
  61. if (data.message) showFailToast({
  62. message:data.message,
  63. icon: 'warning-o',
  64. });
  65. // 401,token 过期
  66. if (data.code == 401) {
  67. localStorage.removeItem("token");
  68. location.href = "#/login";
  69. }
  70. return Promise.reject(data);
  71. }
  72. return data;
  73. };
  74. function addToast(){
  75. showLoadingToast({
  76. message: '加载中...',
  77. forbidClick: true,
  78. duration: 0,
  79. });
  80. loadingCount++
  81. }
  82. function reduce(){
  83. loadingCount--
  84. if (loadingCount == 0) {
  85. closeToast()
  86. }
  87. }
  88. export default request;