request.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * 该文件可自行根据业务逻辑进行调整
  3. */
  4. import type { HttpResponse } from '@vben/request';
  5. import { useAppConfig } from '@vben/hooks';
  6. import { preferences } from '@vben/preferences';
  7. import { RequestClient } from '@vben/request';
  8. import { useAccessStore } from '@vben/stores';
  9. import { message } from 'ant-design-vue';
  10. import { useAuthStore } from '#/store';
  11. const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
  12. function createRequestClient(baseURL: string) {
  13. const client = new RequestClient({
  14. baseURL,
  15. // 为每个请求携带 Authorization
  16. makeAuthorization: () => {
  17. return {
  18. // 默认
  19. key: 'Authorization',
  20. tokenHandler: () => {
  21. const accessStore = useAccessStore();
  22. return {
  23. refreshToken: `${accessStore.refreshToken}`,
  24. token: `${accessStore.accessToken}`,
  25. };
  26. },
  27. unAuthorizedHandler: async () => {
  28. const accessStore = useAccessStore();
  29. const authStore = useAuthStore();
  30. accessStore.setAccessToken(null);
  31. if (preferences.app.loginExpiredMode === 'modal') {
  32. accessStore.setLoginExpired(true);
  33. } else {
  34. // 退出登录
  35. await authStore.logout();
  36. }
  37. },
  38. };
  39. },
  40. makeErrorMessage: (msg) => message.error(msg),
  41. makeRequestHeaders: () => {
  42. return {
  43. // 为每个请求携带 Accept-Language
  44. 'Accept-Language': preferences.app.locale,
  45. };
  46. },
  47. });
  48. client.addResponseInterceptor<HttpResponse>((response) => {
  49. const { data: responseData, status } = response;
  50. const { code, data, message: msg } = responseData;
  51. if (status >= 200 && status < 400 && code === 0) {
  52. return data;
  53. }
  54. throw new Error(msg);
  55. });
  56. return client;
  57. }
  58. export const requestClient = createRequestClient(apiURL);