This commit is contained in:
dap
2025-03-29 22:53:47 +08:00
13 changed files with 193 additions and 27 deletions

View File

@@ -210,7 +210,7 @@ defineExpose({
v-slot="{ flattenItems }"
:class="
cn(
'text-blackA11 select-none list-none rounded-lg p-2 text-sm font-medium',
'text-blackA11 container select-none list-none rounded-lg p-2 text-sm font-medium',
$attrs.class as unknown as ClassType,
bordered ? 'border' : '',
)
@@ -219,11 +219,7 @@ defineExpose({
<div class="w-full" v-if="$slots.header">
<slot name="header"> </slot>
</div>
<TransitionGroup
:name="transition ? 'fade' : ''"
mode="out-in"
class="container"
>
<TransitionGroup :name="transition ? 'fade' : ''">
<TreeItem
v-for="item in flattenItems"
v-slot="{

View File

@@ -31,6 +31,9 @@ async function generateAccessible(
const root = router.getRoutes().find((item) => item.path === '/');
// 获取已有的路由名称列表
const names = root?.children?.map((item) => item.name) ?? [];
// 动态添加到router实例内
accessibleRoutes.forEach((route) => {
/**
@@ -46,7 +49,10 @@ async function generateAccessible(
if (route.children && route.children.length > 0) {
delete route.component;
}
root.children?.push(route);
// 根据router name判断如果路由已经存在则不再添加
if (!names?.includes(route.name)) {
root.children?.push(route);
}
} else {
router.addRoute(route);
}

View File

@@ -23,10 +23,10 @@
"@vben/locales": "workspace:*",
"@vben/utils": "workspace:*",
"axios": "catalog:",
"qs": "^6.13.1"
"qs": "catalog:"
},
"devDependencies": {
"@types/qs": "^6.9.17",
"@types/qs": "catalog:",
"axios-mock-adapter": "catalog:"
}
}

View File

@@ -2,14 +2,39 @@ import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import type { RequestClientConfig, RequestClientOptions } from './types';
import { bindMethods, merge } from '@vben/utils';
import { bindMethods, isString, merge } from '@vben/utils';
import axios from 'axios';
import qs from 'qs';
import { FileDownloader } from './modules/downloader';
import { InterceptorManager } from './modules/interceptor';
import { FileUploader } from './modules/uploader';
function getParamsSerializer(
paramsSerializer: RequestClientOptions['paramsSerializer'],
) {
if (isString(paramsSerializer)) {
switch (paramsSerializer) {
case 'brackets': {
return (params: any) =>
qs.stringify(params, { arrayFormat: 'brackets' });
}
case 'comma': {
return (params: any) => qs.stringify(params, { arrayFormat: 'comma' });
}
case 'indices': {
return (params: any) =>
qs.stringify(params, { arrayFormat: 'indices' });
}
case 'repeat': {
return (params: any) => qs.stringify(params, { arrayFormat: 'repeat' });
}
}
}
return paramsSerializer;
}
class RequestClient {
public addRequestInterceptor: InterceptorManager['addRequestInterceptor'];
@@ -39,6 +64,9 @@ class RequestClient {
};
const { ...axiosConfig } = options;
const requestConfig = merge(axiosConfig, defaultConfig);
requestConfig.paramsSerializer = getParamsSerializer(
requestConfig.paramsSerializer,
);
this.instance = axios.create(requestConfig);
bindMethods(this);
@@ -154,6 +182,9 @@ class RequestClient {
const response: AxiosResponse<T> = await this.instance({
url,
...config,
...(config.paramsSerializer
? { paramsSerializer: getParamsSerializer(config.paramsSerializer) }
: {}),
});
return response as T;
} catch (error: any) {

View File

@@ -5,15 +5,29 @@ import type {
InternalAxiosRequestConfig,
} from 'axios';
type ExtendOptions = {
/** 响应数据的返回方式。
* raw: 原始的AxiosResponse包括headers、status等不做是否成功请求的检查。
* body: 返回响应数据的BODY部分只会根据status检查请求是否成功忽略对code的判断这种情况下应由调用方检查请求是否成功
* data: 解构响应的BODY数据只返回其中的data节点数据会检查status和code是否为成功状态
type ExtendOptions<T = any> = {
/**
* 参数序列化方式。预置的有
* - brackets: ids[]=1&ids[]=2&ids[]=3
* - comma: ids=1,2,3
* - indices: ids[0]=1&ids[1]=2&ids[2]=3
* - repeat: ids=1&ids=2&ids=3
*/
paramsSerializer?:
| 'brackets'
| 'comma'
| 'indices'
| 'repeat'
| AxiosRequestConfig<T>['paramsSerializer'];
/**
* 响应数据的返回方式。
* - raw: 原始的AxiosResponse包括headers、status等不做是否成功请求的检查。
* - body: 返回响应数据的BODY部分只会根据status检查请求是否成功忽略对code的判断这种情况下应由调用方检查请求是否成功
* - data: 解构响应的BODY数据只返回其中的data节点数据会检查status和code是否为成功状态
*/
responseReturn?: 'body' | 'data' | 'raw';
};
type RequestClientConfig<T = any> = AxiosRequestConfig<T> & ExtendOptions;
type RequestClientConfig<T = any> = AxiosRequestConfig<T> & ExtendOptions<T>;
type RequestResponse<T = any> = AxiosResponse<T> & {
config: RequestClientConfig<T>;

View File

@@ -1,5 +1,5 @@
export * from './iconify/index.js';
export * from './iconify-offline/index.js';
export * from './iconify';
export * from './iconify-offline';
export { default as EmptyIcon } from './icons/empty-icon.vue';
export * from './svg/index.js';
export * from './svg';
export { VbenIcon } from '@vben-core/shadcn-ui';