request.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import axios from 'axios';
  2. import { useUserStore } from '@/stores/modules/userStore';
  3. import { createDiscreteApi } from 'naive-ui';
  4. import { tansParams } from "@/utils/tools";
  5. import type { Result } from '@/types/data';
  6. import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, AxiosError } from 'axios';
  7. import type { NotificationApi } from "naive-ui";
  8. const { notification } = createDiscreteApi(["notification"]);
  9. const useStore = useUserStore();
  10. const url = import.meta.env.VITE_BASE_URL;
  11. const prefix = import.meta.env.VITE_BASE_PREFIX;
  12. const baseURL = url + prefix;
  13. enum errorCode {
  14. '请求错误' = 400,
  15. '未授权,请重新登录' = 401,
  16. '拒绝访问' = 403,
  17. '请求出错' = 404,
  18. '请求超时' = 408,
  19. '服务器错误' = 500,
  20. '服务未实现' = 501,
  21. '网络错误' = 502,
  22. '服务不可用' = 503,
  23. '网络超时' = 504,
  24. 'HTTP版本不受支持' = 505
  25. }
  26. const showNotification = (type: keyof NotificationApi = 'error', meta: string) => {
  27. notification[type]({
  28. content: '提示',
  29. meta,
  30. duration: 3 * 1000,
  31. keepAliveOnHover: true
  32. })
  33. }
  34. export class Request {
  35. private instance: AxiosInstance;
  36. private baseConfig: AxiosRequestConfig = { baseURL, timeout: 30 * 1000 };
  37. constructor(config: AxiosRequestConfig = {}) {
  38. this.instance = axios.create({ ...this.baseConfig, ...config });
  39. this.instance.interceptors.request.use((config: InternalAxiosRequestConfig<Result>) => {
  40. const { token } = useStore.userInfo;
  41. // if (config.method === "get" && config.params) {
  42. // let url = config.url + '?' + tansParams(config.params);
  43. // url = url.slice(0, -1);
  44. // config.params = {};
  45. // config.url = url;
  46. // }
  47. token && (config.headers.Authorization = 'Bearer ' + token);
  48. return config;
  49. }, (err: any) => {
  50. return Promise.reject(err)
  51. });
  52. this.instance.interceptors.response.use(res => {
  53. if ( res.config.onDownloadProgress ) return res;
  54. const { code } = res.data;
  55. // console.log(code)
  56. // !success && showNotification("error", message);
  57. return code === 200 ? res.data : Promise.reject(res.data);
  58. }, (error: AxiosError) => {
  59. // if (error.code === 'ERR_ABORTED') {
  60. // console.log( "取消了请求", error.code );
  61. // return
  62. // }
  63. // error.code === 'ERR_ABORTED'
  64. // console.log("取消了请求");
  65. const errorMessage = errorCode[error.response?.status as number] || error.message ||'未知错误';
  66. // showNotification("error", errorMessage);
  67. return Promise.reject(error);
  68. })
  69. }
  70. public request(config: AxiosRequestConfig): Promise<AxiosResponse> {
  71. return this.instance.request(config);
  72. }
  73. public get<T = any>(
  74. url: string,
  75. config?: AxiosRequestConfig
  76. ): Promise<Result<T>> {
  77. return this.instance.get(url, config);
  78. }
  79. public post<T = any>(
  80. url: string,
  81. data?: any,
  82. config?: AxiosRequestConfig
  83. ): Promise<Result<T>> {
  84. return this.instance.post(url, data, config);
  85. }
  86. public put<T = any>(
  87. url: string,
  88. data?: any,
  89. config?: AxiosRequestConfig
  90. ): Promise<Result<T>> {
  91. return this.instance.put(url, data, config);
  92. }
  93. public delete<T = any>(
  94. url: string,
  95. config?: AxiosRequestConfig
  96. ): Promise<Result<T>> {
  97. return this.instance.delete(url, config);
  98. }
  99. }
  100. export default new Request({
  101. baseURL,
  102. timeout: 120 * 1000
  103. });