This commit is contained in:
ahjung
2024-09-14 22:39:11 +08:00
parent 1ae5372396
commit 7a62de39c2
62 changed files with 1996 additions and 2938 deletions

View File

@@ -0,0 +1,124 @@
import { createAlova } from 'alova';
import VueHook from 'alova/vue';
import adapterFetch from 'alova/fetch';
import { createAlovaMockAdapter } from '@alova/mock';
import { isString } from 'lodash-es';
import mocks from './mocks';
import { useUser } from '@/store/modules/user';
import { storage } from '@/utils/Storage';
import { useGlobSetting } from '@/hooks/setting';
import { PageEnum } from '@/enums/pageEnum';
import { ResultEnum } from '@/enums/httpEnum';
import { isUrl } from '@/utils';
const { useMock, apiUrl, urlPrefix, loggerMock } = useGlobSetting();
const mockAdapter = createAlovaMockAdapter([...mocks], {
// 全局控制是否启用mock接口默认为true
enable: useMock,
// 非模拟请求适配器用于未匹配mock接口时发送请求
httpAdapter: adapterFetch(),
// mock接口响应延迟单位毫秒
delay: 1000,
// 自定义打印mock接口请求信息
// mockRequestLogger: (res) => {
// loggerMock && console.log(`Mock Request ${res.url}`, res);
// },
mockRequestLogger: loggerMock,
onMockError(error, currentMethod) {
console.error('🚀 ~ onMockError ~ currentMethod:', currentMethod);
console.error('🚀 ~ onMockError ~ error:', error);
},
});
export const Alova = createAlova({
baseURL: apiUrl,
statesHook: VueHook,
// 关闭全局请求缓存
// cacheFor: null,
// 全局缓存配置
// cacheFor: {
// POST: {
// mode: 'memory',
// expire: 60 * 10 * 1000
// },
// GET: {
// mode: 'memory',
// expire: 60 * 10 * 1000
// },
// HEAD: 60 * 10 * 1000 // 统一设置HEAD请求的缓存模式
// },
// 在开发环境开启缓存命中日志
cacheLogger: process.env.NODE_ENV === 'development',
requestAdapter: mockAdapter,
beforeRequest(method) {
const userStore = useUser();
const token = userStore.getToken;
// 添加 token 到请求头
if (!method.meta?.ignoreToken && token) {
method.config.headers['token'] = token;
}
// 处理 api 请求前缀
const isUrlStr = isUrl(method.url as string);
if (!isUrlStr && urlPrefix) {
method.url = `${urlPrefix}${method.url}`;
}
if (!isUrlStr && apiUrl && isString(apiUrl)) {
method.url = `${apiUrl}${method.url}`;
}
},
responded: {
onSuccess: async (response, method) => {
const res = (response.json && (await response.json())) || response.body;
// 是否返回原生响应头 比如:需要获取响应头时使用该属性
if (method.meta?.isReturnNativeResponse) {
return res;
}
// 请根据自身情况修改数据结构
const { message, code, result } = res;
// 不进行任何处理,直接返回
// 用于需要直接获取 code、result、 message 这些信息时开启
if (method.meta?.isTransformResponse === false) {
return res.data;
}
// @ts-ignore
const Message = window.$message;
// @ts-ignore
const Modal = window.$dialog;
const LoginPath = PageEnum.BASE_LOGIN;
if (ResultEnum.SUCCESS === code) {
return result;
}
// 需要登录
if (code === 912) {
Modal?.warning({
title: '提示',
content: '登录身份已失效,请重新登录!',
okText: '确定',
closable: false,
maskClosable: false,
onOk: async () => {
storage.clear();
window.location.href = LoginPath;
},
});
} else {
// 可按需处理错误 一般情况下不是 912 错误,不一定需要弹出 message
Message?.error(message);
throw new Error(message);
}
},
},
});
// 项目,多个不同 api 地址,可导出多个实例
// export const AlovaTwo = createAlova({
// baseURL: 'http://localhost:9001',
// });