import { createAlova, Method } from 'alova'; import adapterFetch from 'alova/fetch'; import VueHook from 'alova/vue'; import pinia, { useAccountStore } from '@/stores'; import router from '@/router'; const FileHttpClient = createAlova({ requestAdapter: adapterFetch(), statesHook: VueHook, baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/file/`, async beforeRequest(method) { if (!method.config.meta?.ignoreToken) { method.config.headers.Authorization ??= useAccountStore(pinia).token; } }, responded: { async onSuccess(response, method) { if (response.status === 200) { return analysisResponseBody(response, method); } }, async onError(error, method) {}, async onComplete(method) {}, }, }); export default FileHttpClient; async function analysisResponseBody(response: Response, method: Method) { const body = await response.json(); const { code, msg, data, ...external } = body; if (code === 401) { await nextTick(() => router.replace({ name: 'login' })); } if (code !== 200) throw method.meta?.exception?.(msg, response, method) ?? msg; ['success', 'warn', 'error'].forEach((key) => Reflect.deleteProperty(external, key)); return Object.assign({}, external, data); }