pharmacy.request.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { createAlova, Method } from 'alova';
  2. import adapterFetch from 'alova/fetch';
  3. import VueHook from 'alova/vue';
  4. import pinia, { useAccountStore } from '@/stores';
  5. import router from '@/router';
  6. const PharmacyHttpClient = createAlova({
  7. requestAdapter: adapterFetch(),
  8. statesHook: VueHook,
  9. baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/yfc-admin/`,
  10. async beforeRequest(method) {
  11. if (!method.config.meta?.ignoreToken) {
  12. method.config.headers.Authorization ??= useAccountStore(pinia).token;
  13. }
  14. },
  15. responded: {
  16. async onSuccess(response, method) {
  17. if (response.status === 200) {
  18. return analysisResponseBody(response, method);
  19. }
  20. },
  21. async onError(error, method) {},
  22. async onComplete(method) {},
  23. },
  24. });
  25. export default PharmacyHttpClient;
  26. async function analysisResponseBody(response: Response, method: Method) {
  27. const body = await response.json();
  28. const { code, msg, data, ...external } = body;
  29. if (code === 401) {
  30. await nextTick(() => router.replace({ name: 'login' }));
  31. }
  32. if (code !== 200) throw method.meta?.exception?.(msg, response, method) ?? msg;
  33. ['success', 'warn', 'error'].forEach((key) => Reflect.deleteProperty(external, key));
  34. return Object.assign({}, external, data);
  35. }