mirror of
https://github.com/jekip/naive-ui-admin.git
synced 2026-02-12 17:22:26 +08:00
127 lines
3.8 KiB
TypeScript
127 lines
3.8 KiB
TypeScript
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, useLocalSetting } from '@/hooks/setting';
|
||
import { PageEnum } from '@/enums/pageEnum';
|
||
import { ResultEnum } from '@/enums/httpEnum';
|
||
import { isUrl } from '@/utils';
|
||
|
||
const { apiUrl, urlPrefix } = useGlobSetting();
|
||
|
||
const { useMock, loggerMock } = useLocalSetting();
|
||
|
||
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',
|
||
// });
|