build: 搭建项目架构

This commit is contained in:
louis 2024-02-27 17:22:27 +08:00
commit 4074bbdc74
406 changed files with 48908 additions and 0 deletions

5
.browserslistrc Normal file
View File

@ -0,0 +1,5 @@
> 1%
last 2 versions
not dead
not ie 11
chrome 79

94
.cz-config.js Normal file
View File

@ -0,0 +1,94 @@
// 请使用npm run c提交代码。遵循代码提交规范
module.exports = {
types: [
{ value: 'feat', name: '功能: ✨ 新增功能', emoji: ':sparkles:' },
{ value: 'fix', name: '修复: 🐛 修复缺陷', emoji: ':bug:' },
{ value: 'docs', name: '文档: 📝 文档变更', emoji: ':memo:' },
{
value: 'style',
name: '格式: 🌈 代码格式(不影响功能,例如空格、分号等格式修正)',
emoji: ':lipstick:',
},
{
value: 'refactor',
name: '重构: 🔄 代码重构(不包括 bug 修复、功能新增)',
emoji: ':recycle:',
},
{ value: 'perf', name: '性能: 🚀 性能优化', emoji: ':zap:' },
{
value: 'test',
name: '测试: 🧪 添加疏漏测试或已有测试改动',
emoji: ':white_check_mark:',
},
{
value: 'build',
name: '构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 vite 配置等)',
emoji: ':package:',
},
{
value: 'ci',
name: '集成: ⚙️ 修改 CI 配置、脚本',
emoji: ':ferris_wheel:',
},
{ value: 'revert', name: '回退: ↩️ 回滚 commit', emoji: ':rewind:' },
{
value: 'chore',
name: '其他: 🛠️ 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)',
emoji: ':hammer:',
},
],
useEmoji: true,
emojiAlign: 'center',
useAI: false,
aiNumber: 1,
themeColorCode: '',
scopes: [],
allowCustomScopes: true,
allowEmptyScopes: true,
customScopesAlign: 'bottom',
customScopesAlias: 'custom',
emptyScopesAlias: 'empty',
upperCaseSubject: false,
markBreakingChangeMode: false,
breaklineNumber: 100,
breaklineChar: '|',
issuePrefixes: [
{ value: 'closed', name: 'closed: ISSUES has been processed' },
],
customIssuePrefixAlign: 'top',
emptyIssuePrefixAlias: 'skip',
customIssuePrefixAlias: 'custom',
allowCustomIssuePrefix: true,
allowEmptyIssuePrefix: true,
confirmColorize: true,
maxHeaderLength: Infinity,
maxSubjectLength: Infinity,
minSubjectLength: 0,
scopeOverrides: undefined,
defaultBody: '',
defaultIssues: '',
defaultScope: '',
defaultSubject: '',
messages: {
type: '选择一种你期望的提交类型(type):',
// scope: '选择一个更改的范围(scope) (可选):',
// used if allowCustomScopes is true
// customScope: 'Denote the SCOPE of this change:',
subject: '输入本次commit记录说明:\n',
// body: '长说明,使用"|"换行(可选)\n',
// breaking: '非兼容性说明 (可选):\n',
// footer: '关联关闭的issue例如#31, #34(可选):\n',
confirmCommit: '确定提交说明?',
},
skipQuestions: ['scope', 'body', 'breaking', 'footer'],
allowBreakingChanges: [
'fix',
'feat',
'update',
'refactor',
'perf',
'build',
'revert',
],
subjectLimit: 500, // 提交长度限制500
};

19
.dockerignore Normal file
View File

@ -0,0 +1,19 @@
.DS_Store
node_modules/
dist/
.vscode/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
tests/**/coverage/
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

9
.env Normal file
View File

@ -0,0 +1,9 @@
# 项目名称
VITE_APP_TITLE = Admin
# 网站前缀
VITE_BASE_URL = /
# enable mock in production
VITE_MOCK_IN_PROD = false

10
.env.development Normal file
View File

@ -0,0 +1,10 @@
# 只在开发模式中被载入
ENV = 'development'
# 公共基础路径, 所有资源的路径都将据此配置重写。
VITE_BASE_URL = /
# base api url
VITE_BASE_API_URL = '/api'
VITE_DROP_CONSOLE = false

11
.env.production Normal file
View File

@ -0,0 +1,11 @@
# 只在生产模式中被载入
ENV = 'production'
# base api url
# VITE_BASE_API_URL = 'https://nest-api.buqiyuan.site'
VITE_BASE_API_URL = 'http://localhost:7001'
# 公共基础路径, 所有资源的路径都将据此配置重写。
VITE_BASE_URL = /api
VITE_DROP_CONSOLE = true

19
.eslintignore Normal file
View File

@ -0,0 +1,19 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.husky
.local
/bin
/src/mock
Dockerfile
commitlint.config.js
components.d.ts

110
.eslintrc.js Normal file
View File

@ -0,0 +1,110 @@
/**
* @type {import('eslint').ESLint.ConfigData}
*/
module.exports = {
root: true,
env: {
browser: true,
node: true,
es6: true,
},
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2020,
sourceType: 'module',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true,
tsx: true,
},
},
plugins: ['vue', '@typescript-eslint', 'import'],
extends: [
'eslint:recommended',
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
overrides: [
{
files: ['*.ts', '*.js', '*.tsx', '*.vue'],
rules: {
'no-undef': 'off',
},
},
],
rules: {
'no-unused-vars': 'off',
// js/ts
// 'no-console': ['warn', { allow: ['error'] }],
'no-restricted-syntax': ['error', 'LabeledStatement', 'WithStatement'],
camelcase: ['error', { properties: 'never' }],
'no-var': 'error',
'no-empty': ['error', { allowEmptyCatch: true }],
'no-void': 'error',
'prefer-const': ['warn', { destructuring: 'all', ignoreReadBeforeAssign: true }],
'prefer-template': 'error',
'object-shorthand': ['error', 'always', { ignoreConstructors: false, avoidQuotes: true }],
'block-scoped-var': 'error',
'no-constant-condition': ['error', { checkLoops: false }],
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'error',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-non-null-asserted-optional-chain': 'off',
// '@typescript-eslint/consistent-type-imports': ['error', { disallowTypeAnnotations: false }],
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
// vue
'vue/no-v-html': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/multi-word-component-names': 'off',
// prettier
'prettier/prettier': 'error',
// import
'import/first': 'error',
'import/no-duplicates': 'error',
'import/order': [
'error',
{
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
pathGroups: [
{
pattern: 'vue',
group: 'external',
position: 'before',
},
{
pattern: '@vue/**',
group: 'external',
position: 'before',
},
{
pattern: 'ant-design-vue',
group: 'internal',
},
],
pathGroupsExcludedImportTypes: ['type'],
},
],
},
};

32
.gitignore vendored Normal file
View File

@ -0,0 +1,32 @@
node_modules
.DS_Store
dist
.cache
tests/server/static
tests/server/static/upload
.local
# local env files
.env.local
.env.*.local
.eslintcache
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*pnpm-debug.log*
# Editor directories and files
.idea
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# auto generate file
types/auto-imports.d.ts
types/components.d.ts

4
.husky/commit-msg Normal file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run commitlint

7
.husky/pre-commit Normal file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
#推送之前运行eslint检查
npx lint-staged
##推送之前运行单元测试检查
#npm run test:unit

18
.npmrc Normal file
View File

@ -0,0 +1,18 @@
# 使用淘宝镜像源
registry = https://registry.npmmirror.com
# registry = https://registry.npmjs.org
# 根据需要提升含有以下的依赖包到根 node_modules 目录下
public-hoist-pattern[]=husky
public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=*prettier*
public-hoist-pattern[]=lint-staged
public-hoist-pattern[]=*stylelint*
public-hoist-pattern[]=@commitlint/cli
public-hoist-pattern[]=core-js
# 提升所有依赖到根 node_modules 目录下,相当于 public-hoist-pattern[]=*,与上面一种方式一般二选一使用
# 极不推荐用这样的方式解决依赖问题,这样没有充分利用 pnpm 依赖访问安全性的优势,又走回了 npm / yarn 的老路。
# shamefully-hoist=true
enable-pre-post-scripts=true

9
.prettierignore Normal file
View File

@ -0,0 +1,9 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

2
.stylelintignore Normal file
View File

@ -0,0 +1,2 @@
/dist/*
/public/*

19
.versionrc.js Normal file
View File

@ -0,0 +1,19 @@
//发布应用 生成commit日志记录。
module.exports = {
types: [
{ type: 'feat', section: '✨ Features | 新功能' },
{ type: 'fix', section: '🐛 Bug Fixes | Bug 修复' },
{ type: 'init', section: '📦️ Init | 初始化' },
{ type: 'docs', section: '📝 Documentation | 文档' },
{ type: 'style', section: '🌈 Styles | 风格' },
{ type: 'refactor', section: '🔄 Code Refactoring | 代码重构' },
{ type: 'perf', section: '🚀 Performance Improvements | 性能优化' },
{ type: 'test', section: '🧪 Tests | 测试' },
{ type: 'revert', section: '↩️ Revert | 回退' },
{ type: 'build', section: '📦️ Build System | 打包构建' },
{ type: 'update', section: '⚙️ update | 构建/工程依赖/工具升级' },
{ type: 'tool', section: '🛠️ tool | 工具升级' },
{ type: 'ci', section: '⚙️ Continuous Integration | CI 配置' },
],
};

14
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,14 @@
{
"recommendations": [
"Vue.volar",
"Vue.vscode-typescript-vue-plugin",
"dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint",
"esbenp.prettier-vscode",
"mrmlnc.vscode-less",
"lokalise.i18n-ally",
"antfu.iconify",
"mikestead.dotenv",
"heybourn.headwind"
]
}

13
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}/src",
"sourceMaps": true
}
]
}

106
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,106 @@
{
"typescript.tsdk": "./node_modules/typescript/lib",
"volar.tsPlugin": true,
"volar.tsPluginStatus": false,
"npm.packageManager": "pnpm",
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.eol": "\n",
"search.exclude": {
"**/node_modules": true,
"**/*.log": true,
"**/*.log*": true,
"**/bower_components": true,
"**/dist": true,
"**/elehukouben": true,
"**/.git": true,
"**/.gitignore": true,
"**/.svn": true,
"**/.DS_Store": true,
"**/.idea": true,
"**/.vscode": false,
"**/yarn.lock": true,
"**/tmp": true,
"out": true,
"dist": true,
"node_modules": true,
"CHANGELOG.md": true,
"examples": true,
"res": true,
"screenshots": true,
"yarn-error.log": true,
"**/.yarn": true
},
"files.exclude": {
"**/.cache": true,
"**/.editorconfig": true,
"**/.eslintcache": true,
"**/bower_components": true,
"**/.idea": true,
"**/tmp": true,
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true
},
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/.vscode/**": true,
"**/node_modules/**": true,
"**/tmp/**": true,
"**/bower_components/**": true,
"**/dist/**": true,
"**/yarn.lock": true
},
"stylelint.enable": true,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"path-intellisense.mappings": {
"@/": "${workspaceRoot}/src"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"[vue]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"i18n-ally.localesPaths": ["src/locales/lang"],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": ["json"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"]
}

20
.vscode/vue3.3.code-snippets vendored Normal file
View File

@ -0,0 +1,20 @@
{
"Vue3.3+defineOptions快速生成模板": {
"scope": "vue",
"prefix": "Vue3.3+",
"body": [
"<script setup lang='ts'>",
"defineOptions({",
"\tname: '${TM_FILENAME_BASE}'",
"})",
"</script>\n",
"<template>",
"\t<div>test</div>",
"</template>\n",
"<style lang='less' scoped>\n",
"</style>",
"$2"
],
"description": "Vue3.3+defineOptions快速生成模板"
}
}

0
CHANGELOG.md Normal file
View File

29
Dockerfile Normal file
View File

@ -0,0 +1,29 @@
# https://stackoverflow.com/questions/53681522/share-variable-in-multi-stage-dockerfile-arg-before-from-not-substituted
ARG PROJECT_DIR=/huaxin-base-frontend
FROM node:20-slim as builder
ARG PROJECT_DIR
WORKDIR $PROJECT_DIR
# 安装pnpm
RUN npm install -g pnpm
COPY . ./
# 安装依赖
# 若网络不通,可以使用淘宝源
# RUN pnpm config set registry https://registry.npmmirror.com
RUN pnpm install
# 构建项目
ENV VITE_BASE_URL=/
RUN pnpm build
FROM nginx:alpine as production
ARG PROJECT_DIR
COPY --from=builder $PROJECT_DIR/dist/ /usr/share/nginx/html
# COPY --from=builder $PROJECT_DIR/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

77
README.md Normal file
View File

@ -0,0 +1,77 @@
# Huaxin-admin
基于 vite5.x + vue3.x + antd-design-vue4.x + typescript5.x
- 账号admin密码a123456
- [swagger 文档](http://localhost:7001/api-docs/)
## 技术要求
- [Vue](https://cn.vuejs.org/)
- [Ant desgin](https://www.antdv.com/components/overview-cn)
- [TypeScript](https://www.tslang.cn/index.html)
- [Nestjs](https://docs.nestjs.cn/8/)
- [TypeORM](https://typeorm.biunav.com/)
- Mysql
- Redis
## 技术选型
1. **前端技术**
- vue3
- ant design
- axios
- pinia
- vue-router @3.4.9
- less-loader @10.1.1
2. **后端技术**
- nest
- mysql2
- swagger-ui-express
- typeorm
- ioredis
## 安装使用
- 安装依赖
```bash
pnpm install
```
- 运行
```bash
pnpm dev
```
- 打包
```bash
pnpm build
```
## Git 贡献提交规范
```bash
yarn c
```
- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
- `feat` 增加新功能
- `fix` 修复问题/BUG
- `style` 代码风格相关无影响运行结果的
- `perf` 优化/性能提升
- `refactor` 重构
- `revert` 撤销修改
- `test` 测试相关
- `docs` 文档/注释
- `chore` 依赖更新/脚手架配置修改等
- `workflow` 工作流改进
- `ci` 持续集成
- `types` 类型定义文件更改
- `wip` 开发中

24
commitlint.config.cjs Normal file
View File

@ -0,0 +1,24 @@
// 请使用npm run c/yarn c提交代码。
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'feat', // 新增功能
'fix', // 修复缺陷
'docs', // 文档变更
'style', // 代码格式(不影响功能,例如空格、分号等格式修正)
'refactor', // 代码重构(不包括 bug 修复、功能新增)
'perf', // 性能优化
'test', // 添加疏漏测试或已有测试改动
'build', // 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)
'ci', // 修改 CI 配置、脚本
'revert', // 回滚 commit
'chore', // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)
],
],
'subject-case': [0], // subject大小写不做校验
},
};

14
docker-compose.yml Normal file
View File

@ -0,0 +1,14 @@
version: '3'
services:
huaxin-base-frontend:
# 从当前路径构建镜像
build:
context: .
dockerfile: Dockerfile
target: production
ports:
- '80:80'
env_file:
- .env
- .env.production

14
index.html Normal file
View File

@ -0,0 +1,14 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="referrer" content="origin" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="user-scalable=yes" />
<title>华信Admin</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

10
lint-staged.config.js Normal file
View File

@ -0,0 +1,10 @@
/**
* @type {import('stylelint').Config}
*/
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'*.json': ['prettier --write'],
'*.vue': ['eslint --fix', 'prettier --write', 'stylelint --fix --allow-empty-input'],
'*.{scss,less,styl,html}': ['stylelint --fix --allow-empty-input', 'prettier --write'],
'*.md': ['prettier --write'],
};

83
mocks/_util.ts Normal file
View File

@ -0,0 +1,83 @@
// Interface data format used to return a unified format
import type { DefaultBodyType, StrictRequest } from 'msw';
import { ResultEnum } from '@/enums/httpEnum';
import { uniqueSlash } from '@/utils/urlUtils';
const baseApiUrl = new URL(import.meta.env.VITE_BASE_API_URL, location.origin).toString();
/**
* msw baseUrl,
* @see https://github.com/mswjs/msw/issues/397#issuecomment-751230924
*/
export const serverApi = (path: string) => {
return uniqueSlash(baseApiUrl + path);
};
export function resultSuccess<T = Recordable>(data: T, { message = 'ok' } = {}) {
return {
code: ResultEnum.SUCCESS,
data,
message,
type: 'success',
};
}
export function resultPageSuccess<T = any>(
page: number,
pageSize: number,
list: T[],
{ message = 'ok' } = {},
) {
const pageData = pagination(page, pageSize, list);
return {
...resultSuccess({
items: pageData,
meta: {
currentPage: ~~page,
totalItems: list.length,
totalPages: Math.ceil(list.length / pageSize),
},
}),
message,
};
}
export function resultError(
message = 'Request failed',
{ code = ResultEnum.ERROR, data = null } = {},
) {
return {
code,
data,
message,
type: 'error',
};
}
export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
const offset = (pageNo - 1) * Number(pageSize);
return offset + Number(pageSize) >= array.length
? array.slice(offset, array.length)
: array.slice(offset, offset + Number(pageSize));
}
export interface requestParams {
method: string;
body: any;
headers?: { authorization?: string };
query: any;
}
/**
* @description request数据中获取token
*
*/
export function getRequestToken({ headers }: requestParams): string | undefined {
return headers?.authorization;
}
export const getQuery = (request: StrictRequest<DefaultBodyType>) => {
const url = new URL(request.url);
return Object.fromEntries<any>(url.searchParams.entries());
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

37
mocks/demo/hero/index.ts Normal file
View File

@ -0,0 +1,37 @@
import { HttpResponse, delay, http } from 'msw';
import { getQuery, resultPageSuccess, resultSuccess, serverApi } from '../../_util';
import heroListJson from './_heroList.json';
import heroLoLListJson from './_lolHeroList.json';
export default [
http.get(serverApi('/demo/wzry/hero_list'), async ({ request }) => {
await delay(500);
const { page = 1, pageSize = 10, cname = '', title = '' } = getQuery(request);
const filterResult = heroListJson.filter((n) => {
return n.cname.includes(cname) && n.title.includes(title);
});
return HttpResponse.json(resultPageSuccess(page, pageSize, filterResult));
}),
http.get(serverApi('/demo/lol/hero_list'), async ({ request }) => {
// 接口地址: https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js
await delay(500);
const { page = 1, pageSize = 10, title = '', name = '' } = getQuery(request);
const filterResult = heroLoLListJson.filter((n) => {
return n.title.includes(title) && n.name.includes(name);
});
return HttpResponse.json(resultPageSuccess(page, pageSize, filterResult));
}),
http.get(serverApi('/demo/lol/hero_info/:id'), async ({ params }) => {
await delay(300);
const { id } = params;
const result = heroLoLListJson.find((n) => n.heroId == id);
return HttpResponse.json(resultSuccess(result));
}),
];

23
mocks/demo/select.ts Normal file
View File

@ -0,0 +1,23 @@
import { http, HttpResponse, delay } from 'msw';
import { getQuery, resultSuccess, serverApi } from '../_util';
const demoList = (keyword, count = 20) => {
const result = [] as any[];
for (let index = 0; index < count; index++) {
result.push({
name: `${keyword ?? ''}选项${index}`,
id: `${index}`,
});
}
return result;
};
export default [
http.get(serverApi('/select/getDemoOptions'), async ({ request }) => {
await delay(1000);
const { keyword, count } = getQuery(request);
return HttpResponse.json(resultSuccess(demoList(keyword, count)));
}),
];

25
mocks/index.ts Normal file
View File

@ -0,0 +1,25 @@
// import { enableMocking } from '@admin-pkg/vite-plugin-msw';
// import { HttpHandler } from 'msw';
// const modules = import.meta.glob<any>('./**/*.ts', {
// eager: true,
// });
// export const setupMock = async () => {
// const handlers = Object.values(modules).reduce<HttpHandler[]>((prev, curr) => {
// const arr = curr?.default;
// if (Array.isArray(arr)) {
// arr.forEach((item) => {
// if (item instanceof HttpHandler) {
// prev.push(item);
// }
// });
// }
// return prev;
// }, []);
// console.log('handlers', handlers);
// await enableMocking(handlers, {
// // 设置为 true 则不会在浏览器控制台输出 log 信息
// quiet: false,
// });
// };

28
mocks/list.ts Normal file
View File

@ -0,0 +1,28 @@
import { http, HttpResponse, delay } from 'msw';
import { faker } from '@faker-js/faker/locale/zh_CN';
import { serverApi } from './_util';
export default [
http.get(serverApi('/list'), async () => {
await delay(1000);
return HttpResponse.json(
Array.from({ length: 10 }).map(() => ({
fullname: faker.person.fullName(),
email: faker.internet.email(),
avatar: faker.image.avatar(),
address: faker.location.streetAddress(),
})),
);
}),
http.get(serverApi('/list'), async () => {
await delay(1000);
return HttpResponse.json(
Array.from({ length: 10 }).map(() => ({
fullname: faker.person.fullName(),
email: faker.internet.email(),
avatar: faker.image.avatar(),
address: faker.location.streetAddress(),
})),
);
}),
];

24
mocks/user.ts Normal file
View File

@ -0,0 +1,24 @@
import { http, HttpResponse, delay } from 'msw';
import { faker } from '@faker-js/faker/locale/zh_CN';
import { serverApi } from './_util';
export default [
http.get(serverApi('/user/:id'), async () => {
await delay(1000);
return HttpResponse.json(
Array.from({ length: 10 }).map(() => ({
fullname: faker.person.fullName(),
email: faker.internet.email(),
avatar: faker.image.avatar(),
address: faker.location.streetAddress(),
})),
);
}),
http.get(serverApi('/login'), async () => {
await delay(1000);
return HttpResponse.json({
code: 200,
data: '登录成功',
});
}),
];

67
openapi.config.ts Normal file
View File

@ -0,0 +1,67 @@
import { generateService } from '@umijs/openapi';
import type { RequestOptions } from './src/utils/request';
const re = /controller[-_ .](\w)/gi;
// swagger-typescript-api
generateService({
schemaPath: 'http://127.0.0.1:7001/api-docs-json',
serversPath: './src/api/backend',
requestOptionsType: 'RequestOptions',
// 自定义网络请求函数路径
requestImportStatement: 'import { request, type RequestOptions } from "@/utils/request";',
hook: {
// @ts-ignore
customFunctionName(operationObject, apiPath) {
const { operationId } = operationObject;
if (!operationId) {
console.warn('[Warning] no operationId', apiPath);
return;
}
const funcName = operationId.replace(re, (_all, letter) => letter.toUpperCase());
operationObject.operationId = funcName;
return funcName;
},
// @ts-ignore
customFileNames(operationObject, apiPath) {
const { operationId } = operationObject;
if (!operationId) {
console.warn('[Warning] no operationId', apiPath);
return;
}
const controllerName = operationId.split(re)[0];
const moduleName = operationObject.tags?.[0].split(' - ')[0];
if (moduleName === controllerName) {
return [controllerName];
} else if (moduleName && moduleName !== controllerName) {
return [`${moduleName}_${controllerName}`];
}
return;
},
customType(schemaObject, namespace, defaultGetType) {
const type = defaultGetType(schemaObject, namespace);
// 提取出 data 的类型
const regex = /API\.ResOp & { 'data'\?: (.+); }/;
return type.replace(regex, '$1');
},
customOptionsDefaultValue(data): RequestOptions {
const { summary } = data;
if (summary?.startsWith('创建') || summary?.startsWith('新增')) {
return { successMsg: '创建成功' };
} else if (summary?.startsWith('更新')) {
return { successMsg: '更新成功' };
} else if (summary?.startsWith('删除')) {
return { successMsg: '删除成功' };
}
return {};
},
},
});

155
package.json Normal file
View File

@ -0,0 +1,155 @@
{
"name": "huaxin-base-frontend",
"version": "1.0.0",
"packageManager": "pnpm@8.10.2",
"engines": {
"node": ">=18"
},
"author": {
"name": "luzixun",
"email": "869322496@qq.com",
"url": "https://github.com/869322496"
},
"scripts": {
"bootstrap": "pnpm install",
"serve": "npm run dev",
"dev": "vite",
"build": "rimraf dist && cross-env NODE_ENV=production vite build",
"build:watch": "rimraf dist && cross-env NODE_ENV=production vite build --watch",
"preview": "npm run build && vite preview",
"preview:dist": "vite preview",
"deploy": "bash deploy.sh",
"openapi": "npx tsx openapi.config.ts",
"clean:cache": "npx rimraf node_modules/.cache/ && npx rimraf node_modules/.vite",
"clean:lib": "npx rimraf node_modules packages/*/node_modules",
"format": "prettier --write .",
"lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx,.md,.json --max-warnings 0 && pretty-quick --check --branch main",
"lint:fix": "eslint --fix . --ext .vue,.js,.ts,.jsx,.tsx,.md,.json && pretty-quick --branch main",
"lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged",
"gen:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
"reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
"test:gzip": "npx http-server dist --cors --gzip -c-1",
"test:br": "npx http-server dist --cors --brotli -c-1",
"commitlint": "commitlint --config commitlint.config.cjs -e -V",
"c": "git add . && git cz && git push",
"release": "standard-version"
},
"dependencies": {
"@ant-design/icons-vue": "~7.0.1",
"@iconify/vue": "^4.1.1",
"@tinymce/tinymce-vue": "^5.1.1",
"@vueuse/core": "~10.8.0",
"ant-design-vue": "~4.1.2",
"axios": "~1.6.7",
"dayjs": "~1.11.10",
"echarts": "^5.5.0",
"file-saver": "~2.0.5",
"lodash-es": "~4.17.21",
"mitt": "~3.0.1",
"nprogress": "~1.0.0-1",
"pinia": "~2.1.7",
"qiniu-js": "^3.4.2",
"qs": "~6.11.2",
"sortablejs": "~1.15.2",
"tinymce": "^6.8.3",
"vue": "~3.4.19",
"vue-echarts": "^6.6.9",
"vue-i18n": "9.9.1",
"vue-router": "~4.3.0",
"vue-types": "~5.1.1",
"vue-virtual-scroller": "2.0.0-beta.8",
"xlsx": "~0.18.5"
},
"devDependencies": {
"@commitlint/cli": "~18.6.0",
"@commitlint/config-conventional": "~18.6.0",
"@faker-js/faker": "^8.4.1",
"@iconify-json/ant-design": "^1.1.15",
"@iconify-json/ep": "^1.1.14",
"@iconify/json": "^2.2.180",
"@types/lodash-es": "~4.17.12",
"@types/node": "~20.11.16",
"@typescript-eslint/eslint-plugin": "~7.0.2",
"@typescript-eslint/parser": "~7.0.2",
"@umijs/openapi": "^1.10.1",
"@vitejs/plugin-vue": "~5.0.4",
"@vitejs/plugin-vue-jsx": "~3.1.0",
"@vue/tsconfig": "^0.5.1",
"commitizen": "~4.3.0",
"cliui": "^8.0.1",
"cz-customizable": "^7.0.0",
"conventional-changelog-cli": "~4.1.0",
"standard-version": "^9.5.0",
"core-js": "^3.36.0",
"cross-env": "~7.0.3",
"eslint": "~8.57.0",
"eslint-config-prettier": "~9.1.0",
"eslint-define-config": "~2.1.0",
"eslint-plugin-import": "~2.29.1",
"eslint-plugin-prettier": "~5.1.3",
"eslint-plugin-vue": "~9.22.0",
"husky": "~9.0.10",
"less": "~4.2.0",
"lightningcss": "^1.24.0",
"lint-staged": "~15.2.2",
"mockjs": "~1.1.0",
"msw": "^2.2.1",
"postcss": "~8.4.34",
"postcss-html": "~1.6.0",
"postcss-less": "~6.0.0",
"prettier": "~3.2.5",
"pretty-quick": "~4.0.0",
"rimraf": "~5.0.5",
"stylelint": "~16.2.1",
"stylelint-config-property-sort-order-smacss": "^10.0.0",
"stylelint-config-recommended": "~14.0.0",
"stylelint-config-recommended-vue": "~1.5.0",
"stylelint-config-standard": "~36.0.0",
"stylelint-order": "~6.0.4",
"stylelint-prettier": "^5.0.0",
"terser": "~5.28.1",
"ts-node": "^10.9.2",
"typescript": "~5.3.3",
"unocss": "^0.58.5",
"unplugin-vue-components": "~0.26.0",
"vite": "~5.1.4",
"vite-plugin-checker": "~0.6.4",
"vite-plugin-mkcert": "^1.17.3",
"vite-plugin-svg-icons": "~2.0.1",
"vue-eslint-parser": "~9.4.2",
"vue-tsc": "~1.8.27"
},
"keywords": [
"vue",
"ant-design-vue",
"vue3",
"ts",
"tsx",
"admin",
"typescript"
],
"target": "web",
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
"rollup"
],
"allowedVersions": {
"postcss": "5"
}
}
},
"config": {
"commitizen": {
"path": "cz-customizable"
}
},
"lint-staged": {
"*.{js,ts,jsx,tsx,vue}": [
"npm run lint"
]
}
}

12319
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

13
prettier.config.js Normal file
View File

@ -0,0 +1,13 @@
/**
* @type {import('prettier').Config}
*/
module.exports = {
printWidth: 100,
semi: true,
vueIndentScriptAndStyle: true,
singleQuote: true,
trailingComma: 'all',
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
};

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

1
public/iconfont.js Normal file

File diff suppressed because one or more lines are too long

23
src/App.vue Normal file
View File

@ -0,0 +1,23 @@
<template>
<ProConfigProvider>
<router-view #="{ Component }">
<component :is="Component" />
</router-view>
<LockScreen />
</ProConfigProvider>
</template>
<script setup lang="ts">
import { watchEffect } from 'vue';
import { useRoute } from 'vue-router';
import { transformI18n } from './hooks/useI18n';
import { LockScreen } from '@/components/basic/lockscreen';
const route = useRoute();
watchEffect(() => {
if (route.meta?.title) {
//
document.title = transformI18n(route.meta.title);
}
});
</script>

View File

@ -0,0 +1,59 @@
// @ts-ignore
/* eslint-disable */
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,27 @@
// @ts-ignore
/* eslint-disable */
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,15 @@
// @ts-ignore
/* eslint-disable */
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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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,22 @@
// @ts-ignore
/* eslint-disable */
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: {
// width has a default value: 100
width: '100',
// height has a default value: 50
height: '50',
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,68 @@
// @ts-ignore
/* eslint-disable */
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,52 @@
// @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 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 systemSse from './systemSse';
import * as netDiskManage from './netDiskManage';
import * as netDiskOverview from './netDiskOverview';
import * as businessTodo from './businessTodo';
export default {
auth,
account,
captcha,
authEmail,
systemUser,
systemRole,
systemMenu,
systemParamConfig,
systemLog,
systemDept,
systemDictType,
systemDictItem,
systemTask,
systemOnline,
systemServe,
toolsStorage,
systemEmail,
toolsUpload,
health,
systemSse,
netDiskManage,
netDiskOverview,
businessTodo,
};

View File

@ -0,0 +1,128 @@
// @ts-ignore
/* eslint-disable */
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,11 @@
// @ts-ignore
/* eslint-disable */
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,77 @@
// @ts-ignore
/* eslint-disable */
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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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,15 @@
// @ts-ignore
/* eslint-disable */
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,90 @@
// @ts-ignore
/* eslint-disable */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,95 @@
// @ts-ignore
/* eslint-disable */
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: {
// extOpenMode has a default value: 1
extOpenMode: '1',
// show has a default value: 1
show: '1',
// keepAlive has a default value: 1
keepAlive: '1',
// status has a default value: 1
status: '1',
...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,23 @@
// @ts-ignore
/* eslint-disable */
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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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,11 @@
// @ts-ignore
/* eslint-disable */
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,17 @@
// @ts-ignore
/* eslint-disable */
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,136 @@
// @ts-ignore
/* eslint-disable */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
// limit has a default value: -1
limit: '-1',
...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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...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 */
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: {
// page has a default value: 1
page: '1',
// pageSize has a default value: 10
pageSize: '10',
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,35 @@
// @ts-ignore
/* eslint-disable */
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 || {}),
});
}

1271
src/api/backend/api/typings.d.ts vendored Normal file

File diff suppressed because it is too large Load Diff

30
src/api/demo/hero.ts Normal file
View File

@ -0,0 +1,30 @@
import { request } from '@/utils/request';
/**
* @description 耀
*/
export function getWzryHeroList(query: API.PageParams) {
return request('/demo/wzry/hero_list', {
method: 'get',
params: query,
});
}
/**
* @description
*/
export function getLolHeroList(query: API.PageParams) {
return request('/demo/lol/hero_list', {
method: 'get',
params: query,
});
}
/**
* @description
*/
export function getLolHeroInfo({ id }) {
return request(`/demo/lol/hero_info/${id}`, {
method: 'get',
});
}

13
src/api/demo/select.ts Normal file
View File

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

5
src/api/index.ts Normal file
View File

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

36
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;
};
}

BIN
src/assets/404.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

1
src/assets/analysis.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

39
src/assets/icons/dark.svg Normal file
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

48
src/assets/icons/logo.svg Normal file
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

1
src/assets/icons/sun.svg Normal file
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

BIN
src/assets/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/images/tool.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

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