refactor: 悦码项目重构

This commit is contained in:
wangxuefeng
2025-02-19 13:42:56 +08:00
parent c8c9406fd5
commit eab709f94f
494 changed files with 50986 additions and 27639 deletions

30
apps/platform/src/App.vue Normal file
View File

@@ -0,0 +1,30 @@
<template>
<ProConfigProvider
:theme="{
algorithm: [compactAlgorithm],
}"
>
<Suspense>
<router-view v-slot="{ Component }">
<transition>
<keep-alive v-if="route.meta.keepAlive">
<component :is="Component" v-if="route.meta.keepAlive" :key="route.path" />
</keep-alive>
<component :is="Component" v-else :key="route.path" />
</transition>
</router-view>
</Suspense>
<LockScreen />
</ProConfigProvider>
</template>
<script setup lang="ts">
import { theme } from 'ant-design-vue';
import { LockScreen } from '@/components/basic/lockscreen';
import { useRoute } from 'vue-router';
const route = useRoute();
const { compactAlgorithm } = theme;
</script>

View File

@@ -0,0 +1,64 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 账户登出 GET /api/account/logout */
export async function accountLogout(options?: RequestOptions) {
return request<any>('/api/account/logout', {
method: 'GET',
...(options || {}),
});
}
/** 获取菜单列表 GET /api/account/menus */
export async function accountMenu(options?: RequestOptions) {
return request<API.AccountMenus[]>('/api/account/menus', {
method: 'GET',
...(options || {}),
});
}
/** 更改账户密码 POST /api/account/password */
export async function accountPassword(body: API.PasswordUpdateDto, options?: RequestOptions) {
return request<any>('/api/account/password', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 获取权限列表 GET /api/account/permissions */
export async function accountPermissions(options?: RequestOptions) {
return request<string[]>('/api/account/permissions', {
method: 'GET',
...(options || {}),
});
}
/** 获取账户资料 GET /api/account/profile */
export async function accountProfile(options?: RequestOptions) {
return request<API.AccountInfo>('/api/account/profile', {
method: 'GET',
...(options || {}),
});
}
/** 更改账户资料 PUT /api/account/update */
export async function accountUpdate(body: API.AccountUpdateDto, options?: RequestOptions) {
return request<any>('/api/account/update', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@@ -0,0 +1,32 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 登录 POST /api/auth/login */
export async function authLogin(body: API.LoginDto, options?: RequestOptions) {
return request<API.LoginToken>('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 注册 POST /api/auth/register */
export async function authRegister(body: API.RegisterDto, options?: RequestOptions) {
return request<any>('/api/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@@ -0,0 +1,20 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 发送邮箱验证码 POST /api/auth/email/send */
export async function emailSendEmailCode(body: API.SendEmailCodeDto, options?: RequestOptions) {
return request<any>('/api/auth/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@@ -0,0 +1,82 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取Todo列表 GET /api/todos */
export async function todoList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoListParams,
options?: RequestOptions,
) {
return request<API.TodoEntity[]>('/api/todos', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 创建Todo POST /api/todos */
export async function todoCreate(body: API.TodoDto, options?: RequestOptions) {
return request<any>('/api/todos', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取Todo详情 GET /api/todos/${param0} */
export async function todoInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.TodoEntity>(`/api/todos/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新Todo PUT /api/todos/${param0} */
export async function todoUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoUpdateParams,
body: API.TodoUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/todos/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除Todo DELETE /api/todos/${param0} */
export async function todoDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/todos/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@@ -0,0 +1,23 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取登录图片验证码 GET /api/auth/captcha/img */
export async function captchaCaptchaByImg(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.CaptchaCaptchaByImgParams,
options?: RequestOptions,
) {
return request<API.ImageCaptcha>('/api/auth/captcha/img', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@@ -0,0 +1,73 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 此处后端没有提供注释 GET /api/health/database */
export async function healthCheckDatabase(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/database', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/disk */
export async function healthCheckDisk(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/disk', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/memory-heap */
export async function healthCheckMemoryHeap(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/memory-heap', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/memory-rss */
export async function healthCheckMemoryRss(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/memory-rss', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/network */
export async function healthCheckNetwork(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/network', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,54 @@
// @ts-ignore
/* eslint-disable */
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';
import * as account from './account';
import * as captcha from './captcha';
import * as authEmail from './authEmail';
import * as systemUser from './systemUser';
import * as systemRole from './systemRole';
import * as systemMenu from './systemMenu';
import * as systemParamConfig from './systemParamConfig';
import * as systemLog from './systemLog';
import * as systemDept from './systemDept';
import * as systemDictType from './systemDictType';
import * as systemDictItem from './systemDictItem';
import * as systemTask from './systemTask';
import * as systemOnline from './systemOnline';
import * as systemSse from './systemSse';
import * as systemServe from './systemServe';
import * as toolsStorage from './toolsStorage';
import * as systemEmail from './systemEmail';
import * as toolsUpload from './toolsUpload';
import * as health from './health';
import * as netDiskManage from './netDiskManage';
import * as netDiskOverview from './netDiskOverview';
import * as businessTodo from './businessTodo';
import * as user from './user';
export default {
auth,
account,
captcha,
authEmail,
systemUser,
systemRole,
systemMenu,
systemParamConfig,
systemLog,
systemDept,
systemDictType,
systemDictItem,
systemTask,
systemOnline,
systemSse,
systemServe,
toolsStorage,
systemEmail,
toolsUpload,
health,
netDiskManage,
netDiskOverview,
businessTodo,
user,
};

View File

@@ -0,0 +1,133 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 复制文件或文件夹,支持批量 POST /api/netdisk/manage/copy */
export async function netDiskManageCopy(body: API.FileOpDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/copy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 剪切文件或文件夹,支持批量 POST /api/netdisk/manage/cut */
export async function netDiskManageCut(body: API.FileOpDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/cut', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 删除文件或文件夹 POST /api/netdisk/manage/delete */
export async function netDiskManageDelete(body: API.DeleteDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '删除成功' }),
});
}
/** 获取下载链接,不支持下载文件夹 GET /api/netdisk/manage/download */
export async function netDiskManageDownload(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageDownloadParams,
options?: RequestOptions,
) {
return request<string>('/api/netdisk/manage/download', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取文件详细信息 GET /api/netdisk/manage/info */
export async function netDiskManageInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageInfoParams,
options?: RequestOptions,
) {
return request<API.SFileInfoDetail>('/api/netdisk/manage/info', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取文件列表 GET /api/netdisk/manage/list */
export async function netDiskManageList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageListParams,
options?: RequestOptions,
) {
return request<API.SFileList>('/api/netdisk/manage/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 添加文件备注 POST /api/netdisk/manage/mark */
export async function netDiskManageMark(body: API.MarkFileDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/mark', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 创建文件夹,支持多级 POST /api/netdisk/manage/mkdir */
export async function netDiskManageMkdir(body: API.MKDirDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/mkdir', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 重命名文件或文件夹 POST /api/netdisk/manage/rename */
export async function netDiskManageRename(body: API.RenameDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/rename', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 获取上传Token无Token前端无法上传 GET /api/netdisk/manage/token */
export async function netDiskManageToken(options?: RequestOptions) {
return request<API.UploadToken>('/api/netdisk/manage/token', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,16 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取网盘空间数据统计 GET /api/netdisk/overview/desc */
export async function netDiskOverviewSpace(options?: RequestOptions) {
return request<API.OverviewSpaceInfo>('/api/netdisk/overview/desc', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,82 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取部门列表 GET /api/system/depts */
export async function deptList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptListParams,
options?: RequestOptions,
) {
return request<API.DeptEntity[]>('/api/system/depts', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 创建部门 POST /api/system/depts */
export async function deptCreate(body: API.DeptDto, options?: RequestOptions) {
return request<any>('/api/system/depts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询部门信息 GET /api/system/depts/${param0} */
export async function deptInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DeptEntity>(`/api/system/depts/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新部门 PUT /api/system/depts/${param0} */
export async function deptUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptUpdateParams,
body: API.DeptDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/depts/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除部门 DELETE /api/system/depts/${param0} */
export async function deptDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/depts/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取字典项列表 GET /api/system/dict-item */
export async function dictItemList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemListParams,
options?: RequestOptions,
) {
return request<{
items?: API.DictItemEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/dict-item', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增字典项 POST /api/system/dict-item */
export async function dictItemCreate(body: API.DictItemDto, options?: RequestOptions) {
return request<any>('/api/system/dict-item', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询字典项信息 GET /api/system/dict-item/${param0} */
export async function dictItemInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DictItemEntity>(`/api/system/dict-item/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新字典项 POST /api/system/dict-item/${param0} */
export async function dictItemUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemUpdateParams,
body: API.DictItemDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-item/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的字典项 DELETE /api/system/dict-item/${param0} */
export async function dictItemDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-item/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@@ -0,0 +1,99 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取字典类型列表 GET /api/system/dict-type */
export async function dictTypeList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeListParams,
options?: RequestOptions,
) {
return request<{
items?: API.DictTypeEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/dict-type', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增字典类型 POST /api/system/dict-type */
export async function dictTypeCreate(body: API.DictTypeDto, options?: RequestOptions) {
return request<any>('/api/system/dict-type', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询字典类型信息 GET /api/system/dict-type/${param0} */
export async function dictTypeInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DictTypeEntity>(`/api/system/dict-type/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新字典类型 POST /api/system/dict-type/${param0} */
export async function dictTypeUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeUpdateParams,
body: API.DictTypeDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-type/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的字典类型 DELETE /api/system/dict-type/${param0} */
export async function dictTypeDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-type/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 一次性获取所有的字典类型(不分页) GET /api/system/dict-type/select-options */
export async function dictTypeGetAll(options?: RequestOptions) {
return request<API.DictTypeEntity[]>('/api/system/dict-type/select-options', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,20 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 发送邮件 POST /api/tools/email/send */
export async function emailSend(body: API.EmailSendDto, options?: RequestOptions) {
return request<any>('/api/tools/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@@ -0,0 +1,80 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 查询验证码日志列表 GET /api/system/log/captcha/list */
export async function logCaptchaList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogCaptchaListParams,
options?: RequestOptions,
) {
return request<{
items?: API.CaptchaLogEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/captcha/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 查询登录日志列表 GET /api/system/log/login/list */
export async function logLoginLogPage(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogLoginLogPageParams,
options?: RequestOptions,
) {
return request<{
items?: API.LoginLogInfo[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/login/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 查询任务日志列表 GET /api/system/log/task/list */
export async function logTaskList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogTaskListParams,
options?: RequestOptions,
) {
return request<{
items?: API.TaskLogEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/task/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@@ -0,0 +1,90 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取所有菜单列表 GET /api/system/menus */
export async function menuList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuListParams,
options?: RequestOptions,
) {
return request<API.MenuItemInfo[]>('/api/system/menus', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增菜单或权限 POST /api/system/menus */
export async function menuCreate(body: API.MenuDto, options?: RequestOptions) {
return request<any>('/api/system/menus', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取菜单或权限信息 GET /api/system/menus/${param0} */
export async function menuInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新菜单或权限 PUT /api/system/menus/${param0} */
export async function menuUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuUpdateParams,
body: API.MenuUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除菜单或权限 DELETE /api/system/menus/${param0} */
export async function menuDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 获取后端定义的所有权限集 GET /api/system/menus/permissions */
export async function menuGetPermissions(options?: RequestOptions) {
return request<string[]>('/api/system/menus/permissions', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,28 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 下线指定在线用户 POST /api/system/online/kick */
export async function onlineKick(body: API.KickDto, options?: RequestOptions) {
return request<any>('/api/system/online/kick', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 查询当前在线用户 GET /api/system/online/list */
export async function onlineList(options?: RequestOptions) {
return request<API.OnlineUserInfo[]>('/api/system/online/list', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取参数配置列表 GET /api/system/param-config */
export async function paramConfigList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigListParams,
options?: RequestOptions,
) {
return request<{
items?: API.ParamConfigEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/param-config', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增参数配置 POST /api/system/param-config */
export async function paramConfigCreate(body: API.ParamConfigDto, options?: RequestOptions) {
return request<any>('/api/system/param-config', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询参数配置信息 GET /api/system/param-config/${param0} */
export async function paramConfigInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.ParamConfigEntity>(`/api/system/param-config/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新参数配置 POST /api/system/param-config/${param0} */
export async function paramConfigUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigUpdateParams,
body: API.ParamConfigDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/param-config/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的参数配置 DELETE /api/system/param-config/${param0} */
export async function paramConfigDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/param-config/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取角色列表 GET /api/system/roles */
export async function roleList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleListParams,
options?: RequestOptions,
) {
return request<{
items?: API.RoleEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/roles', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增角色 POST /api/system/roles */
export async function roleCreate(body: API.RoleDto, options?: RequestOptions) {
return request<any>('/api/system/roles', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取角色信息 GET /api/system/roles/${param0} */
export async function roleInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.RoleInfo>(`/api/system/roles/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新角色 PUT /api/system/roles/${param0} */
export async function roleUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleUpdateParams,
body: API.RoleUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/roles/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除角色 DELETE /api/system/roles/${param0} */
export async function roleDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/roles/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@@ -0,0 +1,16 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取服务器运行信息 GET /api/system/serve/stat */
export async function serveStat(options?: RequestOptions) {
return request<API.ServeStatInfo>('/api/system/serve/stat', {
method: 'GET',
...(options || {}),
});
}

View File

@@ -0,0 +1,22 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 服务端推送消息 GET /api/sse/${param0} */
export async function sseSse(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.SseSseParams,
options?: RequestOptions,
) {
const { uid: param0, ...queryParams } = params;
return request<Record<string, any>>(`/api/sse/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}

View File

@@ -0,0 +1,133 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取任务列表 GET /api/system/tasks */
export async function taskList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskListParams,
options?: RequestOptions,
) {
return request<{
items?: API.TaskEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/tasks', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 添加任务 POST /api/system/tasks */
export async function taskCreate(body: API.TaskDto, options?: RequestOptions) {
return request<any>('/api/system/tasks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 查询任务详细信息 GET /api/system/tasks/${param0} */
export async function taskInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.TaskEntity>(`/api/system/tasks/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新任务 PUT /api/system/tasks/${param0} */
export async function taskUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskUpdateParams,
body: API.TaskUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除任务 DELETE /api/system/tasks/${param0} */
export async function taskDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 手动执行一次任务 PUT /api/system/tasks/${param0}/once */
export async function taskOnce(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskOnceParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/once`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}
/** 启动任务 PUT /api/system/tasks/${param0}/start */
export async function taskStart(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskStartParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/start`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}
/** 停止任务 PUT /api/system/tasks/${param0}/stop */
export async function taskStop(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskStopParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/stop`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}

View File

@@ -0,0 +1,110 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取用户列表 GET /api/system/users */
export async function userList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserListParams,
options?: RequestOptions,
) {
return request<{
items?: API.UserEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/users', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增用户 POST /api/system/users */
export async function userCreate(body: API.UserDto, options?: RequestOptions) {
return request<any>('/api/system/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询用户 GET /api/system/users/${param0} */
export async function userRead(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserReadParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.UserEntity>(`/api/system/users/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新用户 PUT /api/system/users/${param0} */
export async function userUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserUpdateParams,
body: API.UserUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除用户 DELETE /api/system/users/${param0} */
export async function userDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 更改用户密码 POST /api/system/users/${param0}/password */
export async function userPassword(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserPasswordParams,
body: API.UserPasswordDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}/password`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || {}),
});
}

View File

@@ -0,0 +1,44 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 删除文件 POST /api/tools/storage/delete */
export async function storageDelete(body: API.StorageDeleteDto, options?: RequestOptions) {
return request<any>('/api/tools/storage/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '删除成功' }),
});
}
/** 获取本地存储列表 GET /api/tools/storage/list */
export async function storageList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.StorageListParams,
options?: RequestOptions,
) {
return request<{
items?: API.StorageInfo[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/tools/storage/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@@ -0,0 +1,40 @@
// @ts-ignore
/* eslint-disable */
/**
* 该文件为 @umijs/openapi 插件自动生成,请勿随意修改。如需修改请通过配置 openapi.config.ts 进行定制化。
* */
import { request, type RequestOptions } from '@/utils/request';
/** 上传 POST /api/tools/upload */
export async function uploadUpload(body: API.FileUploadDto, file?: File, options?: RequestOptions) {
const formData = new FormData();
if (file) {
formData.append('file', file);
}
Object.keys(body).forEach((ele) => {
const item = (body as any)[ele];
if (item !== undefined && item !== null) {
if (typeof item === 'object' && !(item instanceof File)) {
if (item instanceof Array) {
item.forEach((f) => formData.append(ele, f || ''));
} else {
formData.append(ele, JSON.stringify(item));
}
} else {
formData.append(ele, item);
}
}
});
return request<any>('/api/tools/upload', {
method: 'POST',
data: formData,
requestType: 'form',
...(options || {}),
});
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
import { request } from '@/utils/request';
enum Api {
Login = '/boyanghu/iotree-service/platform/login',
}
/**
* @description: 登录接口参数
*/
export interface LoginParams {
phone: string;
type: number; // 0短信 1密码
code?: string;
password?: string;
}
/**
* @description: 用户登录
*/
export function loginApi(params: LoginParams) {
return request({
url: Api.Login,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: params,
});
}

View File

@@ -0,0 +1,11 @@
import { request } from '@/utils/request';
export type DictType = 'gender' | 'sell_status';
export async function getDictData(params: { type: DictType }) {
return request<LabelValueOptions>({
url: '/dict/data',
method: 'GET',
params,
});
}

View File

@@ -0,0 +1,33 @@
import { request } from '@/utils/request';
/**
* @description 获取王者荣耀英雄列表
*/
export function getWzryHeroList(query: API.PageParams) {
return request({
url: '/demo/wzry/hero_list',
method: 'get',
params: query,
});
}
/**
* @description 获取英雄联盟英雄列表
*/
export function getLolHeroList(query: API.PageParams) {
return request({
url: '/demo/lol/hero_list',
method: 'get',
params: query,
});
}
/**
* @description 获取英雄联盟英雄列表
*/
export function getLolHeroInfo({ id }) {
return request({
url: `/demo/lol/hero_info/${id}`,
method: 'get',
});
}

View File

@@ -0,0 +1,14 @@
import { request } from '@/utils/request';
interface DemoOptionsItem {
name: string;
id: string;
}
export async function optionsListApi(params?: Recordable) {
return request<DemoOptionsItem[]>({
url: '/select/getDemoOptions',
method: 'GET',
params,
});
}

View File

@@ -0,0 +1,26 @@
import { request } from '@/utils/request';
enum Api {
Login = '/boyanghu/iotree-service/platform/login',
}
/**
* @description: 登录接口参数
*/
export interface LoginParams {
phone: string;
password?: string;
code?: string;
type: number; // 0短信 1密码
}
/**
* @description: 用户登录
*/
export function loginApi(params: LoginParams) {
return request({
url: Api.Login,
method: 'POST',
data: params,
});
}

View File

@@ -0,0 +1,5 @@
import Api from './backend/api';
export { Api };
export default Api;

36
apps/platform/src/api/typings.d.ts vendored Normal file
View File

@@ -0,0 +1,36 @@
// @ts-ignore
/* eslint-disable */
declare namespace API {
/** 全局通过表格查询返回结果 */
type TableListResult<T = any> = {
items?: T;
meta?: PaginationResult;
};
/** 全局通用表格分页返回数据结构 */
type PaginationResult = {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
/** 全局通用表格分页请求参数 */
type PageParams<T = any> = {
page?: number;
pageSize?: number;
} & {
[P in keyof T]?: T[P];
};
type ErrorResponse = {
/** 业务约定的错误码 */
errorCode: string;
/** 业务上的错误信息 */
errorMessage?: string;
/** 业务上的请求是否成功 */
success?: boolean;
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
<rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506354975" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2334" width="64" height="64"><path d="M137.90246 0.00041a48.573421 48.573421 0 0 0-35.589106 15.293433A53.964778 53.964778 0 0 0 87.0404 50.934149V968.345622a48.706541 48.706541 0 0 0 15.272954 35.640306 49.97118 49.97118 0 0 0 35.589106 15.293434h746.336982a48.639981 48.639981 0 0 0 35.589105-15.293434 50.37054 50.37054 0 0 0 15.272954-35.640306V288.717094L646.727857 0.00041H137.90246z" fill="#FF8976" p-id="2335"></path><path d="M935.101501 288.717094h-237.445025c-27.822069-0.6656-50.22718-23.075831-50.928619-50.93374V0.00041l288.373644 288.716684z" fill="#FFD0C8" p-id="2336"></path><path d="M415.257869 564.731064l-124.70267 49.26974 124.70267 49.27486v39.096305l-172.175291-68.756453v-39.096304l172.175291-68.756453v38.963185zM539.02358 451.686629h39.045104l-95.016922 254.801818h-38.978544l94.950362-254.801818z m67.860452 212.377515l124.702671-49.26974-124.702671-49.269741v-39.101424l172.175292 67.957733v39.895024l-172.175292 68.823012V664.064144z" fill="#FFFFFF" p-id="2337"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506230415" class="icon" viewBox="0 0 1208 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1594" width="64" height="64"><path d="M132.51584 120.4736h879.4368c33.26976 0 60.2368 26.96704 60.2368 60.23168v409.6c0 33.26976-26.96704 60.2368-60.2368 60.2368H132.51584c-33.26464 0-60.23168-26.96704-60.23168-60.2368v-409.6c0-33.26464 26.96704-60.2368 60.23168-60.2368z" fill="#F9B552" p-id="1595"></path><path d="M469.8368 0c73.18528 0 132.51584 59.33056 132.51584 132.51584v84.3264h469.8368c73.18528 0 132.51584 59.33568 132.51584 132.52096v542.12096c0 73.18528-59.33056 132.51584-132.51584 132.51584H132.51584A132.51584 132.51584 0 0 1 0 891.48416V349.3632c0-4.03456 0.1792-8.06912 0.54272-12.04736A134.25664 134.25664 0 0 1 0 325.2736V132.51584C0 59.33056 59.33056 0 132.51584 0h337.32096z" fill="#FFCF5C" p-id="1596"></path></svg>

After

Width:  |  Height:  |  Size: 853 B

View File

@@ -0,0 +1 @@
<svg t="1619506254031" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1741" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#5895FF" p-id="1742"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="1743"></path><path d="M427.37664 725.31968V768H259.8144v-42.68032h167.56224zM594.944 640v42.68032H259.8144V640H594.944z m0-85.31968v42.63936H259.8144v-42.63936H594.944z m0-85.36064V512H259.8144v-42.68032H594.944z" fill="#FFFFFF" p-id="1744"></path></svg>

After

Width:  |  Height:  |  Size: 800 B

View File

@@ -0,0 +1 @@
<svg t="1619506332655" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2186" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#1ABF74" p-id="2187"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="2188"></path><path d="M594.61632 426.82368v0.2304h0.09216V768H566.8352v-0.0512h-83.968 0.04608H399.7696h0.0512-139.91936v-28.3904l0.0512-0.04608v-85.82656h-0.0512v-28.39552h0.0512v-85.82656h-0.09728v-28.39552l0.09216-0.04608V455.168h-0.09216v-28.3904h334.70976l0.04608 0.04608z m-222.62784 226.86208H287.88224v85.82656h84.10624v-85.82656z m83.08224 0h-55.2448v85.82656h55.19872v-85.82656h0.0512z m111.75936 0H482.90816v85.82656H566.784v-85.82656h0.04608z m-194.8416-114.2272H287.88224v85.83168h84.10624v-85.82656z m83.08224 0h-55.2448v85.83168h55.19872v-85.82656h0.0512z m111.75936 0H482.90816v85.83168H566.784v-85.82656h0.04608z m0-84.24448H287.88224v55.808H566.784V455.168l0.04608 0.0512z" fill="#FFFFFF" p-id="2189"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506370346" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2482" width="64" height="64"><path d="M137.90246 0.00041a48.573421 48.573421 0 0 0-35.589106 15.293433A53.964778 53.964778 0 0 0 87.0404 50.934149V968.345622a48.706541 48.706541 0 0 0 15.272954 35.640306 49.97118 49.97118 0 0 0 35.589106 15.293434h746.336982a48.639981 48.639981 0 0 0 35.589105-15.293434 50.37054 50.37054 0 0 0 15.272954-35.640306V288.717094L646.727857 0.00041H137.90246z" fill="#FF5562" p-id="2483"></path><path d="M935.101501 288.717094h-237.445025c-27.822069-0.6656-50.22718-23.075831-50.928619-50.93374V0.00041l288.373644 288.716684z" fill="#FFBBC0" p-id="2484"></path><path d="M772.290686 715.069564l-106.239957-164.766655a16.593913 16.593913 0 0 0-14.412794-7.649276 18.851832 18.851832 0 0 0-14.407675 7.649276l-56.837097 88.299485-127.221709-206.131117a16.527353 16.527353 0 0 0-14.407674-7.644157 18.851832 18.851832 0 0 0-14.412795 7.649277L249.656655 715.264123a15.447034 15.447034 0 0 0 0 16.957434 15.667194 15.667194 0 0 0 14.407675 8.509436h493.547322a18.851832 18.851832 0 0 0 15.272954-8.509436 16.977913 16.977913 0 0 0-0.7936-16.957434l0.19968-0.199679zM628.070584 403.149048a42.490863 42.490863 0 0 0 26.14271 39.306225 42.388463 42.388463 0 0 0 46.264301-9.169917 42.531823 42.531823 0 0 0 9.226236-46.310381 42.429423 42.429423 0 0 0-39.203824-26.24511c-23.408631 0-42.393583 18.979832-42.434543 42.419183z" fill="#FFFFFF" p-id="2485"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506298580" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2038" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#FFC547" p-id="2039"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="2040"></path><path d="M568.7808 446.464V675.84a27.2384 27.2384 0 0 1-6.79424 18.24768 45.66016 45.66016 0 0 1-17.31584 12.38016 112.64 112.64 0 0 1-20.80256 6.51776c-6.9376 1.43872-13.40416 2.18624-19.40992 2.18624-6.05184 0-12.52352-0.74752-19.40992-2.14016a112.45568 112.45568 0 0 1-20.80768-6.56384 45.70624 45.70624 0 0 1-17.31584-12.38016A27.22816 27.22816 0 0 1 440.08448 675.84c0-6.84032 2.3296-12.89216 6.84032-18.24768a45.70624 45.70624 0 0 1 17.31584-12.38016c6.98368-2.93376 13.91616-5.12 20.80768-6.51776 6.8864-1.4848 13.35808-2.18624 19.4048-2.18624 14.05952 0 26.95168 2.65216 38.63552 8.00768V534.528L388.608 583.07584v145.21856a27.22816 27.22816 0 0 1-6.79936 18.2016 45.66016 45.66016 0 0 1-17.31584 12.38016 112.64 112.64 0 0 1-20.80256 6.56384c-6.9376 1.39776-13.40416 2.14016-19.40992 2.14016-6.05184 0-12.52352-0.69632-19.40992-2.14016a112.50176 112.50176 0 0 1-20.80768-6.51776A45.70624 45.70624 0 0 1 266.752 746.496a27.23328 27.23328 0 0 1-6.84544-18.24768c0-6.79424 2.3296-12.89216 6.84544-18.19648a45.70624 45.70624 0 0 1 17.31072-12.38016c6.98368-2.93376 13.92128-5.12 20.80768-6.56384a94.80192 94.80192 0 0 1 19.4048-2.14016c14.05952 0 26.9568 2.65216 38.63552 7.95648V498.87232a19.87584 19.87584 0 0 1 13.68576-18.84672l167.28576-52.41344c1.80224-0.57856 3.6864-0.86016 5.5808-0.83968 5.4016 0 9.96352 1.90976 13.68576 5.72928 3.77344 3.86048 5.632 8.46848 5.632 13.96224z" fill="#FFFFFF" p-id="2041"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506408333" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2778" width="64" height="64"><path d="M116.91008 0h552.05888l262.77376 257.70496V995.4304c0 15.7696-13.19936 28.5696-29.46048 28.5696H116.91008c-16.26112 0-29.45536-12.8-29.45536-28.5696V28.5696C87.4496 12.8 100.64896 0 116.91008 0z" fill="#4A8DFF" p-id="2779"></path><path d="M668.96896 0v229.13536c0 15.79008 13.19936 28.5696 29.46048 28.5696h233.31328L668.96896 0z" fill="#E5F0FF" p-id="2780"></path><path d="M722.7648 823.53664c25.3952 26.96192 71.7056 9.55392 71.7056-26.96704V371.44064h-82.51392v321.97632l-163.96288-174.1824c-7.81312-8.29952-18.87232-13.0304-30.464-13.0304-11.58656 0-22.64064 4.73088-30.45888 13.0304l-163.96288 174.1824v-321.9968H240.62976v425.14944c0 36.52096 46.31552 53.92896 71.71072 26.96704l205.2096-217.99424 205.2096 217.99424z" fill="#FFFFFF" p-id="2781"></path></svg>

After

Width:  |  Height:  |  Size: 919 B

View File

@@ -0,0 +1 @@
<svg t="1619506497326" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3076" width="64" height="64"><path d="M116.91008 0h552.05888l262.77376 257.70496V995.4304c0 15.7696-13.19936 28.5696-29.46048 28.5696H116.91008c-16.26112 0-29.45536-12.8-29.45536-28.5696V28.5696C87.4496 12.8 100.64896 0 116.91008 0z" fill="#FF4867" p-id="3077"></path><path d="M668.96896 0v229.13536c0 15.79008 13.19936 28.5696 29.46048 28.5696h233.31328L668.96896 0z" fill="#FF97A9" p-id="3078"></path><path d="M721.3056 854.87104c-52.31616 0-99.24608-87.0912-123.91936-143.70304-41.5232-16.80896-87.31648-32.512-131.77856-42.66496-38.912 24.89856-105.12384 62.17216-155.9808 62.17216-31.54944 0-54.26688-15.39584-62.60736-42.1888-6.38976-22.05184-0.98816-37.2736 5.87776-45.5168 13.40928-17.7664 41.0368-26.79296 82.4064-26.79296 33.52064 0 76.01664 5.69856 123.4432 16.7936a785.0496 785.0496 0 0 0 89.26208-71.3728c-12.2624-56.45824-25.67168-147.968 8.3456-190.1568 16.83456-20.14208 42.496-26.79808 73.5488-17.7664 34.01728 9.5232 46.93504 29.66016 50.85696 45.5168 14.39232 55.04-50.85696 129.25952-94.82752 172.88192 9.81504 37.7344 22.7328 77.55264 38.43072 114.0224 63.09888 27.2896 138.1376 68.0448 146.65216 112.47104 3.4304 15.36-1.4848 29.6448-14.39744 42.17344-11.12064 8.87296-22.87616 14.11072-35.31776 14.11072v0.02048z m-47.03744-96.02048c11.50464 24.85248 22.48704 36.57728 28.27776 36.57728 0.88064 0 2.14528-0.37888 3.92192-1.8944 2.1504-2.28864 2.1504-3.80928 1.792-5.20704-1.19296-6.51776-10.9056-17.23904-33.9968-29.47584zM342.07744 658.2784c-18.4064 0-23.4752 4.31616-25.00608 6.33344-0.44032 0.64512-1.76128 2.59072-0.44032 7.60832 1.09056 4.32128 4.1728 8.92928 13.70624 8.92928 11.95008 0 29.24544-6.5536 49.34144-18.26304-14.37696-3.08736-27.04384-4.608-37.60128-4.608z m180.18816-22.18496c10.99776 2.9696 22.4 6.8096 32.99328 10.752a280.9344 280.9344 0 0 1-9.58976-29.696 722.85696 722.85696 0 0 1-23.3984 18.944z m77.7216-214.3744a11.71456 11.71456 0 0 0-9.1136 4.00896c-7.28064 8.89344-8.0896 31.29856-2.4576 59.99104 21.3248-22.20544 32.9216-42.5984 30.03392-53.504-0.40448-1.60768-1.6384-6.48704-11.5968-9.30304a24.01792 24.01792 0 0 0-6.8608-1.19296z" fill="#FFFFFF" p-id="3079"></path></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506516185" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3224" width="64" height="64"><path d="M116.91008 0h552.05888l262.77376 257.70496V995.4304c0 15.7696-13.19936 28.5696-29.46048 28.5696H116.91008c-16.26112 0-29.45536-12.8-29.45536-28.5696V28.5696C87.4496 12.8 100.64896 0 116.91008 0z" fill="#FF7861" p-id="3225"></path><path d="M668.96896 0v229.13536c0 15.79008 13.19936 28.5696 29.46048 28.5696h233.31328L668.96896 0z" fill="#FFB0A4" p-id="3226"></path><path d="M695.59296 473.25696c9.18528 9.09824 14.0288 22.19008 14.0288 41.59488 0 19.42016-4.84352 32.512-14.0288 41.60512-9.79968 9.728-26.3936 16.9472-50.90816 20.6848h-363.9808c-22.784 0-41.25184 17.90976-41.25184 40.00768v179.42016c0 14.29504 7.8592 27.50464 20.62336 34.65216a42.35776 42.35776 0 0 0 41.24672 0c12.76416-7.14752 20.62848-20.35712 20.62336-34.65216v-139.43296h325.82144c1.93536 0 3.8912-0.12288 5.82144-0.39424 88.11008-12.20096 138.5216-62.22336 138.5216-141.89056 0-79.65184-50.41152-129.67424-138.5216-141.8752a42.04544 42.04544 0 0 0-5.82144-0.4096H280.69888c-22.784 0-41.24672 17.90976-41.24672 40.00256 0 22.0928 18.46784 40.00256 41.24672 40.00256h363.98592c24.51456 3.7376 41.10848 10.9568 50.90816 20.66944v0.01536z" fill="#FFFFFF" p-id="3227"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506202991" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1446" width="64" height="64"><path d="M391.432258 376.567742h-67.716129v142.03871h67.716129c24.774194 0 42.941935-4.954839 54.503226-16.516129 11.56129-11.56129 16.516129-29.729032 16.516129-54.503226s-6.606452-42.941935-18.167742-52.851613-31.380645-18.167742-52.851613-18.167742z" fill="#169DFB" p-id="1447"></path><path d="M758.090323 36.335484L736.619355 14.864516h-545.032258c-46.245161 0-82.580645 36.335484-82.580645 82.580645v825.806452c0 46.245161 36.335484 82.580645 82.580645 82.580645h644.129032c46.245161 0 82.580645-36.335484 82.580645-82.580645V201.496774l-160.206451-165.16129zM391.432258 551.63871h-67.716129v113.96129c0 6.606452-1.651613 11.56129-4.954839 14.864516s-8.258065 4.954839-14.864516 4.954839-13.212903-1.651613-14.864516-4.954839c-3.303226-3.303226-4.954839-8.258065-4.954839-14.864516V365.006452c0-9.909677 1.651613-16.516129 4.954839-19.819355 3.303226-3.303226 11.56129-4.954839 23.122581-4.954839h77.625806c37.987097 0 64.412903 8.258065 82.580645 24.774194s26.425806 42.941935 26.425807 79.277419c1.651613 72.670968-34.683871 107.354839-107.354839 107.354839z m343.535484 74.32258c-4.954839 13.212903-13.212903 23.122581-21.470968 33.032258s-21.470968 16.516129-34.683871 21.470968c-13.212903 4.954839-28.077419 8.258065-44.593548 8.258065-13.212903 0-24.774194-1.651613-36.335484-4.954839-11.56129-3.303226-23.122581-6.606452-33.032258-11.56129-14.864516-6.606452-23.122581-14.864516-28.077419-23.122581-4.954839-8.258065-4.954839-14.864516 0-21.470968 3.303226-4.954839 8.258065-6.606452 13.212903-6.606451 4.954839 0 9.909677 1.651613 14.864516 6.606451 9.909677 6.606452 21.470968 11.56129 33.032258 16.516129 11.56129 4.954839 24.774194 6.606452 37.987097 6.606452 8.258065 0 16.516129-1.651613 24.774193-4.954839 8.258065-3.303226 14.864516-8.258065 21.470968-13.212903 6.606452-4.954839 11.56129-13.212903 14.864516-19.819355 3.303226-8.258065 4.954839-16.516129 4.954839-26.425806 0-9.909677-1.651613-18.167742-4.954839-24.774194-3.303226-8.258065-8.258065-14.864516-14.864516-19.819355l-19.819355-14.864516c-8.258065-3.303226-14.864516-8.258065-21.470968-9.909677-13.212903-4.954839-26.425806-11.56129-37.987096-16.516129-11.56129-4.954839-21.470968-11.56129-29.729033-19.819355-8.258065-6.606452-14.864516-16.516129-19.819354-26.425807-4.954839-9.909677-6.606452-23.122581-6.606452-36.335483 0-13.212903 3.303226-24.774194 8.258064-36.335484 4.954839-9.909677 11.56129-19.819355 21.470968-26.425807 8.258065-8.258065 18.167742-13.212903 29.729032-16.516129 11.56129-3.303226 23.122581-4.954839 36.335484-4.954839 13.212903 0 24.774194 1.651613 36.335484 4.954839 11.56129 3.303226 21.470968 8.258065 29.729032 13.212903 8.258065 4.954839 14.864516 11.56129 18.167742 16.516129 3.303226 6.606452 3.303226 13.212903 0 19.819355-3.303226 4.954839-6.606452 6.606452-13.212903 6.606452s-11.56129-1.651613-16.516129-4.954839c-6.606452-4.954839-14.864516-9.909677-24.774193-14.864516-9.909677-4.954839-19.819355-6.606452-31.380646-6.606452-16.516129 0-29.729032 4.954839-39.638709 14.864517-9.909677 9.909677-14.864516 21.470968-14.864516 36.335483 0 9.909677 1.651613 16.516129 6.606451 23.122581 4.954839 6.606452 9.909677 13.212903 16.516129 16.516129 6.606452 4.954839 14.864516 9.909677 24.774194 13.212903 8.258065 4.954839 18.167742 8.258065 28.077419 13.212904 13.212903 4.954839 23.122581 11.56129 33.032258 18.167741s18.167742 13.212903 24.774194 19.819355c6.606452 8.258065 11.56129 16.516129 16.516129 26.425807 3.303226 9.909677 4.954839 21.470968 4.954839 34.683871 1.651613 16.516129 0 29.729032-6.606452 41.290322z" fill="#169DFB" p-id="1448"></path><path d="M736.619355 14.864516h-3.303226v132.129032c0 16.516129 8.258065 52.851613 57.806452 52.851613h127.174193L736.619355 14.864516z" fill="#8BCEFD" p-id="1449"></path></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506392432" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2630" width="64" height="64"><path d="M137.90246 0.00041a48.573421 48.573421 0 0 0-35.589106 15.293433A53.964778 53.964778 0 0 0 87.0404 50.934149V968.345622a48.706541 48.706541 0 0 0 15.272954 35.640306 49.97118 49.97118 0 0 0 35.589106 15.293434h746.336982a48.639981 48.639981 0 0 0 35.589105-15.293434 50.37054 50.37054 0 0 0 15.272954-35.640306V288.717094L646.727857 0.00041H137.90246z" fill="#E5E5E5" p-id="2631"></path><path d="M935.101501 288.717094h-237.445025c-27.822069-0.6656-50.22718-23.075831-50.928619-50.93374V0.00041l288.373644 288.716684z" fill="#CCCCCC" p-id="2632"></path><path d="M248.125776 365.184264h220.518312a25.51807 25.51807 0 0 0 24.19199-25.49759 25.51807 25.51807 0 0 0-24.19711-25.50271H248.125776a25.51807 25.51807 0 0 0-24.19711 25.49759 25.51807 25.51807 0 0 0 24.19711 25.49759z m0 169.825212h525.82379a25.44639 25.44639 0 0 0 25.431029-25.46687 25.44639 25.44639 0 0 0-25.431029-25.46687h-525.82379a25.44639 25.44639 0 0 0-25.43103 25.46687 25.44639 25.44639 0 0 0 25.43103 25.46687z m525.82379 118.886352h-525.82379a25.51807 25.51807 0 0 0-24.19711 25.49759 25.51807 25.51807 0 0 0 24.19711 25.50271h525.82379a25.51807 25.51807 0 0 0 24.19711-25.49759 25.51807 25.51807 0 0 0-24.19711-25.49759z" fill="#FFFFFF" p-id="2633"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506160661" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1299" width="64" height="64"><path d="M758.090323 36.335484L736.619355 14.864516h-545.032258c-46.245161 0-82.580645 36.335484-82.580645 82.580645v825.806452c0 46.245161 36.335484 82.580645 82.580645 82.580645h644.129032c46.245161 0 82.580645-36.335484 82.580645-82.580645V201.496774l-160.206451-165.16129zM531.819355 715.148387c-6.606452 6.606452-16.516129 11.56129-26.425807 11.56129-11.56129 0-19.819355-3.303226-28.077419-11.56129-6.606452-6.606452-11.56129-16.516129-11.56129-26.425806 0-11.56129 3.303226-19.819355 11.56129-26.425807 6.606452-6.606452 16.516129-11.56129 28.077419-11.56129s19.819355 3.303226 26.425807 11.56129c6.606452 6.606452 11.56129 16.516129 11.56129 26.425807 0 9.909677-4.954839 18.167742-11.56129 26.425806z m87.535484-272.516129c-4.954839 13.212903-16.516129 28.077419-33.032258 42.941936-11.56129 9.909677-19.819355 19.819355-26.425807 26.425806-6.606452 8.258065-11.56129 14.864516-14.864516 21.470968-3.303226 6.606452-4.954839 11.56129-6.606452 18.167742-1.651613 6.606452-1.651613 13.212903-1.651612 19.819355 0 11.56129-3.303226 19.819355-9.909678 24.774193-6.606452 4.954839-14.864516 8.258065-24.774193 8.258065s-18.167742-3.303226-24.774194-8.258065c-6.606452-4.954839-9.909677-13.212903-9.909677-24.774193 0-6.606452 1.651613-13.212903 3.303225-21.470968s6.606452-18.167742 9.909678-28.07742c4.954839-9.909677 9.909677-19.819355 16.516129-29.729032s14.864516-19.819355 23.122581-28.077419c6.606452-6.606452 13.212903-13.212903 16.516129-18.167742s8.258065-11.56129 11.56129-16.516129c3.303226-4.954839 4.954839-9.909677 4.954839-14.864516 1.651613-4.954839 1.651613-11.56129 1.651612-16.516129 0-14.864516-4.954839-26.425806-13.212903-31.380645-8.258065-4.954839-18.167742-8.258065-31.380645-8.258065-11.56129 0-23.122581 3.303226-31.380645 6.606452-9.909677 4.954839-14.864516 11.56129-14.864516 21.470967 0 9.909677-4.954839 16.516129-13.212903 21.470968-8.258065 4.954839-18.167742 6.606452-26.425807 6.606452-11.56129 0-19.819355-3.303226-24.774193-8.258065-4.954839-4.954839-6.606452-11.56129-6.606452-21.470968 0-13.212903 3.303226-24.774194 9.909677-36.335483 6.606452-11.56129 14.864516-19.819355 24.774194-28.07742s23.122581-14.864516 37.987097-18.167742c14.864516-4.954839 29.729032-6.606452 46.245161-8.258064 16.516129 0 31.380645 1.651613 44.593548 6.606451 13.212903 4.954839 26.425806 11.56129 36.335484 19.819355 9.909677 8.258065 18.167742 19.819355 23.122581 33.032258 4.954839 13.212903 8.258065 28.077419 8.258064 46.245162 3.303226 14.864516 1.651613 29.729032-4.954838 42.941935z" fill="#DCDCDC" p-id="1300"></path><path d="M736.619355 14.864516h-3.303226v132.129032c0 16.516129 8.258065 52.851613 57.806452 52.851613h127.174193L736.619355 14.864516z" fill="#EEEEEE" p-id="1301"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506277769" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1889" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#627CFE" p-id="1890"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="1891"></path><path d="M519.68 606.62784v66.42176l120.832 73.40032v-213.0432z" fill="#FFFFFF" opacity=".99" p-id="1892"></path><path d="M534.528 512.13824H282.25024a22.48192 22.48192 0 0 0-22.2976 22.62016v210.52928c0 12.38016 9.91744 22.66624 22.25152 22.66624h252.50816a22.48192 22.48192 0 0 0 22.25152-22.66624v-210.7136a22.62016 22.62016 0 0 0-22.43584-22.43584zM356.2496 719.36v-158.81216L483.328 639.9488 356.2496 719.36z" fill="#FFFFFF" opacity=".99" p-id="1893"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<svg t="1619506466646" class="icon" viewBox="0 0 1140 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2926" width="64" height="64"><path d="M1079.048591 1022.302497H56.746094c-31.187329 0-56.746094-21.778899-56.746094-48.224215V681.537289h1135.574765v292.389798c0 26.452188-25.565638 48.231087-56.746094 48.231087l0.21992 0.144323z" fill="#5ACC9B" p-id="2927"></path><path d="M56.746094 0H1079.048591c31.187329 0 56.746094 21.785772 56.746094 48.224215v292.540993H0.219919V48.382282C0.219919 21.923221 25.785557 0.151195 56.972886 0.151195L56.746094 0z" fill="#6CCBFF" p-id="2928"></path><path d="M0.219919 340.840805h1135.423571v340.620886H0.219919z" fill="#FFD766" p-id="2929"></path><path d="M378.694443 0.219919h378.474523v1021.862658H378.694443z" fill="#FF5562" p-id="2930"></path><path d="M487.444617 56.972886h75.714148v56.814819H487.444617V56.966013zM563.158765 0.213047H638.86604V56.972886H563.158765V0.219919z m0 113.567785H638.86604v56.5949H563.158765v-56.5949z m-75.714148 56.5949h75.714148v56.746094H487.444617v-56.746094z m75.714148 56.746094H638.86604v56.821691H563.158765v-56.821691z m-75.714148 56.821691h75.714148v56.814819H487.444617v-56.814819z m75.714148 56.746094H638.86604v56.746094H563.158765v-56.746094zM487.444617 397.435705h75.714148v56.814818H487.444617v-56.814818z m75.714148 56.814818H638.86604v56.897289H563.158765v-56.897289z m-75.714148 56.897289h75.714148v56.746094H487.444617v-56.746094z m75.714148 56.746094H638.86604V624.708725H563.158765v-56.814819zM487.444617 624.708725h75.714148v56.821691H487.444617V624.708725z m75.714148 56.746094H638.86604v56.746094H563.158765v-56.746094z m-75.714148 56.746094h75.714148v56.821691H487.444617v-56.821691z m75.714148 56.821691H638.86604v56.890416H563.158765v-56.890416z m-75.714148 56.890416h75.714148v56.746094H487.444617v-56.746094z m0 113.567785h75.714148v56.814819H487.444617v-56.814819z m75.714148-56.821691H638.86604v56.821691H563.158765v-56.821691z" fill="#FFFFFF" p-id="2931"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" transform="translate(-1254.000000, -136.000000)">
<g id="Group-8" transform="translate(1167.000000, 0.000000)">
<g id="Group-5" filter="url(#filter-1)" transform="translate(89.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-18" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,14 @@
<svg
viewBox="0 0 24 24"
focusable="false"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path d="M0 0h24v24H0z" fill="none" />
<path
d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z "
className="css-c4d79v"
/>
</svg>

After

Width:  |  Height:  |  Size: 645 B

View File

@@ -0,0 +1,68 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 21</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"/>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"/>
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"/>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"/>
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "/>
</g>
</g>
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"/>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"/>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"/>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"/>
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"/>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"/>
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "/>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"/>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"/>
</g>
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"/>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"/>
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"/>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"/>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"/>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"/>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"/>
</g>
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"/>
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "/>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"/>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"/>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"/>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"/>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"/>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"/>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"/>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"/>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"/>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"/>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"/>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"/>
</g>
</g>
</g>
</g>
<div xmlns="" id="divScriptsUsed" style="display: none"/><script xmlns="" id="globalVarsDetection" src="chrome-extension://cmkdbmfndkfgebldhnkbfhlneefdaaip/js/wrs_env.js"/></svg>

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -0,0 +1,48 @@
<svg width="182" height="166" xmlns="http://www.w3.org/2000/svg">
<!-- Generator: Sketch 54 (76480) - https://sketchapp.com -->
<title>未命名</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="0.00542331488%" y1="50.0074349%" x2="100.011743%" y2="50.0074349%" id="linearGradient-1">
<stop stop-color="#3668E7" offset="0.3030465%"/>
<stop stop-color="#44BAE1" offset="100%"/>
</linearGradient>
<linearGradient x1="0.0117592657%" y1="50.0044985%" x2="100.006481%" y2="50.0044985%" id="linearGradient-2">
<stop stop-color="#44BCE1" offset="0%"/>
<stop stop-color="#44BAE1" offset="36.72%"/>
<stop stop-color="#43B2E2" offset="54.5%"/>
<stop stop-color="#41A5E2" offset="68.19%"/>
<stop stop-color="#3F93E4" offset="79.8%"/>
<stop stop-color="#3C7BE5" offset="89.99%"/>
<stop stop-color="#385EE7" offset="99.21%"/>
<stop stop-color="#385BE7" offset="100%"/>
</linearGradient>
<linearGradient x1="0.0148416278%" y1="50.0005568%" x2="100.005996%" y2="50.0005568%" id="linearGradient-3">
<stop stop-color="#44BCE1" offset="0%"/>
<stop stop-color="#43B6E1" offset="14.76%"/>
<stop stop-color="#41A4E2" offset="34.89%"/>
<stop stop-color="#3E88E4" offset="58.12%"/>
<stop stop-color="#3960E7" offset="83.49%"/>
<stop stop-color="#385BE7" offset="86.36%"/>
</linearGradient>
</defs>
<g>
<title>background</title>
<rect x="-1" y="-1" width="184" height="168" id="canvas_background" fill="none"/>
</g>
<g>
<title>Layer 1</title>
<g id="logo3-01的副本" fill-rule="nonzero" stroke="null" transform="rotate(-1 88.74440002441469,82.13372802734358) ">
<g id="图层_2" stroke="null" transform="rotate(-1 88.74440002441469,82.13372802734358) ">
<g id="XMLID_5_" stroke="null">
<g id="编组" stroke="null">
<path d="m85.59977,58.69808c-18.60016,1.68406 -33.15083,17.00902 -33.15083,35.70211c0,19.80456 16.36951,35.83683 36.51396,35.83683c0,0 74.57221,12.15893 56.93295,-76.69217c10.15802,16.70589 19.42378,33.51283 19.42378,33.51283c0,0 22.64964,38.36292 -2.47087,61.80507c0,0 -14.585,13.40513 -41.55865,13.40513c-7.41261,0 -16.30088,0 -25.36073,0c-47.22107,-8.15086 -51.20191,-49.17461 -51.20191,-49.17461c-3.26018,-52.74481 40.8723,-54.5636 40.8723,-54.5636l0,0.16841z" id="路径" fill="url(#linearGradient-1)" stroke="null" stroke-width="0"/>
<path d="m145.89585,53.54485c17.63926,88.8511 -56.93295,76.69217 -56.93295,76.69217c20.17877,0 36.51396,-16.03227 36.51396,-35.83683c0,-3.33445 -0.48045,-6.56784 -1.33839,-9.63284c0,0 0,-0.03368 0,-0.03368c-0.37749,-1.91983 -6.0399,-28.3596 -33.52833,-38.63238c-12.52593,-4.68169 -26.35594,-4.34488 -38.91619,0.20209c-8.81963,3.19972 -19.18356,8.75712 -26.83639,18.32259l19.04629,-32.90656c4.35833,-7.51092 10.05506,-14.17981 16.98722,-19.50144c12.11413,-9.22866 31.19473,-16.97534 52.91779,-0.97676c0,0 6.52035,3.63758 19.86991,23.13901c3.84358,5.62477 8.13328,12.3947 12.21708,19.16463z" id="路径" fill="url(#linearGradient-2)" stroke="null" stroke-width="0"/>
<path d="m124.13847,84.73367c0.85794,3.06499 1.33839,6.29839 1.33839,9.63284c0,19.80456 -16.36951,35.83683 -36.51396,35.83683c-20.14445,0 -36.51396,-16.03227 -36.51396,-35.83683c0,-18.69309 14.55067,-34.01805 33.15083,-35.70212c1.09817,-0.10104 2.23065,-0.13472 3.36313,-0.13472c16.747,0 30.88587,11.08113 35.17557,26.204c0,0 0,0 0,0z" id="路径" fill="#FFFFFF" stroke="null" stroke-width="0"/>
<path d="m44.72747,113.09327c0,0 3.94653,41.02375 51.20191,49.17461c-15.47726,0 -31.332,0 -40.63208,0c-10.39824,0 -20.69353,-2.35769 -29.85634,-7.20779c-12.21708,-6.50048 -24.64006,-18.38995 -22.3751,-39.44073c1.64725,-15.32496 20.79649,-49.24196 20.79649,-49.24196l0.99521,-1.71775c0,0 0,0 0,-0.03368c7.61851,-9.59915 17.98244,-15.12287 26.83639,-18.32259c12.56025,-4.54697 26.39026,-4.88378 38.91619,-0.20209c27.48843,10.30646 33.15084,36.74623 33.52833,38.63238c-4.2897,-15.08919 -18.42857,-26.17032 -35.17557,-26.17032c-1.13249,0 -2.26497,0.06736 -3.36313,0.13472l0,-0.13472c0,-0.03368 -44.13248,1.78511 -40.8723,54.52992z" id="路径" fill="url(#linearGradient-3)" stroke="null" stroke-width="0"/>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938A7.999 7.999 0 0 0 4 12z"/></svg>

After

Width:  |  Height:  |  Size: 366 B

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#001529d9" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#001529d9" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
<rect id="Rectangle-18" fill="#001529a6" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
<rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M12 18a6 6 0 1 1 0-12a6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8a4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636L5.636 7.05L3.515 4.93zM16.95 18.364l1.414-1.414l2.121 2.121l-1.414 1.414l-2.121-2.121zm2.121-14.85l1.414 1.415l-2.121 2.121l-1.414-1.414l2.121-2.121zM5.636 16.95l1.414 1.414l-2.121 2.121l-1.414-1.414l2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></svg>

After

Width:  |  Height:  |  Size: 571 B

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="white" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-18" fill="#f0f2f5" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
<rect id="Rectangle-11" fill="#001529" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,68 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 21</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"/>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"/>
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"/>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"/>
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "/>
</g>
</g>
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"/>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"/>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"/>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"/>
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"/>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"/>
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "/>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"/>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"/>
</g>
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"/>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"/>
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"/>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"/>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"/>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"/>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"/>
</g>
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"/>
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "/>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"/>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"/>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"/>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"/>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"/>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"/>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"/>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"/>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"/>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"/>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"/>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"/>
</g>
</g>
</g>
</g>
<div xmlns="" id="divScriptsUsed" style="display: none"/><script xmlns="" id="globalVarsDetection" src="chrome-extension://cmkdbmfndkfgebldhnkbfhlneefdaaip/js/wrs_env.js"/></svg>

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -0,0 +1,6 @@
### 基础组件(目录说明)
| 组件名称 | 描述 | 是否全局组件 | 使用建议 |
| --- | --- | --- | --- |
| button | `按钮组件`基于 a-button 二次封装,主要扩展了按钮的颜色,基本使用方式与 antdv 的 a-button 保持一致 | 是 | -- |
| check-box | `复选框`基于 a-checkbox 二次封装,基本使用方式与 antdv 的 a-checkbox 保持一致 | 否 | -- |

View File

@@ -0,0 +1 @@
export { default as BasicArrow } from './index.vue';

View File

@@ -0,0 +1,24 @@
<template>
<DownOutlined class="collapse-icon" />
</template>
<script lang="ts" setup>
import { computed } from 'vue';
import { DownOutlined } from '@ant-design/icons-vue';
const props = defineProps({
expand: { type: Boolean },
});
/**
* @description 展开/收起 图标旋转转数
*/
const turn = computed(() => `${props.expand ? 0 : 0.5}turn`);
</script>
<style lang="less" scoped>
.collapse-icon {
transform: rotate(v-bind(turn));
transition: transform 0.3s;
}
</style>

View File

@@ -0,0 +1,94 @@
<script lang="tsx">
import { defineComponent, computed, unref } from 'vue';
import { InfoCircleOutlined } from '@ant-design/icons-vue';
import { Tooltip } from 'ant-design-vue';
import type { CSSProperties, PropType } from 'vue';
import { isString, isArray } from '@/utils/is';
import { getSlot } from '@/utils/helper/tsxHelper';
const props = {
/**
* Help text max-width
* @default: 600px
*/
maxWidth: { type: String, default: '600px' },
/**
* Whether to display the serial number
* @default: false
*/
showIndex: { type: Boolean },
/**
* Help text font color
* @default: #ffffff
*/
color: { type: String, default: '#ffffff' },
/**
* Help text font size
* @default: 14px
*/
fontSize: { type: String, default: '14px' },
/**
* Help text list
*/
placement: { type: String, default: 'right' },
/**
* Help text list
*/
text: { type: [Array, String] as PropType<string[] | string> },
};
export default defineComponent({
name: 'BasicHelp',
components: { Tooltip },
props,
setup(props, { slots }) {
const getTooltipStyle = computed(
(): CSSProperties => ({ color: props.color, fontSize: props.fontSize }),
);
const getOverlayStyle = computed((): CSSProperties => ({ maxWidth: props.maxWidth }));
function renderTitle() {
const textList = props.text;
if (isString(textList)) {
return <p>{textList}</p>;
}
if (isArray(textList)) {
return textList.map((text, index) => {
return (
<p key={text}>
<>
{props.showIndex ? `${index + 1}. ` : ''}
{text}
</>
</p>
);
});
}
return null;
}
return () => {
return (
<Tooltip
overlayClassName="basic-help__wrap"
title={<div style={unref(getTooltipStyle)}>{renderTitle()}</div>}
autoAdjustOverflow={true}
overlayStyle={unref(getOverlayStyle)}
placement={props.placement as 'right'}
>
<span class="basic-help">{getSlot(slots) || <InfoCircleOutlined />}</span>
</Tooltip>
);
};
},
});
</script>
<style lang="less">
.basic-help__wrap p {
margin-bottom: 0;
}
</style>

View File

@@ -0,0 +1,22 @@
import buttonProps from 'ant-design-vue/es/button/buttonTypes';
import { theme } from 'ant-design-vue';
import type { ButtonType as AButtonType } from 'ant-design-vue/es/button/buttonTypes';
import type { ExtractPropTypes } from 'vue';
const { defaultSeed } = theme;
export declare type ButtonProps = Partial<ExtractPropTypes<typeof buttonProps>>;
export type ButtonType = AButtonType | 'warning' | 'success' | 'error';
/** 这里自定义颜色 */
export const buttonColorPrimary = {
success: defaultSeed.colorSuccess,
warning: defaultSeed.colorWarning,
error: defaultSeed.colorError,
} as const;
export const aButtonTypes = ['default', 'primary', 'ghost', 'dashed', 'link', 'text'];
export type { AButtonType };
export { buttonProps };

View File

@@ -0,0 +1,55 @@
<template>
<ProConfigProvider :theme="btnTheme">
<component :is="h(Button, { ...$attrs, ...props, type: buttonType }, $slots)" />
</ProConfigProvider>
</template>
<script lang="ts" setup>
import { computed, h } from 'vue';
import { useConfigContextInject } from 'ant-design-vue/es/config-provider/context';
import { Button } from 'ant-design-vue';
import { buttonProps, buttonColorPrimary, aButtonTypes } from './button';
import type { ButtonType, AButtonType } from './button';
const { theme: globalTheme } = useConfigContextInject();
defineOptions({
name: 'AButton',
});
const props = defineProps({
...buttonProps(),
type: {
type: String as PropType<ButtonType>,
},
// 自定义按钮颜色
color: String,
});
const isCustomType = computed(() => Reflect.has(buttonColorPrimary, props.type!));
const buttonType = computed<AButtonType>(() => {
if (props.type && aButtonTypes.includes(props.type)) {
return props.type as AButtonType;
} else if (props.color || isCustomType.value) {
return 'primary';
}
return 'default';
});
const btnTheme = computed(() => {
const type = props.type!;
if (props.color || isCustomType.value) {
return {
...globalTheme.value,
token: {
colorPrimary: props.color || buttonColorPrimary[type],
},
};
}
return globalTheme.value;
});
</script>

View File

@@ -0,0 +1,9 @@
import AButton from './button.vue';
export default AButton;
export const Button = AButton;
export * from './button';
export { AButton };

View File

@@ -0,0 +1,54 @@
<template>
<Checkbox v-bind="getProps" v-model:checked="checkedModel" @change="handleChange">
<slot />
</Checkbox>
</template>
<script lang="ts" setup>
import { computed } from 'vue';
import { checkboxProps } from 'ant-design-vue/es/checkbox';
import { omit } from 'lodash-es';
import { Checkbox } from 'ant-design-vue';
defineOptions({
inheritAttrs: false,
});
const props = defineProps({
...checkboxProps(),
trueValue: {
type: [Number, Boolean, String],
default: true,
},
falseValue: {
type: [Number, Boolean, String],
default: false,
},
});
const emit = defineEmits(['update:checked', 'change']);
const getProps = computed(() => {
return omit(props, ['onUpdate:checked', 'onChange']);
});
const checkedModel = computed<boolean>({
get() {
return props.checked === props.trueValue;
},
set(val) {
emit('update:checked', val ? props.trueValue : props.falseValue);
},
});
const handleChange = (e) => {
const evt = {
...e,
target: {
...e.target,
checked: e.target.checked ? props.trueValue : props.falseValue,
},
};
emit('change', evt);
};
</script>

View File

@@ -0,0 +1,3 @@
export { createContextMenu, destroyContextMenu } from './src/createContextMenu';
export * from './src/typing';

View File

@@ -0,0 +1,136 @@
<script lang="tsx">
import { defineComponent, computed, ref, unref } from 'vue';
import { Menu, Dropdown } from 'ant-design-vue';
import type { ContextMenuItem, ItemContentProps, Axis } from './typing';
import type { FunctionalComponent, CSSProperties, PropType } from 'vue';
import { IconFont } from '@/components/basic/icon';
const props = {
width: { type: Number, default: 156 },
customEvent: { type: Object as PropType<Event>, default: null },
styles: { type: Object as PropType<CSSProperties> },
showIcon: { type: Boolean, default: true },
axis: {
// The position of the right mouse button click
type: Object as PropType<Axis>,
default() {
return { x: 0, y: 0 };
},
},
items: {
// The most important list, if not, will not be displayed
type: Array as PropType<ContextMenuItem[]>,
default() {
return [];
},
},
};
const ItemContent: FunctionalComponent<ItemContentProps> = (props) => {
const { item } = props;
return (
<span
style="display: inline-block; width: 100%; "
class="px-4"
onClick={props.handler.bind(null, item)}
>
{props.showIcon && item.icon && <IconFont class="mr-2" type={item.icon} />}
<span>{item.label}</span>
</span>
);
};
export default defineComponent({
name: 'ContextMenu',
props,
setup(props, { expose }) {
const open = ref(true);
const getStyle = computed((): CSSProperties => {
const { axis, items, styles, width } = props;
const { x, y } = axis || { x: 0, y: 0 };
const menuHeight = (items || []).length * 40;
const menuWidth = width;
const body = document.body;
const left = body.clientWidth < x + menuWidth ? x - menuWidth : x;
const top = body.clientHeight < y + menuHeight ? y - menuHeight : y;
return {
position: 'absolute',
width: `${width}px`,
left: `${left + 1}px`,
top: `${top + 1}px`,
...styles,
};
});
const close = () => {
open.value = false;
};
function handleAction(item: ContextMenuItem, e: MouseEvent) {
const { handler, disabled } = item;
if (disabled) {
return;
}
e?.stopPropagation();
e?.preventDefault();
handler?.();
close();
}
function renderMenuItem(items: ContextMenuItem[]) {
const visibleItems = items.filter((item) => !item.hidden);
return visibleItems.map((item) => {
const { disabled, label, children, divider = false } = item;
const contentProps = {
item,
handler: handleAction,
showIcon: props.showIcon,
};
if (!children || children.length === 0) {
return (
<>
<Menu.Item disabled={disabled} key={label}>
<ItemContent {...contentProps} />
</Menu.Item>
{divider ? <Menu.Divider key={`d-${label}`} /> : null}
</>
);
}
return (
<Menu.SubMenu key={label} disabled={disabled}>
{{
title: () => <ItemContent {...contentProps} />,
default: () => renderMenuItem(children),
}}
</Menu.SubMenu>
);
});
}
expose({
close,
});
return () => {
const { items } = props;
return (
<Dropdown open={open.value}>
{{
default: () => <div style={unref(getStyle)}></div>,
overlay: () => (
<Menu inlineIndent={12} mode="vertical">
{renderMenuItem(items)}
</Menu>
),
}}
</Dropdown>
);
};
},
});
</script>

View File

@@ -0,0 +1,80 @@
import { createVNode, render } from 'vue';
import contextMenuVue from './ContextMenu.vue';
import type { CreateContextOptions, ContextMenuProps } from './typing';
import { isClient } from '@/utils/is';
const menuManager: {
domList: Element[];
resolve: Fn;
} = {
domList: [],
resolve: () => {},
};
export const createContextMenu = function (options: CreateContextOptions) {
const { event } = options || {};
event && event?.preventDefault();
if (!isClient) {
return;
}
return new Promise((resolve) => {
const body = document.body;
const container = document.createElement('div');
const propsData: Partial<ContextMenuProps> = {
getPopupContainer: () => container,
};
if (options.styles) {
propsData.styles = options.styles;
}
if (options.items) {
propsData.items = options.items;
}
if (options.event) {
propsData.customEvent = event;
propsData.axis = { x: event.clientX, y: event.clientY };
}
const vm = createVNode(contextMenuVue, propsData);
render(vm, container);
const handleClick = function () {
menuManager.resolve('');
};
menuManager.domList.push(container);
const remove = function () {
menuManager.domList.forEach((dom: Element) => {
try {
dom && body.removeChild(dom);
} catch (error) {
console.error(error);
}
});
body.removeEventListener('click', handleClick);
body.removeEventListener('scroll', handleClick);
};
menuManager.resolve = function (arg) {
vm.component?.exposed?.close();
remove();
resolve(arg);
};
remove();
body.appendChild(container);
body.addEventListener('click', handleClick);
body.addEventListener('scroll', handleClick);
});
};
export const destroyContextMenu = function () {
if (menuManager) {
menuManager.resolve('');
menuManager.domList = [];
}
};

View File

@@ -0,0 +1,38 @@
import type { DropdownProps } from 'ant-design-vue/es/dropdown';
export interface Axis {
x: number;
y: number;
}
export interface ContextMenuItem {
label: string;
icon?: string;
hidden?: boolean;
disabled?: boolean;
handler?: Fn;
divider?: boolean;
children?: ContextMenuItem[];
}
export interface CreateContextOptions {
event: MouseEvent;
icon?: string;
styles?: any;
items?: ContextMenuItem[];
}
export interface ContextMenuProps extends DropdownProps {
event?: MouseEvent;
styles?: any;
items: ContextMenuItem[];
customEvent?: MouseEvent;
axis?: Axis;
width?: number;
showIcon?: boolean;
}
export interface ItemContentProps {
showIcon: boolean | undefined;
item: ContextMenuItem;
handler: Fn;
}

View File

@@ -0,0 +1,8 @@
import impExcel from './src/ImportExcel.vue';
import { withInstall } from '@/utils';
export { useExportExcelModal } from './src/ExportExcelModal';
export const ImpExcel = withInstall(impExcel);
// export const ExpExcelModal = withInstall(expExcelModal);
export * from './src/typing';
export * from './src/Export2Excel';

View File

@@ -0,0 +1,59 @@
import { utils, writeFile } from 'xlsx';
import type { WorkBook } from 'xlsx';
import type { JsonToSheet, AoAToSheet } from './typing';
const DEF_FILE_NAME = 'excel-list.xlsx';
export function jsonToSheetXlsx<T = any>({
data,
header,
filename = DEF_FILE_NAME,
json2sheetOpts = {},
write2excelOpts = { bookType: 'xlsx' },
}: JsonToSheet<T>) {
let arrData = [...data];
if (header) {
arrData.unshift(header);
const filterKeys = Object.keys(header);
arrData = arrData.map((item) => filterKeys.reduce<any>((p, k) => ((p[k] = item[k]), p), {}));
json2sheetOpts.skipHeader = true;
}
const worksheet = utils.json_to_sheet(arrData, json2sheetOpts);
/* add worksheet to workbook */
const workbook: WorkBook = {
SheetNames: [filename],
Sheets: {
[filename]: worksheet,
},
};
/* output format determined by filename */
writeFile(workbook, filename, write2excelOpts);
/* at this point, out.xlsb will have been downloaded */
}
export function aoaToSheetXlsx<T = any>({
data,
header,
filename = DEF_FILE_NAME,
write2excelOpts = { bookType: 'xlsx' },
}: AoAToSheet<T>) {
const arrData = [...data];
if (header) {
arrData.unshift(header);
}
const worksheet = utils.aoa_to_sheet(arrData);
/* add worksheet to workbook */
const workbook: WorkBook = {
SheetNames: [filename],
Sheets: {
[filename]: worksheet,
},
};
/* output format determined by filename */
writeFile(workbook, filename, write2excelOpts);
/* at this point, out.xlsb will have been downloaded */
}

View File

@@ -0,0 +1,78 @@
import type { ExportModalResult } from './typing';
import type { FormSchema } from '@/components/core/schema-form/';
import { useI18n } from '@/hooks/useI18n';
import { useFormModal } from '@/hooks/useModal/';
export type OpenModalOptions = {
onOk: (val: ExportModalResult) => any;
};
const getSchemas = (t): FormSchema<ExportModalResult>[] => [
{
field: 'filename',
component: 'Input',
label: t('component.excel.fileName'),
rules: [{ required: true }],
},
{
field: 'bookType',
component: 'Select',
label: t('component.excel.fileType'),
defaultValue: 'xlsx',
rules: [{ required: true }],
componentProps: {
options: [
{
label: 'xlsx',
value: 'xlsx',
key: 'xlsx',
},
{
label: 'html',
value: 'html',
key: 'html',
},
{
label: 'csv',
value: 'csv',
key: 'csv',
},
{
label: 'txt',
value: 'txt',
key: 'txt',
},
],
},
},
];
export const useExportExcelModal = () => {
const { t } = useI18n();
const [showModal] = useFormModal();
const openModal = ({ onOk }: OpenModalOptions) => {
showModal<ExportModalResult>({
modalProps: {
title: t('component.excel.exportModalTitle'),
onFinish: async (values) => {
const { filename, bookType } = values;
onOk({
filename: `${filename.split('.').shift()}.${bookType}`,
bookType,
});
},
},
formProps: {
labelWidth: 100,
schemas: getSchemas(t),
},
});
};
return {
openModal,
};
};

View File

@@ -0,0 +1,159 @@
<template>
<div>
<input
v-show="false"
ref="inputRef"
type="file"
accept=".xlsx, .xls"
@change="handleInputClick"
/>
<div @click="handleUpload">
<slot />
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, unref } from 'vue';
import { read, utils } from 'xlsx';
import type { WorkSheet, WorkBook } from 'xlsx';
import type { ExcelData } from './typing';
import { dateUtil } from '@/utils/dateUtil';
export default defineComponent({
name: 'ImportExcel',
props: {
// 日期时间格式。如果不提供或者提供空值将返回原始Date对象
dateFormat: {
type: String,
},
// 时区调整。实验性功能,仅为了解决读取日期时间值有偏差的问题。目前仅提供了+08:00时区的偏差修正值
// https://github.com/SheetJS/sheetjs/issues/1470#issuecomment-501108554
timeZone: {
type: Number,
default: 8,
},
},
emits: ['success', 'error'],
setup(props, { emit }) {
const inputRef = ref<HTMLInputElement | null>(null);
const loadingRef = ref<Boolean>(false);
/**
* @description: 第一行作为头部
*/
function getHeaderRow(sheet: WorkSheet) {
if (!sheet || !sheet['!ref']) return [];
const headers: string[] = [];
// A3:B7=>{s:{c:0, r:2}, e:{c:1, r:6}}
const range = utils.decode_range(sheet['!ref']);
const R = range.s.r;
/* start in the first row */
for (let C = range.s.c; C <= range.e.c; ++C) {
/* walk every column in the range */
const cell = sheet[utils.encode_cell({ c: C, r: R })];
/* find the cell in the first row */
let hdr = `UNKNOWN ${C}`; // <-- replace with your desired default
if (cell && cell.t) hdr = utils.format_cell(cell);
headers.push(hdr);
}
return headers;
}
/**
* @description: 获得excel数据
*/
function getExcelData(workbook: WorkBook) {
const excelData: ExcelData[] = [];
const { dateFormat, timeZone } = props;
for (const sheetName of workbook.SheetNames) {
const worksheet = workbook.Sheets[sheetName];
const header: string[] = getHeaderRow(worksheet);
let results = utils.sheet_to_json(worksheet, {
raw: true,
dateNF: dateFormat, //Not worked
}) as object[];
results = results.map((row: object) => {
for (const field in row) {
if (row[field] instanceof Date) {
if (timeZone === 8) {
row[field].setSeconds(row[field].getSeconds() + 43);
}
if (dateFormat) {
row[field] = dateUtil(row[field]).format(dateFormat);
}
}
}
return row;
});
excelData.push({
header,
results,
meta: {
sheetName,
},
});
}
return excelData;
}
/**
* @description: 读取excel数据
*/
function readerData(rawFile: File) {
loadingRef.value = true;
const { promise, resolve, reject } = Promise.withResolvers();
const reader = new FileReader();
reader.onload = async (e) => {
try {
const data = e.target && e.target.result;
const workbook = read(data, { type: 'array', cellDates: true });
// console.log(workbook);
/* DO SOMETHING WITH workbook HERE */
const excelData = getExcelData(workbook);
emit('success', excelData);
resolve('');
} catch (error) {
reject(error);
emit('error');
} finally {
loadingRef.value = false;
}
};
reader.readAsArrayBuffer(rawFile);
return promise;
}
async function upload(rawFile: File) {
const inputRefDom = unref(inputRef);
if (inputRefDom) {
// fix can't select the same excel
inputRefDom.value = '';
}
await readerData(rawFile);
}
/**
* @description: 触发选择文件管理器
*/
function handleInputClick(e: Event) {
const files = e && (e.target as HTMLInputElement).files;
const rawFile = files && files[0]; // only setting files[0]
if (!rawFile) return;
upload(rawFile);
}
/**
* @description: 点击上传按钮
*/
function handleUpload() {
const inputRefDom = unref(inputRef);
inputRefDom && inputRefDom.click();
}
return { handleUpload, handleInputClick, inputRef };
},
});
</script>

View File

@@ -0,0 +1,27 @@
import type { JSON2SheetOpts, WritingOptions, BookType } from 'xlsx';
export interface ExcelData<T = any> {
header: string[];
results: T[];
meta: { sheetName: string };
}
export interface JsonToSheet<T = any> {
data: T[];
header?: T;
filename?: string;
json2sheetOpts?: JSON2SheetOpts;
write2excelOpts?: WritingOptions;
}
export interface AoAToSheet<T = any> {
data: T[][];
header?: T[];
filename?: string;
write2excelOpts?: WritingOptions;
}
export interface ExportModalResult {
filename: string;
bookType: BookType;
}

View File

@@ -0,0 +1,57 @@
<script setup lang="ts">
import { computed, type CSSProperties, type VNode } from 'vue';
import { useAttrs } from 'vue';
import { Icon as IconifyIcon } from '@iconify/vue';
import { isString, omit } from 'lodash-es';
import SvgIcon from './src/SvgIcon.vue';
import IconFont from './src/icon-font';
import type { IconProps } from './src/props';
const props = withDefaults(defineProps<IconProps>(), {
type: 'iconify',
size: 16,
});
const attrs = useAttrs();
const getWrapStyle = computed((): CSSProperties => {
const { size, color } = props;
let fs = size;
if (isString(size)) {
fs = parseInt(size, 10);
}
return {
fontSize: `${fs}px`,
color,
display: 'inline-flex',
};
});
/** svg 不支持 title 属性,需要在其元素内部手动添加 title 标签 */
const handleIconUpdated = (vnode: VNode) => {
const title = attrs.title;
if (vnode.el && title) {
vnode.el.insertAdjacentHTML?.('afterbegin', `<title>${title}</title>`);
}
};
</script>
<template>
<template v-if="type === 'svg'">
<SvgIcon v-bind="{ ...$attrs, ...props }" :name="icon" class="anticon" />
</template>
<template v-else-if="type === 'icon-font'">
<IconFont v-bind="{ ...$attrs, ...props }" :type="icon" />
</template>
<template v-else>
<IconifyIcon
v-bind="omit({ ...$attrs, ...props }, ['size', 'color'])"
:style="getWrapStyle"
class="anticon"
@vue:updated="handleIconUpdated"
/>
</template>
</template>
<style lang="less" scoped></style>

View File

@@ -0,0 +1,8 @@
export { default as IconPicker } from './src/IconPicker.vue';
export { default as SvgIcon } from './src/SvgIcon.vue';
export { default as Icon } from './Icon.vue';
export { default as IconFont } from './src/icon-font';
export * from './src/props';
export { setupIcons } from './src/icons.data';

View File

@@ -0,0 +1,120 @@
<template>
<a-form-item-rest>
<a-popover
v-model:open="visible"
placement="bottomLeft"
:overlay-inner-style="{ paddingTop: 0 }"
trigger="click"
>
<template #title>
<a-tabs
v-model:activeKey="activeCateName"
size="small"
:tab-bar-style="{ marginBottom: '8px' }"
>
<a-tab-pane v-for="(_, cateName) in iconsMap" :key="cateName" :tab="cateName" />
</a-tabs>
<a-input
autofocus
allow-clear
:placeholder="`从“${activeCateName}”中搜索图标`"
@change="handleSearchChange"
/>
</template>
<template #content>
<RecycleScroller
class="select-box"
:items="iconFilteredList"
key-field="name"
:item-size="38"
:grid-items="9"
:item-secondary-size="38"
>
<template #default="{ item }">
<div
:key="item.name"
:title="item.name"
:class="{ active: modelValue == item.name }"
class="select-box-item"
@click="selectIcon(item.name)"
>
<Icon :icon="item.name" class="text-[20px]" />
</div>
</template>
</RecycleScroller>
</template>
<a-input v-bind="$attrs" v-model:value="modelValue" :placeholder="placeholder" allow-clear>
<template v-if="modelValue" #prefix>
<Icon :icon="modelValue" class="text-[20px]" />
</template>
</a-input>
</a-popover>
</a-form-item-rest>
</template>
<script lang="ts" setup>
import { ref, computed } from 'vue';
import { Icon } from '@iconify/vue';
import { RecycleScroller } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
import { useDebounceFn } from '@vueuse/core';
import { setupIcons, icons } from './icons.data';
import { iconPickerProps } from './props';
// 添加默认图标集合
setupIcons();
defineOptions({
inheritAttrs: false,
});
defineProps(iconPickerProps);
const modelValue = defineModel<string>('value');
const iconsMap = Object.entries(icons).reduce(
(prev, [cateName, curr]) => {
prev[cateName] = Object.keys(curr.icons).map((name) => ({ name: `${curr.prefix}:${name}` }));
return prev;
},
{
全部: Object.values(icons).flatMap((item) =>
Object.keys(item.icons).map((name) => ({ name: `${item.prefix}:${name}` })),
),
} as Recordable<{ name: string }[]>,
);
const visible = ref(false);
const activeCateName = ref('全部');
const keyword = ref('');
const iconFilteredList = computed(() => {
const list = iconsMap[activeCateName.value];
return list.filter((item) => item.name.includes(keyword.value));
});
const handleSearchChange = useDebounceFn((e: Event) => {
keyword.value = (e.target as HTMLInputElement).value;
}, 100);
const selectIcon = (name: string) => {
modelValue.value = name;
visible.value = false;
};
</script>
<style lang="less" scoped>
.select-box {
@apply h-300px min-w-350px;
&-item {
@apply flex m-2px p-6px;
border: 1px solid #e5e7eb;
&:hover,
&.active {
@apply border-blue-600;
}
}
}
</style>

View File

@@ -0,0 +1,33 @@
<template>
<svg v-bind="$attrs" class="svg-icon" :style="getStyle" aria-hidden="true">
<use :xlink:href="symbolId" />
</svg>
</template>
<script lang="ts" setup>
import { computed, type CSSProperties } from 'vue';
import { svgIconProps } from './props';
defineOptions({
name: 'SvgIcon',
});
const props = defineProps(svgIconProps);
const symbolId = computed(() => `#${props.prefix}-${props.name}`);
const getStyle = computed((): CSSProperties => {
const { size } = props;
const s = `${size}`.replace('px', '').concat('px');
return {
width: s,
height: s,
};
});
</script>
<style lang="less">
.svg-icon {
overflow: hidden;
fill: currentcolor;
vertical-align: -0.15em;
}
</style>

View File

@@ -0,0 +1,74 @@
import { defineComponent, unref, computed } from 'vue';
import { createFromIconfontCN } from '@ant-design/icons-vue';
import type { PropType } from 'vue';
import { isString } from '@/utils/is';
import { uniqueSlash } from '@/utils/urlUtils';
let scriptUrls = [uniqueSlash(`${import.meta.env.BASE_URL}/iconfont.js`)];
// 文档https://antdv.com/components/icon-cn#components-icon-demo-iconfont
let MyIconFont = createFromIconfontCN({
// scriptUrl: '//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js',
// scriptUrl: '//at.alicdn.com/t/font_2184398_zflo1kjcemp.js',
// iconfont字体图标本地化详见/public/iconfont.js
scriptUrl: scriptUrls,
});
export default defineComponent({
name: 'IconFont',
props: {
type: {
type: String as PropType<string>,
default: '',
},
prefix: {
type: String,
default: 'icon-',
},
color: {
type: String as PropType<string>,
default: 'unset',
},
size: {
type: [Number, String] as PropType<number | string>,
default: 14,
},
scriptUrl: {
// 阿里图库字体图标路径
type: String as PropType<string | string[]>,
default: '',
},
},
setup(props, { attrs }) {
// 如果外部传进来字体图标路径,则覆盖默认的
if (props.scriptUrl) {
scriptUrls = [...new Set(scriptUrls.concat(props.scriptUrl))];
MyIconFont = createFromIconfontCN({
scriptUrl: scriptUrls,
});
}
const wrapStyleRef = computed(() => {
const { color, size } = props;
const fs = isString(size) ? parseFloat(size) : size;
return {
color,
fontSize: `${fs}px`,
};
});
return () => {
const { type, prefix } = props;
return type ? (
<MyIconFont
type={type.startsWith(prefix) ? type : `${prefix}${type}`}
{...attrs}
style={unref(wrapStyleRef)}
/>
) : null;
};
},
});

View File

@@ -0,0 +1,14 @@
import { addCollection } from '@iconify/vue';
import ep from '@iconify-json/ep/icons.json';
import antDesign from '@iconify-json/ant-design/icons.json';
export const icons = { 'Ant Design': antDesign, 'Element Plus': ep } as const;
export type DefaultIconsType =
| `ep:${keyof typeof ep.icons}`
| `ant-design:${keyof typeof antDesign.icons}`;
export const setupIcons = () => {
Object.values(icons).forEach((item) => addCollection(item));
};

View File

@@ -0,0 +1,30 @@
import type { DefaultIconsType } from './icons.data';
export const svgIconProps = {
prefix: {
type: String,
default: 'svg-icon',
},
name: {
type: String,
required: true,
},
size: {
type: [Number, String],
default: 16,
},
};
export const iconPickerProps = {
value: {
type: String as PropType<DefaultIconsType>,
},
placeholder: String,
};
export type IconProps = {
type?: 'svg' | 'iconify' | 'icon-font';
icon: DefaultIconsType | string;
color?: string;
size?: string | number;
};

View File

@@ -0,0 +1,3 @@
import IFramePage from './index.vue';
export default IFramePage;

View File

@@ -0,0 +1,37 @@
<template>
<div class="iframe-box wh-full">
<Spin :spinning="loading" size="large">
<iframe class="wh-full" v-bind="$attrs" :src="src" @load="onFrameLoad" />
</Spin>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { Spin } from 'ant-design-vue';
defineOptions({
name: 'IFramePage',
});
defineProps({
src: {
type: String,
required: true,
},
});
const loading = ref(true);
const onFrameLoad = () => {
loading.value = false;
};
</script>
<style lang="less" scoped>
.iframe-box {
transform: translate(0);
:deep(div[class^='ant-spin']) {
@apply wh-full;
}
}
</style>

View File

@@ -0,0 +1 @@
export { default as LocalePicker } from './index.vue';

View File

@@ -0,0 +1,60 @@
<template>
<Dropdown placement="bottomRight">
<SvgIcon name="locale" />
<span v-if="showText" class="ml-1">{{ getLocaleText }}</span>
<template #overlay>
<Menu v-model:selectedKeys="selectedKeys" @click="handleMenuClick">
<Menu.Item v-for="item in localeList" :key="item.lang">
<a href="javascript:;">{{ item.icon }} {{ item.label }}</a>
</Menu.Item>
</Menu>
</template>
</Dropdown>
</template>
<script lang="ts" setup>
import { ref, watchEffect, unref, computed } from 'vue';
import { Dropdown, Menu } from 'ant-design-vue';
import { useLocale } from '@/locales/useLocale';
import { type LocaleType, localeList } from '@/locales/config';
import { SvgIcon } from '@/components/basic/icon';
const props = defineProps({
/**
* Whether to display text
*/
showText: { type: Boolean, default: true },
/**
* Whether to refresh the interface when changing
*/
reload: { type: Boolean },
});
const selectedKeys = ref<string[]>([]);
const { changeLocale, getLocale } = useLocale();
const getLocaleText = computed(() => {
const key = selectedKeys.value[0];
if (!key) {
return '';
}
return localeList.find((item) => item.lang === key)?.label;
});
watchEffect(() => {
selectedKeys.value = [unref(getLocale)];
});
async function toggleLocale(lang: LocaleType | string) {
await changeLocale(lang as LocaleType);
selectedKeys.value = [lang as string];
props.reload && location.reload();
}
function handleMenuClick({ key }) {
if (unref(getLocale) === key) {
return;
}
toggleLocale(key as string);
}
</script>

View File

@@ -0,0 +1,194 @@
<template>
<div class="huawei-charge">
<div class="number">{{ battery.level.toFixed(0) }}%</div>
<div class="contrast">
<div class="circle" />
<ul class="bubbles">
<li v-for="i in 15" :key="i" />
</ul>
</div>
<div class="charging">
<div>{{ batteryStatus }}</div>
<div v-show="Number.isFinite(battery.dischargingTime) && battery.dischargingTime != 0">
剩余可使用时间{{ calcDischargingTime }}
</div>
<span v-show="Number.isFinite(battery.chargingTime) && battery.chargingTime != 0">
距离电池充满需要{{ calcDischargingTime }}
</span>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import type { Battery } from '@/hooks/useBattery';
export default defineComponent({
name: 'HuaweiCharge',
// props: ['batteryStatus', 'battery', 'calcDischargingTime'],
props: {
battery: {
// 电池对象
type: Object as PropType<Battery>,
default: () => ({}),
},
calcDischargingTime: {
// 电池剩余时间可用时间
type: String,
default: '',
},
batteryStatus: {
// 电池状态
type: String,
validator: (val: string) => ['充电中', '已充满', '已断开电源'].includes(val),
},
},
});
</script>
<style lang="less" scoped>
.huawei-charge {
.generate-columns(15);
// @for $i from 0 through 15 {
// li:nth-child(#{$i}) {
// $width: 15 + random(15) + px;
// top: 50%;
// left: 15 + random(70) + px;
// width: $width;
// height: $width;
// transform: translate(-50%, -50%);
// animation: ~'moveToTop `Math.random(6) + 3`s ease-in-out -`Math.random(5000) / 1000`s infinite';
// }
// }
@keyframes trotate {
50% {
border-radius: 45% / 42% 38% 58% 49%;
}
100% {
transform: translate(-50%, -50%) rotate(720deg);
}
}
@keyframes move-to-top {
90% {
opacity: 1;
}
100% {
transform: translate(-50%, -180px);
opacity: 0.1;
}
}
@keyframes hue-rotate {
100% {
filter: contrast(15) hue-rotate(360deg);
}
}
position: absolute;
bottom: 20vh;
left: 50vw;
width: 300px;
height: 400px;
transform: translateX(-50%);
.generate-columns(@n, @i: 0) when (@i =< @n) {
.generate-columns(@n, (@i + 1));
.column-@{i} {
width: (@i * 100% / @n);
}
li:nth-child(@{i}) {
@width: unit(~`Math.round(15 + Math.random() * 15) `, px);
top: 50%;
left: unit(~`Math.round(Math.random() * 70) `, px);
width: @width;
height: @width;
transform: translate(-50%, -50%);
animation: move-to-top unit(~`(Math.round(Math.random() * 6) + 3) `, s) ease-in-out
unit(~`-(Math.random() * 5000 / 1000) `, s) infinite;
}
}
.number {
position: absolute;
z-index: 10;
top: 27%;
width: 300px;
color: #fff;
font-size: 32px;
text-align: center;
}
.contrast {
width: 300px;
height: 400px;
overflow: hidden;
animation: hue-rotate 10s infinite linear;
background-color: #000;
filter: contrast(15) hue-rotate(0);
.circle {
position: relative;
box-sizing: border-box;
width: 300px;
height: 300px;
filter: blur(8px);
&::after {
content: '';
position: absolute;
top: 40%;
left: 50%;
width: 200px;
height: 200px;
transform: translate(-50%, -50%) rotate(0);
animation: trotate 10s infinite linear;
border-radius: 42% 38% 62% 49% / 45%;
background-color: #00ff6f;
}
&::before {
content: '';
position: absolute;
z-index: 10;
top: 40%;
left: 50%;
width: 176px;
height: 176px;
transform: translate(-50%, -50%);
border-radius: 50%;
background-color: #000;
}
}
.bubbles {
position: absolute;
bottom: 0;
left: 50%;
width: 100px;
height: 40px;
transform: translate(-50%, 0);
border-radius: 100px 100px 0 0;
background-color: #00ff6f;
filter: blur(5px);
li {
position: absolute;
border-radius: 50%;
background: #00ff6f;
}
}
}
.charging {
font-size: 20px;
text-align: center;
}
}
</style>

View File

@@ -0,0 +1,3 @@
import LockScreen from './index.vue';
export { LockScreen };

View File

@@ -0,0 +1,42 @@
<template>
<transition name="slide-up">
<LockScreenPage v-if="isLock && isMouted && $route.name != LOGIN_NAME" />
</transition>
</template>
<script setup lang="ts">
import { computed, ref, onMounted } from 'vue';
import LockScreenPage from './lockscreen-page.vue';
import { useLockscreenStore } from '@/store/modules/lockscreen';
import { LOGIN_NAME } from '@/router/constant';
const lockscreenStore = useLockscreenStore();
const isLock = computed(() => lockscreenStore.isLock);
const isMouted = ref(false);
onMounted(() => {
setTimeout(() => {
isMouted.value = true;
});
});
</script>
<style lang="less" scoped>
.slide-up-enter-active {
animation: slide-up 0.5s;
}
.slide-up-leave-active {
animation: slide-up 0.5s reverse;
}
@keyframes slide-up {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(0);
}
}
</style>

View File

@@ -0,0 +1,261 @@
<template>
<div
:class="{ unLockLogin: isShowForm }"
class="lockscreen"
@keyup="isShowForm = true"
@mousedown.stop
@contextmenu.prevent
>
<template v-if="!isShowForm">
<div class="lock-box">
<div class="lock">
<span class="lock-icon" title="解锁屏幕" @click="isShowForm = true">
<Icon icon="ant-design:lock-outlined" size="30" />
</span>
</div>
<h6 class="tips">点击解锁</h6>
</div>
<!-- 小米 / 华为 充电-->
<component
:is="BatteryComp"
:battery="battery"
:battery-status="batteryStatus"
:calc-discharging-time="calcDischargingTime"
/>
<div class="local-time">
<div class="time">{{ hour }}:{{ minute }}</div>
<div class="date">{{ month }}{{ day }}星期{{ week }}</div>
</div>
<div class="computer-status">
<span :class="{ offline: !online }" class="network">
<Icon icon="ant-design:wifi-outlined" size="30" class="network" />
</span>
<Icon icon="ant-design:api-outlined" size="30" />
</div>
</template>
<template v-else>
<div class="login-box">
<Avatar :size="80" :src="userStore.userInfo.avatar">
<template #icon>
<Icon icon="ant-design:user-outlined" size="50" />
</template>
</Avatar>
<div class="username">{{ userStore.userInfo.username }}</div>
<a-input-password v-model:value="password" autofocus :placeholder="pwdPlaceholder" />
<div class="flex justify-between w-full">
<template v-if="lockscreenStore.lockPwd">
<a-button type="link" size="small" @click="hideLockForm">返回</a-button>
<a-button type="link" size="small" @click="nav2login">返回登录</a-button>
<a-button type="link" size="small" @click="onLogin">进入系统</a-button>
</template>
<template v-else>
<a-button type="link" size="small" @click="cancelLock">取消锁屏</a-button>
<a-button type="link" size="small" @click="lockScreen">确定锁屏</a-button>
</template>
</div>
</div>
</template>
</div>
</template>
<script setup lang="ts">
import { defineAsyncComponent, ref, computed } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { Avatar, message } from 'ant-design-vue';
import { useOnline } from '@/hooks/useOnline';
import { useTime } from '@/hooks/useTime';
import { useBattery } from '@/hooks/useBattery';
import { useLockscreenStore } from '@/store/modules/lockscreen';
import { useUserStore } from '@/store/modules/user';
import { LOGIN_NAME } from '@/router/constant';
import { Icon } from '@/components/basic/icon';
const lockscreenStore = useLockscreenStore();
const userStore = useUserStore();
// const isLock = computed(() => lockscreenStore.isLock);
// 获取本地时间
const { month, day, hour, minute, week } = useTime();
const { online } = useOnline();
const router = useRouter();
const route = useRoute();
const { battery, batteryStatus, calcDischargingTime } = useBattery();
const BatteryComp = defineAsyncComponent(() => {
return Math.random() > 0.49 ? import('./huawei-charge.vue') : import('./xiaomi-charge.vue');
});
const isShowForm = ref(!lockscreenStore.lockPwd);
const password = ref('');
const pwdPlaceholder = computed(() => {
return lockscreenStore.lockPwd ? '请输入锁屏密码或用户密码' : '请输入锁屏密码(可选)';
});
// 登录
const onLogin = async () => {
const pwd = password.value.trim();
if (pwd === '') return message.warn('密码不能为空');
if (lockscreenStore.verifyLockPwd(pwd)) {
unlockScreen();
} else {
return message.warn('密码错误,请重新输入');
}
};
/** 隐藏锁屏输入表单 */
const hideLockForm = () => {
isShowForm.value = false;
password.value = '';
};
/** 取消锁屏 */
const cancelLock = () => {
isShowForm.value = false;
lockscreenStore.setLock(false);
};
// 确定锁屏
const lockScreen = () => {
const pwd = password.value.trim();
lockscreenStore.setLockPwd(pwd);
hideLockForm();
};
// 取消锁屏/解锁锁屏
const unlockScreen = () => {
isShowForm.value = false;
lockscreenStore.setLock(false);
};
// 输入密码 锁屏
const nav2login = () => {
isShowForm.value = false;
lockscreenStore.setLock(false);
userStore.clearLoginStatus();
router.replace({
name: LOGIN_NAME,
query: {
redirect: route.fullPath,
},
});
};
</script>
<style lang="less" scoped>
.lockscreen {
display: flex;
position: fixed;
z-index: 9999;
inset: 0;
overflow: hidden;
background: #000;
color: white;
&.unLockLogin {
background-color: rgb(25 28 34 / 78%);
backdrop-filter: blur(7px);
}
.setting-box,
.login-box {
display: flex;
position: absolute;
top: 45%;
left: 50%;
flex-direction: column;
align-items: center;
justify-content: center;
width: 260px;
transform: translate(-50%, -50%);
> * {
margin-bottom: 14px;
}
.username {
font-size: 22px;
font-weight: 700;
}
}
.lock-box {
position: absolute;
top: 12vh;
left: 50%;
transform: translateX(-50%);
font-size: 34px;
.tips {
color: white;
cursor: text;
}
.lock {
display: flex;
justify-content: center;
.lock-icon {
cursor: pointer;
.anticon-unlock {
display: none;
}
&:hover .anticon-unlock {
display: initial;
}
&:hover .anticon-lock {
display: none;
}
}
}
}
.local-time {
position: absolute;
bottom: 60px;
left: 60px;
font-family: helvetica;
.time {
font-size: 70px;
}
.date {
font-size: 40px;
}
}
.computer-status {
position: absolute;
right: 60px;
bottom: 60px;
font-size: 24px;
> * {
margin-left: 14px;
}
.network {
position: relative;
&.offline::before {
content: '';
position: absolute;
z-index: 10;
top: 50%;
left: 50%;
width: 2px;
height: 28px;
transform: translate(-50%, -50%) rotate(45deg);
background-color: red;
}
}
}
}
</style>

View File

@@ -0,0 +1,272 @@
<template>
<div class="xiaomi-charge">
<div v-for="i in 3" :key="i" class="outer">
<div class="circle" :style="{ transform: `scale(${1.01 - 0.04 * (i - 1)})` }" />
</div>
<div class="line-box">
<div class="line-left" />
<div class="line-left line-right" />
<div class="line-center line-center-left-2" />
<div class="line-center line-center-left-1" />
<div class="line-center" />
<div class="line-center line-center-right-1" />
<div class="line-center line-center-right-2" />
</div>
<div class="outer" style="transform: scale(0.68)">
<div class="circle circle-blur" style="padding: 30px" />
</div>
<div v-for="i in 4" :key="i" class="outer">
<div
class="circle-white"
:style="{
transform: `scale(${1 - 0.02 * (i - 1)})`,
animationDuration: `${500 - 20 * (i - 1)}ms`,
}"
/>
</div>
<div class="outer">
<div class="text">{{ battery.level.toFixed(0) }}<span class="sub">%</span></div>
</div>
<div class="light" />
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import type { Battery } from '@/hooks/useBattery';
export default defineComponent({
name: 'XiaomiCharge',
props: {
battery: {
// 电池对象
type: Object as PropType<Battery>,
default: () => ({}),
},
},
});
</script>
<style lang="less" scoped>
.xiaomi-charge {
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes up {
0% {
transform: translateY(80px);
}
100% {
transform: translateY(-400px);
}
}
@keyframes light {
0% {
transform: scale(0.3);
opacity: 0.3;
}
40% {
transform: scale(1);
opacity: 0.6;
}
100% {
transform: scale(0.3);
opacity: 0;
}
}
display: flex;
position: absolute;
bottom: 0;
left: 50vw;
justify-content: center;
width: 300px;
height: 400px;
transform: translateX(-50%);
.circle {
position: absolute;
width: 286px;
height: 286px;
padding: 2px;
border-radius: 50%;
background: linear-gradient(#c71ff1, #2554ea);
}
.circle::after {
content: ' ';
display: block;
width: 100%;
height: 100%;
border-radius: 50%;
background: #000;
}
.circle-blur {
filter: blur(5px);
animation: rotate 5s linear infinite;
}
.circle-white {
position: absolute;
width: 220px;
height: 220px;
animation: rotate 500ms linear infinite;
border-top: solid 1px rgb(255 255 255 / 6%);
border-bottom: solid 1px rgb(255 255 255 / 8%);
border-radius: 50%;
}
.outer {
display: flex;
position: absolute;
bottom: 400px;
align-items: center;
justify-content: center;
}
.line-box {
position: absolute;
bottom: 0;
width: 80px;
height: 400px;
overflow: hidden;
background: #000;
}
.line-left {
position: absolute;
bottom: 0;
left: -15px;
box-sizing: border-box;
width: 30px;
height: 267px;
border-top: solid 2px #2554ea;
border-right: solid 2px #2554ea;
border-top-right-radius: 40px;
}
.line-left::before {
content: '';
position: absolute;
top: -8px;
left: 0;
box-sizing: border-box;
width: 30px;
height: 100%;
transform: scaleY(0.96);
transform-origin: center top;
border-top: solid 2px #2554ea;
border-right: solid 2px #2554ea;
border-top-right-radius: 50px;
}
.line-left::after {
content: '';
position: absolute;
top: -14px;
left: 0;
box-sizing: border-box;
width: 30px;
height: 100%;
transform: scaleY(0.92);
transform-origin: center top;
border-top: solid 2px #2554ea;
border-right: solid 2px #2554ea;
border-top-right-radius: 60px;
}
.line-right {
transform: scaleX(-1);
transform-origin: 55px;
}
.line-center {
position: absolute;
top: 0;
left: 39px;
width: 2px;
height: 100%;
background: #231779;
}
.line-center::before {
content: '';
position: absolute;
bottom: 10px;
width: 2px;
height: 80px;
animation: up 700ms linear infinite;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
background: linear-gradient(#79ccea, transparent);
}
.line-center-left-1 {
transform: translateX(-9px);
}
.line-center-left-2 {
transform: translateX(-18px);
}
.line-center-right-1 {
transform: translateX(9px);
}
.line-center-right-2 {
transform: translateX(18px);
}
.line-center-left-1::before {
animation-delay: -200ms;
}
.line-center-left-2::before {
animation-delay: -400ms;
}
.line-center-right-1::before {
animation-delay: -300ms;
}
.line-center-right-2::before {
animation-delay: -500ms;
}
.text {
position: absolute;
width: 200px;
height: 80px;
color: turquoise;
font-size: 70px;
line-height: 80px;
text-align: center;
}
.sub {
font-size: 30px;
}
.light {
position: absolute;
bottom: -150px;
width: 300px;
height: 350px;
animation: light 1.2s linear 1 forwards;
border-radius: 50%;
background: radial-gradient(#2554ea, transparent 60%);
}
}
</style>

View File

@@ -0,0 +1,37 @@
<template>
<object :key="url" :data="url" :type="type" width="100%" height="100%" />
</template>
<script setup lang="ts">
defineOptions({
name: 'preview-resource',
});
defineProps({
url: {
type: String,
},
type: {
type: String,
},
});
// const allowTypes = [
// 'image/',
// 'video/',
// 'audio/',
// 'text/',
// '/xml',
// '/json',
// '/javascript',
// '/pdf',
// ];
// const sandbox = computed(() => {
// const isAllowType = allowTypes.some((n) => props.type?.includes(n));
// if (isAllowType) {
// return '';
// }
// return 'allow-downloads: false';
// });
</script>

View File

@@ -0,0 +1,27 @@
<script setup lang="ts">
import { computed } from 'vue';
import { configProviderProps } from 'ant-design-vue/es/config-provider/context';
import { merge } from 'lodash-es';
import { ConfigProvider } from 'ant-design-vue';
import { useLocale } from '@/locales/useLocale';
import { useLayoutSettingStore } from '@/store/modules/layoutSetting';
defineOptions({
name: 'ProConfigProvider',
});
const props = defineProps(configProviderProps());
const layoutSetting = useLayoutSettingStore();
const { getAntdLocale } = useLocale();
const theme = computed(() => {
return merge({}, layoutSetting.themeConfig, props.theme);
});
</script>
<template>
<ConfigProvider v-bind="$props" :locale="getAntdLocale" :theme="theme">
<slot />
</ConfigProvider>
</template>

View File

@@ -0,0 +1,34 @@
<template>
<Progress v-bind="myProps" />
</template>
<script lang="ts" setup>
import { computed } from 'vue';
import { progressProps, type ProgressProps } from 'ant-design-vue/es/progress/props';
import { Progress } from 'ant-design-vue';
import type { PropType } from 'vue';
type StrokeColorType = ProgressProps['strokeColor'];
type StrokeColorFn = (percent) => StrokeColorType;
const props = defineProps({
...progressProps(),
strokeColor: {
type: [String, Object, Function] as PropType<StrokeColorType | StrokeColorFn>,
},
});
const myProps = computed(() => {
if (typeof props.strokeColor === 'function') {
return {
...props,
strokeColor: props.strokeColor(props.percent),
};
} else {
return {
...props,
strokeColor: props.strokeColor as StrokeColorType,
};
}
});
</script>

View File

@@ -0,0 +1,3 @@
import SplitPanel from './index.vue';
export { SplitPanel };

Some files were not shown because too many files have changed in this diff Show More