feat: 日常更新
parent
1133555ca2
commit
1d572cf8e4
|
|
@ -142,69 +142,50 @@ export interface UpdateUserDto {
|
||||||
roleIds?: number[];
|
roleIds?: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Permission {
|
|
||||||
/**
|
|
||||||
* 权限名称
|
|
||||||
* @example "文章列表"
|
|
||||||
*/
|
|
||||||
name: string;
|
|
||||||
/**
|
|
||||||
* 权限标识
|
|
||||||
* @example "post:list"
|
|
||||||
*/
|
|
||||||
slug: string;
|
|
||||||
/**
|
|
||||||
* 权限类型
|
|
||||||
* @example "menu"
|
|
||||||
*/
|
|
||||||
type: "menu" | "api";
|
|
||||||
/**
|
|
||||||
* 权限描述
|
|
||||||
* @example "文章列表"
|
|
||||||
*/
|
|
||||||
description: string;
|
|
||||||
/**
|
|
||||||
* 自增ID
|
|
||||||
* @example 1
|
|
||||||
*/
|
|
||||||
id: number;
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
* @format date-time
|
|
||||||
* @example "2022-01-01 10:10:10"
|
|
||||||
*/
|
|
||||||
createdAt: string;
|
|
||||||
/**
|
|
||||||
* 创建人
|
|
||||||
* @example "绝弹"
|
|
||||||
*/
|
|
||||||
createdBy: string;
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
* @format date-time
|
|
||||||
* @example "2022-01-02 11:11:11"
|
|
||||||
*/
|
|
||||||
updatedAt: string;
|
|
||||||
/**
|
|
||||||
* 更新人
|
|
||||||
* @example "绝弹"
|
|
||||||
*/
|
|
||||||
updatedBy: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateRoleDto {
|
export interface CreateRoleDto {
|
||||||
|
/**
|
||||||
|
* 角色名称
|
||||||
|
* @example "管理员"
|
||||||
|
*/
|
||||||
name: string;
|
name: string;
|
||||||
|
/**
|
||||||
|
* 角色标识
|
||||||
|
* @example "admin"
|
||||||
|
*/
|
||||||
slug: string;
|
slug: string;
|
||||||
|
/**
|
||||||
|
* 角色描述
|
||||||
|
* @example "一段很长的描述"
|
||||||
|
*/
|
||||||
description?: string;
|
description?: string;
|
||||||
permissions?: Permission[];
|
/**
|
||||||
|
* 角色ID数组
|
||||||
|
* @example [1]
|
||||||
|
*/
|
||||||
|
menuIds: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UpdateRoleDto {
|
export interface UpdateRoleDto {
|
||||||
permissionIds?: number[];
|
/**
|
||||||
|
* 角色名称
|
||||||
|
* @example "管理员"
|
||||||
|
*/
|
||||||
name?: string;
|
name?: string;
|
||||||
|
/**
|
||||||
|
* 角色标识
|
||||||
|
* @example "admin"
|
||||||
|
*/
|
||||||
slug?: string;
|
slug?: string;
|
||||||
|
/**
|
||||||
|
* 角色描述
|
||||||
|
* @example "一段很长的描述"
|
||||||
|
*/
|
||||||
description?: string;
|
description?: string;
|
||||||
permissions?: Permission[];
|
/**
|
||||||
|
* 角色ID数组
|
||||||
|
* @example [1]
|
||||||
|
*/
|
||||||
|
menuIds?: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AuthUserDto {
|
export interface AuthUserDto {
|
||||||
|
|
@ -301,48 +282,22 @@ export interface UpdateLogDto {
|
||||||
demo?: string;
|
demo?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CreatePermissionDto {
|
export interface CreateFileDto {
|
||||||
/**
|
|
||||||
* 权限名称
|
|
||||||
* @example "权限名称"
|
|
||||||
*/
|
|
||||||
name: string;
|
|
||||||
/**
|
|
||||||
* 权限标识
|
|
||||||
* @example "permission:permission"
|
|
||||||
*/
|
|
||||||
slug: string;
|
|
||||||
/** 权限描述 */
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdatePermissionDto {
|
|
||||||
id: number;
|
|
||||||
/**
|
|
||||||
* 权限名称
|
|
||||||
* @example "权限名称"
|
|
||||||
*/
|
|
||||||
name?: string;
|
|
||||||
/**
|
|
||||||
* 权限标识
|
|
||||||
* @example "permission:permission"
|
|
||||||
*/
|
|
||||||
slug?: string;
|
|
||||||
/** 权限描述 */
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateUploadDto {
|
|
||||||
/** @format binary */
|
/** @format binary */
|
||||||
file: File;
|
file: File;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Upload {
|
export interface File {
|
||||||
/**
|
/**
|
||||||
* 文件名
|
* 文件名
|
||||||
* @example "xxx.jpg"
|
* @example "头像.jpg"
|
||||||
*/
|
*/
|
||||||
name: string;
|
name: string;
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
* @example "一段很长的描述"
|
||||||
|
*/
|
||||||
|
description: string;
|
||||||
/**
|
/**
|
||||||
* 文件大小
|
* 文件大小
|
||||||
* @example 1024
|
* @example 1024
|
||||||
|
|
@ -397,6 +352,19 @@ export interface Upload {
|
||||||
updatedBy: string;
|
updatedBy: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface UpdateFileDto {
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
* @example "头像.jpg"
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
* @example "一段很长的描述"
|
||||||
|
*/
|
||||||
|
description?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CreatePostDto {
|
export interface CreatePostDto {
|
||||||
/** 文章标题 */
|
/** 文章标题 */
|
||||||
title: string;
|
title: string;
|
||||||
|
|
@ -816,6 +784,11 @@ export interface Dict {
|
||||||
description: string;
|
description: string;
|
||||||
/** 字段类型 */
|
/** 字段类型 */
|
||||||
type: DictType;
|
type: DictType;
|
||||||
|
/**
|
||||||
|
* 类型ID
|
||||||
|
* @example 1
|
||||||
|
*/
|
||||||
|
typeId: number;
|
||||||
/**
|
/**
|
||||||
* 自增ID
|
* 自增ID
|
||||||
* @example 1
|
* @example 1
|
||||||
|
|
@ -862,6 +835,11 @@ export interface UpdateDictTypeDto {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CreateDictDto {
|
export interface CreateDictDto {
|
||||||
|
/**
|
||||||
|
* 字典类型
|
||||||
|
* @example 1
|
||||||
|
*/
|
||||||
|
typeId: number;
|
||||||
/**
|
/**
|
||||||
* 类型名称
|
* 类型名称
|
||||||
* @example "性别"
|
* @example "性别"
|
||||||
|
|
@ -878,6 +856,11 @@ export interface CreateDictDto {
|
||||||
|
|
||||||
export interface UpdateDictDto {
|
export interface UpdateDictDto {
|
||||||
id: number;
|
id: number;
|
||||||
|
/**
|
||||||
|
* 字典类型
|
||||||
|
* @example 1
|
||||||
|
*/
|
||||||
|
typeId?: number;
|
||||||
/**
|
/**
|
||||||
* 类型名称
|
* 类型名称
|
||||||
* @example "性别"
|
* @example "性别"
|
||||||
|
|
@ -1127,10 +1110,10 @@ export interface GetDictTypesParams {
|
||||||
|
|
||||||
export interface GetDictsParams {
|
export interface GetDictsParams {
|
||||||
/**
|
/**
|
||||||
* 字段描述(Swagger用途)
|
* 类型ID
|
||||||
* @example "示例值"
|
* @example 1
|
||||||
*/
|
*/
|
||||||
demo?: string;
|
typeId: number;
|
||||||
/**
|
/**
|
||||||
* 排序规则
|
* 排序规则
|
||||||
* @default "id:desc"
|
* @default "id:desc"
|
||||||
|
|
@ -1667,17 +1650,17 @@ export namespace Log {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export namespace Permission {
|
export namespace File {
|
||||||
/**
|
/**
|
||||||
* @description 创建权限
|
* @description 上传文件
|
||||||
* @tags permission
|
* @tags file
|
||||||
* @name AddPermission
|
* @name AddFile
|
||||||
* @request POST:/api/v1/permissions
|
* @request POST:/api/v1/file
|
||||||
*/
|
*/
|
||||||
export namespace AddPermission {
|
export namespace AddFile {
|
||||||
export type RequestParams = {};
|
export type RequestParams = {};
|
||||||
export type RequestQuery = {};
|
export type RequestQuery = {};
|
||||||
export type RequestBody = CreatePermissionDto;
|
export type RequestBody = CreateFileDto;
|
||||||
export type RequestHeaders = {};
|
export type RequestHeaders = {};
|
||||||
export type ResponseBody = {
|
export type ResponseBody = {
|
||||||
/**
|
/**
|
||||||
|
|
@ -1694,119 +1677,6 @@ export namespace Permission {
|
||||||
data?: number;
|
data?: number;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* @description 批量查询权限
|
|
||||||
* @tags permission
|
|
||||||
* @name GetPermissions
|
|
||||||
* @request GET:/api/v1/permissions
|
|
||||||
*/
|
|
||||||
export namespace GetPermissions {
|
|
||||||
export type RequestParams = {};
|
|
||||||
export type RequestQuery = {};
|
|
||||||
export type RequestBody = never;
|
|
||||||
export type RequestHeaders = {};
|
|
||||||
export type ResponseBody = Response;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @description 查询权限
|
|
||||||
* @tags permission
|
|
||||||
* @name GetPermission
|
|
||||||
* @request GET:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
export namespace GetPermission {
|
|
||||||
export type RequestParams = {
|
|
||||||
id: string;
|
|
||||||
};
|
|
||||||
export type RequestQuery = {};
|
|
||||||
export type RequestBody = never;
|
|
||||||
export type RequestHeaders = {};
|
|
||||||
export type ResponseBody = {
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @description 更新权限
|
|
||||||
* @tags permission
|
|
||||||
* @name SetPermission
|
|
||||||
* @request PATCH:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
export namespace SetPermission {
|
|
||||||
export type RequestParams = {
|
|
||||||
id: string;
|
|
||||||
};
|
|
||||||
export type RequestQuery = {};
|
|
||||||
export type RequestBody = UpdatePermissionDto;
|
|
||||||
export type RequestHeaders = {};
|
|
||||||
export type ResponseBody = Response;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @description 删除权限
|
|
||||||
* @tags permission
|
|
||||||
* @name DelPermission
|
|
||||||
* @request DELETE:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
export namespace DelPermission {
|
|
||||||
export type RequestParams = {
|
|
||||||
id: string;
|
|
||||||
};
|
|
||||||
export type RequestQuery = {};
|
|
||||||
export type RequestBody = never;
|
|
||||||
export type RequestHeaders = {};
|
|
||||||
export type ResponseBody = {
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export namespace File {
|
|
||||||
/**
|
|
||||||
* @description 上传文件
|
|
||||||
* @tags file
|
|
||||||
* @name AddFile
|
|
||||||
* @request POST:/api/v1/file
|
|
||||||
*/
|
|
||||||
export namespace AddFile {
|
|
||||||
export type RequestParams = {};
|
|
||||||
export type RequestQuery = {};
|
|
||||||
export type RequestBody = CreateUploadDto;
|
|
||||||
export type RequestHeaders = {};
|
|
||||||
export type ResponseBody = {
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: Upload;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* @description 批量查询
|
* @description 批量查询
|
||||||
* @tags file
|
* @tags file
|
||||||
|
|
@ -1845,7 +1715,7 @@ export namespace File {
|
||||||
* @example "请求成功"
|
* @example "请求成功"
|
||||||
*/
|
*/
|
||||||
message: string;
|
message: string;
|
||||||
data?: Upload;
|
data?: File;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
@ -1856,10 +1726,10 @@ export namespace File {
|
||||||
*/
|
*/
|
||||||
export namespace SetFile {
|
export namespace SetFile {
|
||||||
export type RequestParams = {
|
export type RequestParams = {
|
||||||
id: string;
|
id: number;
|
||||||
};
|
};
|
||||||
export type RequestQuery = {};
|
export type RequestQuery = {};
|
||||||
export type RequestBody = never;
|
export type RequestBody = UpdateFileDto;
|
||||||
export type RequestHeaders = {};
|
export type RequestHeaders = {};
|
||||||
export type ResponseBody = {
|
export type ResponseBody = {
|
||||||
/**
|
/**
|
||||||
|
|
@ -1892,7 +1762,7 @@ export namespace File {
|
||||||
export type ResponseBody = Response;
|
export type ResponseBody = Response;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @description 查询文件是否已存在
|
* @description 根据哈希查询
|
||||||
* @tags file
|
* @tags file
|
||||||
* @name GetFileByHash
|
* @name GetFileByHash
|
||||||
* @request GET:/api/v1/file/hash/{hash}
|
* @request GET:/api/v1/file/hash/{hash}
|
||||||
|
|
@ -1916,7 +1786,7 @@ export namespace File {
|
||||||
* @example "请求成功"
|
* @example "请求成功"
|
||||||
*/
|
*/
|
||||||
message: string;
|
message: string;
|
||||||
data?: boolean;
|
data?: File;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2525,10 +2395,10 @@ export namespace Dict {
|
||||||
export type RequestParams = {};
|
export type RequestParams = {};
|
||||||
export type RequestQuery = {
|
export type RequestQuery = {
|
||||||
/**
|
/**
|
||||||
* 字段描述(Swagger用途)
|
* 类型ID
|
||||||
* @example "示例值"
|
* @example 1
|
||||||
*/
|
*/
|
||||||
demo?: string;
|
typeId: number;
|
||||||
/**
|
/**
|
||||||
* 排序规则
|
* 排序规则
|
||||||
* @default "id:desc"
|
* @default "id:desc"
|
||||||
|
|
@ -3271,15 +3141,15 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
permission = {
|
file = {
|
||||||
/**
|
/**
|
||||||
* 创建权限
|
* 上传文件
|
||||||
*
|
*
|
||||||
* @tags permission
|
* @tags file
|
||||||
* @name AddPermission
|
* @name AddFile
|
||||||
* @request POST:/api/v1/permissions
|
* @request POST:/api/v1/file
|
||||||
*/
|
*/
|
||||||
addPermission: (data: CreatePermissionDto, params: RequestParams = {}) => {
|
addFile: (data: CreateFileDto, params: RequestParams = {}) => {
|
||||||
return this.request<
|
return this.request<
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -3296,139 +3166,6 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
data?: number;
|
data?: number;
|
||||||
},
|
},
|
||||||
any
|
any
|
||||||
>({
|
|
||||||
path: `/api/v1/permissions`,
|
|
||||||
method: "POST",
|
|
||||||
body: data,
|
|
||||||
type: ContentType.Json,
|
|
||||||
format: "json",
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 批量查询权限
|
|
||||||
*
|
|
||||||
* @tags permission
|
|
||||||
* @name GetPermissions
|
|
||||||
* @request GET:/api/v1/permissions
|
|
||||||
*/
|
|
||||||
getPermissions: (params: RequestParams = {}) => {
|
|
||||||
return this.request<Response, any>({
|
|
||||||
path: `/api/v1/permissions`,
|
|
||||||
method: "GET",
|
|
||||||
format: "json",
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询权限
|
|
||||||
*
|
|
||||||
* @tags permission
|
|
||||||
* @name GetPermission
|
|
||||||
* @request GET:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
getPermission: (id: string, params: RequestParams = {}) => {
|
|
||||||
return this.request<
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: string;
|
|
||||||
},
|
|
||||||
any
|
|
||||||
>({
|
|
||||||
path: `/api/v1/permissions/${id}`,
|
|
||||||
method: "GET",
|
|
||||||
format: "json",
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新权限
|
|
||||||
*
|
|
||||||
* @tags permission
|
|
||||||
* @name SetPermission
|
|
||||||
* @request PATCH:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
setPermission: (id: string, data: UpdatePermissionDto, params: RequestParams = {}) => {
|
|
||||||
return this.request<Response, any>({
|
|
||||||
path: `/api/v1/permissions/${id}`,
|
|
||||||
method: "PATCH",
|
|
||||||
body: data,
|
|
||||||
type: ContentType.Json,
|
|
||||||
format: "json",
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除权限
|
|
||||||
*
|
|
||||||
* @tags permission
|
|
||||||
* @name DelPermission
|
|
||||||
* @request DELETE:/api/v1/permissions/{id}
|
|
||||||
*/
|
|
||||||
delPermission: (id: string, params: RequestParams = {}) => {
|
|
||||||
return this.request<
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: string;
|
|
||||||
},
|
|
||||||
any
|
|
||||||
>({
|
|
||||||
path: `/api/v1/permissions/${id}`,
|
|
||||||
method: "DELETE",
|
|
||||||
format: "json",
|
|
||||||
...params,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
file = {
|
|
||||||
/**
|
|
||||||
* 上传文件
|
|
||||||
*
|
|
||||||
* @tags file
|
|
||||||
* @name AddFile
|
|
||||||
* @request POST:/api/v1/file
|
|
||||||
*/
|
|
||||||
addFile: (data: CreateUploadDto, params: RequestParams = {}) => {
|
|
||||||
return this.request<
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* 状态码
|
|
||||||
* @format int32
|
|
||||||
* @example 2000
|
|
||||||
*/
|
|
||||||
code: number;
|
|
||||||
/**
|
|
||||||
* 提示信息
|
|
||||||
* @example "请求成功"
|
|
||||||
*/
|
|
||||||
message: string;
|
|
||||||
data?: Upload;
|
|
||||||
},
|
|
||||||
any
|
|
||||||
>({
|
>({
|
||||||
path: `/api/v1/file`,
|
path: `/api/v1/file`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
|
@ -3476,7 +3213,7 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
* @example "请求成功"
|
* @example "请求成功"
|
||||||
*/
|
*/
|
||||||
message: string;
|
message: string;
|
||||||
data?: Upload;
|
data?: File;
|
||||||
},
|
},
|
||||||
any
|
any
|
||||||
>({
|
>({
|
||||||
|
|
@ -3494,7 +3231,7 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
* @name SetFile
|
* @name SetFile
|
||||||
* @request PATCH:/api/v1/file/{id}
|
* @request PATCH:/api/v1/file/{id}
|
||||||
*/
|
*/
|
||||||
setFile: (id: string, params: RequestParams = {}) => {
|
setFile: (id: number, data: UpdateFileDto, params: RequestParams = {}) => {
|
||||||
return this.request<
|
return this.request<
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -3514,6 +3251,8 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
>({
|
>({
|
||||||
path: `/api/v1/file/${id}`,
|
path: `/api/v1/file/${id}`,
|
||||||
method: "PATCH",
|
method: "PATCH",
|
||||||
|
body: data,
|
||||||
|
type: ContentType.Json,
|
||||||
format: "json",
|
format: "json",
|
||||||
...params,
|
...params,
|
||||||
});
|
});
|
||||||
|
|
@ -3536,7 +3275,7 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询文件是否已存在
|
* 根据哈希查询
|
||||||
*
|
*
|
||||||
* @tags file
|
* @tags file
|
||||||
* @name GetFileByHash
|
* @name GetFileByHash
|
||||||
|
|
@ -3556,7 +3295,7 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
|
||||||
* @example "请求成功"
|
* @example "请求成功"
|
||||||
*/
|
*/
|
||||||
message: string;
|
message: string;
|
||||||
data?: boolean;
|
data?: File;
|
||||||
},
|
},
|
||||||
any
|
any
|
||||||
>({
|
>({
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
<slot name="content">
|
<slot name="content">
|
||||||
<a-scrollbar outer-class="h-full overflow-hidden" class="h-full overflow-auto" type="track">
|
<a-scrollbar outer-class="h-full overflow-hidden" class="h-full overflow-auto" type="track">
|
||||||
<div class="m-4 p-4 bg-white overflow-hidden">
|
<div class="m-4 p-4 max-w-[1360px] mx-auto bg-white rounded overflow-hidden">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</a-scrollbar>
|
</a-scrollbar>
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useAniFormModal } from "@/components";
|
import { useAniFormModal } from "@/components";
|
||||||
import { useUserStore } from "@/store";
|
import { useUserStore } from "@/store";
|
||||||
|
import { delConfirm } from "@/utils";
|
||||||
import { Message } from "@arco-design/web-vue";
|
import { Message } from "@arco-design/web-vue";
|
||||||
|
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
|
@ -56,6 +57,7 @@ const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const logout = async () => {
|
const logout = async () => {
|
||||||
|
await delConfirm('退出后将跳转到登录页面,确定退出吗?')
|
||||||
userStore.clearUser();
|
userStore.clearUser();
|
||||||
Message.success("提示:已退出登陆!");
|
Message.success("提示:已退出登陆!");
|
||||||
router.push({ path: "/login", query: { redirect: route.path } });
|
router.push({ path: "/login", query: { redirect: route.path } });
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ const tagItems = [
|
||||||
// 导致部分内容被截取
|
// 导致部分内容被截取
|
||||||
// min-height: 100vh;
|
// min-height: 100vh;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
background-color: var(--color-fill-2);
|
background-color: #e4ebf1;
|
||||||
transition: padding 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
|
transition: padding 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -65,10 +65,10 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import doc from "./data.json";
|
|
||||||
import editorModal from "./editor.vue";
|
|
||||||
import ejs from "ejs";
|
import ejs from "ejs";
|
||||||
import template from "./page.ejs?raw";
|
import doc from "./components/data.json";
|
||||||
|
import editorModal from "./components/editor.vue";
|
||||||
|
import template from "./components/page.ejs?raw";
|
||||||
|
|
||||||
const content = ref("");
|
const content = ref("");
|
||||||
const { tags, routes } = doc;
|
const { tags, routes } = doc;
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<a-modal v-model:visible="modal.visible" title="上传文件" title-align="start" :footer="false" :width="732">
|
<a-modal v-model:visible="modal.visible" title="上传文件" title-align="start" :footer="false" :width="732">
|
||||||
<a-alert class="mb-4">
|
<a-alert class="mb-4"> 提示:支持大小在 1G 以内,格式为.png、.jpg、.webp、.mp4、.ogg的文件。 </a-alert>
|
||||||
提示:支持大小在 1G 以内,格式为.png、.jpg、.webp、.mp4、.ogg的文件。
|
|
||||||
</a-alert>
|
|
||||||
<a-upload :custom-request="upload" draggable action="/api/v1/upload"></a-upload>
|
<a-upload :custom-request="upload" draggable action="/api/v1/upload"></a-upload>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -23,7 +21,7 @@ const upload = (option: RequestOption) => {
|
||||||
api.file
|
api.file
|
||||||
.addFile(
|
.addFile(
|
||||||
{
|
{
|
||||||
file: fileItem.file,
|
file: fileItem.file as any,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
onUploadProgress(e) {
|
onUploadProgress(e) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<BreadPage>
|
<BreadPage>
|
||||||
<div class="overflow-hidden grid grid-cols-[auto_auto_1fr]">
|
<div class="overflow-hidden h-full grid grid-cols-[auto_auto_1fr]">
|
||||||
<ani-group></ani-group>
|
<ani-group></ani-group>
|
||||||
<a-divider direction="vertical" :margin="16"></a-divider>
|
<a-divider direction="vertical" :margin="16"></a-divider>
|
||||||
<div>
|
<div>
|
||||||
|
|
@ -116,7 +116,8 @@ const table = useTable({
|
||||||
field: "name",
|
field: "name",
|
||||||
label: "文件名称",
|
label: "文件名称",
|
||||||
type: "search",
|
type: "search",
|
||||||
enableLoad: true,
|
searchable: true,
|
||||||
|
enterable: true,
|
||||||
itemProps: {
|
itemProps: {
|
||||||
hideLabel: true,
|
hideLabel: true,
|
||||||
},
|
},
|
||||||
|
|
@ -129,16 +130,22 @@ const table = useTable({
|
||||||
modify: {
|
modify: {
|
||||||
title: "修改素材",
|
title: "修改素材",
|
||||||
modalProps: {
|
modalProps: {
|
||||||
width: 432,
|
width: 580,
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
field: "name",
|
field: "name",
|
||||||
label: "素材名称",
|
label: "名称",
|
||||||
type: "input",
|
type: "input",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
field: "description",
|
||||||
|
label: "描述",
|
||||||
|
type: "textarea",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
submit: ({ model }) => {
|
submit: ({ model }) => {
|
||||||
|
console.log(model);
|
||||||
return api.file.setFile(model.id, model);
|
return api.file.setFile(model.id, model);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
<i class="icon-park-outline-folder-close align-[-2px]"></i>
|
<i class="icon-park-outline-folder-close align-[-2px]"></i>
|
||||||
<span class="flex-1 truncate">{{ item.name }}</span>
|
<span class="flex-1 truncate">{{ item.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="">
|
||||||
<a-dropdown>
|
<a-dropdown>
|
||||||
<a-button size="small" type="text">
|
<a-button size="small" type="text">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<div class="py-2 px-4 bg-white">
|
<div class="py-2 px-4 bg-white">
|
||||||
<bread-crumb></bread-crumb>
|
<bread-crumb></bread-crumb>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-[auto_1fr] gap-4 overflow-hidden bg-white p-4 m-4 rounded">
|
<div class="max-w-[1360px] mx-auto grid grid-cols-[auto_1fr] gap-4 overflow-hidden bg-white p-4 m-4 rounded">
|
||||||
<div>
|
<div>
|
||||||
<ani-group :current="current" @change="onTypeChange"></ani-group>
|
<ani-group :current="current" @change="onTypeChange"></ani-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -20,8 +20,8 @@
|
||||||
|
|
||||||
<script setup lang="tsx">
|
<script setup lang="tsx">
|
||||||
import { DictType, api } from "@/api";
|
import { DictType, api } from "@/api";
|
||||||
|
import { createColumn, updateColumn, useAniTable } from "@/components";
|
||||||
import aniGroup from "./components/group.vue";
|
import aniGroup from "./components/group.vue";
|
||||||
import { useAniTable, createColumn, updateColumn } from "@/components";
|
|
||||||
|
|
||||||
const current = ref<DictType>();
|
const current = ref<DictType>();
|
||||||
const onTypeChange = (item: DictType) => {
|
const onTypeChange = (item: DictType) => {
|
||||||
|
|
@ -41,7 +41,7 @@ const [dictTable, dict] = useAniTable({
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
{record.name}: {record.code}
|
<span class="text-gray-900">{record.name}</span>: {record.code}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-gray-400 text-xs">{record.description}</div>
|
<div class="text-gray-400 text-xs">{record.description}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -103,7 +103,7 @@ const [dictTable, dict] = useAniTable({
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: "code",
|
field: "code",
|
||||||
label: "字典指",
|
label: "字典值",
|
||||||
type: "input",
|
type: "input",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<BreadPage>
|
<BreadPage>
|
||||||
<div class="">
|
|
||||||
<div class="">
|
|
||||||
<a-alert :closable="true" class="mb-4"> 仅展示近 90 天内的数据,如需查看更多数据,请联系管理员。 </a-alert>
|
|
||||||
<Table v-bind="table">
|
<Table v-bind="table">
|
||||||
<template #action>
|
<template #action>
|
||||||
<a-button type="primary" @click="visible = true">添加</a-button>
|
<a-button type="primary" @click="visible = true">添加</a-button>
|
||||||
<ani-editor v-model:visible="visible"></ani-editor>
|
<ani-editor v-model:visible="visible"></ani-editor>
|
||||||
</template>
|
</template>
|
||||||
</Table>
|
</Table>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</BreadPage>
|
</BreadPage>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
<template>
|
|
||||||
<BreadPage>
|
|
||||||
<Table v-bind="table"></Table>
|
|
||||||
</BreadPage>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="tsx">
|
|
||||||
import { api } from "@/api";
|
|
||||||
import { Table, createColumn, updateColumn, useTable } from "@/components";
|
|
||||||
|
|
||||||
const table = useTable({
|
|
||||||
data: async (model, paging) => {
|
|
||||||
return api.permission.getPermissions();
|
|
||||||
},
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: "权限名称",
|
|
||||||
dataIndex: "username",
|
|
||||||
width: 200,
|
|
||||||
render({ record }) {
|
|
||||||
return (
|
|
||||||
<div class="flex flex-col overflow-hidden">
|
|
||||||
<span>{record.name}</span>
|
|
||||||
<span class="text-gray-400 text-xs truncate">@{record.slug}</span>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "权限描述",
|
|
||||||
dataIndex: "description",
|
|
||||||
},
|
|
||||||
createColumn,
|
|
||||||
updateColumn,
|
|
||||||
{
|
|
||||||
title: "操作",
|
|
||||||
type: "button",
|
|
||||||
width: 110,
|
|
||||||
buttons: [
|
|
||||||
{
|
|
||||||
type: "modify",
|
|
||||||
text: "修改",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'delete',
|
|
||||||
text: '删除',
|
|
||||||
}
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
search: {
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
field: "name",
|
|
||||||
label: "权限名称",
|
|
||||||
type: "input",
|
|
||||||
required: false,
|
|
||||||
nodeProps: {
|
|
||||||
placeholder: '请输入名称关键字'
|
|
||||||
},
|
|
||||||
itemProps: {
|
|
||||||
hideLabel: true,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
create: {
|
|
||||||
title: "添加权限",
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
field: "name",
|
|
||||||
label: "角色名称",
|
|
||||||
type: "input",
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: "slug",
|
|
||||||
label: "角色标识",
|
|
||||||
type: "input",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: "description",
|
|
||||||
label: "个人描述",
|
|
||||||
type: "textarea",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
modalProps: {
|
|
||||||
width: 580,
|
|
||||||
maskClosable: false,
|
|
||||||
},
|
|
||||||
formProps: {
|
|
||||||
layout: "vertical",
|
|
||||||
},
|
|
||||||
submit: ({ model }) => {
|
|
||||||
return api.permission.addPermission(model);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
modify: {
|
|
||||||
extend: true,
|
|
||||||
title: "修改权限",
|
|
||||||
submit: ({ model }) => {
|
|
||||||
return api.permission.setPermission(model.id, model);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
||||||
|
|
||||||
<route lang="json">
|
|
||||||
{
|
|
||||||
"meta": {
|
|
||||||
"sort": 10303,
|
|
||||||
"title": "权限管理",
|
|
||||||
"icon": "icon-park-outline-permissions"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</route>
|
|
||||||
|
|
@ -88,19 +88,19 @@ const [roleTable, roleCtx] = useAniTable({
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: "slug",
|
field: "code",
|
||||||
label: "角色标识",
|
label: "角色标识",
|
||||||
type: "input",
|
type: "input",
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
field: "permissionIds",
|
// field: "menuIds",
|
||||||
label: "关联权限",
|
// label: "关联权限",
|
||||||
type: "select",
|
// type: "select",
|
||||||
options: () => api.permission.getPermissions(),
|
// options: () => api.menu.getMenus({ size: 0 }),
|
||||||
nodeProps: {
|
// nodeProps: {
|
||||||
multiple: true,
|
// multiple: true,
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
field: "description",
|
field: "description",
|
||||||
label: "个人描述",
|
label: "个人描述",
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,9 @@ const table = useTable({
|
||||||
{
|
{
|
||||||
title: "用户昵称",
|
title: "用户昵称",
|
||||||
dataIndex: "username",
|
dataIndex: "username",
|
||||||
width: 180,
|
|
||||||
render: ({ record }) => (
|
render: ({ record }) => (
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<a-avatar size={32}>
|
<a-avatar size={32} class="!bg-brand-500">
|
||||||
{record.avatar?.startsWith("/") ? <img src={record.avatar} alt="" /> : record.nickname?.[0]}
|
{record.avatar?.startsWith("/") ? <img src={record.avatar} alt="" /> : record.nickname?.[0]}
|
||||||
</a-avatar>
|
</a-avatar>
|
||||||
<span class="ml-2 flex-1 flex flex-col overflow-hidden">
|
<span class="ml-2 flex-1 flex flex-col overflow-hidden">
|
||||||
|
|
@ -34,10 +33,6 @@ const table = useTable({
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: "用户描述",
|
|
||||||
dataIndex: "description",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: "用户邮箱",
|
title: "用户邮箱",
|
||||||
dataIndex: "email",
|
dataIndex: "email",
|
||||||
|
|
@ -73,6 +68,17 @@ const table = useTable({
|
||||||
search: {
|
search: {
|
||||||
button: true,
|
button: true,
|
||||||
items: [
|
items: [
|
||||||
|
// {
|
||||||
|
// field: "nickname",
|
||||||
|
// label: "用户昵称",
|
||||||
|
// type: "input",
|
||||||
|
// nodeProps: {
|
||||||
|
// placeholder: '用户昵称'
|
||||||
|
// },
|
||||||
|
// itemProps: {
|
||||||
|
// hideLabel: true
|
||||||
|
// }
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
field: "nickname",
|
field: "nickname",
|
||||||
label: "用户昵称",
|
label: "用户昵称",
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,15 @@
|
||||||
@arcoblue-6: #08f;
|
@arcoblue-6: #08f;
|
||||||
|
|
||||||
body {
|
body {
|
||||||
// --border-radius-small: 4px;
|
--border-radius-small: 4px;
|
||||||
|
|
||||||
|
div.arco-dropdown {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.arco-divider-horizontal {
|
||||||
|
border-color: var(--color-neutral-2);
|
||||||
|
}
|
||||||
|
|
||||||
li.arco-dropdown-option {
|
li.arco-dropdown-option {
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
|
|
@ -23,7 +31,7 @@ body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.arco-modal-header {
|
.arco-modal-header {
|
||||||
background: var(--color-fill-2);
|
background: var(--color-fill-3);
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
.arco-modal-footer {
|
.arco-modal-footer {
|
||||||
|
|
@ -59,7 +67,7 @@ body {
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
[class^="icon-"] {
|
[class^="icon-"] {
|
||||||
font-size: 16px;
|
font-size: 14px;
|
||||||
vertical-align: -2px;
|
vertical-align: -2px;
|
||||||
}
|
}
|
||||||
.arco-menu-item {
|
.arco-menu-item {
|
||||||
|
|
@ -80,7 +88,7 @@ body {
|
||||||
.arco-menu-inner {
|
.arco-menu-inner {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
.arco-menu-icon {
|
.arco-menu-icon {
|
||||||
margin-right: 8px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.arco-menu-inline-header:hover {
|
.arco-menu-inline-header:hover {
|
||||||
background-color: var(--color-fill-2);
|
background-color: var(--color-fill-2);
|
||||||
|
|
@ -121,6 +129,10 @@ body {
|
||||||
.arco-form-item-layout-inline:last-child {
|
.arco-form-item-layout-inline:last-child {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ani-form-modal .arco-modal-body {
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.dark {
|
.dark {
|
||||||
.arco-menu-item.arco-menu-selected {
|
.arco-menu-item.arco-menu-selected {
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ declare module '@vue/runtime-core' {
|
||||||
ACheckbox: typeof import('@arco-design/web-vue')['Checkbox']
|
ACheckbox: typeof import('@arco-design/web-vue')['Checkbox']
|
||||||
ACheckboxGroup: typeof import('@arco-design/web-vue')['CheckboxGroup']
|
ACheckboxGroup: typeof import('@arco-design/web-vue')['CheckboxGroup']
|
||||||
AConfigProvider: typeof import('@arco-design/web-vue')['ConfigProvider']
|
AConfigProvider: typeof import('@arco-design/web-vue')['ConfigProvider']
|
||||||
|
ADatePicker: typeof import('@arco-design/web-vue')['DatePicker']
|
||||||
ADivider: typeof import('@arco-design/web-vue')['Divider']
|
ADivider: typeof import('@arco-design/web-vue')['Divider']
|
||||||
ADoption: typeof import('@arco-design/web-vue')['Doption']
|
ADoption: typeof import('@arco-design/web-vue')['Doption']
|
||||||
ADrawer: typeof import('@arco-design/web-vue')['Drawer']
|
ADrawer: typeof import('@arco-design/web-vue')['Drawer']
|
||||||
|
|
@ -67,7 +68,6 @@ declare module '@vue/runtime-core' {
|
||||||
Editor: typeof import('./../components/editor/index.vue')['default']
|
Editor: typeof import('./../components/editor/index.vue')['default']
|
||||||
Header: typeof import('./../components/editor/panel-main/components/header.vue')['default']
|
Header: typeof import('./../components/editor/panel-main/components/header.vue')['default']
|
||||||
ImagePicker: typeof import('./../components/editor/components/ImagePicker.vue')['default']
|
ImagePicker: typeof import('./../components/editor/components/ImagePicker.vue')['default']
|
||||||
'Index.dev1': typeof import('./../components/breadcrumb/index.dev1.vue')['default']
|
|
||||||
InputColor: typeof import('./../components/editor/components/InputColor.vue')['default']
|
InputColor: typeof import('./../components/editor/components/InputColor.vue')['default']
|
||||||
InputImage: typeof import('./../components/editor/components/InputImage.vue')['default']
|
InputImage: typeof import('./../components/editor/components/InputImage.vue')['default']
|
||||||
Marquee: typeof import('./../components/editor/blocks/text/marquee.vue')['default']
|
Marquee: typeof import('./../components/editor/blocks/text/marquee.vue')['default']
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue