完成了 BOM 管理和生产管理,完成部分发料单、采购计划和调拨单。

This commit is contained in:
c
2026-02-28 18:18:01 +08:00
commit 219eef4729
399 changed files with 46113 additions and 0 deletions

15
.editorconfig Normal file
View File

@@ -0,0 +1,15 @@
# @see: http://editorconfig.org
root = true
[*] # 表示所有文件适用
charset = utf-8 # 设置文件字符集为 utf-8
end_of_line = lf # 控制换行类型(lf | cr | crlf)
insert_final_newline = true # 始终在文件末尾插入一个新行
indent_style = tab # 缩进风格tab | space
indent_size = 2 # 缩进大小
max_line_length = 130 # 最大行长度
[*.md] # 表示仅对 md 文件适用以下规则
max_line_length = off # 关闭最大行长度限制
trim_trailing_whitespace = false # 关闭末尾空格修剪

40
.env Normal file
View File

@@ -0,0 +1,40 @@
# port
VITE_PORT = 8099
# open 运行 npm run dev 时自动打开浏览器
VITE_OPEN = true
# 是否生成包分析文件
VITE_REPORT = false
# 是否开启 gzip 压缩
VITE_BUILD_GZIP = true
# 是否删除生产环境 console
VITE_DROP_CONSOLE = true
# 是否删除生产环境 debugger
VITE_DROP_DEBUGGER = true
# 是否加载所有 element-plus 组件false 则为按需加载
VITE_LOAD_ALL_EP_COMPONENTS = false
# 是否加载所有 element-plus 样式false 则为按需加载
VITE_LOAD_ALL_EP_STYLE = false
# 打包输出目录,默认 dist
VITE_OUT_DIR = "dist"
# 是否生成 sourcemap 文件
VITE_SOURCEMAP = false
# 是否将 css 切割
VITE_CSS_SPLIT = false
# 是否启用 WebSocket
VITE_WEBSOCKET = false
# 路由权限模式frontend backend | mixed
VITE_ROUTE_ACCESS_MODE = mixed
VITE_DEVTOOLS = true

19
.env.development Normal file
View File

@@ -0,0 +1,19 @@
# 本地环境接口地址
VITE_API_URL = 'http://localhost:8080'
# 静态文件获取根路径
VITE_PUBLIC_PATH = "/"
# 线上环境路由历史模式,格式为 `模式, base 参数`,模式可配置为 hash 和 history如果填错或者不填则默认 history 模式
VITE_ROUTER_MODE = "history, /"
# 是否加载所有 element-plus 样式false 则为按需加载
VITE_LOAD_ALL_EP_STYLE = true
# 是否加载所有 element-plus 组件false 则为按需加载
VITE_LOAD_ALL_EP_COMPONENTS = true
# WebSocket 连接 URL前提在 .env 里将 VITE_WEBSOCKET 改为 true开启 WebSocket
VITE_WEBSOCKET_URL = ""
VITE_ROUTE_ACCESS_MODE = mixed

29
.env.production Normal file
View File

@@ -0,0 +1,29 @@
# 线上环境接口地址
VITE_API_URL = "/pro"
# 静态文件获取根路径
VITE_PUBLIC_PATH = "/"
# 线上环境路由历史模式,格式为 `模式, base 参数`,模式可配置为 hash 和 history如果填错或者不填则默认 history 模式
VITE_ROUTER_MODE = "history, /"
# 是否启用 gzip 压缩或 brotli 压缩(分两种情况,删除原始文件和不删除原始文件)
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 开启压缩条件,.env 文件设置 VITE_BUILD_GZIP 为 true
VITE_COMPRESSION = "gzip"
# 打包输出目录,默认 dist
VITE_OUT_DIR = "dist"
# 是否生成 sourcemap 文件
VITE_SOURCEMAP = false
# 是否将 css 切割
VITE_CSS_SPLIT = true
# 是否加载所有 element-plus 样式false 则为按需加载
VITE_LOAD_ALL_EP_STYLE = true
# 是否加载所有 element-plus 组件false 则为按需加载
VITE_LOAD_ALL_EP_COMPONENTS = true

29
.env.sit Normal file
View File

@@ -0,0 +1,29 @@
# 测试环境接口地址
VITE_API_URL = "/sit"
# 静态文件获取根路径
VITE_PUBLIC_PATH = "/"
# 线上环境路由历史模式,格式为 `模式, base 参数`,模式可配置为 hash 和 history如果填错或者不填则默认 history 模式
VITE_ROUTER_MODE = "history, /"
# 是否启用 gzip 压缩或 brotli 压缩(分两种情况,删除原始文件和不删除原始文件)
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 开启压缩条件,.env 文件设置 VITE_BUILD_GZIP 为 true
VITE_COMPRESSION = "gzip"
# 打包输出目录,默认 dist
VITE_OUT_DIR = "dist"
# 是否生成 sourcemap 文件
VITE_SOURCEMAP = false
# 是否将 css 切割
VITE_CSS_SPLIT = false
# 是否加载所有 element-plus 样式false 则为按需加载
VITE_LOAD_ALL_EP_STYLE = true
# 是否加载所有 element-plus 组件false 则为按需加载
VITE_LOAD_ALL_EP_COMPONENTS = true

29
.env.uat Normal file
View File

@@ -0,0 +1,29 @@
# 测试环境接口地址
VITE_API_URL = "/uat"
# 静态文件获取根路径
VITE_PUBLIC_PATH = "/"
# 线上环境路由历史模式,格式为 `模式, base 参数`,模式可配置为 hash 和 history如果填错或者不填则默认 history 模式
VITE_ROUTER_MODE = "history, /"
# 是否启用 gzip 压缩或 brotli 压缩(分两种情况,删除原始文件和不删除原始文件)
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 开启压缩条件,.env 文件设置 VITE_BUILD_GZIP 为 true
VITE_COMPRESSION = "gzip"
# 打包输出目录,默认 dist
VITE_OUT_DIR = "dist"
# 是否生成 sourcemap 文件
VITE_SOURCEMAP = false
# 是否将 css 切割
VITE_CSS_SPLIT = false
# 是否加载所有 element-plus 样式false 则为按需加载
VITE_LOAD_ALL_EP_STYLE = true
# 是否加载所有 element-plus 组件false 则为按需加载
VITE_LOAD_ALL_EP_COMPONENTS = true

118
.eslintrc-globals.js Normal file
View File

@@ -0,0 +1,118 @@
export default {
Component: true,
ComponentPublicInstance: true,
ComputedRef: true,
DirectiveBinding: true,
EffectScope: true,
ExtractDefaultPropTypes: true,
ExtractPropTypes: true,
ExtractPublicPropTypes: true,
InjectionKey: true,
MaybeRef: true,
MaybeRefOrGetter: true,
PropType: true,
Ref: true,
Slot: true,
Slots: true,
VNode: true,
WritableComputedRef: true,
acceptHMRUpdate: true,
computed: true,
createApp: true,
createPinia: true,
customRef: true,
defineAsyncComponent: true,
defineComponent: true,
defineStore: true,
effectScope: true,
getActivePinia: true,
getCurrentInstance: true,
getCurrentScope: true,
h: true,
inject: true,
isProxy: true,
isReactive: true,
isReadonly: true,
isRef: true,
mapActions: true,
mapGetters: true,
mapState: true,
mapStores: true,
mapWritableState: true,
markRaw: true,
nextTick: true,
onActivated: true,
onBeforeMount: true,
onBeforeRouteLeave: true,
onBeforeRouteUpdate: true,
onBeforeUnmount: true,
onBeforeUpdate: true,
onDeactivated: true,
onErrorCaptured: true,
onMounted: true,
onRenderTracked: true,
onRenderTriggered: true,
onScopeDispose: true,
onServerPrefetch: true,
onUnmounted: true,
onUpdated: true,
onWatcherCleanup: true,
provide: true,
reactive: true,
readonly: true,
ref: true,
resolveComponent: true,
setActivePinia: true,
setMapStoreSuffix: true,
shallowReactive: true,
shallowReadonly: true,
shallowRef: true,
storeToRefs: true,
toRaw: true,
toRef: true,
toRefs: true,
toValue: true,
triggerRef: true,
unref: true,
useAttrs: true,
useCssModule: true,
useCssVars: true,
useId: true,
useLink: true,
useModel: true,
useRoute: true,
useRouter: true,
useSlots: true,
useTemplateRef: true,
watch: true,
watchEffect: true,
watchPostEffect: true,
watchSyncEffect: true,
// 上面是 unplugin-auto-import/vite 插件自动导入的变量,下面是手动维护的变量
MetaProps: "readonly",
RouterConfig: "readonly",
RouterConfigRaw: "readonly",
process: "readonly",
BlobPart: "readonly",
ReadOnlyKey: "readonly",
PartialKey: "readonly",
RequiredKey: "readonly",
RequiredKeyPartialOther: "readonly",
Recordable: "readonly",
Nullable: "readonly",
keyLowercase: "readonly",
CanvasTextBaseline: "readonly",
keyUppercase: "readonly",
keyOnPrefix: "readonly",
NodeJS: "readonly",
module: "readonly",
ImportMetaEnv: "readonly",
__dirname: "readonly",
NodeListOf: "readonly",
AppInfo: "readonly",
__APP_INFO__: "readonly",
httpNs: "readonly",
log: "readonly",
DeepPartial: "readonly",
DeepReadonly: "readonly",
};

29
.gitignore vendored Normal file
View File

@@ -0,0 +1,29 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
!.vscode/settings.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

3
.husky/commit-msg Normal file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env sh
npx --no-install commitlint --edit "$1"

8
.husky/lintstagedrc.js Normal file
View File

@@ -0,0 +1,8 @@
export default {
"*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
"!(package)*.json": ["prettier --write--parser json"],
"package.json": ["prettier --write"],
"*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"],
"*.{vue,css,scss,postcss,less}": ["stylelint --fix", "prettier --write"],
"*.md": ["prettier --write"],
};

1
.husky/pre-commit Normal file
View File

@@ -0,0 +1 @@
npm run lint:lint-staged

9
.prettierignore Normal file
View File

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

13
.prettierrc.json Normal file
View File

@@ -0,0 +1,13 @@
{
"printWidth": 120,
"semi": true,
"singleQuote": false,
"useTabs": false,
"trailingComma": "es5",
"arrowParens": "avoid",
"bracketSpacing": true,
"proseWrap": "preserve",
"endOfLine": "auto",
"jsxSingleQuote": false,
"htmlWhitespaceSensitivity": "ignore"
}

5
.stylelintignore Normal file
View File

@@ -0,0 +1,5 @@
/dist/*
/html/*
/public/*
public/*
/dist*

69
.stylelintrc.js Normal file
View File

@@ -0,0 +1,69 @@
export default {
root: true,
customSyntax: "postcss-html",
extends: [
"stylelint-config-standard", // 配置 stylelint拓展插件
"stylelint-config-html/vue", // 配置 vue 中 template 样式格式化
"stylelint-config-standard-scss", // 配置 stylelint scss 插件
"stylelint-config-recommended-scss",
"stylelint-config-recommended-vue/scss", // 配置 vue 中 scss 样式格式化
"stylelint-config-recess-order", // 配置 stylelint css属性书写顺序插件
],
/**
* 值规则
*
* 1. null关闭该规则
* 2. [xx, { ignoreXx: [] }],指定 xx 规则,但是忽略正则匹配的值
* 3. [xx, { ignoreXx: {key: value} }],指定 xx 规则,但是忽略某个属性的某个 value支持正则
*/
rules: {
"no-empty-source": null, // 允许空样式
"function-url-quotes": "always", // 要求或禁止 URL 的引号always(必须加上引号) | never(没有引号)
"color-hex-length": "long", // 指定 16 进制颜色的简写或扩写, short(16进制简写) | long(16进制扩写)
"custom-property-pattern": null, // 自定义属性命名规则
"selector-class-pattern": null, // 强制选择器类名的格式
"no-descending-specificity": null, // 允许无降序特异性
"keyframes-name-pattern": null, // 动画帧节点样式命名规则
"function-name-case": null, // 指定函数名称的小写或大写
"nesting-selector-no-missing-scoping-root": null, // 去除嵌套选择器无缺失范围根报错
"block-no-redundant-nested-style-rules": null, // 去除不允许在块内嵌套冗余的样式规则
// 要求或不允许 at 规则前有空行
"at-rule-empty-line-before": [
"always",
{ ignore: ["after-comment", "first-nested"], ignoreAtRules: ["forward", "use", "else", "include"] },
],
"value-keyword-case": ["lower", { ignoreFunctions: ["/v-bind$$(.*?$$)/"] }], // 指定关键字值的小写或大写
"media-feature-range-notation": "prefix", // 指定媒体功能范围的上下文或前缀表示法
"selector-pseudo-class-no-unknown": [true, { ignorePseudoClasses: ["global", "export", "deep"] }],
"import-notation": "string", // 为 @import 规则指定字符串或 URL 表示法
"unit-no-unknown": [true, { ignoreUnits: ["rpx"] }], // 禁止未知单位
// 不允许声明中的属性值未知
"declaration-property-value-no-unknown": [
true,
{ ignoreProperties: { "/.+/": "/v-bind|cssVar|cssVarName|cssVarWithDefault/" } },
],
"function-no-unknown": null, // 忽略未知函数的错误
"scss/at-function-pattern": null, // scss 的 @function 命名允许大写
},
ignoreFiles: [
"**/*.js",
"**/*.jsx",
"**/*.tsx",
"**/*.ts",
"**/*.json",
"**/styles/*.css",
"**/*.module.scss",
"**/assets/**/*.*",
],
overrides: [
// 扫描 .vue/html 文件中的 <style> 标签内的样式
{
files: ["**/*.{vue,html}"],
customSyntax: "postcss-html",
},
{
files: ["**/*.{css,scss}"],
customSyntax: "postcss-scss",
},
],
};

59
.versionrc Normal file
View File

@@ -0,0 +1,59 @@
{
"types": [
{
"type": "feat",
"section": "Features",
"hidden": false
},
{
"type": "fix",
"section": "Bug Fixes",
"hidden": false
},
{
"type": "docs",
"section": "Docs",
"hidden": false
},
{
"type": "style",
"section": "Styling",
"hidden": false
},
{
"type": "refactor",
"section": "Code Refactoring",
"hidden": false
},
{
"type": "perf",
"section": "Performance Improvements",
"hidden": false
},
{
"type": "test",
"section": "Tests",
"hidden": false
},
{
"type": "build",
"section": "Build System",
"hidden": false
},
{
"type": "ci",
"section": "CI",
"hidden": false
},
{
"type": "chore",
"section": "Others",
"hidden": false
},
{
"type": "revert",
"section": "Reverts",
"hidden": false
}
]
}

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

@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar", "stylelint.vscode-stylelint", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
}

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

@@ -0,0 +1,65 @@
{
"editor.formatOnSave": true,
"stylelint.enable": true,
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": "explicit"
},
"editor.tabSize": 2,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass", "html"],
"files.eol": "\n",
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"cSpell.words": [
"nprogress",
"Pinia",
"unplugin",
"unref",
"vite",
"vueuse",
"echarts",
"persistedstate",
"sortablejs",
"cssnano",
"cloc",
"antd",
"auths",
"commitlint",
"stylelint",
"iconfont",
"Iconify",
"xlink",
"cascader",
"popconfirm",
"teek",
"teeker",
"axios"
]
}

145
CHANGELOG.md Normal file
View File

@@ -0,0 +1,145 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [2.0.0](https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.0.3...v2.0.0) (2025-08-05)
### Features
- **layout:** 添加页面加载动画功能 ([79daf41](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/79daf41391604cc22206d2c51d06a805f77291ad))
- **menu:** 新增菜单风格设置并调整菜单主题 ([b25d54f](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/b25d54f7a2b48830492264f2c607997a0fefe06f))
- **router:** 增加菜单可见但无权限时的处理逻辑 ([415053e](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/415053e032a667ef1a43952da3a39fed5372ae31))
### Bug Fixes
- 🐞 删除不需要的 2 个依赖 ([c3d732d](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/c3d732d64c71d518bee0e4355fffcafed9021ab2))
- 🐞 修复依赖缺失问题 ([7bd9251](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/7bd92510f3150d63c4e94713a7254e66e0585b55))
- 删除不需要的静态资源,修复 loading 快速消失问题 ([46cc33f](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/46cc33fdac38bad8a9642ffce7cb37ae30377ee4))
### Performance Improvements
- **theme:** 移除生成浅色系颜色的代码 ([8124c66](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/8124c6605f1050b2522b72efd31b7f6a817424d5))
### Code Refactoring
- **styles:** 将 admin-namespace 重命名为 teek-namespace ([401f515](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/401f515405f18f5451b40cebf8bd4353b044c599))
- **theme:** 优化暗黑主题命名和描述 ([f8032d9](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/f8032d968dcb27a586fc94f9472b90c153840398))
- **theme:** 重构主题配置和样式 ([834d93d](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/834d93d4e55a527be9922b58fa390d9035b50af6))
### Build System
- 移除 pnpm 配置项 ([8a953ba](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/8a953baad18545b5fcd3f625cc282bc6ee7e932b))
### Styling
- **color:** 优化颜色处理函数并统一信息色值 ([8b6fdd9](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/8b6fdd98ab19e5ec2288891b878c176f018ec8d8))
- **element-plus:** 调整按钮和列表项的背景颜色 ([35c58d7](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/35c58d7d309caa0067ddf616ae219977573186bb))
### Others
- 更新网站图标和日志 ([f0aeb8e](https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/f0aeb8ed92d4a81de27c94d3a025f312acbee81f))
### [1.1.1](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.1.0...v1.1.1) (2024-12-26)
### Features
- 🚀 经典标签页的左右箭头去掉边框 ([015182d](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/015182ddfed1dcc7be048d8f415effb37d1ddc81))
- 🚀 添加 @eslint/js 依赖 ([0445483](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/0445483be6e561adebcba0aec20bbc02f914b372))
- 🚀 新增 taildwindcss 功能 ([a87b152](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/a87b1522e81de93c3d249e91e9963b2ea0a7779d))
### Bug Fixes
- 🐞 解决 TailWindcss 和 EP 样式冲突 ([a49c7ba](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/a49c7ba234a9a4446cf90e37767d364aef1a142c))
## [1.1.0](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.0.3...v1.1.0) (2024-12-26)
### Features
- 🚀 使用 mittBus 添加页面刷新功能 ([e80d1bb](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/e80d1bb475121f35cf314440d6fb38b5de24d4e7))
- 🚀 新增主题色 ([0c0de39](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/0c0de39b5820657f611cdf289bc3b2d48ea751a5))
- 🚀 依赖升级Eslint 升级 9.17sass 升级 1.83.0。修改文件兼容每个新版依赖 ([8141ee3](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/8141ee370b8e14b4c6fabb36f02a7ce7a9735d4b))
### Bug Fixes
- 🐞 路由重置函数优化。添加 403、404、500 路由。路由加载函数优化 ([5433a0a](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/5433a0aa8d6b60ffcb2fba36149ff9a7ef63d242))
- 🐞 子路由 hideInMenun 全为 false 时报错问题修复 ([f24cdb7](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/f24cdb711074b7701425e88cd3afa0e2cc8565a8))
### Styling
- 🎨 添加注释 ([7bf3760](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/7bf37606d8648f5c0599843b335d85ab78c7bf2d))
### [1.0.3](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.0.2...v1.0.3) (2024-06-20)
### Features
- 🚀 新增 removeBatchTab 函数,优化路由初始化判断,路由配置支持菜单 render ([fa95a91](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/fa95a911d6e7d8ee7bd035cd3117838b5ecb0558))
### Styling
- 🎨 登录逻辑移到 router beforeEach 里 ([0f5584b](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/0f5584b1e3e8385e85baad6326f7be5543e041cd))
- 🎨 主题色悬停 class 重命名 ([875ad51](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/875ad519ec44a35ee867cc6fb17878d0a352ec96))
### [1.0.2](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.0.1...v1.0.2) (2024-06-15)
### Styling
- 🎨 样式优化 ([d867bb1](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/d867bb1e381ec2ca204c01f8f1c92a774282fa7a))
### [1.0.1](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/compare/v1.0.0...v1.0.1) (2024-06-15)
### Bug Fixes
- 🐞 优化部分问题 ([b5f23b6](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/b5f23b6567d3cd3ae7fb2459baa2e0ffae275837))
## 1.0.0 (2024-06-15)
### Features
- 🚀 分页优化 ([7483aac](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/7483aacd2a28c3190ed6d712231c92919ccdc293))
- 🚀 基于 kbt-vue3-admin 提取的纯净版,只有项目搭建的必备文件 ([985201b](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/985201b72807343b1b1ea3d2c54f1bd0871d0046))
- 🚀 基于 kbt-vue3-admin 提取的纯净版,只有项目搭建的必备文件 ([cfb55c3](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/cfb55c301b74b7738269b0fd6b2edcc1f634068d))
- 🚀 基于 kbt-vue3-admin 提取的纯净版,只有项目搭建的必备文件 ([3829072](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/38290726aad4bd3add3d0fc5ddf8a057e3140b8c))
- 🚀 加版本缓存功能、修复布局样式 ([a140119](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/a140119caa11aa699afeb4ba6c7843d6f5b8d802))
- 🚀 解决历史模式的 base_url 出现空格问题 ([853765f](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/853765f47cffb23fa3a2a7d3583a9b06d36c3c34))
- 🚀 升级 stylelint 版本 ([08c0219](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/08c02195169ab632161d23d2bedb80779d46d163))
- 🚀 升级 stylelint 版本 ([0506029](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/0506029138037da93e205e83256cf243300b6b72))
- 🚀 升级各个依赖版本 ([dea9f5a](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/dea9f5ad2077a8d43ded5b0b4a3c86e3269b2355))
- 🚀 添加 Icon 组件、手动引入 Icon 功能 ([dc4c9ca](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/dc4c9ca6f7a7462893187c0572c06013490f0951))
- 🚀 添加 iframe 缓存 ([65fcebb](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/65fcebbcedeba0c4afaa9392d61895e69a975608))
- 🚀 添加 main-content 样式 ([382bb09](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/382bb0919407eaadac84e1f2d932bfb6b90a9219))
- 🚀 添加 request 枚举类相关使用,添加部分状态码的处理 ([aafe7d5](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/aafe7d59ed4f9b3d038de35e8cc1014238120b40))
- 🚀 添加文档说明 ([409ab4c](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/409ab4ceaa4f20530298f758c70ddf1fa38e164f))
- 🚀 新增 Axios 避免重复请求功能,添加通过 name 查找路由功能 ([543ef66](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/543ef66d2eefc8159b3f4b528461ee9b134bd014))
- 🚀 新增 iframe 新窗口打开功能、支持 iframe 通信自动跳转路由 ([ca900bf](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/ca900bf307dc54a02a1f4f4562fbc8da7f76d55e))
- 🚀 新增 VITE_ROUTER_MODE 环境变量,支持 hash 和 h5 历史模式,修复 request 的 mappingUrl ([578ff37](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/578ff37e5df4618cc64531c72c2f3410f928cf15))
- 🚀 修复 Icon 组件 ([5827b19](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/5827b1993e69d84aeba04b295edf8e05f33e54d9))
- 🚀 修复 iframe 样式 ([c911344](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/c9113445fd7d50cfcf1fa8db84a250edf1b8ba6a))
- 🚀 修复 tsconfig 文件报红 ([999a994](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/999a9944ea922681419d92abc784c5f7f62d8753))
- 🚀 修复不开启错误日志捕获导致错误无法输出控制台问题,修改文件名,符合命名规范 ([dff7bfa](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/dff7bfa265a872b607ad95fe418503fd7bdbb4fc))
- 🚀 修复图标无法渲染问题 ([2c2208f](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/2c2208fe271d613d69e0a3a205444604c5a42616))
- 🚀 修复无法打包问题 ([cdf13d0](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/cdf13d081d700bd273a79a087d07300b3482ce14))
- 🚀 修复无法读取 SVG 图标 ([5531611](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/5531611e0a7f94200da2f0d4f8db035c14e918c0))
- 🚀 修复无法实时切换多语言问题 ([1af82cb](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/1af82cbd2e69bb6ec5f2f8b693b9f8830f182e73))
- 🚀 支持 URL 传参来渲染全屏页面 ([122ea0c](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/122ea0c4a84db39bb504c93bd0ba2096a28b15b3))
- 🚀 自定义头部高度、菜单宽度。修复样式。升级所有依赖最新版 ([b72c75d](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/b72c75dae2789b8100b209fae408f98f74683317))
- 🚀 template 依赖、框架、构建全面升级,发布 1.0.0 版本 ([c65374c](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/c65374c06c86b1f7ca521c2a723de6bb03a53562))
- 🚀 tootip 支持多行溢出request 解决无法登录问题 ([b1bad4d](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/b1bad4d1676cfbebede372dcfae9fbbd2d41de13))
- 🚀 Tootip 支持多行溢出request 解决无法登录问题 ([3405248](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/340524850dcda437f3a0edb6363484a0494e2914))
- 🚀 views 组件支持非根节点request 内容修改 ([154e517](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/154e517fe70341667911c4455071aa198963e965))
- 🚀 views 组件支持非根节点request 内容修改 ([b468677](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/b468677be361a3fc48aee34ba2e37cc3b873e68c))
- 🚀 views 组件支持非根节点request 内容修改 ([c5d881d](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/c5d881d7c5c2643839336758c2b91431bb65afed))
### Bug Fixes
- 🐞 解决无法登录问题 ([06f594c](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/06f594c6a8467917f0f4c283b4b83f87777f0beb))
- 🐞 去掉我的主页,错误路由添加类型 ([bddefc4](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/bddefc45b72a0a6319b565c635876dd3b499346b))
- 🐞 去掉我的主页,错误路由添加类型 ([7b15b5f](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/7b15b5ffd04678a2c904b2b9e2db1e52a875ae6a))
- 🐞 修复 iframe 标签无法刷新问题 ([f39a138](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/f39a1384a2a95888ec07bb1887a726958d3747d7))
- 🐞 修复标签页无法缓存、Mixins 布局三级路由以上无法渲染 ([701e3c2](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/701e3c242c90ee78e42116f8d2c0b08d57401b07))
- 🐞 修改 index.scss 注释格式 ([d4f5592](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/d4f5592f91fac2da8b17cc43441af93b9f16ce54))
- 🐞 tooltip 组件支持多行,优化部分 TS 提示 ([50d450c](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/50d450c3872da11a4e71bd793cc6474c0363c4da))
### Docs
- 📚 添加文档信息 ([207c6c6](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/207c6c62664ce469541c080620780c47e6085655))
- 📚 新增文档内容 ([f94e931](https://github.com/Kele-Bingtang/https://github.com/Kele-Bingtang/teek-design-vue3-template/commit/f94e931b3bce5bbde1dc76df9a2c774f60ef7418))

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Brian Liu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

45
README.md Normal file
View File

@@ -0,0 +1,45 @@
# Teek Design Vue3
Teek 是一个基于 [Vue3](https://github.com/vuejs/core)、[TypeScript](https://www.typescriptlang.org/)、[Vite](https://github.com/vitejs/vite)、[ElementPlus](https://element-plus.org/zh-CN) 构建的颜值强大、功能丰富、开箱即用的中后台管理系统解决方案。
这是精简版,只包含项目最基础的框架。完整版请看 [Teek Design Vue3](https://github.com/Kele-Bingtang/teek-design-vue3)。
## 使用文档
[使用文档](https://vue3-design-docs.teek.top/)
## 效果在线预览
[Teek Design Vue3](https://vue3-design.teek.top/)
## 本地开发
安装依赖
```sh
pnpm install
```
编译运行
```sh
pnpm dev
```
项目启动后自动打开浏览器,地址为:`http://localhost:8099/`
## 项目打包
打包运行(测试环境使用)
```sh
pnpm build:test
```
打包运行(生产环境使用)
```sh
pnpm build
# or
pnpm build:prod
```

90
commitlint.config.js Normal file
View File

@@ -0,0 +1,90 @@
// docshttps://cz-git.qbb.sh/zh
import { defineConfig } from "cz-git";
export default defineConfig({
ignores: [commit => commit.includes("init")],
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2,
"always",
["feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "revert", "chore"],
],
},
prompt: {
messages: {
type: "选择你要提交的类型: ",
scope: "选择一个提交范围(可选): ",
customScope: "请输入自定义的提交范围: ",
subject: "填写简短精炼的变更描述:\n",
body: '填写更加详细的变更描述(可选)。使用 "|" 换行:\n',
breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行:\n',
footerPrefixesSelect: "选择关联 Issue 前缀(可选): ",
customFooterPrefix: "输入自定义 Issue 前缀: ",
footer: "列举关联 Issue (可选) 例如: #31, #I3244:\n",
confirmCommit: "是否提交或修改 commit ?",
},
types: [
{ value: "feat", name: "feat: 🚀 新增功能 | A new feature", emoji: "🚀" },
{ value: "fix", name: "fix: 🐞 修复缺陷 | A bug fix", emoji: "🐞" },
{ value: "docs", name: "docs: 📚 文档更新 | Documentation only changes", emoji: "📚" },
{
value: "style",
name: "style: 🎨 代码格式 | Changes that do not affect the meaning of the code",
emoji: "🎨",
},
{
value: "refactor",
name: "refactor: ♻️ 代码重构 | A code change that neither fixes a bug nor adds a feature",
emoji: "♻️",
},
{ value: "perf", name: "perf: ⚡️ 性能优化 | A code change that improves performance", emoji: "⚡️" },
{
value: "test",
name: "test: ✅ 测试相关 | Adding missing tests or correcting existing tests",
emoji: "✅",
},
{
value: "build",
name: "build: 📦️ 构建相关 | Changes that affect the build system or external dependencies",
emoji: "📦️",
},
{ value: "ci", name: "ci: 🎡 持续集成 | Changes to our CI configuration files and scripts", emoji: "🎡" },
{ value: "revert", name: "revert: ⏪️ 回退代码 | Revert to a commit", emoji: "⏪️" },
{
value: "chore",
name: "chore: 🔨 其他修改 | Other changes that do not modify src or test files",
emoji: "🔨",
},
],
useEmoji: true,
emojiAlign: "center",
themeColorCode: "",
useAI: false,
aiNumber: 1,
scopes: [],
allowCustomScopes: true,
allowEmptyScopes: true,
customScopesAlign: "bottom",
customScopesAlias: "custom",
emptyScopesAlias: "empty",
upperCaseSubject: false,
markBreakingChangeMode: false,
allowBreakingChanges: ["feat", "fix"],
breaklineNumber: 100,
breaklineChar: "|",
skipQuestions: [],
issuePrefixes: [{ value: "closed", name: "closed: ISSUES has been processed" }],
customIssuePrefixAlign: "top",
emptyIssuePrefixAlias: "skip",
customIssuePrefixAlias: "custom",
allowCustomIssuePrefix: true,
allowEmptyIssuePrefix: true,
confirmColorize: true,
scopeOverrides: undefined,
defaultBody: "",
defaultIssues: "",
defaultScope: "",
defaultSubject: "",
},
});

165
eslint.config.js Normal file
View File

@@ -0,0 +1,165 @@
import { defineConfig } from "eslint/config";
import eslint from "@eslint/js";
import globals from "globals";
import pluginVue from "eslint-plugin-vue";
import configPrettier from "eslint-config-prettier";
import pluginPrettier from "eslint-plugin-prettier";
import pluginTypeScript from "@typescript-eslint/eslint-plugin";
import * as parserVue from "vue-eslint-parser";
import * as parserTypeScript from "@typescript-eslint/parser";
import projectGlobals from "./.eslintrc-globals.js";
export default defineConfig([
eslint.configs.recommended,
{ ignores: ["**/.*", "**/dist/*", "*.d.ts", "public", "**/assets/*"] }, // 忽略文件配置单独放在一个对象,否则不生效
{
languageOptions: {
globals: {
...globals.browser,
...globals.es6,
...globals.node,
...projectGlobals,
},
},
plugins: {
prettier: pluginPrettier,
},
// 不指定 files则默认是所有文件生效
rules: {
...configPrettier.rules,
...pluginPrettier.configs.recommended.rules,
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", // 禁用 debugger
"no-unused-vars": [process.env.NODE_ENV === "production" ? "warn" : "warn", { vars: "all", args: "none" }], // 禁止出现未使用的变量,函数和函数的参数
"no-undef": process.env.NODE_ENV === "production" ? "warn" : "warn", // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
"no-console": "off", // 禁用 console
"accessor-pairs": "error", // 强制 getter 和 setter 在对象中成对出现
eqeqeq: ["error", "always", { null: "ignore" }], // 要求使用 === 和 !==
"no-class-assign": "error", // 禁止修改类声明的变量
"no-cond-assign": "error", // 禁止条件表达式中出现赋值操作符
"no-const-assign": "error", // 禁止修改 const 声明的变量
"no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
"no-empty-pattern": "error", // 禁止使用空解构模式
"no-extra-boolean-cast": "error", // 禁止不必要的布尔转换
"no-func-assign": "error", // 禁止对 function 声明重新赋值
"no-irregular-whitespace": "error", // 禁止不规则的空白
"no-label-var": "error", // 不允许标签与变量同名
"no-labels": ["error", { allowLoop: false, allowSwitch: false }], // 禁用标签语句
"no-lone-blocks": "error", // 禁用不必要的嵌套块
"no-multi-str": "error", // 禁止多行字符串
"no-global-assign": "error", // 不允许修改只读全局变量
"no-new-native-nonconstructor": "error", // 禁止 new Symbol、new Array、new Map 等
"no-new-wrappers": "error", // 禁止对 StringNumber 和 Boolean 使用 new 操作符
"no-obj-calls": "error", // 禁止把全局对象作为函数调用
"no-redeclare": "error", // 禁止多次声明同一变量
"no-return-assign": ["error", "except-parens"], // 禁止在 return 语句中使用赋值语句
"no-self-assign": "error", // 禁止自我赋值
"no-self-compare": "error", // 禁止自身比较
"no-sequences": "error", // 禁用逗号操作符
"func-call-spacing": "error", // 要求或禁止在函数标识符和其调用之间有空格
"no-undef-init": "error", // 禁止将变量初始化为 undefined
"no-unmodified-loop-condition": "error", // 该规则查找循环条件内的引用,然后检查这些引用的变量是否在循环中被修改
"no-unneeded-ternary": ["error", { defaultAssignment: false }], // 当存在更简单的选择时,此规则不允许三元运算符
"no-unreachable": "error", // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
"no-unreachable-loop": "error", // 禁止循环体允许一次迭代的循环
"prefer-const": "error", // 要求使用 const 声明那些声明后不再被修改的变量
"no-useless-escape": "off", // 取消不必要的转义字符
},
},
{
files: ["**/*.vue"],
languageOptions: {
parser: parserVue,
parserOptions: {
parser: "@typescript-eslint/parser",
ecmaVersion: "latest",
ecmaFeatures: {
jsx: true,
},
extraFileExtensions: [".vue"],
sourceType: "module",
},
},
plugins: {
vue: pluginVue,
},
processor: pluginVue.processors[".vue"],
rules: {
...pluginVue.configs.base.rules,
...pluginVue.configs["essential"].rules,
...pluginVue.configs["recommended"].rules,
// vue (https://eslint.vuejs.org/rules)
"vue/v-slot-style": "error", // 强制执行 v-slot 指令样式
"vue/no-mutating-props": "off", // 不允许组件 prop 的改变
"vue/custom-event-name-casing": "off", // 为自定义事件名称强制使用特定大小写
"vue/attributes-order": "off", // vue api 使用顺序,强制执行属性顺序
"vue/one-component-per-file": "off", // 强制每个组件都应该在自己的文件中
"vue/html-closing-bracket-newline": "off", // 在标签的右括号之前要求或禁止换行
"vue/max-attributes-per-line": "off", // 强制每行的最大属性数
"vue/attribute-hyphenation": "off", // 对模板中的自定义组件强制执行属性命名样式
"vue/require-default-prop": "off", // 此规则要求为每个 prop 为必填时,必须提供默认值
"vue/multi-word-component-names": "off", // 要求组件名称始终为 “-” 链接的单词
"vue/valid-template-root": "off",
"vue/singleline-html-element-content-newline": "off", // 在单行元素的内容之前和之后需要换行符
"vue/multiline-html-element-content-newline": "off", // 在多行元素的内容之前和之后需要换行符
"vue/no-v-html": "off", // 禁止使用 v-html 来防止 XSS 攻击
},
},
{
files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
languageOptions: {
// 使用了 @typescript-eslint/parser 解析器,下面 parserOptions 是该解析器的配置信息官网参考https://typescript.eslint.org.cn/packages/parser/#jsxpragma
parser: parserTypeScript,
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
warnOnUnsupportedTypeScriptVersion: false,
},
},
plugins: {
"@typescript-eslint": pluginTypeScript,
},
rules: {
...pluginTypeScript.configs.strict.rules,
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/no-redeclare": "error",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/prefer-as-const": "warn",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unused-expressions": "off",
"@typescript-eslint/no-unsafe-function-type": "off",
"@typescript-eslint/no-import-type-side-effects": "error",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-wrapper-object-types": "off",
"@typescript-eslint/no-namespace": "off",
"@typescript-eslint/consistent-type-imports": [
"off",
{ disallowTypeAnnotations: false, fixStyle: "inline-type-imports" },
],
"@typescript-eslint/prefer-literal-enum-member": ["error", { allowBitwiseExpressions: true }],
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
},
],
"@typescript-eslint/no-dynamic-delete": "off",
},
},
{
files: ["**/*.d.ts"],
rules: {
"import/no-duplicates": "off",
},
},
{
files: ["**/*.?([cm])js"],
rules: {
"@typescript-eslint/no-require-imports": "off",
"@typescript-eslint/no-var-requires": "off",
},
},
]);

18
index.html Normal file
View File

@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Teek Design Vue3</title>
</head>
<body>
<div id="app"></div>
<script type="module">
// 注入环境变量到全局变量中
window.__TEEK_ENV__ = import.meta.env ?? {};
</script>
<script type="module" src="/envConfig.js"></script>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

61
node/compress.ts Normal file
View File

@@ -0,0 +1,61 @@
import type { Plugin } from "vite";
import compressPlugin from "vite-plugin-compression";
/**
* 打包压缩格式的类型声明
*/
export type ViteCompression = "none" | "gzip" | "brotli" | "both" | "gzip-clear" | "brotli-clear" | "both-clear";
export const configCompressPlugin = (compress: ViteCompression): Plugin | Plugin[] => {
if (!compress || compress === "none") return [];
const gz = {
// 生成的压缩包后缀
ext: ".gz",
// 体积大于 threshold 才会被压缩
threshold: 0,
// 默认压缩 .js|mjs|json|css|html 后缀文件,设置成 true压缩全部文件
filter: () => true,
// 压缩后是否删除原始文件
deleteOriginFile: false,
};
const br = {
ext: ".br",
algorithm: "brotliCompress",
threshold: 0,
filter: () => true,
deleteOriginFile: false,
};
const codeList = [
{ k: "gzip", v: gz },
{ k: "brotli", v: br },
{ k: "both", v: [gz, br] },
];
const plugins: Plugin[] = [];
codeList.forEach((item: any) => {
if (compress.includes(item.k)) {
if (compress.includes("clear")) {
if (Array.isArray(item.v)) {
item.v.forEach((vItem: any) => {
plugins.push(compressPlugin(Object.assign(vItem, { deleteOriginFile: true })));
});
} else {
plugins.push(compressPlugin(Object.assign(item.v, { deleteOriginFile: true })));
}
} else {
if (Array.isArray(item.v)) {
item.v.forEach((vItem: any) => {
plugins.push(compressPlugin(vItem));
});
} else {
plugins.push(compressPlugin(item.v));
}
}
}
});
return plugins;
};

72
node/getEnv.ts Normal file
View File

@@ -0,0 +1,72 @@
import fs from "fs";
import path from "path";
import dotenv from "dotenv";
export type Recordable<T = any> = Record<string, T>;
export function isDevFn(mode: string): boolean {
return mode === "development";
}
export function isProdFn(mode: string): boolean {
return mode === "production";
}
/**
* 是否开启生成 package 报告
*/
export function isReportMode(): boolean {
return process.env.VITE_REPORT === "true";
}
/**
* 重新解析 .env 的内容,重新封装类型,比如 .env 定义了 truefalse默认为字符串类型需要转换为 boolean 类型
*/
export function wrapperEnv(envConf: Recordable): ImportMetaEnv {
const ret: any = {};
for (const envName of Object.keys(envConf)) {
let realName = envConf[envName].replace(/\\n/g, "\n");
// 将 true 和 false 字符串转换为布尔值
realName = realName === "true" ? true : realName === "false" ? false : realName;
// 指定变量名进行类型转换
if (envName === "VITE_PORT") realName = Number(realName);
ret[envName] = realName;
process.env[envName] = realName;
}
return ret;
}
/**
* 从环境变量文件里获取变量值
*
* @param match 前缀
* @param confFiles 文件列表
*/
export function getEnvConfig(match = "VITE_", confFiles = [".env", ".env.production", ".env.sit", ".env.uat"]) {
let envConfig = {};
confFiles.forEach(item => {
try {
const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
envConfig = { ...envConfig, ...env };
} catch (error) {
console.error(`Error in parsing ${item}`, error);
}
});
Object.keys(envConfig).forEach(key => {
const reg = new RegExp(`^(${match})`);
if (!reg.test(key)) {
Reflect.deleteProperty(envConfig, key);
}
});
return envConfig;
}
/**
* 获取项目根路径
*/
export function getRootPath(...dir: string[]) {
return path.resolve(process.cwd(), ...dir);
}

23
node/optimize.ts Normal file
View File

@@ -0,0 +1,23 @@
/**
* 此文件作用于 `vite.config.ts` 的 `optimizeDeps.include` 依赖预构建配置项
* 依赖预构建,`vite` 启动时会将下面 include 里的模块,编译成 esm 格式并缓存到 node_modules/.vite 文件夹,页面加载到对应模块时如果浏览器有缓存就读取浏览器缓存,如果没有会读取本地缓存并按需加载
* 尤其当您禁用浏览器缓存时(这种情况只应该发生在调试阶段)必须将对应模块加入到 include里否则会遇到开发环境切换页面卡顿的问题vite 会认为它是一个新的依赖包会重新加载并强制刷新页面),因为它既无法使用浏览器缓存,又没有在本地 node_modules/.vite 里缓存
* 温馨提示:如果您使用的第三方库是全局引入,也就是引入到 src/main.ts 文件里,就不需要再添加到 include 里了,因为 vite 会自动将它们缓存到 node_modules/.vite
*/
const include = [
"qs",
"mitt",
"axios",
"pinia",
"vue-i18n",
"sortablejs",
"@vueuse/core",
"pinia-plugin-persistedstate",
];
/**
* 在预构建中强制排除的依赖项
*/
const exclude = ["@iconify-icons/ant-design"];
export { include, exclude };

76
node/plugins.ts Normal file
View File

@@ -0,0 +1,76 @@
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import { resolve } from "path";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import { createStyleImportPlugin, ElementPlusResolve } from "vite-plugin-style-import";
import eslintPlugin from "vite-plugin-eslint";
import progress from "vite-plugin-progress";
import ServerUrlCopy from "vite-plugin-url-copy";
import vueDevTools from "vite-plugin-vue-devtools";
import { visualizer } from "rollup-plugin-visualizer";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { configCompressPlugin } from "./compress";
export function getPluginsList(command: string, viteEnv: ImportMetaEnv) {
const lifecycle = process.env.npm_lifecycle_event;
return [
vue(),
vueJsx(),
viteEnv.VITE_DEVTOOLS && vueDevTools(),
eslintPlugin({ cache: false }), // EsLint 报错信息显示在浏览器界面上
ServerUrlCopy({
qrcode: {
disabled: true, // 是否生成二维码
},
}),
progress(),
!viteEnv.VITE_LOAD_ALL_EP_STYLE
? createStyleImportPlugin({
resolves: [ElementPlusResolve()],
libs: [
{
libraryName: "element-plus",
esModule: true,
resolveStyle: name => {
if (!name.startsWith("el-")) return "";
return `element-plus/theme-chalk/src/${name.replace(/^el-/, "")}.scss`;
},
},
],
})
: undefined,
AutoImport({
imports: ["vue", "vue-router", "pinia"], // 自动引入 vue 的 ref、toRefs、onMounted 等,无需在页面中再次引入
dts: "src/types/auto-import.d.ts", // 生成在 src 路径下名为 auto-import.d.ts 的声明文件
eslintrc: {
enabled: false, // 改为 true 用于生成 eslint 配置。生成后改回 false避免重复生成消耗
},
resolvers: !viteEnv.VITE_LOAD_ALL_EP_COMPONENTS ? [ElementPlusResolver()] : [],
}),
!viteEnv.VITE_LOAD_ALL_EP_COMPONENTS
? Components({
resolvers: [ElementPlusResolver({ importStyle: "sass" })],
dirs: "src/components", // 自定引入需要扫描的组件路径
dts: "src/types/auto-components.d.ts", // 生成在 src 路径下名为 auto-components.d.ts 的声明文件
directoryAsNamespace: true,
})
: undefined,
// 使用 svg 图标
createSvgIconsPlugin({
iconDirs: [resolve(process.cwd(), "src/common/assets/icons")],
symbolId: "icon-[dir]-[name]",
}),
viteEnv.VITE_BUILD_GZIP && configCompressPlugin(viteEnv.VITE_COMPRESSION),
// 打包分析
(lifecycle === "report" || viteEnv.VITE_REPORT) &&
visualizer({ open: true, brotliSize: true, filename: "report.html" }),
];
}

120
package.json Normal file
View File

@@ -0,0 +1,120 @@
{
"name": "teek-design-vue3-template",
"version": "2.0.0",
"private": true,
"description": "Teek Design Vue3 后台管理系统",
"author": "Teeker <2456019588@qq.com>",
"license": "MIT",
"type": "module",
"scripts": {
"dev": "vite --mode development",
"serve": "vite --mode development",
"build": "rimraf dist && vite build --mode production",
"build:prod": "rimraf dist && vite build --mode production",
"build:sit": "rimraf dist && vite build --mode sit",
"build:uat": "rimraf dist && vite build --mode uat",
"preview": "vite preview",
"build:preview": "pnpm build && vite preview",
"cloc": "NODE_OPTIONS=--max-old-space-size=4096 cloc . --exclude-dir=node_modules",
"clean:cache": "rm -rf node_modules && rm -rf .eslintcache && pnpm install",
"prepare": "husky install",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
"lint:stylelint": "stylelint \"**/*.{vue,css,scss,postcss,less}\" --fix",
"lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
"lint:eslint": "eslint --max-warnings 0 \"{src,mock,build}/**/*.{vue,js,ts,tsx}\" --fix",
"lint": "pnpm lint:eslint && pnpm lint:prettier && pnpm lint:stylelint",
"release": "standard-version",
"release-major": "standard-version --release-as major",
"release-minor": "standard-version --release-as minor",
"release-patch": "standard-version --release-as patch",
"release-as": "standard-version --release-as",
"release-prerelease": "standard-version --prerelease",
"cz": "git add . && git-cz",
"czp": "git add . && git-cz && git push"
},
"browserslist": [
"> 1%",
"not ie 11",
"not op_mini all"
],
"dependencies": {
"@element-plus/icons-vue": "^2.3.2",
"@icon-park/vue-next": "^1.4.2",
"@vueuse/core": "^13.7.0",
"axios": "^1.11.0",
"element-plus": "^2.10.7",
"mitt": "^3.0.1",
"nprogress": "^0.2.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
"qs": "^6.14.0",
"sortablejs": "^1.15.6",
"vue": "^3.5.18",
"vue-i18n": "^11.1.11",
"vue-router": "^4.5.1",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^19.8.1",
"@commitlint/config-conventional": "^19.8.1",
"@eslint/js": "^9.33.0",
"@iconify/vue": "^5.0.0",
"@types/node": "^24.3.0",
"@types/nprogress": "^0.2.3",
"@types/qs": "^6.14.0",
"@types/sortablejs": "^1.15.8",
"@typescript-eslint/eslint-plugin": "^8.40.0",
"@typescript-eslint/parser": "^8.40.0",
"@vitejs/plugin-vue": "^6.0.1",
"@vitejs/plugin-vue-jsx": "^5.0.1",
"autoprefixer": "^10.4.21",
"cloc": "^2.11.0",
"commitizen": "^4.3.1",
"cssnano": "^7.1.0",
"cz-git": "^1.12.0",
"dotenv": "^17.2.1",
"eslint": "^9.33.0",
"eslint-config-prettier": "^10.1.8",
"eslint-linter-browserify": "^9.31.0",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-vue": "^10.4.0",
"globals": "^16.3.0",
"husky": "^9.1.7",
"lint-staged": "^16.1.5",
"postcss": "^8.5.6",
"postcss-html": "^1.8.0",
"postcss-import": "^16.1.1",
"postcss-scss": "^4.0.9",
"prettier": "^3.6.2",
"rimraf": "^6.0.1",
"rollup-plugin-visualizer": "^6.0.3",
"sass": "^1.90.0",
"standard-version": "^9.5.0",
"stylelint": "^16.23.1",
"stylelint-config-html": "^1.1.0",
"stylelint-config-recess-order": "^7.2.0",
"stylelint-config-recommended-scss": "^16.0.0",
"stylelint-config-recommended-vue": "^1.6.1",
"stylelint-config-standard": "^39.0.0",
"stylelint-config-standard-scss": "^15.0.1",
"typescript": "~5.9.2",
"typescript-eslint": "^8.54.0",
"unplugin-auto-import": "^20.0.0",
"unplugin-vue-components": "^29.0.0",
"vite": "^7.1.3",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-progress": "^0.0.7",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-url-copy": "^1.1.4",
"vite-plugin-vue-devtools": "^8.0.0",
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.0.5"
},
"config": {
"commitizen": {
"path": "node_modules/cz-git"
}
}
}

10827
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

7
postcss.config.js Normal file
View File

@@ -0,0 +1,7 @@
export default {
plugins: {
"postcss-import": {},
autoprefixer: {},
...(process.env.NODE_ENV === "production" ? { cssnano: {} } : {}),
},
};

BIN
public/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

19
public/envConfig.js Normal file
View File

@@ -0,0 +1,19 @@
/**
* ! 该文件中 envConfig 的变量可以覆盖环境变量(.env里相同名称的变量
* ! 该文件不随打包进行编译,因此可以在线上环境直接修改该文件内容来覆盖环境变量,如域名
*
* 在项目里使用window.__TEEK_ENV__.xx 来获取环境变量,且 window.__TEEK_ENV__ 初始化为 {},因此不会 undefined 报错
*/
const envConfig = {
// VITE_API_URL: "", // 接口请求地址
// VITE_ROUTE_ACCESS_MODE: "", // 路由权限模式,可选 "frontend" | "backend" | "mixed" | "mixed-hide-frontend"
// VITE_FILE_ORIGIN_URL: "", // 图片、 附件域名前缀
// VITE_DPS_BACK_PATH: "", // DPS 后端接口前缀
// VITE_ROUTE_ACCESS_MODE: "backend", // 路由权限模式frontend backend | mixed
};
const teekEnv = window.__TEEK_ENV__ ?? {};
const filterEnvConfig = Object.fromEntries(Object.entries(envConfig).filter(([key, value]) => value));
window.__TEEK_ENV__ = Object.assign(teekEnv, filterEnvConfig);

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

53
src/App.vue Normal file
View File

@@ -0,0 +1,53 @@
<template>
<Loading />
<el-config-provider :namespace="ns.elNamespace" :locale="i18nLocale" :button="config" :size="layout.elementPlusSize">
<router-view v-slot="{ Component }">
<component :is="Component" />
</router-view>
</el-config-provider>
</template>
<script setup lang="ts" name="App">
import { reactive, computed, provide } from "vue";
import { storeToRefs } from "pinia";
import { ElConfigProvider } from "element-plus";
import zhCn from "element-plus/es/locale/lang/zh-cn";
import en from "element-plus/es/locale/lang/en";
import { LanguageEnum } from "@/common/enums";
import { GlobalConfigKey, serviceConfig } from "@/common/config";
import { isFunction } from "@/common/utils";
import { useNamespace, useWatchCssVar, useTheme } from "@/composables";
import { useSettingStore, useLayoutStore } from "@/pinia";
import { useIFrame } from "@/layout/components/iframe/use-iframe";
import Loading from "@/layout/components/loading/index.vue";
const ns = useNamespace();
const settingStore = useSettingStore();
const layoutStore = useLayoutStore();
const { layout } = storeToRefs(settingStore);
const { language } = storeToRefs(layoutStore);
// 自定义注入全局参数。ElConfigProvider 会自动使用 provide 全局注入它的 props 到项目里,可以通过 configProviderContextKey 来 inject 获取(先从 element-plus 引入,然后 const config = inject(configProviderContextKey)
provide(GlobalConfigKey, { size: computed(() => layout.value.elementPlusSize) });
// 初始化主题配置
useTheme().initTheme();
// 监听布局样式变量
useWatchCssVar();
// IFrame 通信
useIFrame(serviceConfig.layout.watchFrame);
// 配置 element 按钮文字中间是否有空格
const config = reactive({ autoInsertSpace: false });
// element 语言配置
const i18nLocale = computed(() => {
if (language.value === LanguageEnum.ZhCn) return zhCn;
if (language.value === LanguageEnum.EnUs) return en;
return document.documentElement.lang === "zh-CN" ? zhCn : en;
});
if (isFunction(log.success)) log.success(__APP_INFO__.pkg.version, "欢迎使用 Teek Design Vue3 系统");
</script>

21
src/common/api/menu.ts Normal file
View File

@@ -0,0 +1,21 @@
// import { http } from "@/common/http";
export interface BackstageMenuList {
imageIcon: string;
menuCode: string;
pagePath: string;
menuName: string;
menuUrl: string;
parentMenuCode: string;
seq: number;
children?: BackstageMenuList[];
}
export const getMenuList = () => {
// 模拟请求菜单
return Promise.resolve([] as BackstageMenuList[]);
// return http.request<httpNs.Response<BackstageMenuList[]>>({
// url: "/getMenuList",
// method: "get",
// });
};

39
src/common/api/user.ts Normal file
View File

@@ -0,0 +1,39 @@
import { get, post } from "@/common/http/request";
export interface LoginParams {
username: string;
password: string;
verifyCode?: string;
}
export interface Token {
accessToken: string;
refreshToken: string;
}
export const UserService = {
// 登录
login(params: LoginParams) {
const loginParams = new URLSearchParams();
loginParams.append("username", params.username);
loginParams.append("password", params.password);
return post("/auth/login", loginParams);
},
checkIsLogined() {
return get("/auth/user/me");
},
// 获取用户信息
getUserInfo() {
return get("/auth/getUserInfo");
},
getDynamicRouter() {
return get("/auth/getRouterConfigRawList");
},
logout() {
return post("/auth/logout");
},
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="80" viewBox="0 0 80 80" fill="none">
<g opacity="1" transform="translate(0 0) rotate(0)">
<path id="圆形 1" fill-rule="evenodd" style="fill:#D9E1FF" opacity="1" d="M40 0 C17.91 0 0 17.91 0 40C 0 62.09 17.91 80 40 80C62.09 80 80 62.09 80 40C80 17.91 62.09 0 40 0 Z"></path>
<g opacity="1" transform="translate(20 20) rotate(0)">
<mask id="bg-mask-0" fill="white">
<use transform="translate(0 0) rotate(0)" xlink:href="#path_0"></use>
</mask>
<g mask="url(#bg-mask-0)" >
<g opacity="1" transform="translate(0 -0.013671875) rotate(0)">
<path id="减去_14" fill-rule="evenodd" style="fill:#395AE3" opacity="0.75" d="M29.4072,35.31h-18.82c-1.29001,0.1 -2.56001,-0.33 -3.53001,-1.18c-0.85,-0.97 -1.27,-2.24 -1.18,-3.53v-25.88c-0.09,-1.29 0.33,-2.56 1.18,-3.53c0.97,-0.85 2.24,-1.27 3.53001,-1.18h18.82c1.29,-0.09 2.56,0.33 3.53,1.18c0.85,0.97 1.28,2.24 1.18,3.53v25.88c0.1,1.29 -0.33,2.56 -1.18,3.53c-0.97,0.85 -2.24,1.27 -3.53,1.18zM11.4672,13.25c-0.23,0.23 -0.34,0.56 -0.29,0.88c-0.05,0.32 0.06,0.65 0.29,0.88c0.23,0.23 0.56,0.34 0.88,0.3h9.42c0.32,0.04 0.65,-0.07 0.88,-0.3c0.23,-0.23 0.34,-0.56 0.29,-0.88c0.05,-0.32 -0.06,-0.65 -0.29,-0.88c-0.23,-0.23 -0.56,-0.34 -0.88,-0.3h-9.42c-0.32,-0.04 -0.65,0.07 -0.88,0.3zM11.4672,6.19c-0.23,0.23 -0.34,0.56 -0.29,0.88c-0.05,0.33 0.06,0.65 0.29,0.88c0.23,0.24 0.56,0.34 0.88,0.3h15.3c0.32,0.04 0.65,-0.06 0.88,-0.3c0.23,-0.23 0.34,-0.55 0.29,-0.88c0.05,-0.32 -0.06,-0.65 -0.29,-0.88c-0.23,-0.23 -0.56,-0.34 -0.88,-0.29h-15.3c-0.32,-0.05 -0.65,0.06 -0.88,0.29z"></path>
<path id="路径_5114" fill-rule="evenodd" style="fill:#395AE3" opacity="0.75" d="M40.01 35.2531L40.01 18.3531C40 16.7631 39.2 15.2831 37.87 14.4131C36.53 13.5431 34.85 13.4131 33.4 14.0531L21.9 19.1231C20.69 19.6631 19.31 19.6631 18.1 19.1231L6.6 14.0531C5.15 13.4131 3.47 13.5531 2.14 14.4231C0.81 15.2831 0 16.7631 0 18.3531L 0 35.2531C 0 37.8531 2.11 39.9631 4.71 39.9631L35.29 39.9631C37.9 39.9631 40.01 37.8531 40.01 35.2531Z"></path>
</g>
</g>
</g>
</g>
<defs>
<rect id="path_0" x="0" y="0" width="40" height="39.947" />
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="80" viewBox="0 0 80 80" fill="none">
<g opacity="1" transform="translate(0 0) rotate(0)">
<path id="圆形 1" fill-rule="evenodd" style="fill:#C6F5D8" opacity="1" d="M40 0 C17.91 0 0 17.91 0 40C 0 62.09 17.91 80 40 80C62.09 80 80 62.09 80 40C80 17.91 62.09 0 40 0 Z"></path>
<g opacity="1" transform="translate(20 17) rotate(0)">
<mask id="bg-mask-0" fill="white">
<use transform="translate(0 0) rotate(0)" xlink:href="#path_0"></use>
</mask>
<g mask="url(#bg-mask-0)" >
<g opacity="1" transform="translate(0 0.001007080078125) rotate(0)">
<path id="减去_15" fill-rule="evenodd" style="fill:#0BB449" opacity="0.8" d="M32.94,46.0891h-25.88c-3.9,0 -7.06,-3.16 -7.06,-7.05v-26.5c 0,-3.89999 3.16,-7.05999 7.06,-7.05999h25.88c3.9,0 7.06,3.16 7.06,7.05999v26.5c 0,3.89 -3.16,7.05 -7.06,7.05zM12.19,24.3291c-0.41,0.4 -0.63,0.96 -0.63,1.53c 0,0.58 0.22,1.13 0.63,1.54l4.24,4.23c0.41,0.41 0.96,0.64 1.54,0.64v 0 c0.56,0 1.09,-0.21 1.49,-0.6l8.27,-7.83c0.42,-0.39 0.66,-0.94 0.68,-1.51c0.01,-0.58 -0.2,-1.14 -0.6,-1.56c-0.41,-0.43 -0.98,-0.68 -1.58,-0.68c-0.55,0 -1.09,0.22 -1.49,0.6l-6.74,6.38l-2.74,-2.74c-0.4,-0.41 -0.96,-0.64 -1.53,-0.64c-0.58,0 -1.13,0.23 -1.54,0.64z"></path>
<path id="路径_5105" fill-rule="evenodd" style="fill:#0BB449" opacity="0.8" d="M30.3925 10.83C31.3825 9.84 31.9325 8.51 31.9325 7.11L31.9325 5.25C31.9325 2.35 29.5825 0 26.6825 0 L13.3125 0 C10.4125 0 8.0625 2.35 8.0625 5.25L8.0625 7.11C8.0625 10.01 10.4125 12.37 13.3125 12.37L26.6825 12.37C28.0725 12.37 29.4125 11.81 30.3925 10.83Z"></path>
</g>
</g>
</g>
</g>
<defs>
<rect id="path_0" x="0" y="0" width="40" height="46.093" />
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="80" viewBox="0 0 80 80" fill="none">
<g opacity="1" transform="translate(0 0) rotate(0)">
<path id="圆形 1" fill-rule="evenodd" style="fill:#FFECD2" opacity="1" d="M40 0 C17.91 0 0 17.91 0 40C 0 62.09 17.91 80 40 80C62.09 80 80 62.09 80 40C80 17.91 62.09 0 40 0 Z"></path>
<g opacity="1" transform="translate(20 17) rotate(0)">
<mask id="bg-mask-0" fill="white">
<use transform="translate(0 0) rotate(0)" xlink:href="#path_0"></use>
</mask>
<g mask="url(#bg-mask-0)" >
<g opacity="1" transform="translate(-0.0009765625 -0.0731353759765625) rotate(0)">
<path id="路径_5108" fill-rule="evenodd" style="fill:#FA9014" opacity="0.8" d="M36.45 34.46C36.13 34.13 35.95 33.69 35.95 33.23L35.95 20.2C35.95 13.2 31.37 7.01 24.67 4.95C24.67 4.89 24.68 4.82 24.68 4.75C24.71 3.06 23.82 1.49 22.36 0.64C20.9 -0.21 19.1 -0.21 17.64 0.64C16.18 1.49 15.29 3.06 15.32 4.75C15.32 4.82 15.33 4.88 15.33 4.95C8.63 7.01 4.05 13.2 4.05 20.2L4.05 33.24C4.05 34.19 3.28 34.97 2.32 34.97C1.12 34.95 0.11 35.87 0.01 37.07C-0.04 37.69 0.18 38.3 0.6 38.75C1.03 39.21 1.62 39.47 2.25 39.47L37.76 39.47C38.38 39.47 38.97 39.21 39.4 38.75C39.82 38.3 40.04 37.69 40 37.07C39.89 35.87 38.88 34.95 37.68 34.96C37.22 34.96 36.78 34.78 36.45 34.46Z"></path>
<path id="路径_5109" fill-rule="evenodd" style="fill:#FA9014" opacity="0.8" d="M17.5627 46.2222C20.2827 47.3522 23.4227 46.7322 25.5127 44.6422C27.6027 42.5522 28.2227 39.4122 27.0927 36.6922C25.9627 33.9622 23.3027 32.1822 20.3527 32.1822C16.3227 32.1822 13.0527 35.4522 13.0527 39.4822C13.0527 42.4322 14.8327 45.0922 17.5627 46.2222Z"></path>
<path id="路径_5110" fill-rule="evenodd" style="fill:#FF7 C 0 E" opacity="1" d="M20.3496 32.2486C16.3596 32.2486 13.1096 35.4586 13.0596 39.4586L27.6496 39.4586C27.5996 35.4586 24.3496 32.2486 20.3496 32.2486Z"></path>
</g>
</g>
</g>
</g>
<defs>
<rect id="path_0" x="0" y="0" width="40" height="46.704" />
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,4 @@
<svg t="1665417220563" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6370" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<path d="M940 512H792V412c76.8 0 139-62.2 139-139 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 34.8-28.2 63-63 63H232c-34.8 0-63-28.2-63-63 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 76.8 62.2 139 139 139v100H84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h148v96c0 6.5 0.2 13 0.7 19.3C164.1 728.6 116 796.7 116 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-44.2 23.9-82.9 59.6-103.7 6 17.2 13.6 33.6 22.7 49 24.3 41.5 59 76.2 100.5 100.5 28.9 16.9 61 28.8 95.3 34.5 4.4 0 8-3.6 8-8V484c0-4.4 3.6-8 8-8h60c4.4 0 8 3.6 8 8v464.2c0 4.4 3.6 8 8 8 34.3-5.7 66.4-17.6 95.3-34.5 41.5-24.3 76.2-59 100.5-100.5 9.1-15.5 16.7-31.9 22.7-49C812.1 793.1 836 831.8 836 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-79.3-48.1-147.4-116.7-176.7 0.4-6.4 0.7-12.8 0.7-19.3v-96h148c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z" p-id="6371"></path>
<path d="M304 280h416c4.4 0 8-3.6 8-8 0-40-8.8-76.7-25.9-108.1-17.2-31.5-42.5-56.8-74-74C596.7 72.8 560 64 520 64h-16c-40 0-76.7 8.8-108.1 25.9-31.5 17.2-56.8 42.5-74 74C304.8 195.3 296 232 296 272c0 4.4 3.6 8 8 8z" p-id="6372"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,3 @@
<svg t="1748623362447" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7385" width="200" height="200">
<path d="M736 896c-88.224 0-160-71.776-160-160v-96h-128v96c0 88.224-71.776 160-160 160s-160-71.776-160-160 71.776-160 160-160h96v-128H288c-88.224 0-160-71.776-160-160s71.776-160 160-160 160 71.776 160 160v96h128V288c0-88.224 71.776-160 160-160s160 71.776 160 160-71.776 160-160 160h-96v128h96c88.224 0 160 71.776 160 160s-71.776 160-160 160z m-96-256v96c0 52.928 43.072 96 96 96s96-43.072 96-96-43.072-96-96-96h-96zM288 640c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96v-96H288z m160-64h128v-128h-128v128z m192-192h96c52.928 0 96-43.072 96-96s-43.072-96-96-96-96 43.072-96 96v96zM288 192C235.072 192 192 235.072 192 288s43.072 96 96 96h96V288c0-52.928-43.072-96-96-96z" p-id="7386"></path>
</svg>

After

Width:  |  Height:  |  Size: 857 B

View File

@@ -0,0 +1,3 @@
<svg t="1748187288998" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3597" width="200" height="200">
<path d="M142.4 96.8l-44.8 44.8 173.6 174.4-68 68H384V203.2l-67.2 67.2zM752.8 316l173.6-174.4-44.8-44.8-174.4 173.6-67.2-67.2V384h180.8zM270.4 707.2l-169.6 170.4 44.8 49.6 170.4-174.4 68 68V640H203.2zM820.8 640H640v180.8l68-68 170.4 174.4 44.8-49.6-169.6-170.4z" p-id="3598"></path>
</svg>

After

Width:  |  Height:  |  Size: 438 B

View File

@@ -0,0 +1,3 @@
<svg t="1748188086803" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12826" width="200" height="200">
<path d="M916.645 642.065c23.944 0 43.355 19.41 43.355 43.354v173.42C960 914.709 914.709 960 858.839 960h-173.42c-23.944 0-43.354-19.41-43.354-43.355 0-23.944 19.41-43.355 43.354-43.355h173.42c7.981 0 14.451-6.47 14.451-14.451v-173.42c0-23.944 19.41-43.354 43.355-43.354z m-809.29 0c23.944 0 43.355 19.41 43.355 43.354v173.42c0 7.981 6.47 14.451 14.451 14.451h173.42c23.944 0 43.354 19.41 43.354 43.355 0 23.944-19.41 43.355-43.354 43.355H165.16C109.291 960 64 914.709 64 858.839v-173.42c0-23.944 19.41-43.354 43.355-43.354zM858.839 64C914.709 64 960 109.291 960 165.161v173.42c0 23.944-19.41 43.354-43.355 43.354-23.944 0-43.355-19.41-43.355-43.354V165.16c0-7.981-6.47-14.451-14.451-14.451h-173.42c-23.944 0-43.354-19.41-43.354-43.355 0-23.944 19.41-43.355 43.354-43.355h173.42zM338.58 64c23.944 0 43.354 19.41 43.354 43.355 0 23.944-19.41 43.355-43.354 43.355H165.16c-7.981 0-14.451 6.47-14.451 14.451v173.42c0 23.944-19.41 43.354-43.355 43.354-23.944 0-43.355-19.41-43.355-43.354V165.16C64 109.291 109.291 64 165.161 64h173.42z" p-id="12827"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,38 @@
<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="#303648" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
<rect id="Rectangle-18" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="10" width="16" height="30"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,38 @@
<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.4 KiB

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" class="iconify iconify--mdi size-5 mr-1 size-4">
<path fill="currentColor" d="m12 5.69l5 4.5V18h-2v-6H9v6H7v-7.81zM12 3L2 12h3v8h6v-6h2v6h6v-8h3"></path>
</svg>

After

Width:  |  Height:  |  Size: 319 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" style="outline: none;" class="iconify iconify--ri">
<path fill="currentColor" d="M13 7.22L9.603 10H6v4h3.603L13 16.78zM8.889 16H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h3.889l5.294-4.332a.5.5 0 0 1 .817.387v15.89a.5.5 0 0 1-.817.387zm9.974.591l-1.422-1.422A4 4 0 0 0 19 12c0-1.43-.75-2.685-1.88-3.392l1.439-1.439A5.99 5.99 0 0 1 21 12c0 1.842-.83 3.49-2.137 4.591"></path>
</svg>

After

Width:  |  Height:  |  Size: 529 B

View File

@@ -0,0 +1,6 @@
<svg t="1748764703038" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8892" width="200" height="200">
<path d="M523.377778 955.733333C278.755556 955.733333 79.644444 756.622222 79.644444 512c0-244.622222 199.111111-443.733333 443.733334-443.733333S967.111111 267.377778 967.111111 512c0 244.622222-199.111111 443.733333-443.733333 443.733333z m0-849.54074C299.614815 106.192593 117.57037 288.237037 117.57037 512c0 223.762963 182.044444 405.807407 405.807408 405.807407C747.140741 917.807407 929.185185 735.762963 929.185185 512c0-223.762963-182.044444-405.807407-405.807407-405.807407z" fill="" p-id="8893"></path>
<path d="M523.377778 955.733333c-127.051852 0-225.659259-195.318519-225.659259-443.733333 0-248.414815 98.607407-443.733333 225.659259-443.733333S749.037037 263.585185 749.037037 512c0 248.414815-100.503704 443.733333-225.659259 443.733333z m0-849.54074c-102.4 0-187.733333 185.837037-187.733334 405.807407 0 219.97037 85.333333 405.807407 187.733334 405.807407s187.733333-185.837037 187.733333-405.807407c0-219.97037-87.22963-405.807407-187.733333-405.807407z" fill="" p-id="8894"></path>
<path d="M523.377778 352.711111c-117.57037 0-235.140741-30.340741-339.437037-87.22963-9.481481-5.688889-13.274074-17.066667-7.585185-26.548148 5.688889-9.481481 17.066667-13.274074 26.548148-7.585185 96.711111 53.096296 208.592593 81.540741 320.474074 81.540741 113.777778 0 223.762963-28.444444 322.37037-83.437037 9.481481-5.688889 20.859259-1.896296 26.548148 7.585185 5.688889 9.481481 1.896296 20.859259-7.585185 26.548148-104.296296 58.785185-221.866667 89.125926-341.333333 89.125926zM197.214815 805.925926c-7.585185 0-13.274074-3.792593-17.066667-9.481482-5.688889-9.481481-1.896296-20.859259 7.585185-26.548148 102.4-54.992593 218.074074-85.333333 333.748148-85.333333 115.674074 0 231.348148 28.444444 333.748149 83.437037 9.481481 5.688889 13.274074 17.066667 7.585185 26.548148-5.688889 9.481481-17.066667 13.274074-26.548148 7.585185-96.711111-53.096296-204.8-79.644444-314.785186-79.644444-109.985185 0-219.97037 28.444444-316.681481 79.644444-1.896296 3.792593-3.792593 3.792593-7.585185 3.792593z" fill="" p-id="8895"></path>
<path d="M948.148148 534.755556H98.607407c-11.377778 0-18.962963-7.585185-18.962963-18.962963s7.585185-18.962963 18.962963-18.962963H948.148148c11.377778 0 18.962963 7.585185 18.962963 18.962963s-9.481481 18.962963-18.962963 18.962963z" p-id="8896"></path>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,38 @@
<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,38 @@
<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.4 KiB

View File

@@ -0,0 +1,3 @@
<svg t="1748188118588" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13829" width="200" height="200">
<path d="M446.112323 177.545051c137.567677 0.219798 252.612525 104.59798 266.162424 241.493333 13.562828 136.895354-78.778182 261.818182-213.617777 289.008485-134.852525 27.203232-268.386263-52.156768-308.945455-183.608889s25.018182-272.252121 151.738182-325.779394A267.235556 267.235556 0 0 1 446.112323 177.545051m0-62.060607c-182.794343 0-330.989899 148.195556-330.989899 330.989899s148.195556 330.989899 330.989899 330.989899 330.989899-148.195556 330.989899-330.989899-148.195556-330.989899-330.989899-330.989899z m431.321212 793.341415a30.849293 30.849293 0 0 1-21.94101-9.102223l-157.220202-157.220202c-11.752727-12.179394-11.584646-31.534545 0.37495-43.50707 11.972525-11.972525 31.327677-12.140606 43.494141-0.37495l157.220202 157.220202a31.036768 31.036768 0 0 1 6.723232 33.810101 31.004444 31.004444 0 0 1-28.651313 19.174142z m0 0" p-id="13830"></path>
</svg>

After

Width:  |  Height:  |  Size: 1022 B

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="80" viewBox="0 0 80 80" fill="none">
<g opacity="1" transform="translate(0 0) rotate(0)">
<path id="圆形 1" fill-rule="evenodd" style="fill:#C6F5D8" opacity="1" d="M40 0 C17.91 0 0 17.91 0 40C 0 62.09 17.91 80 40 80C62.09 80 80 62.09 80 40C80 17.91 62.09 0 40 0 Z"></path>
<g opacity="1" transform="translate(20 17) rotate(0)">
<mask id="bg-mask-0" fill="white">
<use transform="translate(0 0) rotate(0)" xlink:href="#path_0"></use>
</mask>
<g mask="url(#bg-mask-0)" >
<g opacity="1" transform="translate(0 0.001007080078125) rotate(0)">
<path id="减去_15" fill-rule="evenodd" style="fill:#0BB449" opacity="0.8" d="M32.94,46.0891h-25.88c-3.9,0 -7.06,-3.16 -7.06,-7.05v-26.5c 0,-3.89999 3.16,-7.05999 7.06,-7.05999h25.88c3.9,0 7.06,3.16 7.06,7.05999v26.5c 0,3.89 -3.16,7.05 -7.06,7.05zM12.19,24.3291c-0.41,0.4 -0.63,0.96 -0.63,1.53c 0,0.58 0.22,1.13 0.63,1.54l4.24,4.23c0.41,0.41 0.96,0.64 1.54,0.64v 0 c0.56,0 1.09,-0.21 1.49,-0.6l8.27,-7.83c0.42,-0.39 0.66,-0.94 0.68,-1.51c0.01,-0.58 -0.2,-1.14 -0.6,-1.56c-0.41,-0.43 -0.98,-0.68 -1.58,-0.68c-0.55,0 -1.09,0.22 -1.49,0.6l-6.74,6.38l-2.74,-2.74c-0.4,-0.41 -0.96,-0.64 -1.53,-0.64c-0.58,0 -1.13,0.23 -1.54,0.64z"></path>
<path id="路径_5105" fill-rule="evenodd" style="fill:#0BB449" opacity="0.8" d="M30.3925 10.83C31.3825 9.84 31.9325 8.51 31.9325 7.11L31.9325 5.25C31.9325 2.35 29.5825 0 26.6825 0 L13.3125 0 C10.4125 0 8.0625 2.35 8.0625 5.25L8.0625 7.11C8.0625 10.01 10.4125 12.37 13.3125 12.37L26.6825 12.37C28.0725 12.37 29.4125 11.81 30.3925 10.83Z"></path>
</g>
</g>
</g>
</g>
<defs>
<rect id="path_0" x="0" y="0" width="40" height="46.093" />
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,3 @@
<svg t="1678205301752" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6821" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<path d="M578.656 651.648S512 704.96 487.776 718.944a300.512 300.512 0 0 1-59.104 26.08 247.808 247.808 0 0 1-46.88 10.688c-13.408 1.472-24.512 2.4-33.312 2.848a7.232 7.232 0 0 1-3.136 0.64h-10.08a249.92 249.92 0 0 1-65.088-8.224 164.768 164.768 0 0 1-53.12-24.192 117.856 117.856 0 0 1-35.84-40.256c-8.832-16.16-13.216-34.912-13.216-56.288 0.416-18.432 5.44-35.2 15.04-50.304a133.504 133.504 0 0 1 37.44-38.4 177.536 177.536 0 0 1 50.976-23.904 172.384 172.384 0 0 1 56.288-6.88c18.432 0.832 36.256 3.008 53.44 6.56a485.44 485.44 0 0 1 49.376 12.928c15.712 5.024 30.592 10.464 44.64 16.32 14.08 5.92 27.36 11.552 39.936 17.024a615.04 615.04 0 0 0 32.704 12.576c12.16-15.52 22.4-30.72 30.816-45.6a473.504 473.504 0 0 0 33.344-72c2.944-8.384 4.8-14.24 5.664-17.6h-272.96v-30.208H473.6v-69.76H294.368v-30.208h179.264v-56.64c0-3.744 2.08-6.784 6.272-9.088 4.192-2.304 9.024-3.872 14.464-4.736 6.304-1.248 13.44-1.888 21.376-1.888h48.416v72.32h184.288v30.208H564.16v69.792h146.432l0.096-0.64v0.64h-0.096c-2.944 18.688-7.936 38.4-14.976 59.136a455.52 455.52 0 0 1-26.112 61.632 432.96 432.96 0 0 1-45.6 71.04s144.32 69.088 296.704 93.376C945.888 639.84 960 577.536 960 512c0-247.424-200.576-448-448-448S64 264.576 64 512c0 247.392 200.576 448 448 448 153.472 0 288.896-77.184 369.664-194.848-82.048-17.888-169.216-54.08-303.04-113.504zM224 621.12c-1.696 76.704 85.632 82.4 99.104 82.816 44.544 1.344 80.48-15.36 108.48-31.872 27.968-16.512 73.632-59.2 75.36-60.64 1.664-1.472 3.36-3.04 5.024-4.704-12.224-6.72-24.224-12.864-36-18.528-11.776-5.632-71.68-37.6-124.8-43.04C250.496 534.784 224.512 597.824 224 621.12z" p-id="6822"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,3 @@
<svg t="1678204813323" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2781" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<path d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z" p-id="2782"></path>
</svg>

After

Width:  |  Height:  |  Size: 649 B

View File

@@ -0,0 +1,4 @@
<svg t="1678204828544" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3771" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<path d="M690.1 377.4c5.9 0 11.8 0.2 17.6 0.5-24.4-128.7-158.3-227.1-319.9-227.1C209 150.8 64 271.4 64 420.2c0 81.1 43.6 154.2 111.9 203.6 5.5 3.9 9.1 10.3 9.1 17.6 0 2.4-0.5 4.6-1.1 6.9-5.5 20.3-14.2 52.8-14.6 54.3-0.7 2.6-1.7 5.2-1.7 7.9 0 5.9 4.8 10.8 10.8 10.8 2.3 0 4.2-0.9 6.2-2l70.9-40.9c5.3-3.1 11-5 17.2-5 3.2 0 6.4 0.5 9.5 1.4 33.1 9.5 68.8 14.8 105.7 14.8 6 0 11.9-0.1 17.8-0.4-7.1-21-10.9-43.1-10.9-66 0-135.8 132.2-245.8 295.3-245.8z m-194.3-86.5c23.8 0 43.2 19.3 43.2 43.1s-19.3 43.1-43.2 43.1c-23.8 0-43.2-19.3-43.2-43.1s19.4-43.1 43.2-43.1z m-215.9 86.2c-23.8 0-43.2-19.3-43.2-43.1s19.3-43.1 43.2-43.1 43.2 19.3 43.2 43.1-19.4 43.1-43.2 43.1z" p-id="3772"></path>
<path d="M866.7 792.7c56.9-41.2 93.2-102 93.2-169.7 0-124-120.8-224.5-269.9-224.5-149 0-269.9 100.5-269.9 224.5S540.9 847.5 690 847.5c30.8 0 60.6-4.4 88.1-12.3 2.6-0.8 5.2-1.2 7.9-1.2 5.2 0 9.9 1.6 14.3 4.1l59.1 34c1.7 1 3.3 1.7 5.2 1.7 2.4 0 4.7-0.9 6.4-2.6 1.7-1.7 2.6-4 2.6-6.4 0-2.2-0.9-4.4-1.4-6.6-0.3-1.2-7.6-28.3-12.2-45.3-0.5-1.9-0.9-3.8-0.9-5.7 0.1-5.9 3.1-11.2 7.6-14.5zM600.2 587.2c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9c0 19.8-16.2 35.9-36 35.9z m179.9 0c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9c-0.1 19.8-16.2 35.9-36 35.9z" p-id="3773"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,4 @@
<svg t="1678204850487" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5713" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<path d="M457.3 543c-68.1-17.7-145 16.2-174.6 76.2-30.1 61.2-1 129.1 67.8 151.3 71.2 23 155.2-12.2 184.4-78.3 28.7-64.6-7.2-131-77.6-149.2z m-52 156.2c-13.8 22.1-43.5 31.7-65.8 21.6-22-10-28.5-35.7-14.6-57.2 13.7-21.4 42.3-31 64.4-21.7 22.4 9.5 29.6 35 16 57.3z m45.5-58.5c-5 8.6-16.1 12.7-24.7 9.1-8.5-3.5-11.2-13.1-6.4-21.5 5-8.4 15.6-12.4 24.1-9.1 8.7 3.2 11.8 12.9 7 21.5zM785.3 443.5c15 4.8 31-3.4 35.9-18.3 11.8-36.6 4.4-78.4-23.2-109-27.6-30.6-68.4-42.3-106-34.3-15.4 3.3-25.2 18.4-21.9 33.8 3.3 15.3 18.4 25.2 33.8 21.8 18.4-3.9 38.3 1.8 51.9 16.7 13.5 15 17.2 35.4 11.3 53.3-4.9 15.1 3.2 31.1 18.2 36z" p-id="5714"></path>
<path d="M885.1 237.5c-56.7-62.9-140.4-86.9-217.7-70.5-17.9 3.8-29.3 21.4-25.4 39.3 3.8 17.9 21.4 29.3 39.3 25.5 55-11.7 114.4 5.4 154.8 50.1 40.3 44.7 51.2 105.7 34 159.1-5.6 17.4 3.9 36 21.3 41.7 17.4 5.6 36-3.9 41.6-21.2v-0.1c24.1-75.4 8.9-161.1-47.9-223.9zM729 499c-12.2-3.6-20.5-6.1-14.1-22.1 13.8-34.7 15.2-64.7 0.3-86-28-40.1-104.8-37.9-192.8-1.1 0 0-27.6 12.1-20.6-9.8 13.5-43.5 11.5-79.9-9.6-101-47.7-47.8-174.6 1.8-283.5 110.6C127.3 471.1 80 557.5 80 632.2 80 775.1 263.2 862 442.5 862c235 0 391.3-136.5 391.3-245 0-65.5-55.2-102.6-104.8-118zM443 810.8c-143 14.1-266.5-50.5-275.8-144.5-9.3-93.9 99.2-181.5 242.2-195.6 143-14.2 266.5 50.5 275.8 144.4C694.4 709 586 796.6 443 810.8z" p-id="5715"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
<rect x="1300" y="400" rx="40" ry="40" width="150" height="150" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 1450 550" to="360 1450 550" repeatCount="indefinite"/>
</rect>
<path d="M 100 350 A 150 150 0 1 1 400 350 Q400 370 380 370 L 250 370 L 120 370 Q100 370 100 350" fill="#a2b3ff">
<animateMotion path="M 800 -200 L 800 -300 L 800 -200" dur="20s" begin="0s" repeatCount="indefinite"/>
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 210 530 ; -30 210 530 ; 0 210 530" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
</path>
<circle cx="150" cy="150" r="180" stroke="#85FFBD" fill="#85FFBD">
<animateMotion path="M 0 0 L 40 20 Z" dur="5s" repeatCount="indefinite"/>
</circle>
<!-- 三角形 -->
<path d="M 165 580 L 270 580 Q275 578 270 570 L 223 483 Q220 480 217 483 L 165 570 Q160 578 165 580" fill="#a2b3ff">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
</path>
<!-- <circle cx="1200" cy="600" r="30" stroke="rgb(241, 243, 244)" fill="rgb(241, 243, 244)">-->
<!-- <animateMotion path="M 0 0 L -20 40 Z" dur="9s" repeatCount="indefinite"/>-->
<!-- </circle>-->
<path d="M 100 350 A 40 40 0 1 1 180 350 L 180 430 A 40 40 0 1 1 100 430 Z" fill="#3054EB">
<animateMotion path="M 140 390 L 180 360 L 140 390" dur="20s" begin="0s" repeatCount="indefinite"/>
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 140 390; -60 140 390; 0 140 390" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
</path>
<rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(129, 201, 149)" fill="#3054EB">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
</rect>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="600px" height="400px" viewBox="0 0 600 400" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>搭建网站</title>
<g id="搭建网站" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="plant_14_" transform="translate(460.407080, 84.286076)" fill-rule="nonzero">
<path d="M6.00259646,105.330035 C6.00259646,105.330035 1.84230973,-7.8292962 69.9789416,0.726420253 C77.8013257,4.31886582 64.1880531,16.8041013 56.9170106,19.4970835 C47.509069,22.9804759 53.7747239,35.7991797 43.601931,40.9868658 C31.1228726,47.3507038 34.275069,56.1659848 32.8093292,70.5177418 C31.7543929,80.8417418 10.7340442,87.5300354 6.00259646,105.330035 Z" id="Path" fill="#F3F9FF"></path>
<path d="M0.51440531,138.928324 C0.51440531,138.928324 38.1236496,40.5109975 92.8416,86.7062785 C98.1748389,94.224638 82.0814301,97.0428962 74.9320071,95.1736709 C65.6808195,92.7546734 66.3384655,107.213681 55.8188319,105.804101 C42.9145558,104.074572 42.3848354,113.35761 35.9227876,124.700041 C31.2733204,132.860101 11.0007062,126.525104 0.51440531,138.928324 Z" id="Path" fill="#E7F4FE"></path>
<path d="M8.45390442,132.267068 C8.45390442,132.267068 18.6906602,6.36023291 81.8670195,35.9181468 C87.3029593,39.0338228 77.5076372,49.6381165 68.456446,50.3645367 C59.4061558,51.090957 62.246646,68.606157 55.6071239,78.2605165 C48.237885,88.9774684 34.5723611,87.3542886 32.0372708,103.647372 C30.2147805,115.370137 14.933069,112.333772 8.45390442,132.267068 Z" id="Path" fill="#DCEEFD"></path>
</g>
<g id="cog_4_" transform="translate(291.941593, 205.055696)" fill="#F3F9FF" fill-rule="nonzero">
<path d="M120.51048,32.7700253 C119.524011,30.3879797 116.994326,29.0342785 114.467343,29.534481 L106.4828,31.1144 C104.59995,31.4875241 102.652237,30.8314025 101.381088,29.3938835 C100.034265,27.8716456 98.6072637,26.4386329 97.1054885,25.1011544 C95.6739823,23.8267646 95.0253451,21.8881418 95.3965097,20.0072 L96.9739593,12.0328 C97.4739504,9.5038481 96.1199204,6.97309367 93.7397823,5.98710886 L81.9508018,1.1022481 C79.5706637,0.115362025 76.8247664,0.94723038 75.3905575,3.08953924 L70.8690159,9.84362532 C69.8041699,11.4343595 67.970869,12.348243 66.060092,12.2373873 C64.0529204,12.1202228 62.0313345,12.1247291 60.0034425,12.2482025 C58.0854584,12.3644658 56.2494549,11.4523848 55.1801044,9.85534177 L50.6513558,3.08953924 C49.2171469,0.94723038 46.4712496,0.116263291 44.0911115,1.1022481 L32.3030319,5.98710886 C29.9219929,6.97399494 28.5688637,9.5038481 29.0688549,12.0328 L30.6490071,20.020719 C31.0210726,21.9043646 30.3661292,23.852 28.9292177,25.1245873 C27.407623,26.4719797 25.9752159,27.8995848 24.6383027,29.4019949 C23.3644513,30.8341063 21.4257469,31.4830177 19.5465009,31.1116962 L11.5754708,29.534481 C9.04758761,29.0342785 6.51790265,30.388881 5.53233451,32.7700253 L0.649538053,44.5639899 C-0.336930973,46.9451342 0.494585841,49.6921924 2.63598938,51.1270076 L9.38722124,55.6495595 C10.9772832,56.7148557 11.8907805,58.5489316 11.7790708,60.4605165 C11.6628566,62.4685367 11.6664602,64.4918785 11.7898814,66.5206278 C11.9069965,68.4394228 10.9944,70.2771038 9.39803186,71.3460051 L2.6350885,75.8766684 C0.493684956,77.3105823 -0.336930973,80.0585418 0.648637168,82.4396861 L5.53143363,94.2327494 C6.51790265,96.6147949 9.04668673,97.9684962 11.5745699,97.4682937 L19.5591133,95.8874734 C21.4419628,95.5152506 23.3896761,96.1704709 24.6608248,97.6079899 C26.0076478,99.1302278 27.4346496,100.563241 28.9364248,101.900719 C30.367931,103.175109 31.017469,105.114633 30.6454035,106.994673 L29.0688549,114.968172 C28.5688637,117.497124 29.9219929,120.027878 32.3030319,121.014765 L44.0911115,125.899625 C46.4721504,126.886511 49.2171469,126.054643 50.6513558,123.912334 L55.1719965,117.158248 C56.2368425,115.567514 58.0701434,114.65363 59.9809204,114.764486 C61.988092,114.881651 64.0096779,114.877144 66.0384708,114.753671 C67.9564549,114.637408 69.7924584,115.548587 70.8618088,117.146532 L75.3905575,123.912334 C76.8247664,126.053742 79.5706637,126.88561 81.9508018,125.899625 L93.7388814,121.014765 C96.1199204,120.027878 97.4730496,117.498025 96.9730584,114.969073 L95.3929062,106.981154 C95.0208407,105.097509 95.6757841,103.149873 97.1126956,101.877286 C98.6342903,100.529894 100.066697,99.1022886 101.403611,97.5998785 C102.677462,96.1677671 104.616166,95.5188557 106.496313,95.8901772 L114.467343,97.4673924 C116.995227,97.9675949 119.524912,96.6138937 120.51048,94.2318481 L125.393276,82.4387848 C126.378844,80.0567392 125.548228,77.309681 123.406825,75.8757671 L116.655593,71.3532152 C115.065531,70.287919 114.152034,68.453843 114.262842,66.5422582 C114.379958,64.534238 114.375453,62.5117975 114.252032,60.4830481 C114.135818,58.5642532 115.047513,56.7265722 116.643881,55.6576709 L123.406825,51.1270076 C125.547327,49.6921924 126.378844,46.9451342 125.393276,44.5639899 L120.51048,32.7700253 Z M73.3635664,88.4835747 C59.5719186,94.1985013 43.7613876,87.6462987 38.0488761,73.8497215 C32.3363646,60.052243 38.8857982,44.2350278 52.6765451,38.5201013 C66.4681929,32.8051747 82.2787239,39.3573772 87.9912354,53.1539544 C93.7037469,66.9505316 87.1552142,82.7686481 73.3635664,88.4835747 Z" id="Shape"></path>
</g>
<g id="window" transform="translate(116.269027, 38.321519)" fill-rule="nonzero">
<g id="Group">
<rect id="Rectangle" fill="#F3F9FF" x="11.4115097" y="11.7164557" width="342.937173" height="202.78481"></rect>
<path d="M355.838747,0.450632911 L9.92054513,0.450632911 C4.52424425,0.450632911 0.150447788,4.82627848 0.150447788,10.2248608 L0.150447788,215.992861 C0.150447788,221.391443 4.52424425,225.767089 9.92054513,225.767089 L355.839648,225.767089 C361.235949,225.767089 365.609745,221.391443 365.609745,215.992861 L365.609745,10.2248608 C365.609745,4.82627848 361.235048,0.450632911 355.838747,0.450632911 Z M354.348683,214.501266 L11.4115097,214.501266 L11.4115097,11.7164557 L354.348683,11.7164557 L354.348683,214.501266 L354.348683,214.501266 Z" id="Shape" fill="#224380"></path>
</g>
<g id="Group" transform="translate(25.224779, 23.432911)">
<path d="M307.56843,179.926005 L119.367257,179.926005 C116.879913,179.926005 114.862832,177.908071 114.862832,175.419676 L114.862832,9.01265823 C114.862832,6.52426329 116.879913,4.50632911 119.367257,4.50632911 L307.56843,4.50632911 C310.055773,4.50632911 312.072855,6.52426329 312.072855,9.01265823 L312.072855,175.419676 C312.072855,177.908071 310.055773,179.926005 307.56843,179.926005 Z" id="Path" fill="#DAE7FF"></path>
<path d="M307.56843,175.419676 L119.367257,175.419676 C116.879913,175.419676 114.862832,173.401742 114.862832,170.913347 L114.862832,4.50632911 C114.862832,2.01793418 116.879913,0 119.367257,0 L307.56843,0 C310.055773,0 312.072855,2.01793418 312.072855,4.50632911 L312.072855,170.913347 C312.072855,173.401742 310.055773,175.419676 307.56843,175.419676 Z" id="Path" fill="#FFFFFF"></path>
<path d="M101.296405,44.7667747 L5.21161947,44.7667747 C2.72427611,44.7667747 0.70719469,42.7488405 0.70719469,40.2604456 L0.70719469,9.01265823 C0.70719469,6.52426329 2.72427611,4.50632911 5.21161947,4.50632911 L101.296405,4.50632911 C103.783749,4.50632911 105.80083,6.52426329 105.80083,9.01265823 L105.80083,40.2604456 C105.80083,42.7497418 103.78465,44.7667747 101.296405,44.7667747 Z" id="Path" fill="#DAE7FF"></path>
<path d="M101.296405,40.2604456 L5.21161947,40.2604456 C2.72427611,40.2604456 0.70719469,38.2425114 0.70719469,35.7541165 L0.70719469,4.50632911 C0.70719469,2.01793418 2.72427611,0 5.21161947,0 L101.296405,0 C103.783749,0 105.80083,2.01793418 105.80083,4.50632911 L105.80083,35.7541165 C105.80083,38.2434127 103.78465,40.2604456 101.296405,40.2604456 Z" id="Path" fill="#FFFFFF"></path>
<path d="M101.296405,106.279068 L5.21161947,106.279068 C2.72427611,106.279068 0.70719469,104.261134 0.70719469,101.772739 L0.70719469,70.5249519 C0.70719469,68.036557 2.72427611,66.0186228 5.21161947,66.0186228 L101.296405,66.0186228 C103.783749,66.0186228 105.80083,68.036557 105.80083,70.5249519 L105.80083,101.772739 C105.80083,104.261134 103.78465,106.279068 101.296405,106.279068 Z" id="Path" fill="#DAE7FF"></path>
<path d="M101.296405,101.772739 L5.21161947,101.772739 C2.72427611,101.772739 0.70719469,99.7548051 0.70719469,97.2664101 L0.70719469,66.0186228 C0.70719469,63.5302278 2.72427611,61.5122937 5.21161947,61.5122937 L101.296405,61.5122937 C103.783749,61.5122937 105.80083,63.5302278 105.80083,66.0186228 L105.80083,97.2664101 C105.80083,99.7548051 103.78465,101.772739 101.296405,101.772739 Z" id="Path" fill="#FFFFFF"></path>
<path d="M226.222122,22.7272203 L133.116563,22.7272203 C132.121085,22.7272203 131.314793,21.9205873 131.314793,20.9246886 L131.314793,13.3116962 C131.314793,12.3157975 132.121085,11.5091646 133.116563,11.5091646 L226.222122,11.5091646 C227.2176,11.5091646 228.023892,12.3157975 228.023892,13.3116962 L228.023892,20.9246886 C228.023892,21.9205873 227.2176,22.7272203 226.222122,22.7272203 Z" id="Path" fill="#1B90FB"></path>
<path d="M170.846526,80.5434228 L133.117464,80.5434228 C132.121986,80.5434228 131.315694,79.7367899 131.315694,78.7408911 L131.315694,71.1278987 C131.315694,70.132 132.121986,69.3253671 133.117464,69.3253671 L170.846526,69.3253671 C171.842004,69.3253671 172.648296,70.132 172.648296,71.1278987 L172.648296,78.7408911 C172.648296,79.7358886 171.841103,80.5434228 170.846526,80.5434228 Z" id="Path" fill="#7266D5"></path>
<g transform="translate(130.628319, 29.741772)" fill="#DCEEFD" id="Path">
<path d="M163.352064,3.56540759 L2.32608496,3.56540759 C1.42069558,3.56540759 0.686474336,2.83087595 0.686474336,1.9251038 L0.686474336,1.91879494 C0.686474336,1.01302278 1.42069558,0.278491139 2.32608496,0.278491139 L163.352064,0.278491139 C164.257453,0.278491139 164.991674,1.01302278 164.991674,1.91879494 L164.991674,1.9251038 C164.991674,2.83177722 164.258354,3.56540759 163.352064,3.56540759 Z"></path>
<path d="M163.352064,13.1404557 L2.32608496,13.1404557 C1.42069558,13.1404557 0.686474336,12.4059241 0.686474336,11.5001519 L0.686474336,11.493843 C0.686474336,10.5880709 1.42069558,9.85353924 2.32608496,9.85353924 L163.352064,9.85353924 C164.257453,9.85353924 164.991674,10.5880709 164.991674,11.493843 L164.991674,11.5001519 C164.991674,12.4059241 164.258354,13.1404557 163.352064,13.1404557 Z"></path>
<path d="M163.352064,22.7155038 L2.32608496,22.7155038 C1.42069558,22.7155038 0.686474336,21.9809722 0.686474336,21.0752 L0.686474336,21.0688911 C0.686474336,20.163119 1.42069558,19.4285873 2.32608496,19.4285873 L163.352064,19.4285873 C164.257453,19.4285873 164.991674,20.163119 164.991674,21.0688911 L164.991674,21.0752 C164.991674,21.9809722 164.258354,22.7155038 163.352064,22.7155038 Z"></path>
<path d="M63.241223,32.2896506 L2.32608496,32.2896506 C1.42069558,32.2896506 0.686474336,31.555119 0.686474336,30.6493468 L0.686474336,30.643038 C0.686474336,29.7372658 1.42069558,29.0027342 2.32608496,29.0027342 L63.241223,29.0027342 C64.1466124,29.0027342 64.8808336,29.7372658 64.8808336,30.643038 L64.8808336,30.6493468 C64.8808336,31.5560203 64.1475133,32.2896506 63.241223,32.2896506 Z"></path>
</g>
</g>
</g>
<g id="chevron_arrow_2_" transform="translate(61.315044, 96.903797)" fill-rule="nonzero">
<polygon id="Path" fill="#F3F9FF" points="19.8068566 71.8750481 38.8335469 90.9097823 38.8335469 104.425165 19.8068566 85.3904304 0.781067257 104.425165 0.781067257 90.9097823"></polygon>
<polygon id="Path" fill="#E7F4FE" points="19.8068566 48.0825316 38.8335469 67.1163646 38.8335469 80.6317468 19.8068566 61.5970127 0.781067257 80.6317468 0.781067257 67.1163646"></polygon>
<polygon id="Path" fill="#DCEEFD" points="19.8068566 24.2891139 38.8335469 43.3238481 38.8335469 56.8383291 19.8068566 37.8035949 0.781067257 56.8383291 0.781067257 43.3238481"></polygon>
<polygon id="Path" fill="#D0E7FE" points="19.8068566 0.495696203 38.8335469 19.5304304 38.8335469 33.0449114 19.8068566 14.0110785 0.781067257 33.0449114 0.781067257 19.5304304"></polygon>
</g>
<g id="woman_7_" transform="translate(138.791150, 38.321519)" fill-rule="nonzero">
<rect id="Rectangle" fill="#0D1F42" x="8.16652212" y="0.450632911" width="2.57022478" height="156.781499"></rect>
<g id="Group" transform="translate(9.008850, 72.101266)">
<path d="M76.4626106,27.1326076 L65.7285664,27.1326076 C65.2510973,27.1326076 64.8637168,26.7450633 64.8637168,26.2673924 L64.8637168,26.2628861 C64.8637168,25.7852152 65.2510973,25.3976709 65.7285664,25.3976709 L76.4626106,25.3976709 L78.714823,26.2646886 L76.4626106,27.1326076 Z" id="Path" fill="#224380"></path>
<polygon id="Path" fill="#F1B282" points="23.8941717 111.707392 24.5590248 114.999716 20.2473894 115.60717 18.9420071 112.501408"></polygon>
<path d="M24.6527168,114.604962 C24.6527168,114.604962 20.5636,115.675666 19.2212814,115.806349 C17.8789628,115.937033 15.6015257,118.817478 14.2249735,119.255494 C12.5547327,119.786339 12.7511257,121.708739 14.0159681,122.049418 C15.802423,122.529792 26.1932301,122.361256 26.2202566,118.839109 C26.2481841,115.10877 24.6527168,114.604962 24.6527168,114.604962 Z" id="Path" fill="#102B5E"></path>
<polygon id="Path" fill="#F1B282" points="31.0661168 110.626775 29.2409239 113.484689 33.2084212 115.548587 35.5894602 113.08723"></polygon>
<path d="M12.8195929,82.2080608 C11.4817788,83.8438582 15.0916248,112.72402 17.2681628,114.131797 C19.4447009,115.539575 24.9346938,112.509519 24.9346938,112.509519 C24.9346938,112.509519 28.4364336,85.8059139 26.8274531,82.2071595 C25.2193735,78.6102076 14.1574071,80.5722633 12.8195929,82.2080608 Z" id="Path" fill="#0B224E"></path>
<path d="M59.1998531,83.8177215 C57.5908726,74.8221873 38.5470655,67.4354127 33.2084212,67.1515139 C27.869777,66.8676152 8.66921593,73.2828253 7.34221239,74.5139544 C6.01520885,75.7450835 5.43684071,85.1434835 17.1744708,84.8595848 C28.9121009,84.5756861 34.4011929,82.8713924 34.4011929,82.8713924 C34.4011929,82.8713924 41.3794478,85.7013671 45.7226142,87.4930835 C41.6380018,92.0300557 30.3481115,105.116435 30.4255876,111.090025 C30.8039593,112.794319 35.2525292,114.594147 36.4831381,114.025448 C37.7137469,113.456749 60.8097345,92.814157 59.1998531,83.8177215 Z" id="Path" fill="#102B5E"></path>
<path d="M29.1949788,24.0187342 C29.1949788,24.0187342 27.3968124,30.6475443 26.2607965,32.1625722 C25.1247805,33.6776 34.0228212,35.9505924 34.9687504,35.003362 C35.9146796,34.0561316 36.1047664,27.6174886 36.1047664,27.6174886 C36.1047664,27.6174886 40.837115,28.7467747 42.0677239,27.7328506 C43.2983327,26.7189266 43.6767044,24.8713316 43.7712973,24.3035342 C43.8658903,23.7357367 45.5694637,23.1201722 45.5694637,22.2675747 C45.5694637,21.4149772 44.7172265,15.5360203 43.0614,14.1715038 C42.1406956,13.4135392 31.4661097,10.0995848 30.4255876,16.1596962 C29.3841646,22.2198076 29.1949788,24.0187342 29.1949788,24.0187342 Z" id="Path" fill="#F1B282"></path>
<path d="M30.2364018,25.7239291 C33.1705841,25.7239291 37.9984265,24.8713316 37.9984265,21.9359089 C37.9984265,19.0004861 34.2120071,14.7393013 37.9984265,15.2124658 C41.784846,15.6856304 44.7172265,15.6901367 44.7190283,11.7092456 C44.7208301,6.21693165 30.3192832,0.219007595 25.1256814,12.7420962 C21.5284478,21.4149772 26.4725044,25.7239291 30.2364018,25.7239291 Z" id="Path" fill="#102B5E"></path>
<path d="M62.1601611,33.5811646 C62.1601611,33.5811646 65.9087434,29.8958886 66.3483752,29.365043 C68.3321239,26.9685772 67.5024088,24.0358582 70.2699274,24.0358582 C71.7906212,24.0358582 74.5076903,25.177762 74.5860673,27.0956557 C74.6203009,27.9221165 74.8950708,30.9557772 72.4284478,31.3442228 C70.3645204,31.6686785 64.8330867,37.3926177 64.8330867,37.3926177 L62.1601611,33.5811646 Z" id="Path" fill="#F1B282"></path>
<path d="M67.5258319,34.2661266 C67.0528673,31.2360709 63.5376142,30.7475848 61.4682814,32.6564658 C60.806131,33.2675241 52.9008655,37.2925772 49.451377,39.8017013 C46.444223,35.9731241 38.7758903,29.748081 29.067954,29.748081 C15.2808106,29.748081 0.136033628,43.2896 0.136033628,52.6636658 C0.136033628,59.1960405 3.8386708,59.6340557 7.24311504,58.6588861 C6.12151327,63.0868051 4.64135929,70.6421165 5.90800354,75.9586835 C6.88005841,80.0396152 18.2149929,75.200719 22.7581558,74.5382886 C27.3013186,73.8758582 36.6723239,74.159757 36.2939522,69.5200405 C35.9155805,64.8803241 34.9939752,50.2086177 42.9109522,50.565519 C46.5081858,50.565519 47.1730389,53.0430987 50.3027133,53.0430987 C56.2656708,53.0421975 68.1915858,38.5273114 67.5258319,34.2661266 Z" id="Path" fill="#1B90FB"></path>
<path d="M26.5923221,6.78472911 C26.5923221,6.78472911 26.7724991,0.0612860759 17.1744708,0.0612860759 C-2.32428319,0.0612860759 5.43774159,18.2425215 5.15306195,27.7121215 C4.8683823,37.1817215 0.326120354,36.5183899 0.136033628,39.8332456 C-0.0531522124,43.1472 18.5933646,40.4956759 19.9185664,27.6174886 C21.2437681,14.7393013 22.1896973,8.80716962 24.9355947,9.90941772 C27.681492,11.0125671 26.5923221,6.78472911 26.5923221,6.78472911 Z" id="Path" fill="#102B5E"></path>
<path d="M29.1526372,5.0948557 C31.0309823,5.98891139 26.6860142,13.8064911 24.0518265,12.785357 C21.4176389,11.7642228 26.7040319,3.92951899 29.1526372,5.0948557 Z" id="Path" fill="#1B90FB"></path>
<path d="M7.22059292,58.7472101 C7.22059292,58.7472101 10.453869,46.5089215 15.1393717,43.3842329 C15.1393717,43.3842329 9.3178531,58.7472101 5.51161416,73.4017924 C5.51161416,73.4017924 5.26567257,64.6342785 7.22059292,58.7472101 Z" id="Path" fill="#1277D7"></path>
<path d="M45.5703646,87.6625215 L48.2676142,88.5529722 C48.2676142,88.5529722 41.6551186,94.9123038 37.5551912,97.3430177 C37.5551912,97.3430177 43.5803097,88.4961924 45.5703646,87.6625215 Z" id="Path" fill="#0B224E"></path>
<path d="M29.2265097,112.703291 C29.2265097,112.703291 33.6705752,115.496314 35.2291062,116.174066 C36.7867363,116.852719 38.2443681,120.878673 39.7065044,121.903413 C41.4803469,123.146258 40.3875735,125.147068 38.7137292,125.010076 C36.3489062,124.816304 23.9184956,120.478511 25.4554053,116.657144 C27.0815027,112.610461 29.2265097,112.703291 29.2265097,112.703291 Z" id="Path" fill="#102B5E"></path>
</g>
<path d="M4.07650442,162.738866 L70.4573115,162.738866 C72.2392619,162.738866 73.6833805,161.294137 73.6833805,159.511433 L73.6833805,159.206805 C73.6833805,157.424101 72.2392619,155.979372 70.4573115,155.979372 L4.07650442,155.979372 C2.29455398,155.979372 0.850435398,157.424101 0.850435398,159.206805 L0.850435398,159.511433 C0.850435398,161.294137 2.29455398,162.738866 4.07650442,162.738866 Z" id="Path" fill="#0D1F42"></path>
<rect id="Rectangle" fill="#0D1F42" x="65.3069522" y="0.450632911" width="2.57022478" height="156.781499"></rect>
</g>
<g id="man_on_ladder_1_" transform="translate(377.525664, 121.237975)" fill-rule="nonzero">
<rect id="Rectangle" fill="#183168" x="46.2235062" y="14.6356557" width="41.7163788" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="45.943331" y="41.523119" width="41.0064814" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.2235062" y="76.2317671" width="42.0704265" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="52.0098903" y="107.820233" width="35.6840531" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.3613416" y="206.888273" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.3613416" y="239.241013" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.5784549" y="138.928324" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="86.2282035" y="0.89315443" width="3.60353982" height="256.868871"></rect>
<rect id="Rectangle" fill="#183168" x="45.4856814" y="0.89315443" width="3.60353982" height="256.868871"></rect>
<g id="Group" transform="translate(0.000000, 14.420253)">
<path d="M11.6682619,19.8963443 L12.5195982,18.2290025 C12.8105841,17.6585013 12.8628354,17.0095899 12.6646407,16.4003342 C12.4673469,15.7919797 12.0448319,15.2962835 11.4754726,15.0051747 L1.85131858,10.0887696 C1.08556637,9.69762025 0.781067257,8.75669873 1.17115044,7.99062278 L3.18823186,4.03857215 C3.37831858,3.66725063 3.7008354,3.39236456 4.09632389,3.26438481 C4.49271327,3.13460253 4.91703009,3.1670481 5.28549204,3.35901772 L8.88452743,5.1976 L9.26470088,4.45225316 L5.66566549,2.61367089 C5.09360354,2.32526582 4.44676814,2.27118987 3.8386708,2.46946835 C3.22967257,2.66684557 2.73508673,3.08953924 2.44410088,3.65913924 L0.427019469,7.61209114 C-0.172969912,8.7891443 0.295490265,10.2347747 1.47114513,10.835919 L11.0952991,15.7523241 C11.4664637,15.9406886 11.7412336,16.2633418 11.8691593,16.6598987 C11.997085,17.0564557 11.9637522,17.4791494 11.7745664,17.8495696 L10.9232301,19.5169114 L11.6682619,19.8963443 Z" id="Path" fill="#4D78CC"></path>
<path d="M6.84762655,8.24027342 L23.1878779,16.5868962 C24.2734442,17.1411747 25.6022496,16.7103696 26.1571947,15.6243443 L27.8373451,12.3320203 C28.3913894,11.2459949 27.9607664,9.91662785 26.8752,9.3614481 L10.5349487,1.01482532 C9.4493823,0.460546835 8.12057699,0.891351899 7.56563186,1.97737722 L5.88548142,5.26970127 C5.33143717,6.35662785 5.76206018,7.68599494 6.84762655,8.24027342 Z" id="Path" fill="#7266D5"></path>
<path d="M9.85297876,27.6463291 L13.5087699,20.4830684 C14.0628142,19.397043 13.6321912,18.0676759 12.5466248,17.5124962 L12.3385204,17.4061468 C11.252954,16.8518684 9.92414867,17.2826734 9.36920354,18.3686987 L5.71341239,25.5319595 C5.15936814,26.6179848 5.58999115,27.9473519 6.67555752,28.5025316 L6.88366195,28.608881 C7.96922832,29.1631595 9.29893451,28.7323544 9.85297876,27.6463291 Z" id="Path" fill="#224380"></path>
</g>
<rect id="Rectangle" fill="#183168" x="48.0324832" y="174.534633" width="41.3605292" height="3.60506329"></rect>
<path d="M62.5376319,165.929347 L64.1970619,170.75923 C64.1970619,170.75923 67.5699752,173.811818 69.317692,169.460506 C69.317692,169.460506 68.7744584,166.525084 68.5762637,165.453478 C68.378069,164.380972 62.5376319,165.929347 62.5376319,165.929347 Z" id="Path" fill="#F1B282"></path>
<path d="M69.8465115,166.232172 L61.3826973,166.232172 C61.3826973,166.232172 53.460315,135.112365 51.2567504,126.868486 C49.5207451,120.375767 47.5027628,98.9157266 48.3036496,88.9197873 C49.0676,79.3898025 65.2727186,84.5513519 66.1177487,91.2441519 C68.5960832,110.863808 63.9835522,125.415646 64.220485,128.846765 C68.2411345,139.022056 69.8465115,166.232172 69.8465115,166.232172 Z" id="Path" fill="#102B5E"></path>
<path d="M46.6280035,27.6598481 C45.6045982,29.859838 46.1063912,31.0576203 45.8550442,31.9841215 C45.6036973,32.9115241 44.6424531,34.7825519 44.6019133,35.6702987 C44.5613735,36.5580456 45.5036991,36.6788152 45.7072991,37.8387443 C45.9108991,38.9986734 45.3766743,40.5100962 46.083869,41.7259038 C46.7910637,42.9417114 49.5351593,42.6605165 49.373,43.8339646 C49.2117416,45.0074127 47.4820425,49.3623291 47.4820425,49.3623291 L58.7656265,49.5434835 C58.7656265,49.5434835 58.3151841,43.204881 58.8890478,40.5849013 C59.4629115,37.9649215 60.7349611,28.3394025 58.3917593,27.1722633 C56.0485575,26.0051241 47.7144708,25.3246684 46.6280035,27.6598481 Z" id="Path" fill="#F1B282"></path>
<path d="M52.8224885,22.6695392 C62.2097097,22.9624506 65.5033451,25.3291747 65.3961398,32.667281 C65.332177,37.0411241 62.9196071,43.0949266 59.7520956,43.0751473 C57.4683522,43.0606785 52.9657292,42.8065215 52.176554,41.5582684 C50.3036142,38.5949063 51.9071894,34.5040608 50.6522566,33.0917772 C48.8685044,31.0846582 44.815423,32.1184101 45.3721699,25.2038987 C45.9289168,18.2893873 49.6982195,22.5713013 52.8224885,22.6695392 Z" id="Path" fill="#0B224E"></path>
<path d="M74.1401292,20.5768 C74.1401292,20.5768 75.7401009,16.118238 75.4545204,13.7343899 C74.9941681,9.89319494 65.856492,9.87607089 65.4628053,13.202643 C65.0456956,16.7347038 66.6916124,17.6585013 67.7663681,18.5804962 C68.8411239,19.5024911 70.069931,21.115757 70.3771327,21.7304203 C70.6843345,22.3450835 73.6788761,22.3441823 74.1401292,20.5768 Z" id="Path" fill="#F1B282"></path>
<path d="M9.9646885,46.2709873 C9.9646885,46.2709873 5.46656991,44.7902076 3.76389735,43.0985316 C1.02070265,40.3722025 6.62781062,33.1548658 9.49082301,34.8907038 C12.5313097,36.7337924 12.2466301,38.6003139 12.3114938,40.0153013 C12.3763575,41.4302886 12.8925646,43.391443 13.1880549,44.0124152 C13.4835451,44.6324861 11.6412354,46.9938025 9.9646885,46.2709873 Z" id="Path" fill="#F1B282"></path>
<path d="M40.234423,158.566005 L42.6650106,163.057013 C42.6650106,163.057013 46.4937717,165.513863 47.5027628,160.934532 C47.5027628,160.934532 46.4847628,158.128891 46.1126973,157.103251 C45.7406319,156.078511 40.234423,158.566005 40.234423,158.566005 Z" id="Path" fill="#F1B282"></path>
<path d="M40.4794637,89.3334684 C40.4794637,89.3334684 24.1797522,112.419392 23.7833628,117.053701 C23.0671593,125.416547 39.0173274,158.62639 39.0173274,158.62639 L47.266731,156.855403 C47.266731,156.855403 41.7416035,131.821843 37.375915,123.286856 C45.7721628,111.929104 59.0728283,105.586896 59.0728283,90.7520608 C59.0737292,86.7297114 40.4794637,89.3334684 40.4794637,89.3334684 Z" id="Path" fill="#0B224E"></path>
<path d="M57.6548354,47.6616405 C55.2386619,47.4985114 50.7414442,47.7454582 48.1225717,47.6958886 C41.4163841,47.5697114 32.3552832,53.5342886 25.0923487,55.6657823 C20.3464867,50.5267646 13.3880513,42.3730127 13.3880513,42.3730127 L7.53590265,45.9888911 C7.53590265,45.9888911 17.9825646,64.0142076 24.4040726,65.0479595 C28.2904903,65.673438 34.5381274,65.4337013 39.3866903,63.4229772 C39.3866903,69.4596557 31.6561965,93.1169823 37.3362761,94.3219747 C43.0163558,95.5269671 51.9675487,93.4612658 57.4755593,94.3219747 C62.9835699,95.1826835 69.0077876,99.3158886 67.6312354,88.9837772 C66.2537823,78.6516658 60.2286637,79.7629266 73.1383451,60.0513418 C76.5193664,54.8888911 80.4553327,47.3687291 79.8589469,41.0625722 C78.6923009,28.7368608 75.6986602,19.4718481 75.6986602,19.4718481 L69.2933681,20.5046987 C69.2933681,20.5046987 69.8465115,33.4811241 71.2230637,41.0580658 C69.8456106,44.7045873 67.7681699,47.2137114 65.3961398,49.8075544 C64.0970637,51.2288506 61.4376513,47.5255494 57.6548354,47.6616405 Z" id="Path" fill="#FFCB01"></path>
<path d="M69.4618336,168.30959 C70.1293894,168.222167 70.8347823,168.939575 70.8068549,171.602815 C70.7789274,174.266056 70.9014478,175.676537 68.8366195,175.962238 C67.5393451,176.14159 62.6502425,174.847372 57.8872637,174.932992 C56.1665735,174.963635 53.0044673,174.156101 51.8954779,172.677124 C51.6693558,172.3752 51.6189062,171.939889 51.7675522,171.571271 C51.9161982,171.202653 52.2360124,170.969225 52.5801504,170.979139 C56.4170195,171.08639 56.483685,171.459514 59.5890354,169.253215 C60.7160425,168.45199 61.6574673,167.703038 62.2520513,167.662481 C63.4087876,167.58317 63.9439133,169.124334 65.8285646,168.923352 C67.7150177,168.721468 68.3078,168.461003 69.4618336,168.30959 Z" id="Path" fill="#0B224E"></path>
<path d="M47.5622212,159.639413 C48.2604071,159.50242 49.1703009,160.431625 49.5207451,162.892081 C49.8711894,165.353438 50.5801858,167.32 48.4207646,167.758916 C47.0649327,168.034704 40.0074,167.316395 34.9471292,167.800375 C33.1192336,167.97522 30.9769292,167.088375 29.5850619,165.81759 C29.3003823,165.558025 29.185069,165.160567 29.2913735,164.807271 C29.3976779,164.453975 29.7048796,164.211534 30.0724407,164.190805 C34.1741699,163.963686 34.2993929,164.302562 37.2921327,162.002532 C38.3786,161.167058 39.2740796,160.395575 39.9019965,160.308152 C41.1226956,160.136911 41.8569168,161.186886 43.8361611,160.8408 C45.8154053,160.494714 46.3541345,159.877347 47.5622212,159.639413 Z" id="Path" fill="#0B224E"></path>
</g>
<g id="man_with_paper" transform="translate(204.555752, 213.167089)">
<path d="M24.5076743,4.49641519 C27.5787912,4.09174684 30.3147788,6.04569114 30.3147788,8.43404557 C30.3147788,8.95407595 30.1111788,9.89229367 30.508469,11.0810633 C30.7742301,11.8759797 31.8886248,12.9025215 31.8787807,13.985843 C31.8688053,15.0691646 30.249915,14.8249215 30.3787416,15.7937823 C30.5075681,16.7617418 31.1535027,18.7634532 30.7012584,19.5376405 C30.249915,20.3127291 25.2166708,19.4087595 25.0878442,21.2157975 C24.9590177,23.0228354 26.249085,26.4990177 26.249085,26.4990177 L15.4087363,25.6698532 C15.4087363,25.6698532 14.5033469,8.93064304 15.4087363,7.65895696 C16.9258265,5.52926582 22.0554655,4.81906835 24.5076743,4.49641519 Z" id="Path" fill="#F1B282" fill-rule="nonzero"></path>
<path d="M4.81072566,153.006096 C4.81072566,153.006096 2.79995044,161.619494 4.79541062,163.34722 L9.20163894,163.750086 C9.60343363,163.787038 9.9583823,163.490522 9.99531858,163.088557 L10.0583805,162.39999 C10.0583805,162.39999 11.9042938,164.207028 13.359223,164.339514 C14.8141522,164.472 22.5743752,164.531484 22.5743752,164.531484 C22.5743752,164.531484 24.3635327,165.012759 24.5220885,163.273316 C24.7491115,160.782218 18.4041788,160.457762 15.9816991,158.191078 C13.5592195,155.924395 12.4322124,153.701873 12.4322124,153.701873 L4.81072566,153.006096 Z" id="Path" fill="#0B224E"></path>
<path d="M28.0544584,155.318744 C28.0544584,155.318744 26.8355611,164.079949 28.9796673,165.61841 L33.4048142,165.61841 C33.8084106,165.61841 34.1354319,165.291251 34.1354319,164.887484 L34.1354319,164.196213 C34.1354319,164.196213 36.1380991,165.827504 37.5984336,165.827504 C39.0587681,165.827504 48.4054496,165.81038 48.4054496,165.81038 C48.4054496,165.81038 50.2306425,166.126724 50.2306425,164.380071 C50.2306425,161.879058 42.2695221,161.502329 39.6506496,159.465468 C37.031777,157.428608 35.7074761,155.317843 35.7074761,155.317843 L28.0544584,155.317843 L28.0544584,155.318744 Z" id="Path" fill="#0B224E"></path>
<path d="M66.1042354,54.1687797 C66.1042354,54.8068759 65.8420779,55.4170329 65.379023,55.8559494 C49.6603823,70.7583797 22.9167115,70.6430313 22.9167115,70.6430313 L22.9167115,36.7103595 C22.9167115,36.7103595 47.0676354,38.9427949 64.8033575,22.4712608 C65.0285788,22.2612658 65.3574018,22.2053873 65.6393788,22.3288608 C65.9213558,22.4523342 66.1042354,22.7308253 66.1042354,23.0390582 L66.1042354,54.1687797 Z" id="Path" fill="#1B90FB" fill-rule="nonzero"></path>
<path d="M57.7800584,41.8836253 C57.7800584,41.8836253 60.1998354,39.075281 60.6836106,38.4948658 C61.1673858,37.9135494 61.5628743,34.5247899 62.4295257,33.6532658 C63.296177,32.7817418 66.0339664,31.2739241 66.757377,31.355038 C67.7798814,31.4704 68.8699522,35.8550582 68.4978867,39.0013772 C68.1555504,41.8944405 66.5501735,42.8741165 64.142108,43.2616608 C62.888977,43.4635443 60.5124425,46.2637772 60.3187522,47.0379646 L57.7800584,41.8836253 Z" id="Path" fill="#F1B282" fill-rule="nonzero"></path>
<path d="M27.5085221,31.9309468 C27.5085221,31.9309468 27.8409487,26.9343291 26.1130513,26.3872608 C24.385154,25.8401924 16.1871009,23.3860456 15.0826159,25.0326582 C13.9790319,26.6792709 13.8150708,30.9999392 13.8150708,30.9999392 L27.5085221,31.9309468 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
<path d="M33.0913062,4.272 C32.9489664,-0.794916456 11.855646,-1.93141266 11.3988973,9.17398481 C11.1358389,15.5846886 12.8168903,20.892243 14.2952425,20.8733165 C18.1726513,20.8228456 15.8015221,14.053438 18.0447257,13.7542177 C20.5392761,13.4207494 18.0231044,24.7920203 24.3563257,24.123281 C34.9786602,23.0003038 32.2057363,15.0691646 25.6256726,16.3372456 C19.0456088,17.6053266 20.6951292,10.2726278 26.1788159,8.90090127 C31.6616018,7.52737215 33.194908,7.96538734 33.0913062,4.272 Z" id="Path" fill="#0B224E" fill-rule="nonzero"></path>
<path d="M7.34941947,79.5511291 C7.34941947,79.5511291 6.88546372,96.574238 9.19082832,113.829873 L3.74768142,153.827149 C3.70353805,154.149803 3.79723009,154.475159 4.00443363,154.725711 C4.21163717,154.976263 4.5152354,155.127676 4.83955398,155.1448 L14.0781292,155.614359 C14.6186602,155.641397 15.1042372,155.292608 15.2528832,154.772577 C16.7123168,149.656992 23.9617381,123.890704 24.4833504,115.185377 C25.0644212,105.502177 27.1932124,79.7449013 22.5473487,77.0338937 C17.901485,74.3228861 7.94490442,71.5983595 7.34941947,79.5511291 Z" id="Path" fill="#0B224E" fill-rule="nonzero"></path>
<path d="M13.0628319,78.5831696 C14.3592053,88.772881 23.3230106,117.509742 25.4518018,121.382481 L26.7553823,155.848689 C26.7851115,156.627382 27.3869027,157.262775 28.1625646,157.333073 L35.8615274,158.033357 C36.2786372,158.07121 36.6939451,157.938724 37.0119575,157.664739 C37.3299699,157.390754 37.5227593,157.000506 37.5479841,156.581418 L39.7767735,118.846319 C39.7767735,118.846319 37.2606018,80.7119595 32.6138372,76.8392203 C27.9670726,72.966481 12.3970779,73.3513215 13.0628319,78.5831696 Z" id="Path" fill="#102B5E" fill-rule="nonzero"></path>
<path d="M12.9592301,52.5113519 C15.7285504,50.4420456 18.9293947,47.7193215 19.9978442,45.5139241 C22.0113221,41.3563848 20.8464779,23.5464709 13.4312938,28.9684861 C6.01610973,34.3905013 0.362155752,50.7241418 0.665753982,56.2452962 C0.969352212,61.7664506 25.7806248,72.8943797 25.7806248,72.8943797 L27.9031097,63.9087595 C27.9031097,63.9078582 17.8528372,56.1569722 12.9592301,52.5113519 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
<path d="M63.0241097,45.171443 L59.0079646,39.8674937 C58.7548159,39.5331241 58.2818513,39.4610228 57.9404159,39.7052658 C55.9945044,41.0977215 49.8567752,45.5788152 45.6649575,49.5768304 C42.1596142,43.3589975 33.1904035,28.3736506 27.9688743,28.0365772 C25.1067628,27.1650532 15.9663841,25.9059848 12.2889717,29.392081 C8.61065841,32.8781772 9.96558938,41.3996456 9.38541947,54.5680405 C8.80434867,67.7373367 3.19093451,79.9377722 7.64310796,81.8745924 C12.0952814,83.8114127 16.5474549,78.9698127 22.5491504,79.1635848 C28.5499451,79.357357 35.9209858,82.8434532 36.4948496,78.0018532 C37.0110566,73.6415291 32.3705982,62.8497722 32.8525717,54.2390785 C37.1993416,58.9328709 42.5028513,63.8159291 45.1982991,63.0904101 C49.7153363,61.8737013 60.7791044,48.8044456 63.0024885,46.1348962 C63.2313133,45.8582076 63.241223,45.4589468 63.0241097,45.171443 Z" id="Path" fill="#2CCD7F" fill-rule="nonzero"></path>
<path d="M33.9003009,64.2827848 C30.4391009,61.5483443 23.8653434,54.6852051 25.6463929,42.9489215 C25.6463929,42.9489215 26.3202549,43.9871797 27.4661805,45.7915139 C28.7436354,47.7824101 30.610269,50.7187342 32.8318513,54.2201519 C32.8318513,54.2201519 32.8318513,54.2282633 32.8399593,54.2282633 L32.8399593,54.2363747 C32.6534761,57.4268557 33.1877009,60.9282734 33.9003009,64.2827848 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
</g>
<g id="check_2_" transform="translate(446.893805, 23.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#DBFEED" cx="25.0725292" cy="24.9245063" rx="24.7743363" ry="24.7848101"></ellipse>
<ellipse id="Oval" fill="#9AEEC5" cx="25.0725292" cy="24.9245063" rx="19.2690283" ry="19.2771747"></ellipse>
<ellipse id="Oval" fill="#60DFA0" cx="25.0725292" cy="24.9245063" rx="13.7637204" ry="13.7695392"></ellipse>
<path d="M23.6383204,30.4321418 C23.6194018,30.4321418 23.5995823,30.4321418 23.5806637,30.4321418 C23.1986885,30.415919 22.8410372,30.2410734 22.5941947,29.9508658 L18.4654389,25.1317975 C17.9690513,24.5558886 18.0366177,23.6852658 18.6149858,23.1904709 C19.1942549,22.7010835 20.0609062,22.7659747 20.5545912,23.3409823 L23.7230035,27.0379747 L31.0453965,19.8116253 C31.5841257,19.2789772 32.4597858,19.2870886 32.991308,19.8251443 C33.5246319,20.3686076 33.5192265,21.2401316 32.9777947,21.7745823 L24.604069,30.0364861 C24.3473168,30.2897418 24.0004761,30.4321418 23.6383204,30.4321418 Z" id="Path" fill="#FFFFFF"></path>
</g>
<g id="plant_13_" transform="translate(46.000000, 234.797468)" fill-rule="nonzero">
<path d="M69.5330035,53.0530127 C69.1789558,53.0530127 68.8726549,52.7889418 68.8240071,52.4275342 C65.7591965,27.7085165 68.1564513,12.8727797 75.9482053,8.33941266 C83.4336584,3.98629873 92.8938513,10.8981063 93.2830336,11.1973266 C93.6028478,11.4298532 93.6650088,11.8786835 93.428977,12.1914228 C93.1929451,12.5077671 92.7334938,12.5735595 92.4353009,12.3374278 C92.3452124,12.2680304 83.3579841,5.67617215 76.6581027,9.57324557 C71.6744071,12.4762228 66.5177416,22.2387342 70.2429009,52.2535899 C70.2915487,52.6429367 70.0131752,52.9980354 69.6239929,53.0467038 C69.5888584,53.0494076 69.560931,53.0530127 69.5330035,53.0530127 Z" id="Path" fill="#2CCD7F"></path>
<path d="M54.1738159,114.058795 L61.3106265,139.114886 C61.8250319,140.921023 66.3871133,142.334208 71.9383664,142.334208 C77.4896195,142.334208 82.0517009,140.921023 82.5661062,139.114886 L89.7029168,114.058795 L54.1738159,114.058795 Z" id="Path" fill="#C3D3F3"></path>
<path d="M89.7317451,113.853306 C89.7317451,113.922704 89.7218354,113.9912 89.7029168,114.058795 C89.1704938,115.928922 81.4210814,117.413306 71.9392673,117.413306 C62.4574531,117.413306 54.7080407,115.929823 54.1756177,114.058795 C54.1566991,113.990299 54.1467894,113.921803 54.1467894,113.853306 C54.1467894,111.886744 62.113315,110.293306 71.9401681,110.293306 C81.7670212,110.293306 89.7317451,111.887646 89.7317451,113.853306 Z" id="Path" fill="#DAE7FF"></path>
<path d="M70.4528071,113.826268 C70.7627115,96.5814481 70.6203717,79.2627241 69.4005735,62.0611646 C68.6807664,53.5036456 67.9627611,44.8001215 65.5105522,36.6842228 C64.8267805,34.7474025 64.0745416,32.6348354 62.7277186,31.4064101 C61.4881009,30.002238 59.6611062,30.8070684 58.3214903,32.4311494 C55.5638814,35.4548962 53.7693186,39.5015797 51.9477292,43.3454785 L51.9288106,43.3851342 C51.7603451,43.7402329 51.3360283,43.8916456 50.9810796,43.7231089 C50.6288336,43.5554734 50.477485,43.1363848 50.6396442,42.7821873 C52.4612336,38.8265316 54.1242673,34.7582177 57.1575469,31.3090734 C57.8719487,30.4177215 58.8890478,29.7048203 60.0674053,29.1676658 C61.4340478,28.8107646 62.9493363,29.1965063 63.8565274,30.1176 C65.7402779,31.8597468 66.4276531,34.0408101 67.2258372,36.1074127 C69.9086726,44.557681 70.7248743,53.2476861 71.5897239,61.8818127 C73.0752832,79.1924253 73.4743752,96.5219646 73.4221239,113.881246 C73.4194212,114.702299 72.7527664,115.364729 71.9320602,115.36293 C71.111354,115.360223 70.4492035,114.693286 70.4510053,113.872233 C70.4528071,113.866825 70.4528071,113.831676 70.4528071,113.826268 Z" id="Path" fill="#2CCD7F"></path>
<path d="M71.8266566,90.3095392 C71.4302673,90.3095392 71.1176602,89.9895899 71.1176602,89.596638 C71.1176602,70.4537519 73.7167133,59.9053367 78.840046,58.2434025 C83.5732956,56.6932253 88.3137522,63.1904506 88.5155504,63.4653367 C88.7452761,63.7852861 88.6750071,64.2269063 88.3560938,64.4594329 C88.0362796,64.6892557 87.5912425,64.618957 87.3624177,64.2999089 C87.3137699,64.2404253 83.053485,58.3930127 79.278777,59.5962025 C76.2067593,60.5975089 72.536554,66.612557 72.536554,89.596638 C72.5356531,89.9895899 72.223046,90.3095392 71.8266566,90.3095392 Z" id="Path" fill="#2CCD7F"></path>
<path d="M68.3411327,40.6407797 C68.3411327,40.6407797 70.7230726,25.8329823 58.4845504,11.307281 C58.4845504,11.307281 65.0159664,26.8577215 68.3411327,40.6407797 Z" id="Path" fill="#2CCD7F"></path>
<path d="M87.939885,63.8817215 C83.3850106,55.6937215 92.2028726,46.1267848 98.9450956,46.1267848 C105.687319,46.1267848 114.907876,56.2371848 114.907876,56.2371848 C114.907876,56.2371848 98.9450956,54.5581266 98.9450956,56.8401316 C98.9450956,59.1221367 112.528639,55.1538633 117.981696,57.8324253 C123.434752,60.5109873 124.327529,68.3465924 124.327529,68.3465924 C124.327529,68.3465924 102.018915,63.1886481 101.919818,64.9740557 C101.82072,66.7594633 124.228432,66.9577418 125.715793,71.4217114 C127.203154,75.885681 126.707667,80.0513316 126.707667,80.0513316 C126.707667,80.0513316 105.787317,70.7277367 105.191832,73.9010937 C104.597248,77.0753519 126.786945,77.6701873 126.786945,83.7212861 C126.786945,89.7723848 123.039264,101.476223 123.93114,103.46081 C123.93114,103.46081 111.041278,107.825641 107.869262,103.46081 C104.696345,99.0959797 104.101761,86.5981266 101.523428,86.5981266 C98.9450956,86.5981266 100.036067,102.181914 105.985512,105.400334 C105.985512,105.400334 94.2857186,107.824739 93.0956496,100.48483 C91.9055805,93.1449215 94.7812053,80.4478886 92.6992602,79.5556354 C90.617315,78.6633823 85.7588425,92.9538532 92.0055788,103.163392 C92.0055788,103.163392 83.0823133,104.849661 82.0904389,96.9140152 C81.0985646,88.9783696 86.2543292,75.9559797 84.767869,75.9559797 C83.2814088,75.9559797 75.1500212,88.0861165 75.7455062,95.0294684 C75.7455062,95.0294684 66.0285611,87.9869772 68.0114088,83.2255899 C69.9942566,78.4642025 77.5301593,72.9097013 76.2409929,71.8182684 C74.9518265,70.7268354 66.2267558,77.1744911 65.731269,80.9435848 C65.731269,80.9435848 61.0709912,70.2311392 70.1933522,61.7006582 C77.0490867,55.2872506 87.939885,63.8817215 87.939885,63.8817215 Z" id="Path" fill="#45D48F"></path>
<path d="M118.215025,36.6139241 C118.215025,36.6139241 123.626641,27.639119 119.994273,22.8921519 C111.987207,12.3599595 104.054014,15.1782177 104.128788,13.3243139 C104.20266,11.4704101 116.806041,12.5825722 119.40149,16.5138937 C119.40149,16.5138937 119.253745,6.27821772 114.656529,6.27821772 C110.059313,6.27821772 104.20266,8.50344304 103.758524,7.09386329 C103.313487,5.68428354 113.989874,4.64602532 113.989874,4.64602532 C113.989874,4.64602532 106.138662,-0.397458228 99.4252673,0.195574684 C91.165954,0.9256 92.8605186,11.7660253 92.8605186,11.7660253 C92.8605186,11.7660253 86.4849558,0.6408 80.6274018,6.20341266 C74.7707487,11.7660253 76.8463876,17.9225722 79.2184177,21.631281 C80.7012743,17.403443 85.1489434,11.6182177 86.1876637,13.1386532 C87.2254832,14.6590886 75.512177,25.0425722 83.7408602,30.9765063 C85.0750708,24.7460557 90.0425504,15.3269266 91.4515345,17.2547342 C93.0587133,17.688243 83.6669876,29.9094076 86.3363097,34.3138937 C89.0056319,37.2808608 92.8605186,38.8382481 92.8605186,38.8382481 C92.8605186,38.8382481 94.3433752,20.8147342 97.3090885,22.6695392 C100.274802,24.5243443 91.0073982,35.0556354 95.7523593,40.2478278 C100.49732,45.4400203 109.319687,44.9947949 110.134988,47.5904405 C110.134988,47.5904405 118.142053,41.5086987 116.807842,36.9843443 C115.002469,30.8638481 105.835064,27.639119 106.502619,26.1186835 C107.168373,24.5982481 117.473596,27.0460861 118.215025,36.6139241 Z M104.128788,18.3677975 C103.906269,17.1808304 105.018862,16.1425722 110.134087,17.6999595 C115.249312,19.2573468 118.511416,27.0451848 118.511416,27.0451848 C114.730402,20.1477975 104.351306,19.5547646 104.128788,18.3677975 Z" id="Shape" fill="#7BE6B1"></path>
<path d="M25.3373894,64.1214582 C26.1238619,66.812638 10.0763982,70.216719 5.72332212,80.069357 C2.50536106,87.3524861 14.5871292,99.2762329 14.5871292,99.2762329 C16.5168248,95.1078785 31.1895381,97.7729215 40.2614496,90.1139646 C49.3333611,82.4550076 36.1092708,62.8074127 41.4767434,60.3478582 C46.8442159,57.8892051 45.4082053,88.3835342 45.4082053,88.3835342 C45.4082053,88.3835342 52.2008779,86.6152506 57.3134,82.2296911 C62.7394301,75.4368506 49.6747965,52.9349468 52.458531,52.5582177 C55.2359593,49.6363139 61.5034159,66.4863797 62.3826796,77.2069367 C77.4490796,69.0649013 60.0971345,49.1325063 62.1655664,46.8126481 C64.2339982,44.4927899 70.4230779,55.1457519 71.9852124,62.5460456 C76.7635062,56.8536506 81.5769345,47.0001114 72.9815912,36.4129418 C64.3862478,25.8257722 51.2936867,43.0633823 51.2936867,43.0633823 C51.2936867,43.0633823 56.4872885,25.2850127 42.8190619,22.2648709 C31.7093487,19.8107241 17.4699611,26.5449823 17.4699611,26.5449823 C17.4699611,26.5449823 35.1164956,30.6069873 34.0651628,32.8691646 C33.0138301,35.1313418 23.6932743,30.1320203 15.997915,29.1316152 C8.30255575,28.1312101 5.83052743,45.2345316 5.83052743,45.2345316 C11.0286336,39.2185823 32.3696973,40.0982177 32.090423,43.2184 C31.8111487,46.3385823 19.1447062,39.8945316 3.45038938,55.7829468 C-3.66299823,62.9389975 3.44588496,79.1410532 3.44588496,79.1410532 C6.7665469,63.2850835 24.5509168,61.4302785 25.3373894,64.1214582 Z M5.02964071,63.0597671 C5.02964071,63.0597671 12.1835681,50.7322532 21.0861133,49.2379544 C29.9886584,47.7436557 31.6246655,49.7237367 30.994046,51.6623595 C30.3634265,53.600081 12.8592319,52.3347038 5.02964071,63.0597671 Z" id="Shape" fill="#9AEEC5"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

View File

@@ -0,0 +1,19 @@
export const HOME_URL = "/home";
export const HOME_NAME = "Home";
export const LOGIN_URL = "/login";
export const LOGIN_NAME = "Login";
export const LAYOUT_NAME = "Layout";
export const REDIRECT_NAME = "Redirect";
export const NOT_FOUND = "NotFound";
export const FORBIDDEN_NAME = "Forbidden";
export const FORBIDDEN_URL = "/403";
export const SERVER_ERROR_NAME = "ServerError";
export const SERVER_ERROR_URL = "/404";
export const GATEWAY_TIMEOUT_NAME = "GatewayTimeout";
export const GATEWAY_TIMEOUT_URL = "/500";
export const TEST_URL = "/test";
export const TEST_NAME = "test";
// 移动端最大宽度
export const mobileMaxWidthMedia = "(max-width: 960px)";

View File

@@ -0,0 +1,3 @@
export * from "./constant";
export * from "./symbols";
export * from "./service";

View File

@@ -0,0 +1,214 @@
import type { ServiceConfig } from "./types";
import {
ElementPlusSizeEnum,
HeaderMenuAlignEnum,
HeaderStyleEnum,
LanguageEnum,
LayoutModeEnum,
MenuThemeEnum,
PageTransitionEnum,
GlobalThemeEnum,
TabNavElementModeEnum,
ThemePanelTriggerPositionEnum,
TitleModeEnum,
MenuShowModeEnum,
HeaderShowModeEnum,
MenuStyleEnum,
} from "@/common/enums";
export const defaultServiceConfig: ServiceConfig = {
layout: {
name: "Teek Design Vue3",
avatar: "/avatar.png",
titleMode: TitleModeEnum.ProjectPage,
layoutMode: LayoutModeEnum.Vertical,
maximize: false,
watermark: false,
moreRouteChildrenHideInMenuThenOnlyOne: false,
tooltipEffect: isDark => (isDark ? "light" : "dark"),
elementPlusSize: ElementPlusSizeEnum.Default,
language: LanguageEnum.ZhCn,
watchFrame: false,
lockSecretKey: "my-secret-key",
errorLog: {
showInHeader: true,
printConsole: true,
env: [],
},
themePanelTriggerPosition: ThemePanelTriggerPositionEnum.Header,
globalAlert: {
enabled: false,
text: "Teek Design Vue3 祝您圣诞快乐,愿节日的欢乐与祝福如雪花般纷至沓来!",
startDate: "2025-12-25",
endDate: "2025-12-25",
type: "primary",
closable: true,
showIcon: false,
},
},
theme: {
// 默认与 css var 一致,在这里配置一份,方便生成 1 - 9 的基础色
primaryColor: {
[GlobalThemeEnum.System]: "", // 跟随系统即自动获取系统预设的主题色
[GlobalThemeEnum.Light]: "#395ae3",
[GlobalThemeEnum.DarkBlue]: "#4a8fe1",
[GlobalThemeEnum.DarkDeep]: "#4a6bc5",
[GlobalThemeEnum.DarkMidnight]: "#3a7fdb",
[GlobalThemeEnum.DarkNeutral]: "#6d94e6",
},
globalThemeMode: GlobalThemeEnum.System,
defaultDarkMode: GlobalThemeEnum.DarkNeutral,
globalThemeClassName: {
[GlobalThemeEnum.Light]: "",
[GlobalThemeEnum.DarkBlue]: "dark-blue",
[GlobalThemeEnum.DarkDeep]: "dark-deep",
[GlobalThemeEnum.DarkMidnight]: "dark-midnight",
[GlobalThemeEnum.DarkNeutral]: "dark-neutral",
},
radius: 0.75,
weakMode: false,
greyMode: false,
presetsColor: {
[GlobalThemeEnum.Light]: [
"#4a6cf7", // 鲜艳蓝
"#ff6b6b", // 珊瑚粉
"#00bbf9", // 天蓝
"#00f5d4", // 蓝绿
"#708090", // 石板灰
"#f15bb5", // 粉红
"#8ac926", // 黄绿
"#ff9e6b", // 橙红
"#ffd166", // 浅黄
],
[GlobalThemeEnum.DarkBlue]: [
"#5a8fe6", // 亮蓝
"#ff6b6b", // 珊瑚粉
"#1abc9c", // 蓝绿
"#708090", // 石板灰
"#f1c40f", // 明黄
"#2980b9", // 深蓝
"#ff69b4", // 热粉
"#d35400", // 深橙
"#9b59b6", // 紫色
],
[GlobalThemeEnum.DarkDeep]: [
"#db7093", // 深蓝紫
"#8e44ad", // 紫罗兰
"#16a085", // 蓝绿
"#708090", // 石板灰
"#f1c40f", // 明黄
"#2c3e50", // 钢蓝
"#c0392b", // 深红
"#2980b9", // 深蓝
"#27ae60", // 绿松石
],
[GlobalThemeEnum.DarkMidnight]: [
"#ff6b6b", // 珊瑚粉
"#1abc9c", // 蓝绿
"#708090", // 石板灰
"#f1c40f", // 明黄
"#2c3e50", // 钢蓝
"#ff69b4", // 热粉
"#d35400", // 深橙
"#2980b9", // 深蓝
"#27ae60", // 绿松石
],
[GlobalThemeEnum.DarkNeutral]: [
"#ff6b6b", // 珊瑚粉
"#42aaff", // 中性天蓝
"#4cd890", // 中性蓝绿
"#708090", // 石板灰
"#ff9e6b", // 中性橙
"#ff69b4", // 热粉
"#5a7fd9", // 中性蓝紫
"#db7093", // 紫红
"#9b59b6", // 紫色
],
},
},
header: {
enabled: true,
height: 55,
style: HeaderStyleEnum.Page,
menuAlign: HeaderMenuAlignEnum.Start,
showMode: HeaderShowModeEnum.Fixed,
},
menu: {
enabled: true,
width: 240,
accordion: false,
collapsed: false,
collapseWidth: 64,
theme: MenuThemeEnum.Light,
style: MenuStyleEnum.Simple,
showMode: MenuShowModeEnum.Static,
autoActivateChild: true,
showModeAutoFixed: true,
rightClickMenuCollapseToClose: true,
},
tabNav: {
enabled: true,
elementMode: TabNavElementModeEnum.Simple,
showIcon: true,
showDot: true,
persistence: false,
fixed: true,
draggable: true,
height: 38,
middleClickToClose: false,
middleClickToOpen: false,
middleClickToOpenInNewWindow: true,
showMore: true,
wheel: true,
maxCount: 0,
},
breadcrumb: {
enabled: true,
showIcon: true,
hideOnlyOne: false,
showHome: true,
onlyShowHomeIcon: false,
},
logo: {
enable: true,
source: "/logo.png",
},
transition: {
pageEnter: PageTransitionEnum.SlideLeft,
progress: true,
loading: true,
},
widget: {
menuCollapse: true,
refresh: true,
search: true,
fullscreen: true,
notification: true,
language: true,
theme: true,
lockScreen: true,
},
shortcutKey: {
enable: true,
search: true,
logout: true,
lockScreen: true,
},
router: {
whiteList: [""],
routeUseI18n: true,
nameI18nPrefix: "_route",
isKeepAlive: false,
isFull: false,
cacheDynamicRoutes: false,
routeUseTooltip: false,
},
cache: {
cacheKeyPrefix: "teek",
tabNavCacheKey: "tabNav",
cacheDynamicRoutesKey: "dynamicRoutes",
versionCacheKey: "version",
tabExcludesUrlKey: ["layoutMode"],
cleanCacheWhenUpgrade: false,
},
} as ServiceConfig;

View File

@@ -0,0 +1,27 @@
import type { ServiceConfig } from "./types";
/**
* 根据环境变量创建配置
*/
export const defineEnvServiceConfig = (): DeepPartial<ServiceConfig> => {
const isDev = import.meta.env.MODE === "development";
const isTest = import.meta.env.MODE === "test";
const isProd = import.meta.env.MODE === "production";
// 本地环境
if (isDev) {
return {} as DeepPartial<ServiceConfig>;
}
// 测试环境
if (isTest) {
return {} as DeepPartial<ServiceConfig>;
}
// 生产环境
if (isProd) {
return {} as DeepPartial<ServiceConfig>;
}
return {};
};

View File

@@ -0,0 +1,10 @@
import type { ServiceConfig } from "./types";
import { defineServiceConfig } from "./override-config";
export { defaultServiceConfig } from "./base-config";
// 可以在这里覆盖框架默认的配置
const overrideServiceConfig: DeepPartial<ServiceConfig> = {};
// 冻结对象防止运行时修改
export const serviceConfig = Object.freeze(defineServiceConfig(overrideServiceConfig));

View File

@@ -0,0 +1,70 @@
import type { ServiceConfig } from "./types";
import { defaultServiceConfig } from "./base-config";
import { defineEnvServiceConfig } from "./env-config";
export const defineServiceConfig = (overrideServiceConfig: DeepPartial<ServiceConfig> = {}): ServiceConfig => {
const envServiceConfig = defineEnvServiceConfig();
return {
layout: {
...defaultServiceConfig.layout,
...envServiceConfig?.layout,
...overrideServiceConfig.layout,
},
tabNav: {
...defaultServiceConfig.tabNav,
...envServiceConfig?.tabNav,
...overrideServiceConfig.tabNav,
},
breadcrumb: {
...defaultServiceConfig.breadcrumb,
...envServiceConfig?.breadcrumb,
...overrideServiceConfig.breadcrumb,
},
header: {
...defaultServiceConfig.header,
...envServiceConfig?.header,
...overrideServiceConfig.header,
},
menu: {
...defaultServiceConfig.menu,
...envServiceConfig?.menu,
...overrideServiceConfig.menu,
},
theme: {
...defaultServiceConfig.theme,
...envServiceConfig?.theme,
...overrideServiceConfig.theme,
},
logo: {
...defaultServiceConfig.logo,
...envServiceConfig?.logo,
...overrideServiceConfig.logo,
},
transition: {
...defaultServiceConfig.transition,
...envServiceConfig?.transition,
...overrideServiceConfig.transition,
},
widget: {
...defaultServiceConfig.widget,
...envServiceConfig?.widget,
...overrideServiceConfig.widget,
},
shortcutKey: {
...defaultServiceConfig.shortcutKey,
...envServiceConfig?.shortcutKey,
...overrideServiceConfig.shortcutKey,
},
router: {
...defaultServiceConfig.router,
...envServiceConfig?.router,
...overrideServiceConfig.router,
},
cache: {
...defaultServiceConfig.cache,
...envServiceConfig?.cache,
...overrideServiceConfig.cache,
},
} as ServiceConfig;
};

View File

@@ -0,0 +1,287 @@
import type {
HeaderStyleEnum,
LanguageEnum,
LayoutModeEnum,
ElementPlusSizeEnum,
MenuThemeEnum,
PageTransitionEnum,
GlobalThemeEnum,
TabNavElementModeEnum,
TitleModeEnum,
HeaderMenuAlignEnum,
ThemePanelTriggerPositionEnum,
MenuShowModeEnum,
HeaderShowModeEnum,
MenuStyleEnum,
} from "@/common/enums";
export interface ServiceConfig {
/** 全局配置 */
layout: LayoutConfig;
/** 主题配置 */
theme: ThemeConfig;
/** 顶栏配置 */
header: headerConfig;
/** 菜单栏配置 */
menu: MenuConfig;
/** 标签栏配置 */
tabNav: TabNavConfig;
/** 面包屑配置 */
breadcrumb: BreadcrumbConfig;
/** Logo 配置 */
logo: LogoConfig;
/** 动画配置 */
transition: TransitionConfig;
/** 小部件配置 */
widget: WidgetConfig;
/** 快捷键配置 */
shortcutKey: ShortcutKeyConfig;
/** 路由配置 */
router: RouterConfig;
/** 缓存配置 */
cache: CacheConfig;
}
export interface LayoutConfig {
/** 系统名称 */
name: string;
/** 默认头像 */
avatar: string;
/** 标题在浏览器标签上的多种模式 */
titleMode: TitleModeEnum;
/** 布局设置 */
layoutMode: LayoutModeEnum;
/** PageContent 是否开启最大化默认不开启false */
maximize: boolean;
/** 是否开启水印 */
watermark: boolean;
/** El 组件尺寸 */
elementPlusSize: ElementPlusSizeEnum;
/**
* 这是路由和菜单呼应可能产生的问题而需要配置alwaysShowRoot 为 false 情况(确保您了解路由的配置规则,如果不了解,前往 router/router-config 查看)
* true存在多个二级路由但是只有一个二级路由 hideInMenu 为 false举例有 5 个二级路由,但是有 4 个二级路由 hideInMenu: true则需要开启 true确保菜单只渲染剩下的路由
*
* 为 true 的场景较少见,如果真的遇到,则开启为 true否则不建议开启虽然 true 能无需后顾之忧,但是会多重复一次过滤递归,即消耗点性能
*
* 如果看不懂这个配置没关系,当您配置路由时遇到为 true 的场景时,自然懂得
*/
moreRouteChildrenHideInMenuThenOnlyOne: boolean;
/** 布局的 el-toolTip 风格 */
tooltipEffect: "light" | "dark" | ((isDark: boolean) => "light" | "dark");
/** 国际化 */
language: LanguageEnum;
/** 是否监听 IFrame 传来的通信,用于 Portal 门户系统,来监听门户所有 IFrame 嵌入系统的通信,比如 A 系统想打开 B 系统,则告诉 Portal 门户帮忙打开 */
watchFrame: boolean;
/** 锁屏密钥 */
lockSecretKey: string;
errorLog: {
/** 是否在顶部显示错误日志图标 */
showInHeader: boolean;
/** 是否打印错误日志到控制台 */
printConsole: boolean;
/** 日志收集的环境,对应 .evn.xxx如 development、test、production */
env: string[];
};
/** 主题面板触发按钮位置 */
themePanelTriggerPosition: ThemePanelTriggerPositionEnum;
/** 全局提示配置 */
globalAlert?: {
/** 是否启用提示,默认为 true */
enabled?: boolean;
/** 开始时间,默认当天 */
startDate?: string;
/** 结束时间,默认为 startDate */
endDate?: string;
/** 提示文本 */
text?: string;
/** 类型,默认 primary */
type?: "primary" | "success" | "warning" | "danger" | "error" | "info" | "secondary";
/** 是否可以关闭,默认 false */
closable?: boolean;
/** 是否显示类型图标,默认 false */
showIcon?: boolean;
};
}
export interface ThemeConfig {
/** 主题色 */
primaryColor: Partial<Record<GlobalThemeEnum, string>>;
/** 系统主题 */
globalThemeMode: GlobalThemeEnum;
/** 指定当切换为暗色模式html class 为 dark或跟随系统时使用的实际暗色模式 */
defaultDarkMode: GlobalThemeEnum;
/** 不同主题模式在 html 的 className */
globalThemeClassName: Partial<Record<GlobalThemeEnum, string>>;
/** 圆角 */
radius: number;
/** 是否开启灰色主题 */
weakMode: boolean;
/** 是否开启色弱主题 */
greyMode: boolean;
/** 预设颜色 */
presetsColor: Partial<Record<GlobalThemeEnum, string[]>>;
}
export interface headerConfig {
/** 是否使用顶栏 */
enabled: boolean;
/** 顶部高度 */
height: number;
/** 顶部样式 */
style: HeaderStyleEnum;
/** 菜单显示模式 */
showMode: HeaderShowModeEnum;
/** 顶部菜单样式 */
menuAlign: HeaderMenuAlignEnum;
}
export interface MenuConfig {
/** 是否使用菜单栏 */
enabled: boolean;
/** 菜单宽度 */
width: number;
/** 是否开启菜单手风琴 */
accordion: boolean;
/** 是否折叠菜单栏 */
collapsed: boolean;
/** 菜单栏折叠宽度 */
collapseWidth: number;
/** 菜单栏的主题色,暗色和亮色,默认为暗色 */
theme: MenuThemeEnum;
/** 菜单样式,朴素和圆润,默认为朴素 */
style: MenuStyleEnum;
/** 菜单显示模式 */
showMode: MenuShowModeEnum;
/** 点击目录时自动激活子菜单,在分栏布局生效 */
autoActivateChild: boolean;
/** 当菜单显示模式为 Auto 时,是否固定菜单栏 */
showModeAutoFixed: boolean;
/** 鼠标右键点击关闭菜单栏 */
rightClickMenuCollapseToClose: boolean;
}
export interface TabNavConfig {
/** 是否使用 tagsNav */
enabled: boolean;
/** 标签栏元素模式设置 */
elementMode: TabNavElementModeEnum;
/** 标签栏 Icon 是否显示 */
showIcon: boolean;
/** 标签栏 Dot 是否显示,优先级低于 showTabNavDot仅在 elementMode 为 simple、classic 模式生效 */
showDot: boolean;
/** 是否记录打开过(没关闭)的 tags下次打开会加载在 tagsNav */
persistence: boolean;
/** 是否固定标签栏 */
fixed: boolean;
/** 是否开启多标签页拖拽 */
draggable: boolean;
/** 标签栏高度 */
height: number;
/** 是否点击中键时关闭标签,优先级低于 middleClickToOpen */
middleClickToClose: boolean;
/** 是否点击中键时打开标签页,优先级低于 middleClickToOpenWindow */
middleClickToOpen: boolean;
/** 是否点击中键时新窗口打开标签页 */
middleClickToOpenInNewWindow: boolean;
/** 显示更多按钮 */
showMore: boolean;
/** 是否开启鼠标滚轮响应 */
wheel: boolean;
/** 最大标签数超出后关闭最先打开的旧标签0 表示不限制 */
maxCount: number;
}
export interface BreadcrumbConfig {
/** 是否使用 Breadcrumb */
enabled: boolean;
/** 面包屑 Icon 是否显示 */
showIcon: boolean;
/** 面包屑是否只有一个时隐藏 */
hideOnlyOne: boolean;
/** 面包屑首页面包屑是否可见,当 onlyShowHomeIcon 为 true 则一定为 false */
showHome: boolean;
/** 是否只显示首页图标 */
onlyShowHomeIcon: boolean;
}
export interface LogoConfig {
/** 是否显示 Logo */
enable: boolean;
/** logo 地址 */
source: string;
}
export interface TransitionConfig {
/** 进入页面过渡动画 */
pageEnter: PageTransitionEnum;
/** 是否开启页面加载进度动画 */
progress: boolean;
/** 是否开启页面加载动画 */
loading: boolean;
}
export interface WidgetConfig {
/** 是否显示菜单栏折叠 */
menuCollapse: boolean;
/** 是否显示刷新图标 */
refresh: boolean;
/** 是否显示搜索框 */
search: boolean;
/** 是否显示全屏图标 */
fullscreen: boolean;
/** 是否显示通知图标 */
notification: boolean;
/** 是否显示国际化图标 */
language: boolean;
/** 是否显示暗黑切换图标 */
theme: boolean;
/** 是否显示锁屏按钮 */
lockScreen: boolean;
}
export interface ShortcutKeyConfig {
/** 是否启用快捷键 */
enable: boolean;
/** 是否启用全局搜索快捷键 */
search: boolean;
/** 是否启用全局注销快捷键 */
logout: boolean;
/** 是否启用全局锁屏快捷键 */
lockScreen: boolean;
}
export interface RouterConfig {
/**
* 白名单额三种模式:["*"]、["next"]、[to.path, ...]
* '*' 代表加载所有路由next 代表直接放行但不加载权限路由to.path 表示指定的路由可以放行,可以填多个
* 优先级:* > next > to.path
*/
whiteList: string[];
/** 「路由」布局是否使用国际化,默认为 false如果不使用则需要在路由中给需要在菜单中展示的路由设置 meta: {title: 'xxx'} 用来在菜单中显示文字 */
routeUseI18n: boolean;
/** 当使用路由国际化时,通过 name 属性读取国际化文本的前缀 */
nameI18nPrefix: string;
/** 路由是否开启缓存 */
isKeepAlive: boolean;
/** 是否全屏,不渲染 Layout 布局,只渲染当前路由组件 */
isFull: boolean;
/** 是否缓存路由默认不开启false */
cacheDynamicRoutes: boolean;
/** 菜单的文字超出后,是否使用 el-toolTip 提示,仅针二级路由及以上生效 */
routeUseTooltip: boolean;
}
export interface CacheConfig {
/** 缓存 key 前缀 */
cacheKeyPrefix: string;
/** 缓存标签栏的 key */
tabNavCacheKey: string;
/** 缓存版本号的 key */
versionCacheKey: string;
/** 当 URL 携带参数时,标签栏会出现多个重复且名字一样的 tab该配置可指定忽略哪些参数生成新的 tab如果为 * 则忽略所有参数 */
tabExcludesUrlKey: string[];
/** 缓存路由的 key */
cacheDynamicRoutesKey: string;
/** 是否在升级时清理所有缓存,默认 false */
cleanCacheWhenUpgrade: boolean;
}

View File

@@ -0,0 +1,21 @@
import type { InjectionKey, Ref } from "vue";
import type { ElementPlusSizeEnum } from "@/common/enums";
interface GlobalConfig {
size: Ref<ElementPlusSizeEnum>;
}
/** 全局配置 */
export const GlobalConfigKey: InjectionKey<GlobalConfig> = Symbol("GlobalConfig");
/** 刷新页面 */
export const RefreshPageKey: InjectionKey<(value?: boolean) => void> = Symbol("RefreshPage");
/** 刷新 IFrame */
export const RefreshIFrameKey: InjectionKey<() => void> = Symbol("RefreshIFrameKey");
/** 打开搜索对话框 */
export const OpenSearchDialogKey: InjectionKey<() => void> = Symbol("OpenSearchDialog");
/** 打开主题面板 */
export const OpenThemePanelKey: InjectionKey<() => void> = Symbol("OpenThemePanel");
/** 打开锁屏面板 */
export const OpenLockPanelKey: InjectionKey<() => void> = Symbol("OpenLockPanel");
/** 修改菜单区域状态 */
export const UpdateInMenuAreaStateKey: InjectionKey<(state?: boolean) => void> = Symbol("UpdateInMenuAreaStateKey");

View File

@@ -0,0 +1,34 @@
import type { App } from "vue";
import copy from "./modules/copy";
import waterMarker from "./modules/water-marker";
import draggable from "./modules/draggable";
import debounce from "./modules/debounce";
import throttle from "./modules/throttle";
import longPress from "./modules/long-press";
import waves from "./modules/waves";
import role from "./modules/permission/role";
import auth from "./modules/permission/auth";
const directivesList: Recordable = {
// Custom directives
copy,
waterMarker,
draggable,
debounce,
throttle,
longPress,
waves,
role,
auth,
};
const directives = {
install: function (app: App<Element>) {
Object.keys(directivesList).forEach(key => {
// 注册所有自定义指令
app.directive(key, directivesList[key]);
});
},
};
export default directives;

View File

@@ -0,0 +1,76 @@
import type { Directive, DirectiveBinding } from "vue";
import { ElMessage } from "element-plus";
interface CopyEl extends HTMLElement {
__copyData__?: string | number;
__handleCopyClick__?: (this: HTMLElement, ev: MouseEvent) => void;
}
/**
* 复制文本到剪贴板
* @param text 需要复制的文本
*/
async function copyToClipboard(text: string | number): Promise<boolean> {
if (!text && text !== 0) return false;
const str = String(text);
if (navigator.clipboard && window.isSecureContext) {
try {
await navigator.clipboard.writeText(str);
return true;
} catch {
return false;
}
} else {
// fallback
const input = document.createElement("input");
input.value = str;
input.style.position = "fixed";
input.style.opacity = "0";
document.body.appendChild(input);
input.select();
try {
const result = document.execCommand("copy");
document.body.removeChild(input);
return result;
} catch {
document.body.removeChild(input);
return false;
}
}
}
/**
* v-copy
* 复制某个值至剪贴板
* 接收参数string类型、Ref<string>类型、Reactive<string>类型
*/
const copy: Directive = {
mounted(el: CopyEl, binding: DirectiveBinding) {
el.__copyData__ = binding.value;
// 如果值为 false则不进行复制
if (binding.value === false) return;
el.__handleCopyClick__ = async function () {
if (!el.__copyData__ && el.__copyData__ !== 0) {
ElMessage({ type: "error", message: "复制失败,内容为空" });
return;
}
const success = await copyToClipboard(el.__copyData__);
if (success) ElMessage({ type: "success", message: "复制成功" });
else ElMessage({ type: "error", message: "复制失败" });
};
el.addEventListener("click", el.__handleCopyClick__);
},
updated(el: CopyEl, binding: DirectiveBinding) {
el.__copyData__ = binding.value;
},
beforeUnmount(el: CopyEl) {
if (el.__handleCopyClick__) {
el.removeEventListener("click", el.__handleCopyClick__);
delete el.__handleCopyClick__;
}
delete el.__copyData__;
},
};
export default copy;

View File

@@ -0,0 +1,51 @@
/**
* v-debounce
* 按钮防抖指令,可扩展至 input 等场景
* 接收参数function 类型或者 {onClick: function, time: 1000, debounceClass: 'is-debouncing'}
*
* <button v-debounce="debounceClick">防抖提交</button>
* <button v-debounce="{onClick: debounceClick, time: 1000, debounceClass: 'is-debouncing'}">防抖提交</button>
*/
import type { Directive, DirectiveBinding } from "vue";
interface ElType extends HTMLElement {
__handleClick__?: () => any;
__debounceTimer__?: ReturnType<typeof setTimeout> | null;
}
const debounce: Directive = {
mounted(el: ElType, binding: DirectiveBinding) {
const { value } = binding;
if (typeof value !== "function" && typeof value?.onClick !== "function") {
throw Error("v-debounce: callback must be a function");
}
const onClick = value.onClick || value;
const time = value.time || 500;
const debounceClass = value.debounceClass || "is-debouncing";
/**
* 防抖点击事件
*/
el.__handleClick__ = function () {
if (el.__debounceTimer__) clearTimeout(el.__debounceTimer__);
el.classList.add(debounceClass);
el.__debounceTimer__ = setTimeout(() => {
el.classList.remove(debounceClass);
onClick();
}, time);
};
el.addEventListener("click", el.__handleClick__);
},
beforeUnmount(el: ElType) {
el.removeEventListener("click", el.__handleClick__!);
if (el.__debounceTimer__) {
clearTimeout(el.__debounceTimer__);
el.__debounceTimer__ = null;
}
},
};
export default debounce;

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