mirror of
https://github.com/jekip/naive-ui-admin.git
synced 2026-02-13 17:52:28 +08:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f97a94e74c | ||
|
|
da5231b384 | ||
|
|
97ae37efd0 | ||
|
|
b19430170f | ||
|
|
b642d28815 | ||
|
|
619669ec9e | ||
|
|
044976b790 | ||
|
|
b43ab1ceb4 | ||
|
|
f773a3ed06 | ||
|
|
7f81152793 | ||
|
|
f6be8f521e | ||
|
|
fa8b33acbe | ||
|
|
54e68db0c2 | ||
|
|
9542345b54 | ||
|
|
b689fabfdd | ||
|
|
46dc7eb69e | ||
|
|
c1e741dad6 | ||
|
|
ab4063e75e | ||
|
|
770d39871a | ||
|
|
3cb7a7f54f | ||
|
|
b4857a7559 | ||
|
|
a6aa6d4d6d | ||
|
|
8fd663e0e5 | ||
|
|
304e7053d7 | ||
|
|
9fa584eb23 | ||
|
|
18597fabd3 | ||
|
|
b1c730dde8 |
@@ -1,3 +0,0 @@
|
|||||||
> 1%
|
|
||||||
last 2 versions
|
|
||||||
not dead
|
|
||||||
@@ -2,7 +2,7 @@ root = true
|
|||||||
|
|
||||||
[*]
|
[*]
|
||||||
charset=utf-8
|
charset=utf-8
|
||||||
end_of_line=lf
|
end_of_line=LF
|
||||||
insert_final_newline=true
|
insert_final_newline=true
|
||||||
indent_style=space
|
indent_style=space
|
||||||
indent_size=2
|
indent_size=2
|
||||||
|
|||||||
@@ -13,11 +13,18 @@ VITE_BASE_URL = /
|
|||||||
# 是否删除console
|
# 是否删除console
|
||||||
VITE_DROP_CONSOLE = true
|
VITE_DROP_CONSOLE = true
|
||||||
|
|
||||||
|
# 跨域代理,可以配置多个,请注意不要换行
|
||||||
|
#VITE_PROXY = [["/appApi","http://localhost:8001"],["/upload","http://localhost:8001/upload"]]
|
||||||
|
# VITE_PROXY=[["/api","https://naive-ui-admin"]]
|
||||||
|
|
||||||
# API 接口地址
|
# API 接口地址
|
||||||
VITE_APP_API_URL = /
|
VITE_GLOB_API_URL =
|
||||||
|
|
||||||
# 图片上传地址
|
# 图片上传地址
|
||||||
VITE_GLOB_UPLOAD_URL= /
|
VITE_GLOB_UPLOAD_URL=
|
||||||
|
|
||||||
|
# 图片前缀地址
|
||||||
|
VITE_GLOB_IMG_URL=
|
||||||
|
|
||||||
# 接口前缀
|
# 接口前缀
|
||||||
VITE_GLOB_API_URL_PREFIX = /api
|
VITE_GLOB_API_URL_PREFIX = /api
|
||||||
|
|||||||
@@ -11,10 +11,21 @@ VITE_BASE_URL = /
|
|||||||
VITE_DROP_CONSOLE = true
|
VITE_DROP_CONSOLE = true
|
||||||
|
|
||||||
# API
|
# API
|
||||||
VITE_APP_API_URL = /
|
VITE_GLOB_API_URL =
|
||||||
|
|
||||||
# 图片上传地址
|
# 图片上传地址
|
||||||
VITE_GLOB_UPLOAD_URL= /
|
VITE_GLOB_UPLOAD_URL=
|
||||||
|
|
||||||
|
# 图片前缀地址
|
||||||
|
VITE_GLOB_IMG_URL=
|
||||||
|
|
||||||
# 接口前缀
|
# 接口前缀
|
||||||
VITE_GLOB_API_URL_PREFIX = /api
|
VITE_GLOB_API_URL_PREFIX = /api
|
||||||
|
|
||||||
|
# 是否启用gzip压缩或brotli压缩
|
||||||
|
# 可选: gzip | brotli | none
|
||||||
|
# 如果你需要多种形式,你可以用','来分隔
|
||||||
|
VITE_BUILD_COMPRESS = 'none'
|
||||||
|
|
||||||
|
# 使用压缩时是否删除原始文件,默认为false
|
||||||
|
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
|
||||||
|
|||||||
74
.eslintrc.js
74
.eslintrc.js
@@ -1,9 +1,11 @@
|
|||||||
module.exports = {
|
// @ts-check
|
||||||
|
const { defineConfig } = require('eslint-define-config');
|
||||||
|
module.exports = defineConfig({
|
||||||
root: true,
|
root: true,
|
||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
node: true,
|
node: true,
|
||||||
es6: true
|
es6: true,
|
||||||
},
|
},
|
||||||
parser: 'vue-eslint-parser',
|
parser: 'vue-eslint-parser',
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
@@ -12,21 +14,46 @@ module.exports = {
|
|||||||
sourceType: 'module',
|
sourceType: 'module',
|
||||||
jsxPragma: 'React',
|
jsxPragma: 'React',
|
||||||
ecmaFeatures: {
|
ecmaFeatures: {
|
||||||
jsx: true
|
jsx: true,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
extends: [
|
extends: [
|
||||||
'plugin:vue/vue3-recommended',
|
'plugin:vue/vue3-recommended',
|
||||||
'plugin:@typescript-eslint/recommended',
|
'plugin:@typescript-eslint/recommended',
|
||||||
'prettier',
|
'prettier',
|
||||||
'plugin:prettier/recommended'
|
'plugin:prettier/recommended',
|
||||||
|
'plugin:jest/recommended',
|
||||||
],
|
],
|
||||||
rules: {
|
rules: {
|
||||||
'vue/no-unused-components': 'off',
|
'@typescript-eslint/ban-ts-ignore': 'off',
|
||||||
'vue/no-unused-vars': 'off',
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
'vue/no-v-for-template-key-on-child': 'off',
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/no-var-requires': 'off',
|
||||||
|
'@typescript-eslint/no-empty-function': 'off',
|
||||||
'vue/custom-event-name-casing': 'off',
|
'vue/custom-event-name-casing': 'off',
|
||||||
// 'vue/attributes-order': 'off',
|
'no-use-before-define': 'off',
|
||||||
|
'@typescript-eslint/no-use-before-define': 'off',
|
||||||
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
|
'@typescript-eslint/ban-types': 'off',
|
||||||
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'space-before-function-paren': 'off',
|
||||||
|
|
||||||
|
'vue/attributes-order': 'off',
|
||||||
'vue/one-component-per-file': 'off',
|
'vue/one-component-per-file': 'off',
|
||||||
'vue/html-closing-bracket-newline': 'off',
|
'vue/html-closing-bracket-newline': 'off',
|
||||||
'vue/max-attributes-per-line': 'off',
|
'vue/max-attributes-per-line': 'off',
|
||||||
@@ -34,34 +61,17 @@ module.exports = {
|
|||||||
'vue/singleline-html-element-content-newline': 'off',
|
'vue/singleline-html-element-content-newline': 'off',
|
||||||
'vue/attribute-hyphenation': 'off',
|
'vue/attribute-hyphenation': 'off',
|
||||||
'vue/require-default-prop': 'off',
|
'vue/require-default-prop': 'off',
|
||||||
|
|
||||||
'space-before-function-paren': 'off',
|
|
||||||
|
|
||||||
'@typescript-eslint/camelcase': 'off',
|
|
||||||
'@typescript-eslint/ban-ts-ignore': 'off',
|
|
||||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
|
||||||
'@typescript-eslint/no-var-requires': 'off',
|
|
||||||
'@typescript-eslint/no-empty-function': 'off',
|
|
||||||
'no-use-before-define': 'off',
|
|
||||||
'@typescript-eslint/no-use-before-define': 'off',
|
|
||||||
'@typescript-eslint/ban-ts-comment': 'off',
|
|
||||||
'@typescript-eslint/ban-types': 'off',
|
|
||||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
|
||||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
||||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'vue/html-self-closing': [
|
'vue/html-self-closing': [
|
||||||
'error',
|
'error',
|
||||||
{
|
{
|
||||||
html: {
|
html: {
|
||||||
void: 'always',
|
void: 'always',
|
||||||
normal: 'never',
|
normal: 'never',
|
||||||
component: 'always'
|
component: 'always',
|
||||||
},
|
},
|
||||||
svg: 'always',
|
svg: 'always',
|
||||||
math: 'always'
|
math: 'always',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
}
|
},
|
||||||
}
|
});
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
useTabs: false,
|
|
||||||
tabWidth: 2,
|
|
||||||
printWidth: 100,
|
|
||||||
singleQuote: true,
|
|
||||||
trailingComma: 'none',
|
|
||||||
bracketSpacing: true,
|
|
||||||
semi: false
|
|
||||||
};
|
|
||||||
8
.yarnrc
8
.yarnrc
@@ -1,8 +0,0 @@
|
|||||||
registry "https://registry.npm.taobao.org"
|
|
||||||
|
|
||||||
sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
|
|
||||||
phantomjs_cdnurl "http://cnpmjs.org/downloads"
|
|
||||||
electron_mirror "https://npm.taobao.org/mirrors/electron/"
|
|
||||||
sqlite3_binary_host_mirror "https://foxgis.oss-cn-shanghai.aliyuncs.com/"
|
|
||||||
profiler_binary_host_mirror "https://npm.taobao.org/mirrors/node-inspector/"
|
|
||||||
chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver"
|
|
||||||
67
CHANGELOG.md
67
CHANGELOG.md
@@ -1,3 +1,67 @@
|
|||||||
|
# 1.5 (2021-07-30)
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
- 修复表格列配置,拖拽时最后的操作列重复增加
|
||||||
|
- 多标签页交互优化
|
||||||
|
|
||||||
|
- ### ✨ Features
|
||||||
|
- `项目文档`已上线
|
||||||
|
- `Application`组件加载机制优化,解决路由守卫,Axios中可使用,Dialog,Message 等之类组件
|
||||||
|
- `BasicTable` 组件新增`高度自适应`,`单元格编辑`,`整行编辑` 特性
|
||||||
|
- `nprogress` 移除,用 `Loading Bar`代替
|
||||||
|
- 打包支持`gzip`,`brotli` 压缩
|
||||||
|
- 新增代理`VITE_PROXY`配置
|
||||||
|
- 路由菜单,支持多级菜单
|
||||||
|
- 依赖升级
|
||||||
|
- 本次更新,有破坏性更新,涉及文件重命名,增删调整
|
||||||
|
|
||||||
|
|
||||||
|
# 1.4 (2021-07-21)
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
- vite降至2.3.6
|
||||||
|
- 多标签页交互优化
|
||||||
|
|
||||||
|
- ### ✨ Features
|
||||||
|
- 新增 `TableAction` 组件
|
||||||
|
- 新增 `菜单权限管理` 示例
|
||||||
|
- 新增 `角色权限管理` 示例
|
||||||
|
- 持续更新更多实用组件及示例,感谢Star
|
||||||
|
|
||||||
|
|
||||||
|
# 1.3 (2021-07-19)
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
- 修复多标签页左右切换按钮自适应展示
|
||||||
|
- 修复登录页面出现多标签页
|
||||||
|
|
||||||
|
- ### ✨ Features
|
||||||
|
- 新增 `Upload` 组件及配置
|
||||||
|
- 新增 `VITE_GLOB_IMG_URL` 图片前缀地址,配合Upload
|
||||||
|
- 新增 `滑块验证码` 组件
|
||||||
|
- 新增 `登录页面-滑块验证码` 示例
|
||||||
|
- 持续更新更多实用组件及示例,感谢Star
|
||||||
|
|
||||||
|
|
||||||
|
# 1.2 (2021-07-16)
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
- 修复面包屑显示登录页面
|
||||||
|
- 菜单支持只展开当前父级菜单
|
||||||
|
|
||||||
|
- ### ✨ Features
|
||||||
|
- 新增 `列表页面-基础列表` 示例页面
|
||||||
|
- 新增 `异常页面-404-403-500` 示例页面
|
||||||
|
- 新增 `结果页面-成功-失败-信息` 示例页面
|
||||||
|
- 新增 `设置页面-个人设置-系统设置` 示例页面
|
||||||
|
- tips `示例页面,可能在深色主题显示不佳`
|
||||||
|
- 持续更新更多实用示例,同时也演示`Naive UI`使用方法
|
||||||
|
|
||||||
|
|
||||||
|
# 1.1 (2021-07-15)
|
||||||
|
- ### ✨ Features
|
||||||
|
- 新增 `基础表单` 示例页面
|
||||||
|
- 新增 `分步表单` 示例页面
|
||||||
|
- 新增 `表单详情` 示例页面
|
||||||
|
- 持续更新更多实用示例,同时也演示`Naive UI`使用方法
|
||||||
|
|
||||||
|
|
||||||
# 1.0 (2021-07-12)
|
# 1.0 (2021-07-12)
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
- 修复页面切换面包屑未及时更新
|
- 修复页面切换面包屑未及时更新
|
||||||
@@ -6,7 +70,8 @@
|
|||||||
- 1.0骨架发布
|
- 1.0骨架发布
|
||||||
- Naive UI 升级至2.15.4
|
- Naive UI 升级至2.15.4
|
||||||
- 菜单新增排序字段
|
- 菜单新增排序字段
|
||||||
- 新增 `ProTable` 组件,封装了常用的分页列配置等逻辑,可查看组件示例页面
|
- 新增 `ProTable` 组件,封装了常用的分页列配置等逻辑
|
||||||
|
- 新增 `ProTable` 组件示例页面
|
||||||
- 持续更新中...
|
- 持续更新中...
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 bqy
|
Copyright (c) 2021-present Naive Ui Admin
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -1,6 +1,6 @@
|
|||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
Naive Ui Admin 是一个免费开源的中后台模版,使用了最新的`vue3`,`vite2`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,也可用于学习参考。
|
[Naive Ui Admin](https://github.com/jekip/naive-ui-admin) 是一个基于 [Vue3.0](https://github.com/vuejs/vue-next)、[Vite](https://github.com/vitejs/vite)、 [Naive UI](https://www.naiveui.com/)、[TypeScript](https://www.typescriptlang.org/) 的中后台解决方案,它使用了最新的前端技术栈,并提炼了典型的业务模型,页面,包括二次封装组件、动态菜单、权限校验、粒子化权限控制等功能,它可以帮助你快速搭建企业级中后台项目,该项目使用最新的前端技术栈,相信不管是从新技术使用还是其他方面,都能帮助到你。
|
||||||
|
|
||||||
## 特性
|
## 特性
|
||||||
- **最新技术栈**:使用 Vue3/vite2 等前端前沿技术开发
|
- **最新技术栈**:使用 Vue3/vite2 等前端前沿技术开发
|
||||||
@@ -10,20 +10,15 @@ Naive Ui Admin 是一个免费开源的中后台模版,使用了最新的`vue3
|
|||||||
- **权限** 内置完善的动态路由权限生成方案
|
- **权限** 内置完善的动态路由权限生成方案
|
||||||
- **组件** 二次封装了多个常用的组件
|
- **组件** 二次封装了多个常用的组件
|
||||||
|
|
||||||
### 页面功能
|
|
||||||
#### 系统看板
|
|
||||||
- [x] 主控台
|
|
||||||
- [ ] 监控页
|
|
||||||
- [x] 工作台
|
|
||||||
|
|
||||||
## 在线预览
|
## 在线预览
|
||||||
- [naive-ui-admin](https://jekip.github.io)
|
- [naive-ui-admin](https://jekip.github.io)
|
||||||
|
|
||||||
账号:admin,密码:123456
|
账号:admin,密码:123456(随意)
|
||||||
|
|
||||||
## 文档
|
## 文档
|
||||||
|
|
||||||
[文档地址](https://github.com/jekip/naive-ui-admin) - 待完善
|
[文档地址](https://jekip.github.io/docs/)
|
||||||
|
|
||||||
## 准备
|
## 准备
|
||||||
|
|
||||||
@@ -70,7 +65,7 @@ yarn build
|
|||||||
[CHANGELOG](./CHANGELOG.md)
|
[CHANGELOG](./CHANGELOG.md)
|
||||||
|
|
||||||
## 感谢
|
## 感谢
|
||||||
[@Vben](https://github.com/anncwb/vue-vben-admin) 借鉴 vue-vben-admin 实现的骨架,同时也使用作者开发的 vite 插件,非常感谢作者。
|
[@Vben](https://github.com/anncwb/vue-vben-admin) 借鉴 vue-vben-admin 实现的骨架,同时也使用作者开发的 vite 插件,再次感谢作者。
|
||||||
|
|
||||||
|
|
||||||
## 如何贡献
|
## 如何贡献
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
|
|||||||
if (envName === 'VITE_PROXY') {
|
if (envName === 'VITE_PROXY') {
|
||||||
try {
|
try {
|
||||||
realName = JSON.parse(realName);
|
realName = JSON.parse(realName);
|
||||||
} catch (error) {
|
} catch (error) {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ret[envName] = realName;
|
ret[envName] = realName;
|
||||||
process.env[envName] = realName;
|
process.env[envName] = realName;
|
||||||
@@ -51,8 +50,7 @@ export function getEnvConfig(match = 'VITE_GLOB_', confFiles = ['.env', '.env.pr
|
|||||||
try {
|
try {
|
||||||
const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
|
const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
|
||||||
envConfig = { ...envConfig, ...env };
|
envConfig = { ...envConfig, ...env };
|
||||||
} catch (error) {
|
} catch (error) {}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(envConfig).forEach((key) => {
|
Object.keys(envConfig).forEach((key) => {
|
||||||
|
|||||||
35
build/vite/plugin/compress.ts
Normal file
35
build/vite/plugin/compress.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
|
||||||
|
* https://github.com/anncwb/vite-plugin-compression
|
||||||
|
*/
|
||||||
|
import type { Plugin } from 'vite';
|
||||||
|
|
||||||
|
import compressPlugin from 'vite-plugin-compression';
|
||||||
|
|
||||||
|
export function configCompressPlugin(
|
||||||
|
compress: 'gzip' | 'brotli' | 'none',
|
||||||
|
deleteOriginFile = false
|
||||||
|
): Plugin | Plugin[] {
|
||||||
|
const compressList = compress.split(',');
|
||||||
|
|
||||||
|
const plugins: Plugin[] = [];
|
||||||
|
|
||||||
|
if (compressList.includes('gzip')) {
|
||||||
|
plugins.push(
|
||||||
|
compressPlugin({
|
||||||
|
ext: '.gz',
|
||||||
|
deleteOriginFile,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (compressList.includes('brotli')) {
|
||||||
|
plugins.push(
|
||||||
|
compressPlugin({
|
||||||
|
ext: '.br',
|
||||||
|
algorithm: 'brotliCompress',
|
||||||
|
deleteOriginFile,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return plugins;
|
||||||
|
}
|
||||||
@@ -5,9 +5,10 @@ import vueJsx from '@vitejs/plugin-vue-jsx';
|
|||||||
|
|
||||||
import { configHtmlPlugin } from './html';
|
import { configHtmlPlugin } from './html';
|
||||||
import { configMockPlugin } from './mock';
|
import { configMockPlugin } from './mock';
|
||||||
|
import { configCompressPlugin } from './compress';
|
||||||
|
|
||||||
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, prodMock) {
|
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, prodMock) {
|
||||||
const { VITE_USE_MOCK } = viteEnv;
|
const { VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;
|
||||||
|
|
||||||
const vitePlugins: (Plugin | Plugin[])[] = [
|
const vitePlugins: (Plugin | Plugin[])[] = [
|
||||||
// have to
|
// have to
|
||||||
@@ -22,5 +23,12 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, prodMock)
|
|||||||
// vite-plugin-mock
|
// vite-plugin-mock
|
||||||
VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild, prodMock));
|
VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild, prodMock));
|
||||||
|
|
||||||
|
if (isBuild) {
|
||||||
|
// rollup-plugin-gzip
|
||||||
|
vitePlugins.push(
|
||||||
|
configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return vitePlugins;
|
return vitePlugins;
|
||||||
}
|
}
|
||||||
|
|||||||
34
build/vite/proxy.ts
Normal file
34
build/vite/proxy.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* Used to parse the .env.development proxy configuration
|
||||||
|
*/
|
||||||
|
import type { ProxyOptions } from 'vite';
|
||||||
|
|
||||||
|
type ProxyItem = [string, string];
|
||||||
|
|
||||||
|
type ProxyList = ProxyItem[];
|
||||||
|
|
||||||
|
type ProxyTargetList = Record<string, ProxyOptions & { rewrite: (path: string) => string }>;
|
||||||
|
|
||||||
|
const httpsRE = /^https:\/\//;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate proxy
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
export function createProxy(list: ProxyList = []) {
|
||||||
|
const ret: ProxyTargetList = {};
|
||||||
|
for (const [prefix, target] of list) {
|
||||||
|
const isHttps = httpsRE.test(target);
|
||||||
|
|
||||||
|
// https://github.com/http-party/node-http-proxy#options
|
||||||
|
ret[prefix] = {
|
||||||
|
target: target,
|
||||||
|
changeOrigin: true,
|
||||||
|
ws: true,
|
||||||
|
rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
|
||||||
|
// https is require secure=false
|
||||||
|
...(isHttps ? { secure: false } : {}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
76
index.html
76
index.html
@@ -1,75 +1,23 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="zh-CN">
|
<html lang="zh-cmn-Hans">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||||
|
<meta name="renderer" content="webkit"/>
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
|
||||||
|
/>
|
||||||
<link rel="icon" href="/favicon.ico"/>
|
<link rel="icon" href="/favicon.ico"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title><%= title %></title>
|
<title><%= title %></title>
|
||||||
|
<style>.first-loading-wrp{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:420px;height:100%}.first-loading-wrp>h1{font-size:128px}.first-loading-wrp .loading-wrp{padding:98px;display:flex;justify-content:center;align-items:center}.dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div id="appProvider" style="display: none"></div>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<style>
|
<div class="first-loading-wrp">
|
||||||
.app-loading-main{
|
<div class="loading-wrp">
|
||||||
display: flex;
|
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-direction: column;
|
|
||||||
background-color: #f4f7f9;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.app-loading {
|
|
||||||
position: relative;
|
|
||||||
-webkit-transform: translateY(-15px);
|
|
||||||
-ms-transform: translateY(-15px);
|
|
||||||
transform: translateY(-15px);
|
|
||||||
}
|
|
||||||
.app-loading > div {
|
|
||||||
-webkit-animation-fill-mode: both;
|
|
||||||
animation-fill-mode: both;
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
border-radius: 100%; }
|
|
||||||
.app-loading > div:first-child {
|
|
||||||
background: #2d8cf0;
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
top: 9px;
|
|
||||||
left: 9px;
|
|
||||||
-webkit-animation: scale 1s 0s cubic-bezier(.09, .57, .49, .9) infinite;
|
|
||||||
animation: scale 1s 0s cubic-bezier(.09, .57, .49, .9) infinite;
|
|
||||||
}
|
|
||||||
.app-loading > div:last-child {
|
|
||||||
position: absolute;
|
|
||||||
border: 2px solid #2d8cf0;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
background: transparent;
|
|
||||||
border: 2px solid;
|
|
||||||
border-color: #2d8cf0 transparent #2d8cf0 transparent;
|
|
||||||
-webkit-animation: rotate 1s 0s cubic-bezier(.09, .57, .49, .9) infinite;
|
|
||||||
animation: rotate 1s 0s cubic-bezier(.09, .57, .49, .9) infinite;
|
|
||||||
-webkit-animation-duration: 1s;
|
|
||||||
animation-duration: 1s;
|
|
||||||
}
|
|
||||||
@keyframes rotate {
|
|
||||||
0% {
|
|
||||||
-webkit-transform: rotate(0deg) scale(1);
|
|
||||||
transform: rotate(0deg) scale(1); }
|
|
||||||
50% {
|
|
||||||
-webkit-transform: rotate(180deg) scale(0.6);
|
|
||||||
transform: rotate(180deg) scale(0.6); }
|
|
||||||
100% {
|
|
||||||
-webkit-transform: rotate(360deg) scale(1);
|
|
||||||
transform: rotate(360deg) scale(1); }
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<div class="app-loading-main">
|
|
||||||
<div class="app-loading">
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Mock from 'mockjs'
|
import Mock from 'mockjs';
|
||||||
|
|
||||||
export function resultSuccess(result, { message = 'ok' } = {}) {
|
export function resultSuccess(result, { message = 'ok' } = {}) {
|
||||||
return Mock.mock({
|
return Mock.mock({
|
||||||
@@ -51,9 +51,9 @@ export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]
|
|||||||
* @param {Function} callback 回调函数
|
* @param {Function} callback 回调函数
|
||||||
*/
|
*/
|
||||||
export function doCustomTimes(times: number, callback: any) {
|
export function doCustomTimes(times: number, callback: any) {
|
||||||
let i = -1
|
let i = -1;
|
||||||
while (++i < times) {
|
while (++i < times) {
|
||||||
callback(i)
|
callback(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Random } from 'mockjs'
|
import { Random } from 'mockjs';
|
||||||
import { resultSuccess } from '../_util'
|
import { resultSuccess } from '../_util';
|
||||||
|
|
||||||
const consoleInfo = {
|
const consoleInfo = {
|
||||||
//访问量
|
//访问量
|
||||||
@@ -13,7 +13,7 @@ const consoleInfo = {
|
|||||||
saleroom: {
|
saleroom: {
|
||||||
weekSaleroom: Random.float(10000, 99999, 2, 2),
|
weekSaleroom: Random.float(10000, 99999, 2, 2),
|
||||||
amount: Random.float(99999, 999999, 2, 2),
|
amount: Random.float(99999, 999999, 2, 2),
|
||||||
degree:Random.float(10,99)
|
degree: Random.float(10, 99),
|
||||||
},
|
},
|
||||||
//订单量
|
//订单量
|
||||||
orderLarge: {
|
orderLarge: {
|
||||||
@@ -27,10 +27,9 @@ const consoleInfo = {
|
|||||||
weekLarge: Random.float(10000, 99999, 2, 2),
|
weekLarge: Random.float(10000, 99999, 2, 2),
|
||||||
rise: Random.float(10, 99),
|
rise: Random.float(10, 99),
|
||||||
decline: Random.float(10, 99),
|
decline: Random.float(10, 99),
|
||||||
amount:Random.float(99999,999999,2,2)
|
amount: Random.float(99999, 999999, 2, 2),
|
||||||
},
|
},
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
//主控台 卡片数据
|
//主控台 卡片数据
|
||||||
@@ -41,7 +40,5 @@ export default [
|
|||||||
response: () => {
|
response: () => {
|
||||||
return resultSuccess(consoleInfo);
|
return resultSuccess(consoleInfo);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
]
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
89
mock/system/menu.ts
Normal file
89
mock/system/menu.ts
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
import { resultSuccess } from '../_util';
|
||||||
|
|
||||||
|
const menuList = () => {
|
||||||
|
const result: any[] = [
|
||||||
|
{
|
||||||
|
label: 'Dashboard',
|
||||||
|
key: 'dashboard',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'dashboard',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'dashboard',
|
||||||
|
path: '/dashboard',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: '主控台',
|
||||||
|
key: 'console',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'console',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'console',
|
||||||
|
path: '/dashboard/console',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '工作台',
|
||||||
|
key: 'workplace',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'workplace',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'workplace',
|
||||||
|
path: '/dashboard/workplace',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '表单管理',
|
||||||
|
key: 'form',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'form',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'form',
|
||||||
|
path: '/form',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: '基础表单',
|
||||||
|
key: 'basic-form',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'basic-form',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'basic-form',
|
||||||
|
path: '/form/basic-form',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '分步表单',
|
||||||
|
key: 'step-form',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'step-form',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'step-form',
|
||||||
|
path: '/form/step-form',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '表单详情',
|
||||||
|
key: 'detail',
|
||||||
|
type: 1,
|
||||||
|
subtitle: 'detail',
|
||||||
|
openType: 1,
|
||||||
|
auth: 'detail',
|
||||||
|
path: '/form/detail',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
url: '/api/menu/list',
|
||||||
|
timeout: 1000,
|
||||||
|
method: 'get',
|
||||||
|
response: () => {
|
||||||
|
const list = menuList();
|
||||||
|
return resultSuccess({
|
||||||
|
list,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
45
mock/system/role.ts
Normal file
45
mock/system/role.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import { resultSuccess, doCustomTimes } from '../_util';
|
||||||
|
|
||||||
|
function getMenuKeys() {
|
||||||
|
const keys = ['dashboard', 'console', 'workplace', 'basic-form', 'step-form', 'detail'];
|
||||||
|
const newKeys = [];
|
||||||
|
doCustomTimes(parseInt(Math.random() * 6), () => {
|
||||||
|
const key = keys[Math.floor(Math.random() * keys.length)];
|
||||||
|
newKeys.push(key);
|
||||||
|
});
|
||||||
|
return Array.from(new Set(newKeys));
|
||||||
|
}
|
||||||
|
|
||||||
|
const roleList = (pageSize) => {
|
||||||
|
const result: any[] = [];
|
||||||
|
doCustomTimes(pageSize, () => {
|
||||||
|
result.push({
|
||||||
|
id: '@integer(10,100)',
|
||||||
|
name: '@cname()',
|
||||||
|
explain: '@cname()',
|
||||||
|
isDefault: '@boolean()',
|
||||||
|
menu_keys: getMenuKeys(),
|
||||||
|
create_date: `@date('yyyy-MM-dd hh:mm:ss')`,
|
||||||
|
'status|1': ['normal', 'enable', 'disable'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
url: '/api/role/list',
|
||||||
|
timeout: 1000,
|
||||||
|
method: 'get',
|
||||||
|
response: ({ query }) => {
|
||||||
|
const { page = 1, pageSize = 10 } = query;
|
||||||
|
const list = roleList(Number(pageSize));
|
||||||
|
return resultSuccess({
|
||||||
|
page: Number(page),
|
||||||
|
pageSize: Number(pageSize),
|
||||||
|
pageCount: 60,
|
||||||
|
list,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Random } from 'mockjs'
|
import { Random } from 'mockjs';
|
||||||
import { resultSuccess, doCustomTimes, resultPageSuccess } from '../_util'
|
import { resultSuccess, doCustomTimes } from '../_util';
|
||||||
|
|
||||||
const tableList = ((pageSize) => {
|
const tableList = (pageSize) => {
|
||||||
const result:any[] = []
|
const result: any[] = [];
|
||||||
doCustomTimes(pageSize, () => {
|
doCustomTimes(pageSize, () => {
|
||||||
result.push({
|
result.push({
|
||||||
id: '@integer(10,100)',
|
id: '@integer(10,100)',
|
||||||
@@ -14,12 +14,11 @@ const tableList = ((pageSize) => {
|
|||||||
date: `@date('yyyy-MM-dd')`,
|
date: `@date('yyyy-MM-dd')`,
|
||||||
time: `@time('HH:mm')`,
|
time: `@time('HH:mm')`,
|
||||||
'no|100000-10000000': 100000,
|
'no|100000-10000000': 100000,
|
||||||
'status|1': ['normal', 'enable', 'disable'],
|
'status|1': [true, false],
|
||||||
});
|
});
|
||||||
})
|
|
||||||
return result
|
|
||||||
});
|
});
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
//表格数据列表
|
//表格数据列表
|
||||||
@@ -29,16 +28,13 @@ export default [
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
response: ({ query }) => {
|
response: ({ query }) => {
|
||||||
const { page = 1, pageSize = 10 } = query;
|
const { page = 1, pageSize = 10 } = query;
|
||||||
const list = tableList(Number(pageSize))
|
const list = tableList(Number(pageSize));
|
||||||
return resultSuccess({
|
return resultSuccess({
|
||||||
page: Number(page),
|
page: Number(page),
|
||||||
pageSize: Number(pageSize),
|
pageSize: Number(pageSize),
|
||||||
pageCount: 60,
|
pageCount: 60,
|
||||||
list
|
list,
|
||||||
}
|
});
|
||||||
);
|
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
]
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { MockMethod } from 'vite-plugin-mock'
|
import { resultSuccess } from '../_util';
|
||||||
import { resultSuccess, getRequestToken } from '../_util'
|
|
||||||
|
|
||||||
const menusList = [
|
const menusList = [
|
||||||
{
|
{
|
||||||
@@ -18,7 +17,7 @@ const menusList = [
|
|||||||
component: 'DashboardConsole',
|
component: 'DashboardConsole',
|
||||||
meta: {
|
meta: {
|
||||||
title: '主控台',
|
title: '主控台',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'monitor',
|
path: 'monitor',
|
||||||
@@ -26,7 +25,7 @@ const menusList = [
|
|||||||
component: 'DashboardMonitor',
|
component: 'DashboardMonitor',
|
||||||
meta: {
|
meta: {
|
||||||
title: '监控页',
|
title: '监控页',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'workplace',
|
path: 'workplace',
|
||||||
@@ -35,11 +34,11 @@ const menusList = [
|
|||||||
meta: {
|
meta: {
|
||||||
hidden: true,
|
hidden: true,
|
||||||
title: '工作台',
|
title: '工作台',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
},
|
||||||
]
|
];
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
@@ -49,5 +48,5 @@ export default [
|
|||||||
response: () => {
|
response: () => {
|
||||||
return resultSuccess(menusList);
|
return resultSuccess(menusList);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
]
|
];
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import Mock from 'mockjs'
|
import Mock from 'mockjs';
|
||||||
import { resultSuccess, getRequestToken } from '../_util'
|
import { resultSuccess } from '../_util';
|
||||||
|
|
||||||
const Random = Mock.Random
|
const Random = Mock.Random;
|
||||||
|
|
||||||
const token = Random.string('upper', 32, 32)
|
const token = Random.string('upper', 32, 32);
|
||||||
|
|
||||||
const adminInfo = {
|
const adminInfo = {
|
||||||
userId: '1',
|
userId: '1',
|
||||||
@@ -25,9 +25,17 @@ const adminInfo = {
|
|||||||
{
|
{
|
||||||
roleName: '工作台',
|
roleName: '工作台',
|
||||||
value: 'dashboard_workplace',
|
value: 'dashboard_workplace',
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
roleName: '基础列表',
|
||||||
|
value: 'basic_list',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
roleName: '基础列表删除',
|
||||||
|
value: 'basic_list_delete',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
}
|
};
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
@@ -48,4 +56,4 @@ export default [
|
|||||||
return resultSuccess(adminInfo);
|
return resultSuccess(adminInfo);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
];
|
||||||
|
|||||||
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "naive-ui-admin",
|
"name": "naive-ui-admin",
|
||||||
"version": "1.0",
|
"version": "1.5.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Ahjung",
|
"name": "Ahjung",
|
||||||
"email": "735878602@qq.com",
|
"email": "735878602@qq.com",
|
||||||
@@ -8,8 +8,12 @@
|
|||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"bootstrap": "yarn install",
|
||||||
|
"serve": "npm run dev",
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build && esno ./build/script/postBuild.ts",
|
"build": "vite build && esno ./build/script/postBuild.ts",
|
||||||
|
"build:no-cache": "yarn clean:cache && npm run build",
|
||||||
|
"report": "cross-env REPORT=true npm run build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"build typecheck": "vuedx-typecheck . && vite build",
|
"build typecheck": "vuedx-typecheck . && vite build",
|
||||||
"deploy": "gh-pages -d dist",
|
"deploy": "gh-pages -d dist",
|
||||||
@@ -31,10 +35,10 @@
|
|||||||
"element-resize-detector": "^1.2.3",
|
"element-resize-detector": "^1.2.3",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
|
"makeit-captcha": "^1.2.5",
|
||||||
"mitt": "^2.1.0",
|
"mitt": "^2.1.0",
|
||||||
"mockjs": "^1.1.0",
|
"mockjs": "^1.1.0",
|
||||||
"naive-ui": "^2.15.4",
|
"naive-ui": "^2.15.11",
|
||||||
"nprogress": "^1.0.0-1",
|
|
||||||
"pinia": "^2.0.0-beta.3",
|
"pinia": "^2.0.0-beta.3",
|
||||||
"qs": "^6.10.1",
|
"qs": "^6.10.1",
|
||||||
"vfonts": "^0.1.0",
|
"vfonts": "^0.1.0",
|
||||||
@@ -47,7 +51,6 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^12.1.4",
|
"@commitlint/cli": "^12.1.4",
|
||||||
"@commitlint/config-conventional": "^12.1.4",
|
"@commitlint/config-conventional": "^12.1.4",
|
||||||
"@tailwindcss/postcss7-compat": "^2.2.4",
|
|
||||||
"@types/lodash": "^4.14.170",
|
"@types/lodash": "^4.14.170",
|
||||||
"@types/node": "^15.12.2",
|
"@types/node": "^15.12.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.26.1",
|
"@typescript-eslint/eslint-plugin": "^4.26.1",
|
||||||
@@ -56,35 +59,40 @@
|
|||||||
"@vitejs/plugin-vue-jsx": "^1.1.5",
|
"@vitejs/plugin-vue-jsx": "^1.1.5",
|
||||||
"@vue/compiler-sfc": "3.1.1",
|
"@vue/compiler-sfc": "3.1.1",
|
||||||
"@vue/eslint-config-typescript": "^7.0.0",
|
"@vue/eslint-config-typescript": "^7.0.0",
|
||||||
"autoprefixer": "^10.2.6",
|
"autoprefixer": "^10.3.1",
|
||||||
"commitizen": "^4.2.4",
|
"commitizen": "^4.2.4",
|
||||||
"core-js": "^3.14.0",
|
"core-js": "^3.14.0",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"eslint": "^7.28.0",
|
"eslint": "^7.28.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
"eslint-define-config": "^1.0.9",
|
||||||
|
"eslint-plugin-jest": "^24.4.0",
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
"eslint-plugin-vue": "^7.11.1",
|
"eslint-plugin-vue": "^7.11.1",
|
||||||
"esno": "^0.7.3",
|
"esno": "^0.7.3",
|
||||||
"gh-pages": "^3.2.0",
|
"gh-pages": "^3.2.0",
|
||||||
"husky": "^6.0.0",
|
"husky": "^6.0.0",
|
||||||
|
"jest": "^27.0.6",
|
||||||
"less": "^4.1.1",
|
"less": "^4.1.1",
|
||||||
"less-loader": "^9.0.0",
|
"less-loader": "^9.0.0",
|
||||||
"lint-staged": "^11.0.0",
|
"lint-staged": "^11.0.0",
|
||||||
"postcss": "^8.3.5",
|
"postcss": "^8.3.5",
|
||||||
"prettier": "^2.3.1",
|
"prettier": "^2.3.1",
|
||||||
"pretty-quick": "^3.1.0",
|
"pretty-quick": "^3.1.0",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
"stylelint": "^13.13.1",
|
"stylelint": "^13.13.1",
|
||||||
"stylelint-config-prettier": "^8.0.2",
|
"stylelint-config-prettier": "^8.0.2",
|
||||||
"stylelint-config-standard": "^22.0.0",
|
"stylelint-config-standard": "^22.0.0",
|
||||||
"stylelint-order": "^4.1.0",
|
"stylelint-order": "^4.1.0",
|
||||||
"stylelint-scss": "^3.19.0",
|
"stylelint-scss": "^3.19.0",
|
||||||
"tailwindcss": "^2.2.4",
|
"tailwindcss": "^2.2.7",
|
||||||
"typescript": "^4.3.2",
|
"typescript": "^4.3.5",
|
||||||
"vite": "2.4.0-beta.3",
|
"vite": "2.3.6",
|
||||||
|
"vite-plugin-compression": "^0.3.1",
|
||||||
"vite-plugin-html": "^2.0.7",
|
"vite-plugin-html": "^2.0.7",
|
||||||
"vite-plugin-mock": "^2.8.0",
|
"vite-plugin-mock": "^2.9.3",
|
||||||
"vite-plugin-style-import": "^0.10.1",
|
"vite-plugin-style-import": "^1.0.1",
|
||||||
"vue-eslint-parser": "^7.6.0"
|
"vue-eslint-parser": "^7.8.0"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"*.{vue,js,ts,tsx}": "eslint --fix"
|
"*.{vue,js,ts,tsx}": "eslint --fix"
|
||||||
|
|||||||
80
src/App.vue
80
src/App.vue
@@ -11,70 +11,68 @@
|
|||||||
</AppProvider>
|
</AppProvider>
|
||||||
</NConfigProvider>
|
</NConfigProvider>
|
||||||
|
|
||||||
<transition v-if="isLock && $route.name != 'login'" name="slide-up">
|
<transition v-if="isLock && $route.name !== 'login'" name="slide-up">
|
||||||
<lockScreen/>
|
<LockScreen />
|
||||||
</transition>
|
</transition>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, computed, onMounted, onUnmounted } from 'vue'
|
import { defineComponent, computed, onMounted, onUnmounted } from 'vue';
|
||||||
import { zhCN, dateZhCN, createTheme, inputDark, datePickerDark, darkTheme } from 'naive-ui'
|
import { zhCN, dateZhCN, createTheme, inputDark, datePickerDark, darkTheme } from 'naive-ui';
|
||||||
import { LockScreen } from '@/components/Lockscreen'
|
import { LockScreen } from '@/components/Lockscreen';
|
||||||
import { AppProvider } from '@/components/Application'
|
import { AppProvider } from '@/components/Application';
|
||||||
import { useLockscreenStore } from '@/store/modules/lockscreen'
|
import { useLockscreenStore } from '@/store/modules/lockscreen';
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router';
|
||||||
import { useDesignSettingStore } from '@/store/modules/designSetting'
|
import { useDesignSettingStore } from '@/store/modules/designSetting';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: { LockScreen, AppProvider },
|
components: { LockScreen, AppProvider },
|
||||||
setup() {
|
setup() {
|
||||||
const route = useRoute()
|
const route = useRoute();
|
||||||
const useLockscreen = useLockscreenStore()
|
const useLockscreen = useLockscreenStore();
|
||||||
const designStore = useDesignSettingStore()
|
const designStore = useDesignSettingStore();
|
||||||
const isLock = computed(() => useLockscreen.isLock)
|
const isLock = computed(() => useLockscreen.isLock);
|
||||||
const lockTime = computed(() => useLockscreen.lockTime)
|
const lockTime = computed(() => useLockscreen.lockTime);
|
||||||
/**
|
|
||||||
* @type import('naive-ui').GlobalThemeOverrides
|
|
||||||
*/
|
|
||||||
const getThemeOverrides = computed(() => {
|
const getThemeOverrides = computed(() => {
|
||||||
return {
|
return {
|
||||||
common: {
|
common: {
|
||||||
primaryColor: designStore.appTheme,
|
primaryColor: designStore.appTheme,
|
||||||
primaryColorHover: '#57a3f3'
|
primaryColorHover: '#57a3f3',
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
})
|
});
|
||||||
|
|
||||||
const getDarkTheme = computed(() => (designStore.darkTheme ? darkTheme : undefined))
|
const getDarkTheme = computed(() => (designStore.darkTheme ? darkTheme : undefined));
|
||||||
|
|
||||||
let timer
|
let timer;
|
||||||
|
|
||||||
const timekeeping = () => {
|
const timekeeping = () => {
|
||||||
clearInterval(timer)
|
clearInterval(timer);
|
||||||
if (route.name == 'login' || isLock.value) return
|
if (route.name == 'login' || isLock.value) return;
|
||||||
// 设置不锁屏
|
// 设置不锁屏
|
||||||
useLockscreen.setLock(false)
|
useLockscreen.setLock(false);
|
||||||
// 重置锁屏时间
|
// 重置锁屏时间
|
||||||
useLockscreen.setLockTime()
|
useLockscreen.setLockTime();
|
||||||
timer = setInterval(() => {
|
timer = setInterval(() => {
|
||||||
// 锁屏倒计时递减
|
// 锁屏倒计时递减
|
||||||
useLockscreen.setLockTime(lockTime.value - 1)
|
useLockscreen.setLockTime(lockTime.value - 1);
|
||||||
if (lockTime.value <= 0) {
|
if (lockTime.value <= 0) {
|
||||||
// 设置锁屏
|
// 设置锁屏
|
||||||
useLockscreen.setLock(true)
|
useLockscreen.setLock(true);
|
||||||
return clearInterval(timer)
|
return clearInterval(timer);
|
||||||
}
|
|
||||||
}, 1000)
|
|
||||||
}
|
}
|
||||||
|
}, 1000);
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
document.addEventListener('mousedown', timekeeping)
|
document.addEventListener('mousedown', timekeeping);
|
||||||
})
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
document.removeEventListener('mousedown', timekeeping)
|
document.removeEventListener('mousedown', timekeeping);
|
||||||
})
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
darkTheme: createTheme([inputDark, datePickerDark]),
|
darkTheme: createTheme([inputDark, datePickerDark]),
|
||||||
@@ -82,16 +80,14 @@ export default defineComponent({
|
|||||||
zhCN,
|
zhCN,
|
||||||
dateZhCN,
|
dateZhCN,
|
||||||
isLock,
|
isLock,
|
||||||
getThemeOverrides
|
getThemeOverrides,
|
||||||
}
|
};
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
@import 'styles/global.less';
|
|
||||||
@import 'styles/common.less';
|
@import 'styles/common.less';
|
||||||
@import 'styles/override.less';
|
|
||||||
|
|
||||||
.slide-up-enter-active,
|
.slide-up-enter-active,
|
||||||
.slide-up-leave-active {
|
.slide-up-leave-active {
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import http from '@/utils/http/axios'
|
import http from '@/utils/http/axios';
|
||||||
|
|
||||||
//获取主控台信息
|
//获取主控台信息
|
||||||
export function getConsoleInfo() {
|
export function getConsoleInfo() {
|
||||||
return http.request(
|
return http.request({
|
||||||
{
|
|
||||||
url: '/dashboard/console',
|
url: '/dashboard/console',
|
||||||
method: 'get'
|
method: 'get',
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,23 @@
|
|||||||
import http from '@/utils/http/axios'
|
import http from '@/utils/http/axios';
|
||||||
import {
|
|
||||||
GetByUserIdParams,
|
|
||||||
GetMenuListByUserIdResult,
|
|
||||||
GetAuthCodeByUserIdResult
|
|
||||||
} from './model/menuModel'
|
|
||||||
|
|
||||||
enum Api {
|
|
||||||
adminMenus = '/menus',
|
|
||||||
GetBtnCodeListByUserId = '/getBtnCodeListByUserId'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 根据用户id获取用户菜单
|
* @description: 根据用户id获取用户菜单
|
||||||
*/
|
*/
|
||||||
export function adminMenus() {
|
export function adminMenus() {
|
||||||
return http.request<GetMenuListByUserIdResult>({
|
return http.request({
|
||||||
url: Api.adminMenus,
|
url: '/menus',
|
||||||
method: 'GET'
|
method: 'GET',
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据用户Id获取权限编码
|
* 获取tree菜单列表
|
||||||
* @param params
|
* @param params
|
||||||
*/
|
*/
|
||||||
export function getBtnCodeListByUserId(params: GetByUserIdParams) {
|
export function getMenuList(params?) {
|
||||||
return http.request<GetAuthCodeByUserIdResult>({
|
return http.request({
|
||||||
url: Api.GetBtnCodeListByUserId,
|
url: '/menu/list',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
params
|
params,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/api/system/role.ts
Normal file
11
src/api/system/role.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import http from '@/utils/http/axios';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description: 角色列表
|
||||||
|
*/
|
||||||
|
export function getRoleList() {
|
||||||
|
return http.request({
|
||||||
|
url: '/role/list',
|
||||||
|
method: 'GET',
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,44 +1,41 @@
|
|||||||
import http from '@/utils/http/axios'
|
import http from '@/utils/http/axios';
|
||||||
import { LoginParams, LoginResultModel } from './model/userModel'
|
|
||||||
|
|
||||||
export interface BasicResponseModel<T = any> {
|
export interface BasicResponseModel<T = any> {
|
||||||
code: number
|
code: number;
|
||||||
message: string
|
message: string;
|
||||||
result: T
|
result: T;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BasicPageParams {
|
export interface BasicPageParams {
|
||||||
pageNumber: number
|
pageNumber: number;
|
||||||
pageSize: number
|
pageSize: number;
|
||||||
total: number
|
total: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 获取用户信息
|
* @description: 获取用户信息
|
||||||
*/
|
*/
|
||||||
export function getUserInfo() {
|
export function getUserInfo() {
|
||||||
return http.request(
|
return http.request({
|
||||||
{
|
|
||||||
url: '/admin_info',
|
url: '/admin_info',
|
||||||
method: 'get'
|
method: 'get',
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 用户登录
|
* @description: 用户登录
|
||||||
*/
|
*/
|
||||||
export function login(params: LoginParams) {
|
export function login(params) {
|
||||||
return http.request<BasicResponseModel<LoginResultModel>>(
|
return http.request<BasicResponseModel>(
|
||||||
{
|
{
|
||||||
url: '/login',
|
url: '/login',
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
params
|
params,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
isTransformRequestResult: false
|
isTransformResponse: false,
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,12 +46,12 @@ export function changePassword(params, uid) {
|
|||||||
{
|
{
|
||||||
url: `/user/u${uid}/changepw`,
|
url: `/user/u${uid}/changepw`,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
params
|
params,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
isTransformRequestResult: false
|
isTransformResponse: false,
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,6 +61,6 @@ export function logout(params) {
|
|||||||
return http.request({
|
return http.request({
|
||||||
url: '/login/logout',
|
url: '/login/logout',
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
params
|
params,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
import http from '@/utils/http/axios'
|
import http from '@/utils/http/axios';
|
||||||
|
|
||||||
//获取table
|
//获取table
|
||||||
export function getTableList(params) {
|
export function getTableList(params) {
|
||||||
return http.request(
|
return http.request({
|
||||||
{
|
|
||||||
url: '/table/list',
|
url: '/table/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params,
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|||||||
100
src/assets/images/exception/403.svg
Normal file
100
src/assets/images/exception/403.svg
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-2,.cls-20,.cls-22,.cls-23,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#2c94ee;}.cls-14{fill:#8cd7ff;}.cls-15{fill:#40a8f5;}.cls-16{fill:#fff;}.cls-17{fill:#ffb056;}.cls-18{fill:#398eed;}.cls-19{fill:#ffeed2;}.cls-20{stroke:#000;stroke-width:0.23px;}.cls-21{fill:#ebfcff;}.cls-22{stroke:#e49056;stroke-width:0.26px;}.cls-23{stroke:#4986d9;stroke-width:0.13px;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
</defs>
|
||||||
|
<title>无访问权限</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-8">
|
||||||
|
<path class="cls-9"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M315.5,74.68a5.32,5.32,0,0,0-3.58-1.38H162.32a6.41,6.41,0,0,0-5.55,3.21h0a3.34,3.34,0,0,1,2.16-.78H310.77a3.42,3.42,0,0,1,3.4,3.4V185.35a3.36,3.36,0,0,1-1.32,2.68,6.93,6.93,0,0,0,4.41-6.46V78.63A5.29,5.29,0,0,0,315.5,74.68Z"/>
|
||||||
|
<polygon class="cls-14"
|
||||||
|
points="293.51 81.67 292.41 81.67 292.41 83.34 294.61 83.34 294.61 82.32 294.61 81.67 293.51 81.67"/>
|
||||||
|
<polygon class="cls-14"
|
||||||
|
points="295.72 80.65 295.72 82.32 294.61 82.32 294.61 81.67 293.51 81.67 293.51 80.65 295.72 80.65"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M307.05,78.94A3.06,3.06,0,1,1,304,82,3.06,3.06,0,0,1,307.05,78.94Zm.71,3.06,1-1-.71-.71-1,1-1-1-.71.71,1,1-1,1,.71.71,1-1,1,1,.71-.71Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M294.13,78.94A3.06,3.06,0,1,1,291.08,82,3.06,3.06,0,0,1,294.13,78.94Zm1.59,3.38V80.65h-2.21v1h-1.1v1.67h2.2v-1Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M281.22,78.94A3.06,3.06,0,1,1,278.16,82,3.05,3.05,0,0,1,281.22,78.94Zm1.51,3.56v-1h-3v1Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M314.17,79.14v8.29H155.53V79.14a3.41,3.41,0,0,1,3.4-3.4H310.77a3.42,3.42,0,0,1,3.4,3.4ZM310.11,82a3.06,3.06,0,1,0-3.06,3A3.06,3.06,0,0,0,310.11,82Zm-12.92,0a3.06,3.06,0,1,0-3.06,3A3.06,3.06,0,0,0,297.19,82Zm-12.92,0a3.06,3.06,0,1,0-3,3A3.05,3.05,0,0,0,284.27,82Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M238.61,136.26a3.76,3.76,0,0,1-2.33,3.47V146a.37.37,0,0,1-.37.36h-2.12a.36.36,0,0,1-.36-.36v-6.26a3.76,3.76,0,1,1,5.18-3.47Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M314.17,87.43v97.92a3.42,3.42,0,0,1-3.4,3.4H158.93a3.4,3.4,0,0,1-3.4-3.4V87.43Zm-59,63.87V128a3.55,3.55,0,0,0-3.55-3.55h-1.8v-4.68a14.93,14.93,0,1,0-29.86,0v4.68h-1.8a3.55,3.55,0,0,0-3.55,3.55V151.3a3.56,3.56,0,0,0,3.55,3.56h33.46A3.56,3.56,0,0,0,255.13,151.3Z"/>
|
||||||
|
<polygon class="cls-15"
|
||||||
|
points="308.8 80.96 307.76 82 308.8 83.03 308.09 83.74 307.05 82.7 306.02 83.74 305.31 83.03 306.34 82 305.31 80.96 306.02 80.25 307.05 81.29 308.09 80.25 308.8 80.96"/>
|
||||||
|
<rect class="cls-15" x="279.71" y="81.5" width="3.02" height="1"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M251.58,124.4h-1.8v-4.68a14.93,14.93,0,1,0-29.86,0v4.68h-1.8a3.55,3.55,0,0,0-3.55,3.55V151.3a3.56,3.56,0,0,0,3.55,3.56h33.46a3.56,3.56,0,0,0,3.55-3.56V128A3.55,3.55,0,0,0,251.58,124.4Zm-15.3,15.33V146a.37.37,0,0,1-.37.36h-2.12a.36.36,0,0,1-.36-.36v-6.26a3.76,3.76,0,1,1,2.85,0ZM224.9,124.4v-4.68a9.95,9.95,0,0,1,19.9,0v4.68Z"/>
|
||||||
|
<path class="cls-14" d="M244.8,119.72v4.68H224.9v-4.68a9.95,9.95,0,0,1,19.9,0Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M295.87,80.5h-2.51v1h-1.1v2h2.5v-1h1.11Zm-1.41,2.69h-1.9V81.81h1.9Zm1.11-1h-.81v-.65h-1.1v-.73h1.91Z"/>
|
||||||
|
<path d="M203.58,147.25c.06.14.44-.84.44-.84l.09.84.6-.58.26.7.35-.84s.08.15.35.72c.11-.26.8-.22,1.61-.72a3.06,3.06,0,0,0,1-2.59c-.1-.58-.66-1.12-.34-1.48a.67.67,0,0,1,.92-.15c.23.14.49-.17,1.44-.49l.25-.07c1.16-.34,1.06-1.15,1.24-2.29s-1.16-2.56-2.24-3.51a7,7,0,0,0-5.42-1.06c-1.58.49-3.16.9-3.77,4.44a7.67,7.67,0,0,0,1.52,6.37,3.92,3.92,0,0,0,1.18.88A1,1,0,0,1,203.58,147.25Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M206.25,232.22c-.33-.73-.59-1.63.55-1.13l.1,0,0-5.25a4.21,4.21,0,0,0-.93.73,31.18,31.18,0,0,0-2.71,2.81c0-.21.05-.39.06-.48,0-.33-.46-.71-.89-.18s-2.71.62-4.06.38a2.8,2.8,0,0,1-.48-.12c-1.18-.39-.84.49-.45,1.18s.44,1.67.57,3.61,2.26,2.4,3.85,2.57c1.4.16,2.37-1.3,4.56-3.27A3.14,3.14,0,0,0,206.25,232.22Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M206.47,233.11a24.12,24.12,0,0,1,0,2.76c-.06,1.95,2,2.59,3.59,2.92s2.77-1.47,5.85-3.56,5.51-6,4.48-7c-.94-.63-3.41-.22-5.32,1.25a31.79,31.79,0,0,0-3,2.54h0c0-.21.09-.38.11-.47.06-.33-.39-.75-.88-.26s-3.24.34-4.44-.12l-.1,0c-1.14-.5-.88.4-.55,1.13A3.14,3.14,0,0,1,206.47,233.11Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M197.24,182.41l1.23,23.46-.05,23.27c1.35.24,3.67.09,4.06-.38l1.12-21.62,1.08-17a.71.71,0,0,1,.77-.68.8.8,0,0,1,.47.22.72.72,0,0,1,.2.47l1,18.93L207,225.88l0,5.25c1.2.46,4,.59,4.44.12l1.79-23.48.34-23C209.7,185.44,199.19,182.68,197.24,182.41Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M188.66,150.58l-.34,7.12,7.18.81s.13,18.8-1.51,23c.89.42,15.71,3.89,19.48,3.27a3.78,3.78,0,0,0,1.09-.3c-.29-1.68,1.18-22.4,1.18-22.4s3.08,2.26,4.81,3.58a4.68,4.68,0,0,0,.79-1.43h0a28.57,28.57,0,0,0,1.07-5.74L216.55,153a3.32,3.32,0,0,0-1.75-.88,39.71,39.71,0,0,1-5.66-1.29c-.81,1-6,1.61-7.16-.22Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M221.35,164.27l2,1.71a1,1,0,0,0,1.46-.22l8.65-13.51s2.82-2.35,2.8-3.82c0-1-1.52-2.37-1.78-2.42s.17-1.35.2-2.8-.49-1.7-1-1.7,0,.48,0,2-1.77,6.11-2.28,7L224,160l-1.58-1.5A28.57,28.57,0,0,1,221.35,164.27Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M208.26,143.94a3.06,3.06,0,0,1-1,2.59c-.81.5-1.5.46-1.61.72-.27-.57-.35-.72-.35-.72l-.35.84-.26-.7-.6.58-.09-.84s-.38,1-.44.84a1,1,0,0,0-.54-.67c.13,1.4.49,3.77-.49,3.92l-.57.08c1.14,1.83,6.35,1.24,7.16.22a2.47,2.47,0,0,1-1.23-.71c-.63-1.08-.82-3,0-3.46a6.31,6.31,0,0,0,1.85-2.33,4.7,4.7,0,0,0,.2-1.41c0-.53.15-.54.29-1.06h0c-.95.32-1.21.63-1.44.49a.67.67,0,0,0-.92.15C207.6,142.82,208.16,143.36,208.26,143.94Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M203,146.58a3.92,3.92,0,0,1-1.18-.88,7.67,7.67,0,0,1-1.52-6.37c.61-3.54,2.19-4,3.77-4.44a7,7,0,0,1,5.42,1.06c1.08,1,2.38,2.4,2.24,3.51s-.08,1.95-1.24,2.29l-.25.07c-.95.32-1.21.63-1.44.49a.67.67,0,0,0-.92.15c-.32.36.24.9.34,1.48a3.06,3.06,0,0,1-1,2.59c-.81.5-1.5.46-1.61.72-.27-.57-.35-.72-.35-.72l-.35.84-.26-.7-.6.58-.09-.84s-.38,1-.44.84A1,1,0,0,0,203,146.58Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M201.91,236.38c-1.21-.13-2.74-.42-3.45-1.42-.05.94,0,.9,1.1,1.43s2.77,1.15,3.81.39a33.66,33.66,0,0,0,3.14-3.06h0c0-.22,0-.42,0-.6C204.28,235.08,203.31,236.54,201.91,236.38Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M208.69,239a5.08,5.08,0,0,0,3,.08c1.05-.24,3-2.7,4.28-3.43a15.2,15.2,0,0,0,4.39-4.7c1.09-1.81.54-2.25.19-2.48.44,1.36-1.84,4.8-4.67,6.73-3.08,2.09-4.29,3.88-5.85,3.56-1.23-.26-2.78-.71-3.36-1.85C206.42,238.45,207.7,238.67,208.69,239Z"/>
|
||||||
|
<path class="cls-22" d="M206.9,231.13l-.1,0c-1.14-.5-.88.4-.55,1.13a3.14,3.14,0,0,1,.22.89"/>
|
||||||
|
<path class="cls-22" d="M212.64,233.14c-.72.2-.64-.59-.53-1.16"/>
|
||||||
|
<path class="cls-22" d="M203.94,230.52c-.69.27-.69-.52-.63-1.1"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M220.58,228.5h0c.35.23.9.67-.19,2.48a15.2,15.2,0,0,1-4.39,4.7c-1.31.73-3.23,3.19-4.28,3.43a5.08,5.08,0,0,1-3-.08c-1-.36-2.27-.58-2-2.09"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M198.46,235h0c-.05.94,0,.9,1.1,1.43s2.77,1.15,3.81.39a33.66,33.66,0,0,0,3.14-3.06h0"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M202.57,136.72c.21.61.72,2.29-.44,2.73s-2.64,1.42-2.7,1.85-.2,1.06-.67,1.27l-1.31-1.46c.69-1.08,3.37-4.75,3.73-4.77S202.36,136.12,202.57,136.72Z"/>
|
||||||
|
<path class="cls-19" d="M197.45,141.11l1.31,1.46-7.79,8h-2.31l-4.32.11a2.25,2.25,0,0,0-.74.12Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M188.66,150.58l-.23,4.95-4.31-.43a2.21,2.21,0,0,1-1.42-.71,2.17,2.17,0,0,1-.58-1.47,2.22,2.22,0,0,1,1.48-2.11,2.25,2.25,0,0,1,.74-.12Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 20 KiB |
115
src/assets/images/exception/404.svg
Normal file
115
src/assets/images/exception/404.svg
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-2,.cls-24,.cls-25,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#67c8ff;}.cls-14{fill:#8cd7ff;}.cls-15{fill:#b0e7ff;}.cls-16{fill:#728cb9;}.cls-17{fill:#7798b9;}.cls-18{fill:#a4c0d9;}.cls-19{fill:#ebfcff;}.cls-20{fill:#ffb056;}.cls-21{fill:#257fba;}.cls-22{fill:#398eed;}.cls-23{fill:#ffeed2;}.cls-24{stroke:#e49056;stroke-width:0.26px;}.cls-25{stroke:#4986d9;stroke-width:0.1px;}.cls-26{fill:#e55c5c;opacity:0.2;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
</defs>
|
||||||
|
<title>404</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-8">
|
||||||
|
<path class="cls-9"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M182.43,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a6.39,6.39,0,0,1,.22.78c0,.06,0,.12,0,.19a8.08,8.08,0,0,1,.14.9V175c0,.31,0,.63,0,1V164.28c0-.28,0-.55,0-.82v-.14h0c0-.26-.06-.51-.11-.75l0-.14c0-.06,0-.13,0-.19L184,162c-.05-.17-.1-.33-.16-.49v0h0c-.06-.16-.12-.31-.19-.46s-.09-.17-.13-.25a.93.93,0,0,0-.05-.1.59.59,0,0,1,0-.08,3.74,3.74,0,0,0-.27-.42l-.08-.1-.12-.15c-.05-.06-.1-.13-.16-.19a3,3,0,0,0-.25-.25l-.09-.09A4.06,4.06,0,0,0,182,159l-.11-.07-.12-.07-.18-.12-.5-.23c-.26-.11-.53-.22-.81-.32a2.46,2.46,0,0,1-.29-.09l-.54-.16h0l-.65-.16-.34-.09c-.32-.06-.65-.13-1-.18h0c-.36-.06-.73-.11-1.12-.15l-.39,0-.8-.07H175l-.74,0-.4,0-1.26,0h-2.95v11.49h2.95c.43,0,.85,0,1.26,0l.4,0,.8,0,.79.07.4,0,1.12.16h0l1,.19.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,182.43,170.83Z"/>
|
||||||
|
<rect class="cls-13" x="122.87" y="157.13" width="29.56" height="11.49"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M169.61,106.86q0-.52,0-1c0-.08,0-.15,0-.23s0-.35,0-.52a2.51,2.51,0,0,0,0-.27c0-.25-.06-.49-.1-.73a3.31,3.31,0,0,0,0-.33,1.89,1.89,0,0,1-.05-.23l-.12-.52c0-.11,0-.23-.07-.34a2.41,2.41,0,0,1-.08-.25c0-.14-.08-.27-.13-.4a2,2,0,0,0-.08-.26c0-.12-.09-.23-.14-.35s-.08-.21-.13-.31l0-.15c-.08-.18-.18-.34-.26-.51a1.74,1.74,0,0,1-.1-.19.08.08,0,0,1,0,0c-.14-.25-.3-.49-.46-.72l0,0c-.09-.13-.19-.24-.28-.36s-.2-.25-.3-.36,0,0,0,0l-.45-.43-.26-.24a6.42,6.42,0,0,0-.65-.48l-.13-.1h0l-.46-.27a1.63,1.63,0,0,0-.19-.09l-.52-.25c-.14-.06-.29-.13-.44-.18s-.37-.14-.57-.2l-.31-.1a.58.58,0,0,0-.14,0c-.32-.09-.65-.16-1-.22l-.2,0h-.05c-.4-.06-.83-.11-1.26-.14h0c-.39,0-.79,0-1.2,0H159l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0a3,3,0,0,0-.43.09.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.08,0-.14.1-.53.38-.12.09-.27.23a53.11,53.11,0,0,0-5.87,6.55l-36.44,45.8-2.55,3.17c-.68.86-1.34,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56l.39-.31c.17-.14.35-.26.53-.39a1.64,1.64,0,0,0,.22-.14l.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09h.26c.19,0,.38,0,.57,0,.42,0,.83,0,1.23,0a12.44,12.44,0,0,1,1.26.14l.25,0q.51.09,1,.21l.45.14c.2.06.39.12.57.19l.44.19.52.24c.22.12.44.24.65.37h0l.13.1a6.42,6.42,0,0,1,.65.48c.09.07.17.16.26.24s.31.28.45.43.21.26.32.39.19.23.28.36a7.45,7.45,0,0,1,.5.78l.1.19c.11.21.22.43.31.65s.09.22.13.32a6.32,6.32,0,0,1,.22.61c.05.13.09.26.13.4l.15.59.12.52.09.56c0,.24.08.48.1.73s.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V107.13A2.44,2.44,0,0,0,169.61,106.86Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M247,164.23c-1,5.13-2.63,9.07-5,11.83a11.68,11.68,0,0,1-.85.87c-.09.09-.18.16-.27.24a6.66,6.66,0,0,1-.59.49c-.19.14-.37.28-.56.4s-.39.27-.6.39l-.38.21c-.28.15-.57.3-.86.43l-.2.08a10,10,0,0,1-1.13.4l-.29.09c-.32.08-.64.16-1,.22L235,180c-.43.07-.87.14-1.32.18h-.23c-.43,0-.87.05-1.33.05s-.9,0-1.34-.05l-.7-.08-.77-.1-.21,0c-.39-.08-.78-.17-1.16-.27s-.48-.16-.72-.25l-.55-.19c-.24-.1-.46-.21-.7-.33s-.33-.14-.48-.23l-.21-.13a8.63,8.63,0,0,1-.82-.51c-.21-.15-.41-.31-.61-.47l-.43-.34c-.21-.19-.41-.39-.6-.59s-.27-.25-.39-.39a12.06,12.06,0,0,1-.77-.94l-.17-.22c-.23-.32-.47-.66-.69-1a1,1,0,0,0-.1-.17c-.2-.34-.4-.69-.59-1a1.62,1.62,0,0,1-.1-.18c-.2-.39-.39-.8-.58-1.22l-.13-.31c-.17-.4-.34-.81-.49-1.24l-.06-.14c-.17-.47-.33-1-.48-1.47l-.12-.43c-.12-.39-.22-.79-.33-1.2,0-.15-.07-.31-.11-.46-.13-.55-.26-1.11-.37-1.68s-.23-1.25-.33-1.9l0-.14c-.1-.61-.19-1.25-.27-1.9,0-.17,0-.34-.07-.51-.07-.57-.13-1.14-.19-1.73,0-.12,0-.23,0-.35l-.09-1c0-.49-.09-1-.13-1.48s0-.75-.07-1.12-.06-1-.09-1.51,0-.81-.05-1.21,0-1-.07-1.55l0-1.3,0-1.61c0-.85,0-1.7,0-2.57v11.48c0,.75,0,1.49,0,2.21,0,.13,0,.24,0,.36,0,.55,0,1.08,0,1.61s0,.88,0,1.3,0,1,.07,1.56,0,.82.05,1.21l.09,1.5c0,.38,0,.76.07,1.12,0,.51.09,1,.13,1.49,0,.29.05.6.08.89,0,0,0,.09,0,.13s0,.23,0,.35c.06.59.12,1.16.19,1.72,0,.18.05.35.07.52.08.65.17,1.28.27,1.9l0,.14c.06.41.13.82.2,1.21,0,.23.09.46.13.68.11.58.24,1.14.37,1.69,0,.15.07.3.11.46s.09.37.14.55.12.43.19.65l.12.43c.15.48.3,1,.46,1.42,0,0,0,0,0,0l.06.14c.15.43.32.84.49,1.24l.13.31.11.26c.15.33.31.65.47,1a1.62,1.62,0,0,0,.1.18c.09.18.19.36.29.54l.3.5.1.17c.18.28.36.56.54.82l.16.2.16.22c.25.33.5.64.77.94l.06.06c.1.12.22.22.33.33s.39.4.6.58.29.23.43.35.4.32.61.47l.07.06q.38.24.75.45l.21.13h0l.46.22c.23.11.46.23.7.33l.55.19c.24.08.47.17.72.24l0,0c.37.1.74.18,1.12.25l.21,0,.2,0c.18,0,.38,0,.57.06s.46.07.7.08l.15,0c.39,0,.78,0,1.19,0h.26c.36,0,.72,0,1.07-.06h.26c.38,0,.76-.08,1.13-.14l.16,0,.32-.07.52-.1.45-.13.29-.08.18-.05c.31-.1.6-.2.89-.32l.06,0,.2-.09.62-.28c.09,0,.16-.1.24-.14l.38-.21c.1-.07.21-.12.31-.18l.29-.21.56-.4.24-.18.35-.31.27-.24a11.84,11.84,0,0,0,.85-.88c2.39-2.75,4-6.69,5-11.82a113.49,113.49,0,0,0,1.44-20.15V144.08A113.42,113.42,0,0,1,247,164.23Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M267.31,143.7c0-.12,0-.23,0-.34,0-.49,0-1,0-1.43s0-.69,0-1c0-.5,0-1-.06-1.46,0-.31,0-.62,0-.92,0-.54-.06-1.08-.1-1.61,0-.23,0-.46,0-.68-.06-.75-.12-1.49-.19-2.22v0c-.06-.63-.13-1.25-.2-1.87,0-.19-.05-.37-.07-.56-.06-.43-.11-.86-.17-1.29,0-.22-.07-.43-.1-.65-.06-.39-.12-.78-.19-1.17,0-.21-.07-.42-.1-.62l-.06-.35c0-.14-.06-.27-.08-.41l-.33-1.63c-.05-.21-.09-.42-.14-.63-.16-.71-.33-1.41-.51-2.08h0c-.16-.6-.33-1.19-.51-1.76l-.18-.56c-.12-.38-.25-.77-.38-1.14,0-.07,0-.14-.07-.21s-.13-.32-.19-.49l-.3-.8c-.09-.23-.19-.46-.29-.69s-.21-.51-.32-.76c0-.08-.07-.17-.11-.25-.13-.29-.27-.58-.4-.86-.34-.68-.7-1.34-1.06-2-.05-.08-.09-.17-.13-.25l-.18-.29c-.2-.34-.4-.68-.6-1s-.23-.38-.35-.56c-.23-.36-.47-.72-.72-1.07-.07-.11-.14-.22-.22-.33l0-.06q-.56-.77-1.14-1.5l-.3-.37c-.3-.36-.61-.72-.92-1.07-.06-.07-.13-.16-.2-.23l-.17-.17c-.44-.49-.9-1-1.37-1.41l-1-.92-.32-.27-.74-.61-.37-.28q-.4-.31-.81-.6l-.29-.21-.1-.07-.42-.27c-.26-.18-.53-.35-.8-.52l-.56-.33-.78-.45-.18-.1-.29-.15c-.42-.21-.83-.42-1.26-.62l-.48-.22c-.57-.25-1.14-.49-1.73-.71s-.91-.33-1.37-.48l-.46-.14-.74-.22-.17,0c-.49-.14-1-.26-1.49-.37l-.24-.06c-.59-.13-1.18-.24-1.79-.34l-.12,0-.57-.08-1-.13-.75-.08-1-.09-.25,0-.79,0-.52,0c-.54,0-1.08,0-1.63,0h-.91c-.35,0-.7,0-1.05,0l-.47,0-1.41.1h-.07c-.45.05-.9.09-1.34.15l-.41.06-.91.13-.13,0-.41.07-.69.13-.55.11-.67.15-.19,0-.37.1-.61.15-.56.16-.59.18-.21.06-.33.12-.59.2-.53.19-.57.22-.24.09-.27.12-.62.26-.48.22-.61.3-.28.13a1.51,1.51,0,0,1-.18.09l-.76.42-.36.19c-.37.21-.73.43-1.09.65l0,0c-.58.36-1.13.75-1.67,1.15-.17.11-.32.24-.48.36s-.45.33-.66.51-.32.28-.48.41l-.55.48c-.37.33-.73.68-1.08,1l-.44.43c-.48.5-1,1-1.4,1.56l-.17.22c-.39.47-.77,1-1.13,1.47-.14.19-.27.39-.4.58-.28.41-.56.82-.82,1.24l-.41.67c-.26.44-.51.89-.76,1.35l-.33.62c-.34.68-.67,1.36-1,2.07A55.46,55.46,0,0,0,198,128.9a127.46,127.46,0,0,0-1.1,17.57V158a127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127c.31-.71.64-1.4,1-2.07l.33-.62c.25-.46.5-.91.76-1.35l.41-.67c.26-.42.54-.84.82-1.24.13-.2.26-.4.4-.59.36-.5.74-1,1.13-1.46l.17-.22c.45-.54.92-1.06,1.4-1.56l.44-.44q.52-.53,1.08-1l.55-.48c.37-.32.75-.62,1.14-.92.16-.12.31-.25.48-.37.55-.4,1.12-.8,1.7-1.17.36-.22.72-.44,1.09-.65l.36-.2.76-.41.46-.23.61-.29.48-.22.62-.27.51-.2.57-.22.53-.2.59-.2.54-.17.59-.18.56-.16.61-.15.56-.14.66-.15.56-.11.68-.13.55-.1.91-.13.41-.05c.44-.06.89-.11,1.34-.15h.07c.46,0,.93-.08,1.41-.1l.47,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.52,0,1,.06c.33,0,.65.06,1,.09l.75.07,1,.14.69.1c.61.1,1.2.21,1.79.34l.24,0,1.49.37.91.27.46.14c.46.15.92.31,1.37.48s1.16.46,1.73.71l.48.22c.43.2.84.4,1.26.62l.47.25q.39.21.78.45c.19.11.38.21.56.33s.54.34.8.51l.52.35.29.21c.27.19.55.39.81.6l.36.28c.26.2.5.4.75.61l.32.27c.34.3.68.6,1,.92s.93.92,1.37,1.4l.37.41c.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.14,1.5l.26.39c.25.35.49.71.72,1.07l.35.55.6,1,.31.54c.36.65.72,1.31,1.06,2l.51,1.11c.11.25.22.5.32.76s.2.45.29.69l.3.8c.09.23.18.46.26.7s.26.75.38,1.14l.18.56c.18.57.35,1.16.51,1.76h0c.18.67.35,1.37.51,2.07.05.21.09.43.14.64.11.53.22,1.08.33,1.63,0,.25.09.5.14.75s.07.42.1.63c.07.39.13.77.19,1.17,0,.21.07.43.1.65.06.42.11.85.17,1.29,0,.19.05.37.07.56.07.62.14,1.25.21,1.9s.13,1.46.19,2.21c0,.23,0,.46,0,.69,0,.53.07,1.07.1,1.61,0,.3,0,.61,0,.91,0,.49.05,1,.06,1.46s0,.68,0,1,0,1,0,1.43c0,.67,0,1.34,0,2h0V145.37C267.32,144.81,267.32,144.25,267.31,143.7Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M356.8,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a5.92,5.92,0,0,1,.22.78,1.06,1.06,0,0,1,0,.19,8.46,8.46,0,0,1,.14.9.49.49,0,0,0,0,.12c0,.31,0,.64,0,1V164.28c0-.29,0-.57,0-.84a.49.49,0,0,1,0-.12h0c0-.25-.06-.5-.1-.74,0,0,0-.1,0-.15a1.29,1.29,0,0,0,0-.19c0-.09,0-.19-.06-.27s-.1-.35-.16-.51h0c-.06-.16-.12-.32-.19-.47s-.09-.17-.13-.25l-.05-.1s0-.05,0-.08-.17-.28-.26-.42l-.09-.1-.12-.15-.16-.2-.25-.24-.09-.09a4.06,4.06,0,0,0-.46-.36l-.11-.07-.12-.07-.19-.12-.49-.23c-.26-.11-.53-.22-.81-.31l-.29-.1-.54-.16h0l-.65-.16-.34-.08-1-.19h-.09c-.36-.06-.74-.11-1.12-.15l-.38,0-.82-.07h-.05l-.73,0-.41,0-1.26,0h-3v11.49h3c.43,0,.85,0,1.26,0l.4,0,.79,0,.82.07.38,0,1.12.16h.09l1,.18.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,356.8,170.83Z"/>
|
||||||
|
<rect class="cls-13" x="297.24" y="157.13" width="29.56" height="11.49"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M344,106.86c0-.35,0-.69,0-1,0-.08,0-.15,0-.23s0-.35,0-.52,0-.18,0-.27c0-.25-.06-.49-.1-.73s0-.23-.05-.33a1.89,1.89,0,0,0-.05-.23c0-.18-.07-.35-.11-.52s-.05-.23-.08-.34a1.83,1.83,0,0,0-.08-.25l-.12-.4c0-.09-.05-.18-.08-.26s-.09-.23-.14-.35-.08-.21-.13-.31l-.06-.15c-.08-.18-.17-.34-.26-.51a1.74,1.74,0,0,0-.1-.19.08.08,0,0,0,0,0q-.21-.37-.45-.72l0,0c-.09-.12-.19-.24-.29-.35s-.19-.26-.29-.37l0,0a6.14,6.14,0,0,0-.45-.43l-.25-.24a7.62,7.62,0,0,0-.64-.48l-.14-.1h0l-.46-.27a1.11,1.11,0,0,0-.19-.09c-.16-.09-.34-.17-.51-.25s-.29-.13-.44-.18l-.57-.2-.31-.1-.14,0a9.78,9.78,0,0,0-1-.22l-.2,0h0c-.41-.06-.83-.11-1.27-.14h0c-.38,0-.78,0-1.19,0h-.14l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0c-.15,0-.29,0-.43.09a.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.07,0-.14.11a4.7,4.7,0,0,0-.53.38l-.12.08-.28.24a53,53,0,0,0-5.88,6.55l-36.43,45.8c-1,1.25-1.86,2.31-2.54,3.17s-1.36,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56l.4-.32.53-.38.21-.14.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09H333c.19,0,.37,0,.57,0,.42,0,.83,0,1.22,0a12.65,12.65,0,0,1,1.27.14l.25,0q.51.09,1,.21l.45.14c.19.06.39.12.57.19l.44.19.51.24c.23.12.45.24.65.37h0l.15.1a7.62,7.62,0,0,1,.64.48c.09.07.17.16.26.24s.3.28.44.43a3.89,3.89,0,0,1,.32.39c.1.12.2.23.29.36a6.07,6.07,0,0,1,.49.78,1.14,1.14,0,0,1,.1.19c.11.21.22.43.32.65s.09.21.13.32.15.4.22.61l.12.39c.06.2.11.4.16.6s.08.34.11.52.07.37.1.56.07.48.1.73.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V106.86Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M181.06,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.61,5.45c-1.74,1.15-4.36,1.72-7.84,1.72h-4.19v12q0,5-2.34,7.39a9.16,9.16,0,0,1-12.48-.07c-1.58-1.65-2.37-4.1-2.37-7.32v-12H117.92q-6.53,0-9.79-2.78a9.36,9.36,0,0,1-3.27-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56,8.12,8.12,0,0,1,5.54-2q10.44,0,10.45,11.25v50h2.95A22.17,22.17,0,0,1,181.06,170Zm-28.63-1.35V131.09l-29.56,37.53h29.56"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M262.1,126.69q5.22,10.67,5.22,30.17A104.74,104.74,0,0,1,266,175.07a40.85,40.85,0,0,1-5.09,13.83,32.76,32.76,0,0,1-12.1,11.76,33.29,33.29,0,0,1-16.5,4.13,32.86,32.86,0,0,1-18.73-5.55,34.11,34.11,0,0,1-12.48-15.38A54.59,54.59,0,0,1,197.92,172a93.33,93.33,0,0,1-1-14,127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127a30.81,30.81,0,0,1,11.79-14.18q7.73-4.87,18.46-4.88a36.2,36.2,0,0,1,12.85,2.17,29.45,29.45,0,0,1,10.14,6.33A36.1,36.1,0,0,1,262.1,126.69Zm-15.06,49a113.49,113.49,0,0,0,1.44-20.15A101.2,101.2,0,0,0,247,136.22c-1-5-2.7-8.81-5.08-11.37S236.2,121,232,121q-9.07,0-12.61,8.59t-3.54,26.48a107,107,0,0,0,1.51,19.9q1.51,7.76,5.09,11.73a12.37,12.37,0,0,0,9.69,4q6.33,0,9.9-4.14c2.39-2.75,4-6.69,5-11.82"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M355.43,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.62,5.45q-2.61,1.73-7.83,1.72H344v12q0,5-2.33,7.39a8.29,8.29,0,0,1-6.26,2.42,8.19,8.19,0,0,1-6.22-2.49c-1.58-1.65-2.37-4.1-2.37-7.32v-12H292.29q-6.54,0-9.8-2.78a9.42,9.42,0,0,1-3.26-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56,8.1,8.1,0,0,1,5.54-2q10.44,0,10.44,11.25v50h3A22.17,22.17,0,0,1,355.43,170Zm-28.63-1.35V131.09l-29.56,37.53H326.8"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M270.46,172.17c.07,1.42-.5,2.61-1.28,2.64s-1.46-1.08-1.53-2.5.5-2.6,1.28-2.64S270.39,170.75,270.46,172.17Z"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M285.58,170.34c.33,0,.62.46.65,1.06s-.21,1.1-.54,1.12l-.88.09c.12-.19.17-.36,0-.48-.38-.34-.75-.34-1-.08s-.17.57-.48.71h0l-3.26.34-.61.07a3.68,3.68,0,0,0,.19-1.45,3.76,3.76,0,0,0-.33-1.42h2c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13c1,0,.41-.65.47-.93h.29Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M279.17,171.65a3.49,3.49,0,0,1-1.1,2.61l-8.67,1.23c.89-.21,1.53-1.64,1.44-3.34S270,169.06,269,169l8.79.38A2.92,2.92,0,0,1,279.17,171.65Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M279.37,170.3a3.76,3.76,0,0,1,.33,1.42,3.68,3.68,0,0,1-.19,1.45c-.21.6-.57,1-1,1l-.43.06a3.49,3.49,0,0,0,1.1-2.61,2.92,2.92,0,0,0-1.34-2.3l.44,0C278.7,169.35,279.1,169.71,279.37,170.3Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M269.18,174.81c.78,0,1.35-1.22,1.28-2.64s-.75-2.54-1.53-2.5-1.35,1.22-1.28,2.64S268.41,174.85,269.18,174.81Zm1.66-2.66c.09,1.7-.55,3.13-1.44,3.34h0l-.17,0c-1,0-1.86-1.38-2-3.19s.64-3.31,1.63-3.36H269C270,169.06,270.76,170.44,270.84,172.15Z"/>
|
||||||
|
<path d="M303,176a1.14,1.14,0,0,0,.33.71,2.75,2.75,0,0,1-.88-.39A4.37,4.37,0,0,0,303,176Z"/>
|
||||||
|
<path d="M298.64,166.65l.12.16A5.6,5.6,0,0,0,297,169a4.63,4.63,0,0,1-2.06-1.52C296.92,168,297.5,166.05,298.64,166.65Z"/>
|
||||||
|
<path d="M306.62,169.68c-.86-3.88-3.84-4.21-3.84-4.21s-3.07-.47-4.14,1.18l.12.16A5.6,5.6,0,0,0,297,169a6.88,6.88,0,0,0,1.35.43c1.8.34,4.18.13,4.85,1.15s.22,2.66-.91,4.16c-.59.8-.28,1.31.16,1.62A4.37,4.37,0,0,0,303,176a.46.46,0,0,1,.28-.48,1.61,1.61,0,0,1,.49-.11,2.5,2.5,0,0,0,1.34-.39C305.68,174.58,307.49,173.56,306.62,169.68Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M320.54,231.08c0,.63.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85s7.18-.51,7.81-1.12.32-2.83.06-4.08a23.55,23.55,0,0,1-.41-4.38,16,16,0,0,0,.17-1.74c-.06-.35-1.59-1.62-1.59-1.62.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36S320.49,230.45,320.54,231.08Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M319.7,230c.26,1.25.57,3.47-.06,4.08s-7.81,1.12-7.81,1.12,0-.92,0-1.3,4.06-1.18,4.2-2-.47-2.2-1.23-2.16c-.38,0-.48-.26-.49-.57a7.35,7.35,0,0,1,.07-.78c0-.24.95,1,1.35.77s.86-3.75-.28-4.77a1.05,1.05,0,0,0-.86-.28s-.8-.86-.69-1.18.63-.81,1-.31,1.46-.07,1.88-.22a4.57,4.57,0,0,1,1.13-.14s1.53,1.27,1.59,1.62a16,16,0,0,1-.17,1.74A23.55,23.55,0,0,0,319.7,230Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M313.73,229.3l.17,3L295,235.55a3.15,3.15,0,0,1-3.64-2.68l-2.74-20.29,9.2,2.1-.35,12.89,16-3v.18Z"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M288.06,204.33c.51.45,9.48,2.36,15.15,2.31h0l-.77,5.1a3.62,3.62,0,0,1-4.4,3l-.24,0-9.2-2.1-8.66-2,1.86,19-2.31.39-4.45.75-.33.06L272.81,204a2.71,2.71,0,0,1,3.39-2.81Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M305.83,192.12h0a23,23,0,0,0,.05,2.76l-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51c.16,3,.39,6.37.53,7.94a11,11,0,0,1-3.37.43c-5.67.05-14.64-1.86-15.15-2.31s1.25-9.1,2.52-15.42a14.92,14.92,0,0,1-2.92,1.4,5.36,5.36,0,0,1-1.91-2.19,6.93,6.93,0,0,1-.7-4.55,2,2,0,0,1,.24-.6c1.44-1.05,5.18-2.8,7.2-4.19a8.25,8.25,0,0,1,4.06-1.22c-.17.32-.75,3,.87,3.44s5-.87,5-3.08a6.18,6.18,0,0,1,3.22.52c1.77,1,4.07,6.39,5.89,11.34-.32,1.08-2.22,1.88-4,2.19A8.16,8.16,0,0,1,305.83,192.12Z"/>
|
||||||
|
<polygon class="cls-23"
|
||||||
|
points="279.49 229.99 279.48 231.93 275.27 232.85 275.04 231.33 275.04 230.74 279.49 229.99"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M314.38,228.43a7.35,7.35,0,0,0-.07.78h0l-.58.09-.27-4.55,2-.32c1.14,1,.61,4.6.28,4.77S314.38,228.19,314.38,228.43Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M314,197.18c-.52-1.65-1.43-4.45-2.51-7.4-.32,1.08-2.22,1.88-4,2.19l1.08,2.83-2.68.08-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51,6.84.35A1.11,1.11,0,0,0,314,197.18Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M302.38,177.92c0,2.21-3.34,3.52-5,3.08s-1-3.12-.87-3.44a14.35,14.35,0,0,1,1.51,0c.17-.09.3-.54.3-.91a3.83,3.83,0,0,0,1.12.27,5.52,5.52,0,0,0,3-.59c-.32.56-.81,1.15-.74,1.48C301.73,177.92,302,177.93,302.38,177.92Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M303.19,170.55c.67,1,.22,2.66-.91,4.16-.59.8-.28,1.31.16,1.62a5.52,5.52,0,0,1-3,.59,3.83,3.83,0,0,1-1.12-.27c-1.65-.71-2.29-2.23-2.05-4.86a9.18,9.18,0,0,1,1-2.68,3.91,3.91,0,0,0,1,.29C300.14,169.74,302.52,169.53,303.19,170.55Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M285.29,170.34h0c0-.29-.74-1.21-1.47-1.51a6.8,6.8,0,0,0-2.48,0c-.34,0-.84,1.33-.9,1.48h.9c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13C285.8,171.29,285.23,170.62,285.29,170.34Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M283.87,172.05c.22-.26.59-.26,1,.08.14.12.09.29,0,.48l-1.42.15C283.7,172.62,283.64,172.31,283.87,172.05Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M283.38,172.76h0l1.42-.15c-.21.34-.64.74-.7,1.06-.09.49-1.08.75-1.52,1.35l-.48,10.24,2.94-1.69a6.93,6.93,0,0,0,.7,4.55L279.2,191a1,1,0,0,1-1.41-1.07l2.2-15.22c.12-1,.13-1.61.13-1.61Z"/>
|
||||||
|
<path class="cls-24" d="M303,187.14l1.72,4.81a3.36,3.36,0,0,0,1.11.17"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M317.87,222.3c.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36.66,4.23.71,4.86.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85"/>
|
||||||
|
<ellipse class="cls-23" cx="303.14" cy="173.18" rx="1.32" ry="0.91"
|
||||||
|
transform="translate(13 367.35) rotate(-63.53)"/>
|
||||||
|
<ellipse class="cls-26" cx="303.14" cy="173.18" rx="0.77" ry="0.53"
|
||||||
|
transform="translate(13 367.35) rotate(-63.53)"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M262.55,235.72a.72.72,0,0,1-.12-1.21c-.17.18.05.37.48.39a36.08,36.08,0,0,0,11.77-.55c1-.08,3.65.2,5.06.15,1.16-.05,1.62-.47,1.73-.86a1,1,0,0,1,.17,1.64c-.6.61-4.14.52-4.82.51s-7.56,0-8.57.12A26.72,26.72,0,0,1,262.55,235.72Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M280.69,231.61a8.33,8.33,0,0,1,.81,1.8.91.91,0,0,1,0,.23c-.11.39-.57.81-1.73.86-1.41.05-4-.23-5.06-.15a36.08,36.08,0,0,1-11.77.55c-.43,0-.65-.21-.48-.39a33.2,33.2,0,0,1,4.91-1.81,12.78,12.78,0,0,0,6.17-2.66,3.77,3.77,0,0,1,.75,0c.87.08,1.61.44,1.58.78s-.47.82.46.92a3.33,3.33,0,0,0,2.36-.58c.33-.37.34-.67,1-.56.18,0,.33,0,.46,0,.39,0,.58,0,.7.17S280.52,231.25,280.69,231.61Z"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M262.43,234.51a.72.72,0,0,0,.12,1.21,26.72,26.72,0,0,0,5.7.19c1-.17,7.9-.13,8.57-.12s4.22.1,4.82-.51a1,1,0,0,0-.17-1.64h0"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 32 KiB |
111
src/assets/images/exception/500.svg
Normal file
111
src/assets/images/exception/500.svg
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{fill:none;}.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{stroke-miterlimit:10;}.cls-2,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{stroke-width:2px;}.cls-2{stroke:url(#未命名的渐变_26);}.cls-3{stroke:url(#未命名的渐变_26-2);}.cls-4{stroke:url(#未命名的渐变_26-3);}.cls-5{stroke:url(#未命名的渐变_26-4);}.cls-6{stroke:url(#未命名的渐变_26-5);}.cls-7{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-13,.cls-8{opacity:0.4;}.cls-8{fill:url(#未命名的渐变_26-7);}.cls-9{opacity:0.7;}.cls-10{fill:url(#未命名的渐变_26-8);}.cls-11{fill:url(#未命名的渐变_26-9);}.cls-12{fill:url(#未命名的渐变_26-10);}.cls-13{fill:url(#未命名的渐变_26-11);}.cls-14{fill:#67c8ff;}.cls-15{fill:#8cd7ff;}.cls-16{isolation:isolate;}.cls-17{clip-path:url(#clip-path);}.cls-18{fill:#517d94;}.cls-19{fill:#ebfcff;}.cls-20{fill:#ffb056;}.cls-21{stroke:#e49056;stroke-width:0.25px;}.cls-22{stroke:#4986d9;stroke-width:0.13px;}.cls-23{fill:#e49056;}.cls-24{fill:#fae6d2;}.cls-25{fill:#ffeed2;}.cls-26{fill:#d3d3d3;}.cls-27{fill:#fff;}.cls-28{fill:#398eed;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<clipPath id="clip-path">
|
||||||
|
<path class="cls-1"
|
||||||
|
d="M132.71,143.17v-8.64c1.84-.15,3.62-.2,5.32-.2s3.18,0,4.65.11c7.58.36,16.62,3.36,22.3,8.63s7.84,11.57,7.84,20.58v8.64c0-9-2.17-15.32-7.84-20.58s-14.72-8.27-22.3-8.63c-1.47-.07-3-.12-4.65-.12S134.55,143,132.71,143.17Z"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<title>500</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-2" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-3" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-4" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-5" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-6" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-7" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-8" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-9">
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M240.54,164.63c-1,5.12-2.63,9.07-5,11.82-.27.31-.56.6-.85.88l-.27.24c-.19.17-.39.33-.6.49l-.55.4-.6.38-.38.22q-.42.23-.87.42l-.19.09c-.37.15-.74.28-1.13.4l-.3.08c-.31.09-.63.16-1,.23l-.32.06q-.64.12-1.32.18H227c-.44,0-.88.06-1.33.06s-.9,0-1.34-.06l-.71-.08-.76-.1-.21,0a10.34,10.34,0,0,1-1.16-.27c-.25-.07-.48-.16-.72-.24l-.55-.19c-.24-.1-.47-.22-.7-.33l-.48-.23-.21-.13c-.28-.16-.56-.33-.82-.51s-.41-.32-.61-.48a5,5,0,0,1-.43-.34c-.21-.18-.41-.39-.61-.59l-.38-.38c-.27-.3-.52-.62-.77-.94l-.17-.22q-.36-.5-.69-1l-.1-.17c-.21-.34-.41-.68-.6-1.05l-.09-.18c-.2-.39-.4-.79-.58-1.21l-.14-.32c-.17-.4-.33-.81-.49-1.23a.78.78,0,0,0-.05-.14c-.17-.48-.33-1-.48-1.48-.05-.14-.08-.28-.13-.42-.11-.4-.22-.79-.32-1.2,0-.16-.08-.31-.11-.47-.13-.54-.26-1.1-.37-1.68s-.23-1.24-.34-1.89c0-.05,0-.1,0-.15-.1-.61-.19-1.25-.27-1.9,0-.16-.05-.34-.07-.51-.07-.56-.13-1.14-.2-1.73l0-.34c0-.33-.06-.69-.09-1-.05-.49-.09-1-.13-1.48s0-.74-.07-1.12-.07-1-.09-1.5l-.06-1.22c0-.51,0-1-.06-1.55s0-.86,0-1.3,0-1.06,0-1.61c0-.84,0-1.69,0-2.57v11.49c0,.75,0,1.48,0,2.21,0,.12,0,.24,0,.36,0,.54,0,1.08,0,1.61l0,1.3c0,.53,0,1,.06,1.55l.06,1.22c0,.51.06,1,.09,1.5s0,.75.07,1.12.08,1,.13,1.48c0,.3,0,.61.07.9,0,0,0,.08,0,.13l0,.34c.07.59.13,1.17.2,1.73,0,.17,0,.34.07.51.08.65.17,1.29.27,1.9,0,0,0,.1,0,.14.07.41.14.82.21,1.21,0,.23.08.46.13.69.11.58.24,1.13.37,1.68,0,.16.07.31.11.46s.09.38.14.56l.18.64c0,.15.08.29.13.43.14.49.3,1,.46,1.42,0,0,0,0,0,.05a.88.88,0,0,1,.05.15c.16.42.32.83.49,1.23,0,.11.09.21.14.31s.07.18.11.26c.15.33.31.65.47,1l.09.18c.1.18.19.37.29.54s.21.34.31.51l.1.17c.18.28.35.55.54.81l.15.2.17.22a12.06,12.06,0,0,0,.77.94l.05.07.34.32c.19.2.39.4.6.59a5,5,0,0,0,.43.34c.2.16.4.33.61.47l.07.06c.24.17.49.31.75.46l.21.12,0,0c.15.08.31.14.46.21a6.36,6.36,0,0,0,.7.33c.18.08.37.13.55.19s.47.18.72.25h0c.36.1.74.19,1.12.26l.21,0,.19,0,.57.07.71.08.14,0q.58,0,1.2,0h.26c.36,0,.71,0,1.07,0h.25c.39,0,.77-.09,1.13-.15l.17,0,.32-.06.52-.11c.15,0,.29-.08.44-.12l.3-.09.18,0a9.44,9.44,0,0,0,.89-.32l.06,0,.19-.09c.21-.09.43-.18.63-.29l.24-.14c.13-.06.25-.14.38-.21s.21-.11.31-.18l.29-.2.55-.4c.08-.07.17-.12.25-.18l.35-.31.27-.25a11.68,11.68,0,0,0,.85-.87q3.57-4.14,5-11.82A112.54,112.54,0,0,0,242,156V144.47A112.54,112.54,0,0,1,240.54,164.63Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M260.82,144.09c0-.11,0-.22,0-.34l0-1.43,0-1c0-.49,0-1-.06-1.46,0-.3,0-.61,0-.91,0-.55-.07-1.08-.1-1.62,0-.22,0-.45-.05-.68-.05-.75-.12-1.49-.19-2.22v0c-.06-.63-.13-1.26-.2-1.87,0-.19-.05-.38-.07-.57l-.18-1.28-.09-.66c-.06-.39-.12-.78-.19-1.16,0-.21-.07-.42-.11-.63s0-.23-.06-.35-.05-.26-.08-.4c-.1-.55-.21-1.1-.33-1.64,0-.21-.09-.42-.13-.63-.17-.71-.33-1.4-.51-2.08h0l-.51-1.77-.18-.56c-.13-.38-.25-.76-.38-1.13a1.72,1.72,0,0,1-.07-.21c-.06-.17-.13-.33-.19-.5l-.3-.79c-.1-.24-.19-.47-.29-.7l-.32-.75-.11-.26c-.13-.29-.27-.57-.41-.85-.34-.69-.69-1.35-1-2l-.14-.25c0-.1-.11-.19-.17-.29l-.6-1-.35-.55c-.23-.37-.48-.72-.72-1.08-.07-.1-.14-.22-.22-.32l0-.06c-.36-.52-.74-1-1.13-1.5l-.3-.37c-.3-.37-.61-.72-.92-1.07l-.2-.24-.17-.17c-.45-.48-.9-1-1.37-1.4s-.67-.62-1-.92l-.32-.27-.75-.61-.36-.29-.81-.6-.29-.21-.1-.06-.42-.28c-.27-.17-.53-.35-.8-.51s-.37-.23-.56-.34l-.78-.45-.18-.1-.3-.14c-.41-.22-.83-.42-1.25-.62l-.49-.23c-.56-.25-1.13-.49-1.72-.71s-.91-.32-1.38-.47l-.45-.14c-.25-.08-.49-.16-.74-.22l-.18,0c-.48-.13-1-.26-1.48-.37l-.25-.06c-.58-.12-1.18-.23-1.78-.33l-.12,0-.58-.07-1-.14-.75-.07c-.32,0-.65-.07-1-.09l-.24,0-.8,0-.51,0c-.54,0-1.08,0-1.63,0h-.91l-1.05,0-.48,0c-.47,0-.94,0-1.4.09h-.07l-1.34.14-.41.06-.91.13-.13,0-.41.08-.7.12-.55.12-.66.14-.2,0-.37.09-.6.16-.56.16-.59.17-.21.07-.33.11-.59.2-.53.2-.58.21a1.57,1.57,0,0,1-.23.09l-.27.12-.62.27-.49.22-.6.29-.29.14-.17.09-.77.41-.35.2c-.37.21-.73.42-1.09.65l0,0c-.57.36-1.12.75-1.67,1.15l-.48.37-.66.5-.47.42-.56.48c-.36.33-.72.67-1.07,1l-.44.43c-.48.51-1,1-1.4,1.56l-.17.22c-.39.48-.77,1-1.13,1.47-.14.19-.27.39-.41.59-.28.4-.55.81-.81,1.24-.14.22-.28.44-.41.66-.26.45-.51.9-.76,1.36l-.33.62c-.34.67-.67,1.36-1,2.07a54.8,54.8,0,0,0-3.44,13.43,125.91,125.91,0,0,0-1.1,17.57v11.49a125.91,125.91,0,0,1,1.1-17.57A54.8,54.8,0,0,1,195,127.35c.31-.72.64-1.4,1-2.07l.33-.63c.25-.46.5-.91.76-1.35.13-.22.27-.44.41-.66.26-.43.53-.84.81-1.25l.41-.58c.36-.51.74-1,1.13-1.47l.17-.22c.45-.54.92-1.06,1.4-1.56.14-.15.29-.29.44-.43.35-.35.71-.69,1.07-1l.56-.49,1.13-.92.48-.36c.56-.41,1.12-.8,1.71-1.17.36-.23.72-.45,1.09-.66l.35-.19.77-.41c.15-.08.3-.16.46-.23l.6-.29.49-.22c.2-.1.41-.18.62-.27l.5-.21.58-.22.53-.19.59-.2.54-.18.59-.17.56-.16.6-.16.57-.14.66-.14.56-.12.68-.13.55-.09.9-.13.42-.06,1.34-.14h.07l1.4-.1.48,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.51,0,1,.06,1,.09.75.08,1,.13.7.1c.6.1,1.2.21,1.78.34l.25.06c.5.11,1,.23,1.48.37l.92.26.45.14q.7.23,1.38.48c.59.22,1.16.46,1.72.71l.49.23c.42.19.84.4,1.25.61l.48.25.78.45.56.33.8.52.52.34.29.21.81.6.36.28.75.61.32.28c.34.29.68.6,1,.91s.92.92,1.37,1.41l.37.4c.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.13,1.5l.27.39c.24.35.49.71.72,1.08l.35.55.6,1c.1.18.2.36.31.54.36.65.71,1.31,1,2,.18.36.35.74.52,1.11s.21.51.32.76l.29.69.3.8c.09.23.17.47.26.71s.25.75.38,1.13l.18.56c.17.57.34,1.16.5,1.76h0c.18.67.34,1.37.51,2.08,0,.21.09.42.13.63.12.54.23,1.08.33,1.64.05.25.1.49.14.75s.08.42.11.63c.07.38.13.77.19,1.16l.09.65.18,1.29c0,.19,0,.38.07.57.07.62.14,1.25.2,1.89s.14,1.47.19,2.22c0,.22,0,.45.05.68,0,.53.07,1.07.1,1.62,0,.3,0,.6,0,.91,0,.48.05,1,.06,1.46l0,1,0,1.43c0,.66,0,1.33,0,2h0V145.77C260.83,145.2,260.82,144.65,260.82,144.09Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M255.6,127.08q5.23,10.67,5.23,30.18a103.75,103.75,0,0,1-1.38,18.21,40.8,40.8,0,0,1-5.09,13.83,32.63,32.63,0,0,1-12.09,11.75,33.35,33.35,0,0,1-16.5,4.14A32.93,32.93,0,0,1,207,199.63a34.21,34.21,0,0,1-12.48-15.37,54.27,54.27,0,0,1-3.12-11.86,92,92,0,0,1-1-14.05,125.91,125.91,0,0,1,1.1-17.57A54.8,54.8,0,0,1,195,127.35a30.64,30.64,0,0,1,11.79-14.18q7.73-4.87,18.46-4.88a36.47,36.47,0,0,1,12.85,2.16,29.6,29.6,0,0,1,10.14,6.33A36.27,36.27,0,0,1,255.6,127.08Zm-15.06,49A112.54,112.54,0,0,0,242,156a101,101,0,0,0-1.51-19.34q-1.51-7.53-5.09-11.38c-2.39-2.56-5.68-3.84-9.9-3.84q-9.08,0-12.61,8.59t-3.54,26.49a107,107,0,0,0,1.51,19.9q1.52,7.74,5.09,11.72a12.37,12.37,0,0,0,9.69,4q6.31,0,9.9-4.13t5-11.82"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M323.79,164.63c-1,5.12-2.63,9.07-5,11.82-.27.31-.56.6-.85.88l-.27.24c-.19.17-.39.33-.6.49l-.55.4-.6.38-.38.22q-.42.23-.87.42l-.19.09c-.37.15-.74.28-1.13.4l-.3.08c-.31.09-.63.16-1,.23l-.32.06q-.64.12-1.32.18h-.23c-.44,0-.88.06-1.33.06s-.9,0-1.34-.06l-.71-.08-.76-.1-.21,0a10.34,10.34,0,0,1-1.16-.27c-.25-.07-.48-.16-.72-.24l-.55-.19c-.24-.1-.47-.22-.7-.33l-.48-.23-.21-.13c-.28-.16-.56-.33-.82-.51s-.41-.32-.61-.48a5,5,0,0,1-.43-.34c-.21-.18-.41-.39-.61-.59l-.38-.38c-.27-.3-.52-.62-.77-.94l-.17-.22q-.36-.5-.69-1l-.1-.17c-.21-.34-.41-.68-.6-1.05l-.09-.18c-.2-.39-.4-.79-.58-1.21l-.14-.32q-.26-.6-.48-1.23l-.06-.14c-.17-.48-.33-1-.48-1.48,0-.14-.08-.28-.13-.42-.11-.4-.22-.79-.32-1.2,0-.16-.08-.31-.11-.47-.13-.54-.26-1.1-.37-1.68s-.23-1.24-.34-1.89a.77.77,0,0,0,0-.15c-.1-.61-.19-1.25-.27-1.9,0-.16-.05-.34-.07-.51-.07-.56-.13-1.14-.19-1.73,0-.11,0-.23,0-.34,0-.33-.06-.69-.09-1-.05-.49-.09-1-.13-1.48s-.05-.74-.07-1.12-.07-1-.09-1.5l-.06-1.22c0-.51,0-1-.06-1.55s0-.86,0-1.3,0-1.06,0-1.61c0-.84,0-1.69,0-2.57v11.49c0,.75,0,1.48,0,2.21,0,.12,0,.24,0,.36,0,.54,0,1.08,0,1.61l0,1.3c0,.53,0,1,.06,1.55l.06,1.22c0,.51.06,1,.09,1.5s.05.75.07,1.12.08,1,.13,1.48c0,.3.05.61.07.9,0,0,0,.08,0,.13s0,.22,0,.34c.06.59.12,1.17.19,1.73,0,.17,0,.34.07.51.08.65.17,1.29.27,1.9a.78.78,0,0,1,0,.14c.07.41.14.82.21,1.21,0,.23.08.46.13.69.11.58.24,1.13.37,1.68,0,.16.07.31.11.46s.09.38.14.56l.18.64c.05.15.09.29.13.43.15.49.3,1,.46,1.42l0,.05.06.15q.23.63.48,1.23c.05.11.09.21.14.31s.07.18.11.26c.15.33.31.65.47,1l.09.18c.1.18.2.37.3.54s.2.34.3.51l.1.17.54.81.15.2.17.22a12.06,12.06,0,0,0,.77.94l.06.07c.1.11.22.21.33.32s.39.4.6.59l.43.34c.2.16.4.33.61.47l.07.06c.24.17.5.31.75.46l.21.12,0,0c.15.08.31.14.46.21a6.36,6.36,0,0,0,.7.33c.18.08.37.13.55.19s.47.18.72.25h0c.37.1.74.19,1.12.26l.21,0,.19,0,.57.07.71.08.14,0q.58,0,1.2,0h.26c.36,0,.72,0,1.07,0h.25c.39,0,.77-.09,1.13-.15l.17,0,.32-.06.52-.11c.15,0,.3-.08.44-.12l.3-.09.18,0a9.44,9.44,0,0,0,.89-.32l.06,0,.19-.09c.21-.09.43-.18.63-.29l.24-.14c.13-.06.25-.14.38-.21s.21-.11.31-.18l.29-.2.55-.4c.08-.07.17-.12.25-.18l.35-.31.27-.25a11.68,11.68,0,0,0,.85-.87q3.57-4.14,5-11.82A112.54,112.54,0,0,0,325.24,156V144.47A112.54,112.54,0,0,1,323.79,164.63Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M344.07,144.09c0-.11,0-.22,0-.34l0-1.43,0-1c0-.49,0-1-.06-1.46,0-.3,0-.61,0-.91,0-.55-.06-1.08-.1-1.62,0-.22,0-.45-.05-.68-.05-.75-.11-1.49-.19-2.22v0c-.06-.63-.13-1.26-.2-1.87,0-.19-.05-.38-.07-.57l-.18-1.28L343,130c-.06-.39-.12-.78-.19-1.16,0-.21-.07-.42-.11-.63s0-.23-.05-.35l-.09-.4c-.1-.55-.21-1.1-.33-1.64,0-.21-.09-.42-.13-.63-.16-.71-.33-1.4-.51-2.08h0c-.16-.6-.34-1.19-.51-1.77l-.18-.56c-.13-.38-.25-.76-.38-1.13a1.72,1.72,0,0,1-.07-.21c-.06-.17-.13-.33-.19-.5l-.3-.79c-.1-.24-.19-.47-.29-.7s-.21-.5-.32-.75l-.11-.26c-.13-.29-.27-.57-.41-.85-.34-.69-.69-1.35-1.05-2l-.14-.25c-.05-.1-.11-.19-.17-.29l-.6-1-.35-.55c-.23-.37-.47-.72-.72-1.08-.07-.1-.14-.22-.22-.32l-.05-.06c-.36-.52-.74-1-1.13-1.5l-.3-.37c-.3-.37-.61-.72-.92-1.07l-.2-.24-.17-.17c-.45-.48-.9-1-1.37-1.4s-.67-.62-1-.92l-.32-.27-.75-.61-.36-.29-.81-.6-.29-.21-.1-.06-.42-.28c-.27-.17-.53-.35-.8-.51s-.37-.23-.56-.34l-.78-.45-.18-.1-.3-.14c-.41-.22-.82-.42-1.25-.62l-.49-.23c-.56-.25-1.13-.49-1.72-.71s-.91-.32-1.37-.47l-.46-.14c-.25-.08-.49-.16-.74-.22l-.17,0c-.49-.13-1-.26-1.49-.37l-.25-.06c-.58-.12-1.18-.23-1.78-.33l-.12,0-.57-.07-1-.14-.75-.07c-.32,0-.65-.07-1-.09l-.24,0-.8,0-.51,0c-.54,0-1.08,0-1.63,0h-.91l-1.05,0-.48,0c-.47,0-.94,0-1.4.09h-.07l-1.34.14-.41.06-.91.13-.13,0-.41.08-.69.12-.56.12-.66.14-.2,0-.37.09-.6.16-.56.16-.59.17-.21.07-.33.11-.59.2-.53.2-.58.21a1.57,1.57,0,0,1-.23.09l-.27.12-.62.27-.49.22-.6.29-.29.14-.17.09-.77.41-.35.2c-.37.21-.73.42-1.09.65l0,0c-.58.36-1.13.75-1.68,1.15-.16.12-.32.24-.47.37s-.45.33-.66.5l-.48.42c-.19.16-.37.31-.55.48q-.56.5-1.08,1l-.44.43c-.48.51-.95,1-1.4,1.56l-.17.22c-.39.48-.77,1-1.13,1.47-.14.19-.27.39-.41.59-.28.4-.55.81-.81,1.24-.14.22-.28.44-.41.66-.26.45-.51.9-.76,1.36l-.33.62c-.34.67-.67,1.36-1,2.07a54.8,54.8,0,0,0-3.44,13.43,125.91,125.91,0,0,0-1.1,17.57v11.49a125.91,125.91,0,0,1,1.1-17.57,54.8,54.8,0,0,1,3.44-13.43c.31-.72.64-1.4,1-2.07l.33-.63c.25-.46.5-.91.76-1.35.13-.22.27-.44.41-.66.26-.43.53-.84.81-1.25l.41-.58c.36-.51.74-1,1.13-1.47l.17-.22c.45-.54.92-1.06,1.4-1.56.14-.15.29-.29.44-.43q.53-.52,1.08-1l.55-.49c.37-.31.75-.62,1.14-.92l.47-.36c.56-.41,1.12-.8,1.71-1.17.36-.23.72-.45,1.09-.66l.35-.19.77-.41c.15-.08.3-.16.46-.23l.6-.29.49-.22c.2-.1.41-.18.62-.27l.5-.21.58-.22.53-.19.59-.2.54-.18.59-.17.56-.16.6-.16.57-.14.66-.14.56-.12.68-.13.55-.09.9-.13.42-.06,1.34-.14h.07l1.4-.1.48,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.51,0,1,.06,1,.09.75.08,1,.13.69.1c.6.1,1.2.21,1.78.34l.25.06c.5.11,1,.23,1.49.37l.91.26.46.14c.46.15.92.31,1.37.48s1.16.46,1.72.71l.49.23c.43.19.84.4,1.25.61l.48.25.78.45.56.33.8.52.52.34.29.21.81.6.36.28.75.61.32.28c.34.29.68.6,1,.91s.92.92,1.37,1.41c.13.13.25.27.37.4.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.13,1.5l.27.39q.38.52.72,1.08l.35.55.6,1c.1.18.2.36.31.54.36.65.71,1.31,1.05,2,.18.36.35.74.52,1.11s.22.51.32.76l.29.69.3.8c.09.23.17.47.26.71s.25.75.38,1.13l.18.56c.17.57.34,1.16.51,1.76h0c.18.67.35,1.37.51,2.08,0,.21.09.42.13.63.12.54.23,1.08.33,1.64.05.25.1.49.14.75s.08.42.11.63c.07.38.13.77.19,1.16l.09.65.18,1.29c0,.19,0,.38.07.57.07.62.14,1.25.2,1.89s.14,1.47.19,2.22c0,.22,0,.45.05.68,0,.53.07,1.07.1,1.62,0,.3,0,.6,0,.91,0,.48.05,1,.06,1.46l0,1,0,1.43c0,.66,0,1.33,0,2h0V145.77C344.08,145.2,344.07,144.65,344.07,144.09Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M338.85,127.08q5.23,10.67,5.23,30.18a103.75,103.75,0,0,1-1.38,18.21,40.59,40.59,0,0,1-5.09,13.83,32.63,32.63,0,0,1-12.09,11.75,33.33,33.33,0,0,1-16.5,4.14,32.93,32.93,0,0,1-18.74-5.56,34.12,34.12,0,0,1-12.47-15.37,53.71,53.71,0,0,1-3.13-11.86,92,92,0,0,1-1-14.05,125.91,125.91,0,0,1,1.1-17.57,54.8,54.8,0,0,1,3.44-13.43A30.64,30.64,0,0,1,290,113.17q7.73-4.87,18.46-4.88a36.47,36.47,0,0,1,12.85,2.16,29.6,29.6,0,0,1,10.14,6.33A36.27,36.27,0,0,1,338.85,127.08Zm-15.06,49A112.54,112.54,0,0,0,325.24,156a101,101,0,0,0-1.51-19.34q-1.51-7.53-5.09-11.38t-9.9-3.84q-9.08,0-12.61,8.59t-3.54,26.49a107,107,0,0,0,1.51,19.9q1.51,7.74,5.09,11.72a12.37,12.37,0,0,0,9.69,4q6.31,0,9.9-4.13t5-11.82"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M148,177.15c-.37.32-.77.62-1.18.91l-.38.25c-.31.2-.64.4-1,.59l-.35.19c-.45.24-.91.46-1.39.66l-.14.06c-.44.18-.9.34-1.37.49l-.33.11c-.51.15-1,.29-1.56.41l-.31.06c-.46.1-.94.18-1.43.25l-.44.07c-.57.07-1.17.13-1.78.17s-1.48.08-2.25.08l-1.5,0c-.71,0-1.41-.08-2.1-.13l-.47,0q-1-.1-2-.24l-.26-.05c-.77-.11-1.55-.25-2.31-.41l-.14,0c-.77-.16-1.54-.35-2.3-.56l-.63-.17-.09,0a7.67,7.67,0,0,0-1.06-.22h-.13a5.39,5.39,0,0,0-.79-.07H120l-.58,0h-.11l-.48.06-.26,0h-.08l-.59.14-.19,0h0a7.55,7.55,0,0,0-.84.29l-.05,0-.11.06a5.75,5.75,0,0,0-.82.42l-.13.06-.08.06a7.11,7.11,0,0,0-.72.5h0c-.23.18-.45.39-.67.6l-.18.19c-.15.16-.29.32-.43.49l-.18.23q-.21.28-.39.57a1.86,1.86,0,0,0-.11.19,7.68,7.68,0,0,0-.41.81c0,.06,0,.13-.08.2-.08.22-.16.44-.23.67s-.05.2-.08.3-.1.44-.13.66a2.93,2.93,0,0,0,0,.29,7.82,7.82,0,0,0-.06,1V196a7.77,7.77,0,0,1,.06-1,2.5,2.5,0,0,1,0-.29,6.42,6.42,0,0,1,.13-.66c0-.1,0-.2.08-.3s.15-.46.23-.68c0-.06.05-.13.08-.19a9,9,0,0,1,.41-.82,1.74,1.74,0,0,1,.11-.18,5.72,5.72,0,0,1,.39-.57l.18-.24c.14-.16.28-.33.43-.48l.18-.2c.22-.21.44-.41.67-.59l0,0c.23-.18.47-.34.72-.5l.21-.11a5.75,5.75,0,0,1,.82-.42l.16-.08q.41-.16.84-.3l.22-.05.6-.14.33-.05c.16,0,.32-.05.48-.06l.69,0a9.77,9.77,0,0,1,1.07.07h.11a9.77,9.77,0,0,1,1.17.25l.41.12.22.06c.76.2,1.53.4,2.3.56l.14,0c.76.16,1.54.29,2.31.41l.18,0H128q1,.15,2,.24l.47,0c.69.06,1.39.11,2.1.13h0q.75,0,1.5,0c.77,0,1.52,0,2.25-.08h.1q.86-.06,1.68-.18l.44-.06.7-.1.73-.15.31-.06c.45-.1.89-.21,1.32-.34l.24-.07.33-.11c.47-.15.93-.31,1.37-.5l.14-.05.06,0c.46-.2.9-.41,1.33-.64l.35-.19.48-.27.49-.33.38-.25a11.57,11.57,0,0,0,1.18-.91,14.07,14.07,0,0,0,5-9.84c0-.58.08-1.18.08-1.79h0v-8.63A14.53,14.53,0,0,1,148,177.15Z"/>
|
||||||
|
<g class="cls-16">
|
||||||
|
<g class="cls-17">
|
||||||
|
<g class="cls-16">
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M172.52,158.33A33.35,33.35,0,0,0,172,155a26.4,26.4,0,0,0-.82-2.78,22.25,22.25,0,0,0-1.16-2.69,21.93,21.93,0,0,0-2-3.24,25.52,25.52,0,0,0-3-3.25,29.16,29.16,0,0,0-7.34-4.85,40.29,40.29,0,0,0-6.32-2.35,42.23,42.23,0,0,0-5.08-1.08c-1.21-.17-2.4-.29-3.56-.35l-1.53-.06c-1,0-2.05,0-3.12,0-1.5,0-3.06,0-4.68.15l-.64.05v8.64l.64,0C135,143,136.53,143,138,143q1.6,0,3.12.06l1.53.06c1.16.06,2.35.17,3.56.35a42.23,42.23,0,0,1,5.08,1.08,39.31,39.31,0,0,1,6.32,2.35,29.16,29.16,0,0,1,7.34,4.85,24.86,24.86,0,0,1,3,3.25,21.84,21.84,0,0,1,2,3.23,22.39,22.39,0,0,1,1.16,2.7,26.4,26.4,0,0,1,.82,2.78,32.36,32.36,0,0,1,.57,3.3,43.27,43.27,0,0,1,.3,4.55v-8.64A43.27,43.27,0,0,0,172.52,158.33Z"/>
|
||||||
|
<path class="cls-18" d="M172.82,171.52v0"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<polygon class="cls-14" points="113.49 159.94 113.49 151.3 117.24 96.8 117.24 105.44 113.49 159.94"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M163.16,105.56l.71.16.31.07.29.1.46.17.3.12.37.18c.2.1.39.21.58.32l.25.15a8.15,8.15,0,0,1,.76.55l0,0c.23.19.44.39.65.6l.2.22a6.4,6.4,0,0,1,.42.49l.24.31.18.27c.09.13.17.26.25.39l.16.29c0,.09.09.19.14.29s.2.43.28.65l.12.31a4.77,4.77,0,0,1,.15.54c0,.11.07.22.09.33s.06.33.09.5l.06.37c0,.16,0,.33,0,.5s0,.29,0,.44v-8.76c0-.1,0-.21,0-.32s0-.34,0-.5a.19.19,0,0,1,0-.08,2.93,2.93,0,0,0-.05-.29c0-.17,0-.33-.09-.49s0-.07,0-.1a2.25,2.25,0,0,0-.08-.24,5.44,5.44,0,0,0-.15-.54.57.57,0,0,1,0-.14l-.08-.16c-.08-.23-.18-.44-.28-.66,0,0-.05-.12-.08-.17l-.06-.12c-.05-.1-.11-.19-.16-.28a3.73,3.73,0,0,0-.25-.39l-.18-.28-.13-.18a.69.69,0,0,1-.11-.13,6.4,6.4,0,0,0-.42-.49l-.2-.22a7.21,7.21,0,0,0-.65-.59l0,0a8.15,8.15,0,0,0-.76-.55l-.25-.15c-.19-.11-.38-.22-.58-.32l-.14-.08-.23-.09-.3-.13-.46-.17-.29-.09-.11,0-.2,0c-.23-.06-.47-.11-.71-.15l-.17,0h-.18a5.11,5.11,0,0,0-.55,0l-.25,0H117.24v8.63H161.7c.19,0,.38,0,.56,0l.55.05Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M161.7,105.43a8.48,8.48,0,1,1,0,17H134.13l-1.42,20.78c1.84-.15,3.62-.21,5.32-.21s3.18,0,4.65.12c7.58.36,16.62,3.36,22.3,8.63s7.84,11.57,7.84,20.58c0,9.94-2.36,16.89-9.22,23.21s-15.9,9.69-27.68,9.69c-6.9,0-12.87,0-18.22-1.53A7.93,7.93,0,0,1,120,188.1a8.4,8.4,0,0,1,2.35.34,42,42,0,0,0,11.75,1.65q8.88,0,13.88-4.31t5-11.63q0-15.36-21.36-15.36a165,165,0,0,0-18.19,1.15l3.75-54.51Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M309.61,253.46a4.84,4.84,0,0,1-2.85.39c-1-.12-3.07-2.25-4.39-2.8a14.58,14.58,0,0,1-4.61-4c-1.21-1.6-.74-2.07-.43-2.32-.28,1.32,2.22,4.34,5.08,5.86,3.12,1.66,4.45,3.22,5.88,2.76,1.14-.36,2.55-1,3-2.08C311.7,252.68,310.51,253,309.61,253.46Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M311.11,247.65a22.22,22.22,0,0,0,.27,2.61c.25,1.83-1.65,2.65-3.09,3.11s-2.76-1.1-5.88-2.76-5.8-5.1-4.93-6.18c.82-.68,3.19-.55,5.14.64a29.2,29.2,0,0,1,3.05,2.09h0c-.06-.19-.12-.35-.14-.43-.09-.3.29-.74.8-.33s3.09,0,4.17-.57l.09-.05c1-.58.87.29.64,1A2.84,2.84,0,0,0,311.11,247.65Z"/>
|
||||||
|
<path class="cls-21" d="M310.5,245.83l.09-.05c1-.58.87.29.64,1a2.84,2.84,0,0,0-.12.86"/>
|
||||||
|
<path class="cls-21" d="M305.3,248.31c.69.11.54-.62.37-1.14"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M297.34,244.74h0c-.31.25-.78.72.43,2.32a14.58,14.58,0,0,0,4.61,4c1.32.55,3.38,2.68,4.39,2.8a4.84,4.84,0,0,0,2.85-.39c.9-.44,2.09-.78,1.66-2.17"/>
|
||||||
|
<path d="M305.76,168.75c-.06.15-.45.76-.45.76l-.15.14-.47-.18-.45.3-.4-.22s-.06-.5-.36.1c-.12-.28-.86-.23-1.74-.76a3.15,3.15,0,0,1-1.06-2.71c.11-.61.69-.93.34-1.31s-.48-.24-.75-.08-.6-.32-1.62-.65c-.09,0-1.12-2.63-.77-3.79a4.24,4.24,0,0,1,2.16-3,7,7,0,0,1,5.12-.66c1.72.52,3.43.94,4.08,4.66a6.34,6.34,0,0,1-1.61,6,3.79,3.79,0,0,1-1.07.88C306.25,168.51,306,168.2,305.76,168.75Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M316.53,186.52a3.29,3.29,0,0,1-1.34,1,4.82,4.82,0,0,1-3.3.2c.15-3.54.27-6.22.27-6.22l1-7.75a1.23,1.23,0,0,1,.27.52C314.07,176.7,315.88,183.71,316.53,186.52Z"/>
|
||||||
|
<path class="cls-24"
|
||||||
|
d="M315.34,191.29v0a1.5,1.5,0,0,1-1.84,1.57l-2.69-1.24c.06-1.78,1-2.38,1.08-4a4.82,4.82,0,0,0,3.3-.2Z"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M300.82,166.25a2.91,2.91,0,0,0,.92,2.45c.77.47,1.43.43,1.53.68l.33-.68.33.79.25-.66.57.55.08-.8s.37.94.43.8c.19-.49.23-.43.5-.63-.12,1.32-.46,3.57.47,3.71l.54.08c-1.08,1.73-6,1.17-6.78.2a2.38,2.38,0,0,0,1.16-.67c.59-1,.86-3,0-3.27a2.47,2.47,0,0,1-1.88-2.11c-.11-.51-.23-1.65-.33-2.45h0c.89.29,1.14.59,1.36.46a.62.62,0,0,1,.87.14C301.44,165.18,300.91,165.69,300.82,166.25Z"/>
|
||||||
|
<path class="cls-26"
|
||||||
|
d="M294.81,182.83a.83.83,0,0,1-.41,1.1L285,188.22a.83.83,0,0,1-1.1-.41l-6.05-13.32a.83.83,0,0,1,.41-1.1l9.45-4.29a.83.83,0,0,1,1.1.41Z"/>
|
||||||
|
<path class="cls-27"
|
||||||
|
d="M288.29,170.34l5.14,11.31a.72.72,0,0,1-.36,1l-8.24,3.75a.73.73,0,0,1-1-.36l-5.14-11.31a.72.72,0,0,1,.36-1l8.24-3.75A.73.73,0,0,1,288.29,170.34Z"/>
|
||||||
|
<circle class="cls-27" cx="289.29" cy="185.23" r="0.5" transform="translate(57.59 438.83) rotate(-80.22)"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M285.93,190.32s-1.4-1.52-2-2.13-1.86-2.34-2-2.46-1.82-5.36-2.18-5.62.5-.8,1.14.51,1.86,3,2.43,3,.31-1.59.72-1.85.35,0,.5.15-.34,2,.09,2.65.34,1.79.66,2.29l1.84,2.88Z"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M284.63,188.92s3.61,4.34,7,6c.17.08,1.22.48,1.51-.1a24.27,24.27,0,0,0,1-4.75c.07-.34.25-4,.25-4L290.88,185l-.28,5.53a.06.06,0,0,1-.09.05l-4.73-2.84Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M313.16,173.71l-1,7.75s-.12,2.68-.27,6.22c-.07,1.59-.14,3.35-.2,5.13-.19,5.23-.33,10.58-.15,11.9l-.28,0c-1.85.25-11.81.82-15.38.24a3.6,3.6,0,0,1-1-.29c.28-1.59.43-20.67.43-20.67s-.35,2.07-.51,3.67c-1.63.6-2.42.32-4.63-.63.18-1.38,1.93-9.68,3.19-12.13a2.78,2.78,0,0,1,2.15-1.29h0a26.47,26.47,0,0,0,4.5-.92c.76,1,5.7,1.53,6.78-.2,1.28.18,4.1.53,5.54.71A1.31,1.31,0,0,1,313.16,173.71Z"/>
|
||||||
|
<path class="cls-28"
|
||||||
|
d="M311.26,204.76,310.1,225l0,21c-.53.24-3,.89-3.86.38l-1-20.22-1-16.14a.67.67,0,0,0-.73-.63.65.65,0,0,0-.44.2.71.71,0,0,0-.19.44l-2.76,16.56L299.6,243v.05l-.27,4.33c-1.13.44-3.76.56-4.21.12l-.74-22.18,1.5-20.36C299.45,205.58,309.41,205,311.26,204.76Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M300.08,252.26a4.88,4.88,0,0,1-2.65,1.13c-1,.15-3.56-1.37-5-1.55a14.41,14.41,0,0,1-5.5-2.63c-1.59-1.22-1.25-1.8-1-2.12.07,1.34,3.28,3.6,6.44,4.32,3.44.78,5.13,1.94,6.4,1.11,1-.65,2.21-1.59,2.33-2.79C301.88,251,300.83,251.6,300.08,252.26Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M300,246.27a22.16,22.16,0,0,0,.95,2.44c.72,1.7-.89,3-2.16,3.81s-3-.33-6.4-1.11-6.94-3.39-6.39-4.66c.62-.88,2.94-1.37,5.13-.74a30.64,30.64,0,0,1,3.5,1.21h0l-.26-.38c-.16-.26.09-.79.69-.53s3-.82,3.87-1.64l.08-.07c.83-.84.91.05.88.81A3.07,3.07,0,0,0,300,246.27Z"/>
|
||||||
|
<path class="cls-21" d="M298.92,244.67l.08-.07c.83-.84.78.06.88.81a18.24,18.24,0,0,0,1.23,4.32"/>
|
||||||
|
<path class="cls-21" d="M294.56,248.43c.69-.07.36-.75.06-1.2"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M285.94,247.08h0c-.23.32-.57.9,1,2.12a14.41,14.41,0,0,0,5.5,2.63c1.41.18,4,1.7,5,1.55a4.88,4.88,0,0,0,2.65-1.13c.75-.66,1.8-1.3,1-2.53"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 34 KiB |
133
src/assets/images/exception/developing.svg
Normal file
133
src/assets/images/exception/developing.svg
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-2,.cls-28,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#3ba7f5;}.cls-14{fill:#53bef5;}.cls-15{fill:#2d8ce9;}.cls-16{fill:#7798b9;}.cls-17{fill:#728cb9;}.cls-18{fill:#a4c0d9;}.cls-19{fill:#ffb056;}.cls-20{fill:#ebfcff;}.cls-21{fill:#257fba;}.cls-22{fill:#398eed;}.cls-23{fill:#e49056;}.cls-24{fill:#ffbf76;}.cls-25{fill:#f0dabc;}.cls-26{fill:#ffeed2;}.cls-27{fill:#fae6d2;}.cls-28{stroke:#4986d9;stroke-width:0.12px;}.cls-29{fill:#e55c5c;opacity:0.2;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
</defs>
|
||||||
|
<title>开发中</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-8">
|
||||||
|
<path class="cls-9"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M183.16,83.07a36,36,0,1,0,36,36A36,36,0,0,0,183.16,83.07Zm1.52,8.36a27.65,27.65,0,0,1,21.65,12.5l-10,5.75a16.19,16.19,0,0,0-11.69-6.75Zm-3,0v11.5A16.19,16.19,0,0,0,170,109.68l-10-5.75A27.68,27.68,0,0,1,181.64,91.43Zm-26.15,27.63a27.59,27.59,0,0,1,3-12.5l10,5.75a16.23,16.23,0,0,0,0,13.5l-10,5.75A27.59,27.59,0,0,1,155.49,119.06Zm26.15,27.63A27.68,27.68,0,0,1,160,134.19l10-5.75a16.19,16.19,0,0,0,11.69,6.75Zm0-19.76a8,8,0,0,1-4.53-2.62,8.23,8.23,0,0,1-1.52-2.63,8,8,0,0,1,0-5.24,8.23,8.23,0,0,1,1.52-2.63,8,8,0,0,1,4.53-2.61,7.78,7.78,0,0,1,3,0,8,8,0,0,1,4.53,2.61,8,8,0,0,1,0,10.5,8,8,0,0,1-4.53,2.62,8.42,8.42,0,0,1-1.52.14A8.51,8.51,0,0,1,181.64,126.93Zm3,19.76v-11.5a16.19,16.19,0,0,0,11.69-6.75l10,5.75A27.65,27.65,0,0,1,184.68,146.69Zm23.17-15.13-10-5.75a16.23,16.23,0,0,0,0-13.5l10-5.75a27.71,27.71,0,0,1,0,25Z"/>
|
||||||
|
<path class="cls-13" d="M152.32,151.4a46.16,46.16,0,0,0,4.35,3.65l5.59-6.66a36.17,36.17,0,0,1-4.35-3.66Z"/>
|
||||||
|
<path class="cls-13" d="M165.24,160a45.84,45.84,0,0,0,5.34,1.94l3-8.18a35,35,0,0,1-5.34-1.94Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M147.31,122.5,138.75,124a45.19,45.19,0,0,0,1,5.6l8.56-1.51A35.83,35.83,0,0,1,147.31,122.5Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M153.49,98.65,146,94.3a45.28,45.28,0,0,0-2.85,4.92l7.53,4.35A37.49,37.49,0,0,1,153.49,98.65Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M180.32,155v8.7c.94.06,1.89.09,2.84.09s1.9,0,2.84-.09V155c-.93.08-1.88.11-2.84.11S181.26,155,180.32,155Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M148.29,110l-8.56-1.51a44.55,44.55,0,0,0-1,5.6l8.56,1.51A35.42,35.42,0,0,1,148.29,110Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M219,115.63l8.57-1.51a44.55,44.55,0,0,0-1-5.6L218,110A35.42,35.42,0,0,1,219,115.63Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M192.77,153.77l3,8.18a46.52,46.52,0,0,0,5.34-1.94l-3-8.18A34.66,34.66,0,0,1,192.77,153.77Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M218,128.1l8.57,1.51a45.19,45.19,0,0,0,1-5.6L219,122.5A35.83,35.83,0,0,1,218,128.1Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M212.83,139.47l7.54,4.35a44.28,44.28,0,0,0,2.84-4.92l-7.53-4.35A34.8,34.8,0,0,1,212.83,139.47Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M204.06,148.39l5.59,6.66A46.16,46.16,0,0,0,214,151.4l-5.59-6.67A35.41,35.41,0,0,1,204.06,148.39Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M150.64,134.55l-7.53,4.35a44.35,44.35,0,0,0,2.85,4.92l7.53-4.35A36.85,36.85,0,0,1,150.64,134.55Z"/>
|
||||||
|
<path class="cls-13" d="M201.09,78.12a44.75,44.75,0,0,0-5.34-2l-3,8.18a35.73,35.73,0,0,1,5.34,1.94Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M162.26,89.73l-5.59-6.66a44.79,44.79,0,0,0-4.35,3.66l5.59,6.66A37.12,37.12,0,0,1,162.26,89.73Z"/>
|
||||||
|
<path class="cls-13" d="M214,86.73a44.79,44.79,0,0,0-4.35-3.66l-5.59,6.66a36.31,36.31,0,0,1,4.35,3.66Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M215.68,103.57l7.53-4.35a45.2,45.2,0,0,0-2.84-4.92l-7.54,4.35A35.37,35.37,0,0,1,215.68,103.57Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M173.55,84.35l-3-8.18a44.13,44.13,0,0,0-5.34,2l3,8.17A36.14,36.14,0,0,1,173.55,84.35Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M186,83.16v-8.7c-.94,0-1.88-.08-2.84-.08s-1.9,0-2.84.08v8.7c.94-.07,1.89-.11,2.84-.11S185.07,83.09,186,83.16Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M315,95.08c0-.78,0-1.56-.07-2.33l13.18-2.67a52.88,52.88,0,0,0-1.46-8.31l-13.3,2a38.88,38.88,0,0,0-1.59-4.39l11.47-7A52.22,52.22,0,0,0,319,65.07l-11.81,6.42a39.35,39.35,0,0,0-3-3.57l8.38-10.52A53.13,53.13,0,0,0,306.13,52l-8.9,10.07a40.34,40.34,0,0,0-4-2.33L297.46,47a51.91,51.91,0,0,0-7.92-2.89L284.62,56.6a38.62,38.62,0,0,0-4.59-.81l-.35-13.44c-1.39-.11-2.8-.16-4.21-.16s-2.83.05-4.22.16l-.35,13.44a38.62,38.62,0,0,0-4.59.81l-4.92-12.52A52.3,52.3,0,0,0,253.47,47l4.27,12.75a40.34,40.34,0,0,0-4,2.33L244.8,52a53.13,53.13,0,0,0-6.46,5.42l8.38,10.52a39.35,39.35,0,0,0-3,3.57l-11.81-6.42a52.22,52.22,0,0,0-4.23,7.29l11.47,7a38.88,38.88,0,0,0-1.59,4.39l-13.3-2a52.88,52.88,0,0,0-1.46,8.31L236,92.75c0,.77-.07,1.55-.07,2.33s0,1.56.07,2.33l-13.18,2.68a52.75,52.75,0,0,0,1.46,8.3l13.3-2a38.72,38.72,0,0,0,1.59,4.38l-11.47,7a52.92,52.92,0,0,0,4.23,7.3l11.81-6.42a39.35,39.35,0,0,0,3,3.57l-8.38,10.51a53.21,53.21,0,0,0,6.46,5.43l8.9-10.08a38.57,38.57,0,0,0,4,2.34l-4.27,12.75a52.27,52.27,0,0,0,7.92,2.88l4.92-12.51a40.74,40.74,0,0,0,4.59.8l.35,13.44c1.39.11,2.8.17,4.22.17s2.82-.06,4.21-.17l.35-13.44a40.74,40.74,0,0,0,4.59-.8l4.92,12.51a51.88,51.88,0,0,0,7.92-2.88l-4.27-12.75a38.57,38.57,0,0,0,4-2.34l8.9,10.08a53.21,53.21,0,0,0,6.46-5.43l-8.38-10.51a39.35,39.35,0,0,0,3-3.57L319,125.1a52.92,52.92,0,0,0,4.23-7.3l-11.47-7a38.72,38.72,0,0,0,1.59-4.38l13.3,2a52.75,52.75,0,0,0,1.46-8.3L315,97.41C315,96.64,315,95.86,315,95.08ZM275.47,109a13.92,13.92,0,1,1,13.92-13.92A13.92,13.92,0,0,1,275.47,109Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M255.6,166.39l-2.67-1.56a1.87,1.87,0,0,1-.83-2.23,16.84,16.84,0,0,0,.56-2,1.89,1.89,0,0,1,1.87-1.51h3.08c0-.42.06-.85.07-1.27v-.73c0-.44,0-.88-.06-1.31l-3.1,0a1.88,1.88,0,0,1-1.83-1.52,18.52,18.52,0,0,0-.54-2.07,1.86,1.86,0,0,1,.85-2.22l2.69-1.54c-.18-.39-.38-.79-.59-1.17l-.36-.63c-.22-.37-.45-.73-.68-1.08L251.39,147a1.91,1.91,0,0,1-2.37-.41,17.8,17.8,0,0,0-1.5-1.51,1.88,1.88,0,0,1-.37-2.35l1.56-2.67c-.45-.31-.91-.61-1.4-.89s-1-.55-1.46-.79l-1.56,2.67a1.87,1.87,0,0,1-2.24.83,16.22,16.22,0,0,0-2-.56,1.9,1.9,0,0,1-1.52-1.87l0-3.08c-.42,0-.85-.06-1.27-.07h-.73c-.44,0-.88,0-1.32.05v3.1a1.88,1.88,0,0,1-1.52,1.83,16.62,16.62,0,0,0-2.07.55,1.88,1.88,0,0,1-2.22-.86l-1.54-2.69c-.4.18-.79.38-1.17.59l-.63.36q-.56.33-1.08.69l1.52,2.68a1.9,1.9,0,0,1-.4,2.37,16.33,16.33,0,0,0-1.51,1.49,1.88,1.88,0,0,1-2.35.37l-2.67-1.56c-.32.45-.61.92-.9,1.4h0c-.28.48-.54,1-.78,1.46l2.67,1.56a1.87,1.87,0,0,1,.83,2.24,16.36,16.36,0,0,0-.56,2.05,1.91,1.91,0,0,1-1.87,1.51l-3.08,0c0,.43-.06.85-.07,1.27v.73q0,.66.06,1.32l3.1,0a1.87,1.87,0,0,1,1.83,1.52,17.8,17.8,0,0,0,.54,2.06,1.88,1.88,0,0,1-.85,2.23l-2.69,1.53c.18.4.38.79.59,1.18l.36.63c.22.36.45.72.68,1.07l2.68-1.52a1.89,1.89,0,0,1,2.37.4,16.44,16.44,0,0,0,1.5,1.51,1.88,1.88,0,0,1,.37,2.35l-1.56,2.67c.45.32.91.62,1.4.9s1,.54,1.46.78l1.56-2.67a1.89,1.89,0,0,1,2.24-.83,15.07,15.07,0,0,0,2,.56,1.91,1.91,0,0,1,1.52,1.87l0,3.09c.42,0,.85.06,1.27.07H237c.44,0,.88,0,1.32-.06v-3.09a1.88,1.88,0,0,1,1.52-1.84,16.57,16.57,0,0,0,2.07-.54,1.9,1.9,0,0,1,2.23.85l1.53,2.7q.6-.28,1.17-.6l.63-.36c.37-.22.73-.44,1.08-.68L247,171.93a1.89,1.89,0,0,1,.4-2.37,15.26,15.26,0,0,0,1.51-1.5,1.88,1.88,0,0,1,2.35-.37l2.67,1.57c.32-.46.61-.92.9-1.4h0C255.1,167.37,255.36,166.89,255.6,166.39ZM241,150.18a1.4,1.4,0,1,1,1.81-.47A1.4,1.4,0,0,1,241,150.18Zm-3,7.73a1.4,1.4,0,1,1-.47-1.8A1.4,1.4,0,0,1,238,157.91Zm-11.54.59a1.4,1.4,0,1,1,1.81-.48A1.4,1.4,0,0,1,226.43,158.5Zm3.1-5.44a4.81,4.81,0,1,1,6.59-1.72A4.87,4.87,0,0,1,229.53,153.06Zm-.09,16.77a4.82,4.82,0,1,1,6.58-1.72A4.82,4.82,0,0,1,229.44,169.83ZM240.93,167a1.39,1.39,0,1,1,1.8-.47A1.39,1.39,0,0,1,240.93,167Zm3.12-5.47a4.82,4.82,0,0,1-1.73-6.59,4.88,4.88,0,0,1,6.59-1.73,4.82,4.82,0,0,1-4.86,8.32Z"/>
|
||||||
|
<polygon class="cls-16" points="318.66 225.37 319.65 228.74 302.95 229.82 302.09 226.6 318.66 225.37"/>
|
||||||
|
<polygon class="cls-16" points="313.14 206.61 314.2 210.22 297.71 210.22 296.74 206.61 313.14 206.61"/>
|
||||||
|
<polygon class="cls-16" points="308.26 190 309.06 192.72 292.68 191.39 291.93 188.6 308.26 190"/>
|
||||||
|
<polygon class="cls-16" points="303.44 173.61 304.26 176.4 288.02 173.99 287.26 171.13 303.44 173.61"/>
|
||||||
|
<polygon class="cls-16" points="299.11 158.87 300.01 161.93 283.85 158.4 283.21 156 299.11 158.87"/>
|
||||||
|
<polygon class="cls-16" points="295.05 145.06 295.98 148.25 280.06 144.21 279.46 141.99 295.05 145.06"/>
|
||||||
|
<polygon class="cls-17"
|
||||||
|
points="290.44 120.62 325.45 235.84 321.74 235.84 319.65 228.74 318.66 225.37 314.2 210.22 313.14 206.61 309.06 192.72 308.26 190 304.26 176.4 303.44 173.61 300.01 161.93 299.11 158.87 295.98 148.25 295.05 145.06 292.04 134.82 291.46 132.84 287.86 120.62 290.44 120.62"/>
|
||||||
|
<polygon class="cls-16"
|
||||||
|
points="291.46 132.84 292.04 134.82 276.5 130.9 276.5 130.9 275.85 128.48 291.46 132.84"/>
|
||||||
|
<polygon class="cls-18"
|
||||||
|
points="297.71 210.22 302.09 226.6 302.95 229.82 304.56 235.84 300.85 235.84 271.17 120.62 273.75 120.62 275.85 128.48 276.5 130.9 276.5 130.9 279.46 141.99 280.06 144.21 283.21 156 283.85 158.4 287.26 171.13 288.02 173.99 291.93 188.6 292.68 191.39 296.74 206.61 297.71 210.22"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M321.9,225.09c.37.56,1.1,1.95.75,2.94h0a1.46,1.46,0,0,1-.9.87c-1.84.73-3.15,1.16-3.81-.17a4.4,4.4,0,0,0-2.05-2.32c-1-.63-3.84-.21-4.13-.54a1.84,1.84,0,0,1-.42-1.4,2.47,2.47,0,0,1,.3-1c.63-1.22,1.48-2,2.14-2.09a3.61,3.61,0,0,1,1.51.34l.19.64.3-.07c.16.19.53.21.7.83s.91,1,1.25.64.06-.79.38-.89,1.1-.14,1.88-.2l1.13-.08A9.32,9.32,0,0,0,321.9,225.09Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M317.94,228.74c.66,1.33,2,.9,3.81.17a1.46,1.46,0,0,0,.9-.87c-.1.66-.26,1.2-.82,1.45a7.12,7.12,0,0,1-3.63.33c-.82-.34-1.24-1.18-1.94-2.06a4,4,0,0,0-2.35-1.34c-.42,0-2.18.24-2.72-.09s0-1.26.14-1.85h0a1.84,1.84,0,0,0,.42,1.4c.29.33,3.11-.09,4.13.54A4.4,4.4,0,0,1,317.94,228.74Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M304.09,210.39a2.37,2.37,0,0,1-2.4-.89c-.53-.48-1.95-2.78-2.57-3s-.6,0-1.3.14-.42-.37-.43-1a2.86,2.86,0,0,0,0,.3c.09.29.38.49,1,0s.91-.58,1.43-.13,2.26,3.41,3.14,3.94,1.9,0,3.09-.77c.75-.52.94-1,.9-1.49a2.56,2.56,0,0,1-.2,1.69A6.74,6.74,0,0,1,304.09,210.39Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M298.38,205.9c-.58.54-.87.34-1,0a2.86,2.86,0,0,1,0-.3c-.05-.85.13-3.07,2.28-3l1,2.15.73-.34.28.61a1.39,1.39,0,0,1,1.46-.08c0-.55-.13-1-.14-1.29a.56.56,0,0,1,.09-.4,5.92,5.92,0,0,1,1.28-.77h0a1.69,1.69,0,0,1,.72-.22c.37.59.34,1.78.74,2s.6,1.21.87,2.15a4.52,4.52,0,0,1,.21.93h0c0,.51-.15,1-.9,1.49-1.19.81-2.2,1.31-3.09.77s-2.62-3.5-3.14-3.94S299,205.36,298.38,205.9Z"/>
|
||||||
|
<polygon class="cls-21"
|
||||||
|
points="315.29 221.75 309.06 200.32 307.74 184.01 315.52 180.55 315.21 200.32 319.65 221.5 315.78 222.32 315.48 222.39 315.29 221.75"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M315,175l.52,5.55a2,2,0,0,1-1.58,2.15l-6.2,1.31-9.05,1.91,5.71,16.65h0a5.92,5.92,0,0,0-1.28.77.56.56,0,0,0-.09.4l-1.6.76-.73.34-1-2.15-8.86-18.49a1.71,1.71,0,0,1,.77-2.36l13.82-6.65.11-1C307.05,175,309.88,175.74,315,175Z"/>
|
||||||
|
<path class="cls-23" d="M310.63,148c1.28-.16,3.5,2.18,3.34,5.77h0A21,21,0,0,0,310.63,148Z"/>
|
||||||
|
<path class="cls-24"
|
||||||
|
d="M309.21,151.24c3,4.95-.18,5.31-2.06,5.92a35,35,0,0,1-4.08.45l-2.17.15-.42-2.45-.85-4.88a25.9,25.9,0,0,1,4.82-.6C306.39,149.79,308.37,150.08,309.21,151.24Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M309.21,151.24c-.84-1.16-2.82-1.45-4.76-1.41l.13-.42h0a6.12,6.12,0,0,0,5.18-1.62l.39-.35s.17.19.46.55a21,21,0,0,1,3.34,5.77,13.81,13.81,0,0,1,.75,3.12,117.36,117.36,0,0,1,1,18L315,175c-5.12.74-7.95,0-9.49-.85a3.67,3.67,0,0,1-1.76-1.78l-.13-2.94-.31-6.58-.24-5.17v-.07a35,35,0,0,0,4.08-.45C309,156.55,312.23,156.19,309.21,151.24Z"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M320,222.7h0c-.78.06-1.68.15-1.88.2s-.15.49-.38.89-1.08,0-1.25-.64-.54-.64-.7-.83l3.87-.82Z"/>
|
||||||
|
<path class="cls-25" d="M301.43,204.5l1.6-.76c0,.31.13.74.14,1.29a1.39,1.39,0,0,0-1.46.08Z"/>
|
||||||
|
<path class="cls-26"
|
||||||
|
d="M299.63,150.43l.85,4.88-6.91-1.52L284.11,144c-.56-1.1-2.48-1.8-3.41-2-.48-3.37,4.61-2.59,5.1-2.32s.1,1.73.11,2.32l8.8,8.1Z"/>
|
||||||
|
<path class="cls-27"
|
||||||
|
d="M303.31,162.85l.31,6.58s-5-7.55-5.38-8c-.62.21-1.25-.15-2.17-.59s-1.7-.31-1.7-1.2c0-.47.87-.33,1.38-.1a6.38,6.38,0,0,0-1.54-1.64c.24-1.49,3.44-2,4.77-1.24a7.42,7.42,0,0,0,.76,3C299.87,160.2,303.31,162.85,303.31,162.85Z"/>
|
||||||
|
<path class="cls-26"
|
||||||
|
d="M308.34,144.67a5.4,5.4,0,0,0,1.11,2.78l.33.35a6.12,6.12,0,0,1-5.18,1.62h0l.43-1.26c.4-.17-.13-1.36-.45-1.83.16,0,.32,0,.48-.06a4.74,4.74,0,0,0,3-1.62Z"/>
|
||||||
|
<path class="cls-26"
|
||||||
|
d="M305,146.26c-.16,0-.32.05-.48.06a4.08,4.08,0,0,1-1.39-.06,3,3,0,0,1-2.16-2.52c-.34-.49-1-.2-1-.93.06-.89,1.13-1.23,1.28-2.88a4.18,4.18,0,0,1,3.8-3.33c2.21,0,4,2.21,4,4.94a4.47,4.47,0,0,1-4,4.72Z"/>
|
||||||
|
<path class="cls-28"
|
||||||
|
d="M297.39,205.65c0,.64-.27,1.14.43,1s.69-.35,1.3-.14,2,2.5,2.57,3a2.37,2.37,0,0,0,2.4.89,6.74,6.74,0,0,0,2.65-1.25,2.56,2.56,0,0,0,.2-1.69h0"/>
|
||||||
|
<path class="cls-28"
|
||||||
|
d="M311.33,224.48c-.13.59-.68,1.52-.14,1.85s2.3,0,2.72.09a4,4,0,0,1,2.35,1.34c.7.88,1.12,1.72,1.94,2.06a7.12,7.12,0,0,0,3.63-.33c.56-.25.72-.79.82-1.45h0"/>
|
||||||
|
<path d="M300.9,138.55c-.08.49-.21,1.21.34,1.41,1,.46,1.79-.42,2.31-.21s1,.24,1,.72.84,1.08.82,1.31a1,1,0,0,0,.15.79c.28.53.76.3,1.17.73s.23.73.47.81.66,0,.78.1.09.64.66.49.64-.64.72-1.14,1-.9,1.32-1.23,2.05-1.75.83-4.89a4.68,4.68,0,0,0-6-2.76,3,3,0,0,0-2.94-.29c-1.38.92-.87,2.11-1.39,2.55s-.69.25-1.15.09-.79-.1-.88.16a1,1,0,0,0,.23,1.2A1.27,1.27,0,0,0,300.9,138.55Z"/>
|
||||||
|
<ellipse class="cls-26" cx="305.48" cy="141.34" rx="1.37" ry="0.94"
|
||||||
|
transform="translate(126.81 426.6) rotate(-82.77)"/>
|
||||||
|
<ellipse class="cls-26" cx="305.47" cy="141.44" rx="0.61" ry="1.17"
|
||||||
|
transform="translate(-23.34 69.3) rotate(-12.47)"/>
|
||||||
|
<ellipse class="cls-29" cx="305.47" cy="141.44" rx="0.36" ry="0.69"
|
||||||
|
transform="translate(-23.34 69.3) rotate(-12.47)"/>
|
||||||
|
<path class="cls-23" d="M310.17,147.45a4.24,4.24,0,0,0-.72,0l.33.35Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 26 KiB |
178
src/assets/images/exception/load-error.svg
Normal file
178
src/assets/images/exception/load-error.svg
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;}.cls-1,.cls-17,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6{stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#f0dabc;}.cls-14{fill:#e55c5c;opacity:0.2;}.cls-15{fill:#ffbf76;}.cls-16{fill:#ffeed2;}.cls-17{stroke:#000;}.cls-17,.cls-22{stroke-width:0.21px;}.cls-18{fill:#ffb056;}.cls-19{fill:#e49056;}.cls-20{fill:#f5f5f5;}.cls-21{stroke:#4986d9;stroke-width:0.1px;}.cls-22{stroke:#ffb056;}.cls-23{fill:#ccc;}.cls-24{fill:#e8e8e8;}.cls-25{fill:#257fba;}.cls-26{fill:#398eed;}.cls-27{fill:#53bef5;}.cls-28{fill:#fff;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
</defs>
|
||||||
|
<title>加载失败_1</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-8">
|
||||||
|
<path class="cls-9"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M242.46,224.89c0-.06,0-.14,0-.24-.06-.39-1.11-21.66-1.11-21.66l1.78-9.2c-1.87,0-6.4-1.73-6.4-1.73l-1.05,8.26a13.51,13.51,0,0,0-.06,3.36c.87,4.18,3.39,19.87,3.62,21.4h0a2.33,2.33,0,0,1,.05.46c-.06.28-.57.25-.61.43.11,0,.43.74.5.78a3.47,3.47,0,0,0,2.71-.08h0a2,2,0,0,0,.88-1.22C242.62,225.21,242.53,225.22,242.46,224.89Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M236.5,193.59c-.21,1.54-.56,4.41-.64,5,.46.15,1.53-.15,1.47-.73C237.24,197,237.38,194.38,236.5,193.59Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M228.89,172.19c-.61-2.39-1.16-4.53-1.16-4.57v-.05c0-.11,0-.23,0-.35a3,3,0,0,1,5.79-.78l1.67,5.81c-.21,0-.54-.1-.94-.15-1.44-.15-3.8-.13-5,1.44v0C229.12,173.11,229,172.64,228.89,172.19Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M234.33,172.84l-.1-.74h0c.4.05.73.11.94.15C235.11,172.44,234.45,172.82,234.33,172.84Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M230.34,173.56l-.22-.81h0a3.09,3.09,0,0,0-.88.81C229.3,173.75,230.26,173.58,230.34,173.56Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M236.72,193.32a4,4,0,0,1-1.08-2.09l0-10.61a9.14,9.14,0,0,0-.17-1.73l-1.28-6.79a9.65,9.65,0,0,0-2.35,0,4.79,4.79,0,0,0-1.76.62l2.43,8.69,1.34,9.62a7.58,7.58,0,0,0,.32,1.41,51.11,51.11,0,0,1,1.65,5.67c-.07.53,1.46.24,1.37-.62S237.6,194.1,236.72,193.32Z"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M229.26,163c2.14.89-.14,2.84-1.12,3.48-.1-.22-.21-.48-.31-.72a.18.18,0,0,0-.1-.09.74.74,0,0,0-.63,0c-.33.18-.48,1.62-1.79,2.06a4.6,4.6,0,0,1-2.61-.19c-.32.29-.62.59-1,.34s-.44-1.13-.61-1.47-1.36-1.28-1.62-1.7c-.7-1,1-4.17,2.91-4.67,1.24-.47,3.62,1.51,4.61,2A11,11,0,0,0,229.26,163Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M218.89,159.61a5,5,0,0,0-1.16,3.28c.1,1.66,2.2,3,2.21,2.35a.44.44,0,0,1,.45-.59s-.08-.55.11-.7.39.06.39.06a3.84,3.84,0,0,1,.22-.81c1-1.2,1-1,1.58-.81.14,0,.21-.39.34-.41a13.47,13.47,0,0,1,1.51.91c-.17-.2-.85-.81-.72-1.36a.59.59,0,0,1,.16-.38.76.76,0,0,1,1.07.07.84.84,0,0,1,.26.83c.69.32,1.35.67,1.35.67l-.52-.54.67.2-.21-.29.41,0-.48-.29c-.22-.37.05-1-.39-1.83a3.4,3.4,0,0,0-2.65-2.07A5.84,5.84,0,0,0,218.89,159.61Z"/>
|
||||||
|
<ellipse class="cls-14" cx="224.56" cy="161.76" rx="0.35" ry="0.47"
|
||||||
|
transform="translate(-52.16 157.71) rotate(-34.93)"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M226.48,166.78a3.62,3.62,0,0,0,.16-2.42,2.06,2.06,0,0,1,.43,1.36A10.11,10.11,0,0,0,226.48,166.78Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M229.16,166.66c.51-.47,2.44-1.8,0-3.71a1.88,1.88,0,0,1,1.41,2A2.47,2.47,0,0,1,229.16,166.66Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M244.61,176.64c0,.38-1,1.32-1.33,1.6l-7,4.75s-.15.15-.2.13c-2.89-.69.37-3-1.56-4.65s-2.13-2-4.31-5.13a11.75,11.75,0,0,1-2.42-6.4c0-.42.1-.8.05-1.07.15,0,.16-.08.35-.17a2,2,0,0,0,.67-2.82c.34.07,2.16.21,3.21.33a4.65,4.65,0,0,1,2.19.65c3.37,1.6,8.13,10,8.72,10.51C244.59,176,244.83,174.35,244.61,176.64Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M230.21,171c-.61-2.39-1.15-4.53-1.16-4.57v-.05a2.14,2.14,0,0,1,0-.36,3,3,0,0,1,5.78-.77c0,.11,1.67,5.81,1.67,5.81a7.22,7.22,0,0,0-.93-.15c-1.44-.16-3.81-.13-5,1.43l0,0C230.45,172,230.33,171.48,230.21,171Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M235.65,171.68l-.09-.73h0a7.22,7.22,0,0,1,.93.15C236.44,171.29,235.77,171.67,235.65,171.68Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M231.67,172.4l-.22-.8h0a3.17,3.17,0,0,0-.89.8C230.62,172.6,231.59,172.42,231.67,172.4Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M234.48,231.09a16.84,16.84,0,0,0,2-.49,7.09,7.09,0,0,1,2.86-.26l1.05.13c1.33.15,2.71.2,3.56-.76a2.6,2.6,0,0,0,.72-1.24c.16.42.93,2.21-2.3,3.16a4.87,4.87,0,0,1-4-.33,2.62,2.62,0,0,0-1.42-.22c-1.4.2-2.85,1.39-4.6.62a4.52,4.52,0,0,1-1.35-1c-1.58-1.6-.67-2.42-.47-2.71a1.42,1.42,0,0,0,.05,1.07A3.37,3.37,0,0,0,234.48,231.09Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M243.9,229.71c-.85,1-2.23.91-3.56.76.59-1.33,1.82-1.23,2.47-2.13a2.48,2.48,0,0,1,1.39-1.11h0c.11.32.53.63.42,1.24A2.6,2.6,0,0,1,243.9,229.71Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M243.61,225.27a3,3,0,0,1,.56,1.82.35.35,0,0,0,0,.14h0a2.48,2.48,0,0,0-1.39,1.11c-.65.9-1.88.8-2.47,2.13l-1.05-.13a7.09,7.09,0,0,0-2.86.26,16.84,16.84,0,0,1-2,.49,2.26,2.26,0,0,1-1.83-2.09c.11-.43.63-.47.94-.93a15.68,15.68,0,0,0,5.28-1.79l.35.2a4.55,4.55,0,0,0,1.6.49h0a1.67,1.67,0,0,0,2-2.2.92.92,0,0,1,.23.09,1.41,1.41,0,0,1,.35.23A1.37,1.37,0,0,1,243.61,225.27Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M232.65,229a2.26,2.26,0,0,0,1.83,2.09,3.37,3.37,0,0,1-4-2,1.42,1.42,0,0,1-.05-1.07c.34-.82,1.66-1.05,2.92-1.11.21,0,.39.6.23,1.16C233.28,228.53,232.76,228.57,232.65,229Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M239,225.72a1,1,0,0,1,.26.76l-.35-.2a15.68,15.68,0,0,1-5.28,1.79c.16-.56,0-1.16-.23-1.16l.93,0c.48,0,.9,0,1.19,0a17.9,17.9,0,0,0,3.16-.95,1.16,1.16,0,0,0-.2-.24A.47.47,0,0,1,239,225.72Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M238.64,225.9a17.9,17.9,0,0,1-3.16.95,28.56,28.56,0,0,0,2.84-1.37c.08,0,.12.18.12.18A1.16,1.16,0,0,1,238.64,225.9Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M244.62,228.47c.16.42.93,2.21-2.3,3.16a4.87,4.87,0,0,1-4-.33,2.62,2.62,0,0,0-1.42-.22c-1.4.2-2.85,1.39-4.6.62a4.52,4.52,0,0,1-1.35-1c-1.58-1.6-.67-2.42-.47-2.71"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M243.09,224.91a.11.11,0,0,0,0,0c.13-.65.35-.71.78-.39a.92.92,0,0,1,.14.13c.18.24,0,.47-.41.67l-.44.15"/>
|
||||||
|
<path d="M233.71,228.65a.21.21,0,0,0,.41-.11.21.21,0,0,0-.41.11Z"/>
|
||||||
|
<path d="M233.61,228.68a.3.3,0,0,0,.12.17.33.33,0,0,0,.46-.11.33.33,0,0,0-.06-.38.36.36,0,0,0-.36,0,.33.33,0,0,0-.13.13.31.31,0,0,0,0,.23.11.11,0,0,0,.13.07.1.1,0,0,0,.07-.13v0s0,0,0,0v0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h0l0,0s0,0,0,0h.07s0,0,0,0h0s0,0,0,0h0l0,0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0v0h0v0a0,0,0,0,1,0,0h0s0,0,0,0h0l0,0h0l0,0h0s0,0,0,0h-.1s0,0,0,0h0s0,0,0,0h0v0a.09.09,0,0,0-.12-.07A.11.11,0,0,0,233.61,228.68Z"/>
|
||||||
|
<path d="M234.88,228.41a.21.21,0,0,0,.41-.11.21.21,0,0,0-.41.11Z"/>
|
||||||
|
<path d="M234.78,228.43a.32.32,0,0,0,.12.18.34.34,0,0,0,.17,0,.32.32,0,0,0,.29-.16.32.32,0,0,0-.06-.38.34.34,0,0,0-.35,0,.29.29,0,0,0-.14.13.29.29,0,0,0,0,.22.12.12,0,0,0,.13.08.1.1,0,0,0,.07-.13v0h0v0h0s0,0,0,0l0,0h0l0,0h0s0,0,0,0h0s0,0,0,0h.07s0,0,0,0h0s0,0,0,0h0l0,0h0s0,0,0,0h0v0h0v0h0v0a0,0,0,0,1,0,0h0v0h0l0,0h0s0,0,0,0l0,0H235l0,0h0v0a.09.09,0,0,0-.12-.07A.1.1,0,0,0,234.78,228.43Z"/>
|
||||||
|
<path d="M236.14,228a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
|
||||||
|
<path d="M236,228.05a.3.3,0,0,0,.12.17.34.34,0,0,0,.17.05.35.35,0,0,0,.29-.16.32.32,0,0,0-.07-.38.34.34,0,0,0-.35,0,.35.35,0,0,0-.14.13.36.36,0,0,0,0,.23.1.1,0,0,0,.13.07.11.11,0,0,0,.07-.13v0s0,0,0,0,0,0,0,0h0v0h0s0,0,0,0v0h0l0,0h0l0,0s0,0,0,0h.12l0,0h0s0,0,0,0h0v0h0v0h0v0a0,0,0,0,0,0,0h0s0,0,0,0h0v0h0l0,0h0s0,0,0,0l0,0h0s0,0,0,0h-.1s0,0,0,0h0s0,0,0,0h0v0h0s0,0,0,0l0,0s0,0,0,0v0a.1.1,0,0,0-.13-.07A.11.11,0,0,0,236,228.05Z"/>
|
||||||
|
<path d="M237.36,227.55a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
|
||||||
|
<path d="M237.26,227.58a.3.3,0,0,0,.12.17.35.35,0,0,0,.17.06.34.34,0,0,0,.29-.17.31.31,0,0,0-.07-.37.3.3,0,0,0-.35,0,.29.29,0,0,0-.14.13.33.33,0,0,0,0,.22.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12v0s0,0,0,0v0h0s0,0,0,0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h.14l0,0h0v0h0v0a0,0,0,0,0,0,0h0v0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h-.15s0,0,0,0,0,0,0,0v0a.11.11,0,0,0-.13-.08A.11.11,0,0,0,237.26,227.58Z"/>
|
||||||
|
<path d="M238.54,227a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
|
||||||
|
<path d="M238.44,227a.3.3,0,0,0,.12.17.35.35,0,0,0,.16.06.34.34,0,0,0,.3-.17.31.31,0,0,0-.07-.37.3.3,0,0,0-.35,0,.25.25,0,0,0-.14.13.28.28,0,0,0,0,.22.1.1,0,0,0,.13.07.1.1,0,0,0,.07-.12v0s0,0,0,0a.08.08,0,0,1,0,0h0s0,0,0,0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h.13l0,0h0v0h0s0,0,0,0v0a0,0,0,0,1,0,0h0v0h0s0,0,0,0,0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h-.07s0,0,0,0h0s0,0,0,0,0,0,0,0v0a.12.12,0,0,0-.13-.08A.11.11,0,0,0,238.44,227Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M233.83,226.85s0,0,0,0l0,0a.41.41,0,0,1,0,.09,1.55,1.55,0,0,1,.08.23,1.51,1.51,0,0,1,.09.47,1.85,1.85,0,0,1-.24.85c-.06.12.12.22.18.1a1.89,1.89,0,0,0,.25-1.16,2.16,2.16,0,0,0-.19-.61c-.06-.14-.26-.3-.4-.15s.06.24.15.14Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M235.19,228.3a1.63,1.63,0,0,0-.25-.57,4.67,4.67,0,0,0-.36-.51,3.05,3.05,0,0,0-.44-.44.53.53,0,0,0-.24-.14.27.27,0,0,0-.24.07c-.11.08,0,.23.15.15s.15,0,.2.08l.17.15a3.9,3.9,0,0,1,.33.38,2.24,2.24,0,0,1,.48.88c0,.13.22.08.2,0Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M234.49,226.75a2.8,2.8,0,0,1-.13.95,2.45,2.45,0,0,1-.17.45,3,3,0,0,1-.29.43c-.08.11.1.21.18.1a2.63,2.63,0,0,0,.3-.44,2.78,2.78,0,0,0,.18-.48,2.68,2.68,0,0,0,.13-1c0-.13-.22-.14-.2,0Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M236.46,227.92c0-.2-.2-.31-.36-.43a3.78,3.78,0,0,1-.4-.4,1.71,1.71,0,0,0-.94-.46c-.13,0-.18.18,0,.2a1.42,1.42,0,0,1,.84.41c.12.12.23.26.36.37s.32.19.35.37.23.07.2-.06Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M235.74,226.42a.87.87,0,0,0-.34.37,5.4,5.4,0,0,0-.23.49,3,3,0,0,0-.2,1.12c0,.13.19.13.21,0a2.86,2.86,0,0,1,.17-1c.06-.15.13-.29.2-.43a.71.71,0,0,1,.3-.36c.12-.06,0-.24-.11-.18Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M237.65,227.42a1.71,1.71,0,0,0-.38-.38,2.69,2.69,0,0,0-.44-.31c-.16-.08-.33-.12-.48-.19a1,1,0,0,0-.46-.15.1.1,0,0,0,0,.21.8.8,0,0,1,.39.14c.14.06.3.1.44.17a2.55,2.55,0,0,1,.4.27,1.62,1.62,0,0,1,.35.34c.08.11.26,0,.18-.1Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M236.9,226.13a.53.53,0,0,0-.29.33,2.11,2.11,0,0,0-.14.49c0,.16-.12.31-.16.47a1.31,1.31,0,0,0,0,.52c0,.13.22.14.2,0a1.63,1.63,0,0,1,0-.44c0-.15.12-.28.15-.42a1.55,1.55,0,0,0,0-.21c0-.08.05-.15.07-.22s.08-.27.19-.32a.11.11,0,0,0,.07-.13.09.09,0,0,0-.12-.07Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M238.81,226.89a.44.44,0,0,1-.14-.13,1.22,1.22,0,0,0-.17-.15,2.27,2.27,0,0,0-.41-.21c-.32-.11-.65-.19-1-.28a.1.1,0,0,0-.06.2c.32.09.64.17.95.28a1,1,0,0,1,.38.19,3,3,0,0,0,.32.29.11.11,0,0,0,.1-.19Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M237.9,225.82a5.54,5.54,0,0,1-.4,1.59c0,.05,0,.11.08.12s.1,0,.13-.07a5.77,5.77,0,0,0,.39-1.64c0-.14-.19-.14-.2,0Z"/>
|
||||||
|
<path class="cls-24"
|
||||||
|
d="M238,227.78a1.11,1.11,0,0,0,.57-.58.71.71,0,0,0-.21-.71h0a.19.19,0,0,0,0-.08s0,0,0-.07a.41.41,0,0,0-.07-.11l0,0a1.09,1.09,0,0,0,0-.18.25.25,0,0,0-.12-.19,1.71,1.71,0,0,0-1.51-.24c-.27.07-.66.21-.57.57s.54.44.84.42h.1a1.3,1.3,0,0,0-.31.16,4.33,4.33,0,0,1-.47.38,1,1,0,0,1-.65.15c-.14,0-.14.2,0,.21a1.43,1.43,0,0,0,1.12-.47,2,2,0,0,1,1-.4,1.92,1.92,0,0,0-.43.32,1.56,1.56,0,0,0-.27.35,1.21,1.21,0,0,1-.24.35c-.1.09.05.24.15.15s.26-.46.45-.65l.35-.29a1.27,1.27,0,0,1,.31-.15.69.69,0,0,1-.13.11,3,3,0,0,0-.37.25c-.19.15-.41.47-.25.71S237.76,227.9,238,227.78Zm-1.08-1.4a1.09,1.09,0,0,1-.44-.06c-.11,0-.27-.14-.24-.28s.16-.16.26-.19a1.91,1.91,0,0,1,.89-.09,1.35,1.35,0,0,1,.44.15.47.47,0,0,1,.2.12s0,.1,0,.13v0l0,0h0a.2.2,0,0,0-.08.08,1.27,1.27,0,0,0-.55,0A3.63,3.63,0,0,1,236.91,226.38Zm.66,1.33c-.08,0-.19,0-.21-.11a.42.42,0,0,1,.12-.28.92.92,0,0,1,.26-.22,1,1,0,0,0,.47-.43h0a.47.47,0,0,1,.14.46.82.82,0,0,1-.46.47A.93.93,0,0,1,237.57,227.71Z"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M244.52,225.37c0-.06,0-.14,0-.24-.06-.39-1.17-21.62-1.17-21.62l1.88-9.95a51.23,51.23,0,0,1-6.5-1l-1.21,9.17a7.46,7.46,0,0,0,.1,2.45c.87,4.18,3.39,19.87,3.62,21.4h0a2.4,2.4,0,0,1,.05.47c-.06.28-1.13.33-1.17.51.11,0,1,1.14,1,1.17.87.39,3.25-.45,3.25-.45.4-.27.22-.78.37-1.33A1.57,1.57,0,0,1,244.52,225.37Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M236.48,231.89a15.4,15.4,0,0,0,1.92-.61,7.27,7.27,0,0,1,2.85-.43l1.05.06c1.33.07,2.72,0,3.51-1a2.68,2.68,0,0,0,.64-1.29c.19.41,1.07,2.16-2.1,3.3a4.92,4.92,0,0,1-4.06-.08,2.55,2.55,0,0,0-1.42-.14c-1.4.29-2.76,1.56-4.56.9a4.35,4.35,0,0,1-1.41-.89c-1.68-1.49-.82-2.36-.63-2.67a1.38,1.38,0,0,0,.12,1.07A3.35,3.35,0,0,0,236.48,231.89Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M245.81,229.94c-.79,1-2.18,1-3.51,1,.51-1.36,1.74-1.34,2.33-2.27a2.55,2.55,0,0,1,1.32-1.2h0c.13.32.57.6.5,1.21A2.68,2.68,0,0,1,245.81,229.94Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M245.25,225.52a3.08,3.08,0,0,1,.67,1.79.61.61,0,0,0,0,.13h0a2.55,2.55,0,0,0-1.32,1.2c-.59.93-1.82.91-2.33,2.27l-1.05-.06a7.27,7.27,0,0,0-2.85.43,15.4,15.4,0,0,1-1.92.61,2.24,2.24,0,0,1-1.94-2c.08-.43.59-.5.87-1a15.49,15.49,0,0,0,5.16-2.11l.37.18a4.52,4.52,0,0,0,1.63.39h0a1.66,1.66,0,0,0,1.89-2.32,1,1,0,0,1,.25.07,1.34,1.34,0,0,1,.36.22A1.29,1.29,0,0,1,245.25,225.52Z"/>
|
||||||
|
<path class="cls-18"
|
||||||
|
d="M234.54,229.91a2.24,2.24,0,0,0,1.94,2,3.35,3.35,0,0,1-4.09-1.75,1.38,1.38,0,0,1-.12-1.07c.29-.83,1.59-1.14,2.84-1.29.22,0,.43.58.3,1.15C235.13,229.41,234.62,229.48,234.54,229.91Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M240.63,226.25a1,1,0,0,1,.31.75l-.37-.18a15.49,15.49,0,0,1-5.16,2.11c.13-.57-.08-1.16-.3-1.15l.94-.08c.47,0,.89-.06,1.18-.1a19.34,19.34,0,0,0,3.1-1.14,1.89,1.89,0,0,0-.22-.23A.48.48,0,0,1,240.63,226.25Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M240.33,226.46a19.34,19.34,0,0,1-3.1,1.14,29.4,29.4,0,0,0,2.75-1.54c.08,0,.13.17.13.17A1.89,1.89,0,0,1,240.33,226.46Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M246.45,228.65c.19.41,1.07,2.16-2.1,3.3a4.92,4.92,0,0,1-4.06-.08,2.55,2.55,0,0,0-1.42-.14c-1.4.29-2.76,1.56-4.56.9a4.35,4.35,0,0,1-1.41-.89c-1.68-1.49-.82-2.36-.63-2.67"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M244.71,225.19a.09.09,0,0,1,0-.05c.08-.66.3-.73.75-.43a.58.58,0,0,1,.14.12c.2.22.07.47-.36.69a3.73,3.73,0,0,1-.43.18"/>
|
||||||
|
<path d="M235.57,229.5c.09.25.49.12.4-.13a.21.21,0,0,0-.4.13Z"/>
|
||||||
|
<path d="M235.47,229.53a.34.34,0,0,0,.13.16.26.26,0,0,0,.17.05.34.34,0,0,0,.29-.17.35.35,0,0,0-.08-.38.33.33,0,0,0-.19-.06.25.25,0,0,0-.17,0,.31.31,0,0,0-.15.36.11.11,0,0,0,.13.07.12.12,0,0,0,.08-.13,0,0,0,0,1,0,0s0,0,0,0v0s0,0,0,0v0s0,0,0,0h0s0,0,0,0l0,0h0s0,0,0,0h.07s0,0,0,0h.06l0,0s0,0,0,0h0s0,0,0,0,0,0,0,0h0v0s0,0,0,0v0h0v0h0s0,0,0,0l0,0h0l0,0s0,0,0,0h-.13l0,0s0,0,0,0h0v0h0a.11.11,0,0,0-.13-.07A.12.12,0,0,0,235.47,229.53Z"/>
|
||||||
|
<path d="M236.73,229.19a.21.21,0,0,0,.39-.14.21.21,0,0,0-.39.14Z"/>
|
||||||
|
<path d="M236.63,229.21a.3.3,0,0,0,.12.17.37.37,0,0,0,.17.05.34.34,0,0,0,.29-.18.31.31,0,0,0-.08-.37.4.4,0,0,0-.18-.07.47.47,0,0,0-.17,0,.3.3,0,0,0-.15.36.11.11,0,0,0,.13.08.11.11,0,0,0,.07-.13v0h0v0h0v0s0,0,0,0h0s0,0,0,0l0,0H237s0,0,0,0,0,0,0,0l0,0v0h0v0h0s0,0,0,0v0h0s0,0,0,0h0v0s0,0,0,0l0,0s0,0,0,0h0l0,0s0,0,0,0h0s0,0,0,0h-.12s0,0,0,0l0,0s0,0,0,0v0h0s0,0,0,0h0a.11.11,0,0,0-.13-.07A.09.09,0,0,0,236.63,229.21Z"/>
|
||||||
|
<path d="M238,228.72a.21.21,0,0,0,.39-.13.21.21,0,0,0-.39.13Z"/>
|
||||||
|
<path d="M237.86,228.75a.3.3,0,0,0,.12.17.27.27,0,0,0,.17,0,.31.31,0,0,0,.29-.17.31.31,0,0,0-.08-.37.34.34,0,0,0-.18-.07.33.33,0,0,0-.17,0,.29.29,0,0,0-.15.36.1.1,0,0,0,.13.07.09.09,0,0,0,.07-.12.08.08,0,0,1,0,0h0v0h0v0s0,0,0,0h0v0h0l0,0h0l0,0h0s0,0,0,0h.12s0,0,0,0v0s0,0,0,0h0s0,0,0,0h0v0s0,0,0,0v0h0v0h0s0,0,0,0l0,0h0l0,0s0,0,0,0h0l0,0h0s0,0,0,0h-.07l0,0s0,0,0,0v0s0,0,0,0h0a.1.1,0,0,0-.13-.08A.11.11,0,0,0,237.86,228.75Z"/>
|
||||||
|
<path d="M239.15,228.18a.21.21,0,0,0,.39-.13.21.21,0,0,0-.39.13Z"/>
|
||||||
|
<path d="M239.05,228.21a.3.3,0,0,0,.12.17.27.27,0,0,0,.17,0,.31.31,0,0,0,.29-.17.31.31,0,0,0-.08-.37.29.29,0,0,0-.18-.07.33.33,0,0,0-.17,0,.3.3,0,0,0-.15.36.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12s0,0,0,0h0v0h0v0s0,0,0,0h0v0h0l0,0h0l0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0v0h0s0,0,0,0v0h0s0,0,0,0h0s0,0,0,0l0,0h0a0,0,0,0,1,0,0h-.12s0,0,0,0h0s0,0,0,0l0,0s0,0,0,0v0h0a.11.11,0,0,0-.13-.08A.11.11,0,0,0,239.05,228.21Z"/>
|
||||||
|
<path d="M240.29,227.57a.21.21,0,0,0,.4-.13.21.21,0,0,0-.4.13Z"/>
|
||||||
|
<path d="M240.19,227.6a.31.31,0,0,0,.13.17.25.25,0,0,0,.17,0,.3.3,0,0,0,.2-.54.29.29,0,0,0-.18-.07.33.33,0,0,0-.17,0,.31.31,0,0,0-.15.36.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12s0,0,0,0,0,0,0,0v0h0v0s0,0,0,0h0v0h0l0,0h0s0,0,0,0l0,0h.12s0,0,0,0v0h0s0,0,0,0,0,0,0,0h0v0s0,0,0,0v0h0s0,0,0,0v0h0s0,0,0,0v0s0,0,0,0h0a0,0,0,0,1,0,0s0,0,0,0h0l0,0h0s0,0,0,0h-.07s0,0,0,0h0s0,0,0,0,0,0,0,0v0h0a.1.1,0,0,0-.13-.08A.11.11,0,0,0,240.19,227.6Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M235.58,227.7s0,0,0,0l0,0a.56.56,0,0,1,0,.08c0,.08.07.15.1.23a1.82,1.82,0,0,1,.11.46,1.72,1.72,0,0,1-.19.86c-.05.12.14.22.19.09a1.89,1.89,0,0,0,.18-1.17,2.57,2.57,0,0,0-.23-.6c-.07-.13-.28-.28-.41-.13s.08.24.16.14Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M237,229.06a1.73,1.73,0,0,0-.28-.56,4.63,4.63,0,0,0-.4-.48,3,3,0,0,0-.46-.41.55.55,0,0,0-.25-.13.32.32,0,0,0-.24.09c-.1.09.06.22.16.14s.16,0,.21.07l.17.14a4,4,0,0,1,.36.35,2.18,2.18,0,0,1,.53.85c0,.14.23.07.2-.06Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M236.23,227.55a2.44,2.44,0,0,1-.07,1,1.81,1.81,0,0,1-.14.45,2.91,2.91,0,0,1-.26.45c-.07.11.11.2.19.09a3.47,3.47,0,0,0,.27-.46,4,4,0,0,0,.15-.49,2.7,2.7,0,0,0,.07-1c0-.13-.23-.12-.21,0Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M238.28,228.61c-.05-.2-.23-.3-.39-.41a3.89,3.89,0,0,1-.43-.38,1.71,1.71,0,0,0-1-.4c-.13,0-.18.19,0,.2a1.51,1.51,0,0,1,.86.36c.13.11.25.24.39.34s.33.18.37.35.23.07.2-.06Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M237.46,227.16a.85.85,0,0,0-.32.38l-.2.51a3.25,3.25,0,0,0-.13,1.12c0,.13.2.12.21,0a2.91,2.91,0,0,1,.11-1l.17-.44a.7.7,0,0,1,.28-.37c.12-.07,0-.24-.12-.17Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M239.43,228a2,2,0,0,0-.4-.36,2.73,2.73,0,0,0-.47-.27c-.15-.08-.33-.1-.48-.17a1,1,0,0,0-.47-.11c-.14,0-.12.21,0,.2a1,1,0,0,1,.4.11c.15.06.31.09.45.15a2.8,2.8,0,0,1,.41.25,1.47,1.47,0,0,1,.38.32c.08.1.25,0,.17-.12Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M238.6,226.79a.53.53,0,0,0-.27.35,2.78,2.78,0,0,0-.11.5c0,.16-.1.31-.13.48a1.51,1.51,0,0,0,0,.52c0,.13.23.12.21,0a1.36,1.36,0,0,1,0-.45c0-.15.09-.28.12-.43a1.52,1.52,0,0,0,0-.21,1.89,1.89,0,0,1,.05-.23c0-.1.06-.27.17-.32s.09-.08.07-.13a.11.11,0,0,0-.13-.07Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M240.56,227.44a.65.65,0,0,1-.16-.13l-.17-.14a1.72,1.72,0,0,0-.42-.18c-.33-.09-.66-.15-1-.22a.1.1,0,0,0,0,.2c.32.07.65.13,1,.22a1.36,1.36,0,0,1,.39.17,2.78,2.78,0,0,0,.34.26.1.1,0,1,0,.09-.18Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M239.58,226.42a5.52,5.52,0,0,1-.3,1.61.11.11,0,0,0,.08.12.11.11,0,0,0,.13-.08,5.58,5.58,0,0,0,.29-1.67c0-.13-.2-.12-.2,0Z"/>
|
||||||
|
<path class="cls-24"
|
||||||
|
d="M239.79,228.37a1.06,1.06,0,0,0,.53-.61.66.66,0,0,0-.25-.69h0s0-.05,0-.08,0,0,0-.07a.39.39,0,0,0-.08-.1l0,0a1.1,1.1,0,0,0,0-.18.23.23,0,0,0-.13-.19,1.86,1.86,0,0,0-.46-.19,1.91,1.91,0,0,0-1.06.05c-.27.08-.65.25-.53.6s.57.41.87.37h.09a1.11,1.11,0,0,0-.3.17,6,6,0,0,1-.45.42,1,1,0,0,1-.64.18c-.13,0-.12.21,0,.21a1.4,1.4,0,0,0,1.09-.53,2,2,0,0,1,1-.47,2.71,2.71,0,0,0-.4.35,1.37,1.37,0,0,0-.26.37,1.2,1.2,0,0,1-.22.36c-.09.1.07.24.16.14s.24-.47.42-.67a2.34,2.34,0,0,1,.32-.31,1,1,0,0,1,.31-.18.49.49,0,0,1-.13.12c-.12.1-.25.17-.36.27s-.38.5-.2.72S239.57,228.5,239.79,228.37ZM238.63,227a1.14,1.14,0,0,1-.45,0c-.11,0-.27-.12-.25-.27s.15-.17.24-.21a2.08,2.08,0,0,1,.89-.14,1.66,1.66,0,0,1,.45.12c.05,0,.17.06.2.11a.32.32,0,0,1,0,.14v0l0,0h0a.27.27,0,0,0-.07.08,1.23,1.23,0,0,0-.54,0A4.45,4.45,0,0,1,238.63,227Zm.74,1.28c-.08,0-.2,0-.22-.09a.41.41,0,0,1,.11-.29,1.09,1.09,0,0,1,.24-.24,1,1,0,0,0,.44-.45h0a.49.49,0,0,1,.16.45.85.85,0,0,1-.43.5A1,1,0,0,1,239.37,228.32Z"/>
|
||||||
|
<path class="cls-25"
|
||||||
|
d="M236.69,192.06l1.75.62.9-6.69-.91-4.45-2.32,1.58,1.07,1.08a1.29,1.29,0,0,1,.35,1.09L236.45,192Z"/>
|
||||||
|
<path class="cls-26"
|
||||||
|
d="M247,193.77a12.36,12.36,0,0,1-2.64.37c-1.9,0-4.64.17-5.93-1l-.08-.21c.16-1.66.23-7,.23-7a3.4,3.4,0,0,0-2.45-2.8l6.49-4.41a5.9,5.9,0,0,0,2-2.07c.32.36.71.8,1.11,1.28a7.76,7.76,0,0,1,1.5,7.21c-.09.29-.19.6-.32.91A75.57,75.57,0,0,1,247,193.77Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M238.53,193.83c-.21,1.53-.56,4.4-.63,5,.42,0,1.1-.3,1-.88C238.85,197.07,239.42,194.62,238.53,193.83Z"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M238.17,193.58a3.86,3.86,0,0,1-1.07-2.08l-.09-12a10.16,10.16,0,0,0-.17-1.74L235.56,171a9.65,9.65,0,0,0-2.35,0,4.58,4.58,0,0,0-1.76.62l2.42,8.69,1.47,11a7.58,7.58,0,0,0,.32,1.41,48.43,48.43,0,0,1,1.65,5.67c-.06.53,1.46.24,1.37-.62S239.06,194.37,238.17,193.58Z"/>
|
||||||
|
<circle class="cls-27" cx="232.66" cy="89.89" r="53.72"/>
|
||||||
|
<polygon class="cls-28"
|
||||||
|
points="258.62 69.59 252.96 63.93 232.66 84.23 212.36 63.93 206.7 69.59 227 89.89 206.7 110.19 212.36 115.84 232.66 95.54 252.96 115.84 258.62 110.19 238.32 89.89 258.62 69.59"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 33 KiB |
106
src/assets/images/exception/nodata.svg
Normal file
106
src/assets/images/exception/nodata.svg
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1,.cls-16,.cls-2,.cls-25,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#40a8f5;}.cls-14{fill:#53b9f5;}.cls-15{fill:#8cd7ff;}.cls-16{stroke:#4986d9;stroke-width:0.11px;}.cls-17{fill:#ffeed2;}.cls-18{fill:#e55c5c;opacity:0.2;}.cls-19{fill:#e49056;}.cls-20{fill:#ebfcff;}.cls-21{fill:#ffb056;}.cls-22{fill:#398eed;}.cls-23{fill:#fae6d2;}.cls-24{fill:#257fba;}.cls-25{stroke:#e49056;stroke-width:0.22px;}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#81cfff"/>
|
||||||
|
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
|
||||||
|
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
|
||||||
|
</defs>
|
||||||
|
<title>暂无数据</title>
|
||||||
|
<g id="图层_2" data-name="图层 2">
|
||||||
|
<g id="图层_1-2" data-name="图层 1">
|
||||||
|
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
|
||||||
|
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
|
||||||
|
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
|
||||||
|
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
|
||||||
|
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
|
||||||
|
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
|
||||||
|
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
|
||||||
|
<g class="cls-8">
|
||||||
|
<path class="cls-9"
|
||||||
|
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
|
||||||
|
<path class="cls-10"
|
||||||
|
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
|
||||||
|
<path class="cls-11"
|
||||||
|
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
|
||||||
|
<path class="cls-12"
|
||||||
|
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M295.06,98.88V177c-4.93-3.84-14.28-5.29-15.66-5.42V98.88a7.83,7.83,0,0,1,11.71-6.8,7.94,7.94,0,0,1,1.66,1.27A7.77,7.77,0,0,1,295.06,98.88Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M279.4,171.6v22.27a7.84,7.84,0,0,1-15.67,0V115.29a7.85,7.85,0,0,0-2.29-5.54,7.53,7.53,0,0,0-1.11-.92c-1.44-1.29-19.11-10.25-34.35-17.38V73.66a7.85,7.85,0,0,1,9.89-7.56l.18.05c4.45-.54,52.62,23.75,55.06,25.93a7.83,7.83,0,0,0-11.71,6.8Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M263.73,193.87a7.83,7.83,0,0,0,4.86,7.24c-1.81-.29-10.49-4.09-20.48-8.73h0V115.29a7.83,7.83,0,0,1,12.26-6.46,7.53,7.53,0,0,1,1.11.92,7.85,7.85,0,0,1,2.29,5.54Z"/>
|
||||||
|
<path class="cls-15"
|
||||||
|
d="M226,91.45c15.24,7.13,32.91,16.09,34.35,17.38a7.83,7.83,0,0,0-12.26,6.46v94.83a7.85,7.85,0,0,1-7.83,7.83,7.61,7.61,0,0,1-2.25-.33h-.08a7.83,7.83,0,0,1-5.5-7.48V201.7c-9.92-2-25.82-9.21-37.84-15.63a7.68,7.68,0,0,0,.09-1.17V90.07a7.82,7.82,0,0,1,7.83-7.83,6.88,6.88,0,0,1,1.29.11l.19,0C205.93,82.38,215.37,86.47,226,91.45Zm15.09,98.41v-5.15a.37.37,0,0,0-.2-.33L203,166.1a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.28A.36.36,0,0,0,241.07,189.86Zm0-22.38v-5.15a.37.37,0,0,0-.2-.33L203,143.72a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.28A.37.37,0,0,0,241.07,167.48Zm0-22.39V140a.36.36,0,0,0-.2-.33L203,121.34a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.27A.36.36,0,0,0,241.07,145.09Zm0-22.38v-5.15a.37.37,0,0,0-.2-.33L203,99a.36.36,0,0,0-.53.32v5.15a.36.36,0,0,0,.21.33L240.55,123A.36.36,0,0,0,241.07,122.71Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M241.07,184.71v5.15a.36.36,0,0,1-.52.33L202.7,171.91a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33l37.85,18.28A.37.37,0,0,1,241.07,184.71Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M241.07,162.33v5.15a.37.37,0,0,1-.52.33L202.7,149.53a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33L240.87,162A.37.37,0,0,1,241.07,162.33Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M241.07,140v5.14a.36.36,0,0,1-.52.33L202.7,127.15a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33l37.85,18.28A.36.36,0,0,1,241.07,140Z"/>
|
||||||
|
<path class="cls-13"
|
||||||
|
d="M241.07,117.56v5.15a.36.36,0,0,1-.52.33L202.7,104.76a.36.36,0,0,1-.21-.33V99.28A.36.36,0,0,1,203,99l37.85,18.27A.37.37,0,0,1,241.07,117.56Z"/>
|
||||||
|
<path class="cls-14"
|
||||||
|
d="M232.41,210.12a7.83,7.83,0,0,0,5.5,7.48c-4.9-.95-50.65-22.79-55.32-26.12l-.09-.06A7.8,7.8,0,0,1,179,184.9v-8.42c2.09,1.89,8.08,5.58,15.58,9.59,12,6.42,27.92,13.66,37.84,15.63Z"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M218.37,121.59c.32,0,.42,0,.38.2s.19,1-.18,1.09a17.78,17.78,0,0,1-4.14-.24c-.74-.08-3.1-.51-3.57-.49s-2.58-.08-3.14-.05A20.86,20.86,0,0,1,205,122c-.57-.1-2.36-.85-1.68-2.35"/>
|
||||||
|
<path class="cls-16"
|
||||||
|
d="M232.42,114.62h0c.32,0,1.28,1.42,1.25,1.87a2.56,2.56,0,0,1-.92,1.64c-.48.27-2.58.21-3.18.83a9.7,9.7,0,0,0-1.87,2.59,2.29,2.29,0,0,1-2,1.21c-1,0-2.36-.1-3.41,0s-1.76-.07-1.73-1.16h0"/>
|
||||||
|
<ellipse class="cls-17" cx="237.51" cy="60.25" rx="1.08" ry="0.74"
|
||||||
|
transform="translate(174.08 296.94) rotate(-89.23)"/>
|
||||||
|
<ellipse class="cls-18" cx="237.51" cy="60.25" rx="0.63" ry="0.43"
|
||||||
|
transform="translate(174.08 296.94) rotate(-89.23)"/>
|
||||||
|
<path class="cls-19" d="M240,66.35l.33.44a2.85,2.85,0,0,0,.09-.44C240.24,66.25,240,66.35,240,66.35Z"/>
|
||||||
|
<path class="cls-19"
|
||||||
|
d="M235.15,67.17a.62.62,0,0,0,.3.48c.08-.22.16-.42.23-.59C235.68,67.06,235.26,67,235.15,67.17Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M203.32,119.6c-.68,1.5,1.11,2.25,1.68,2.35a20.86,20.86,0,0,0,2.72.15c.56,0,2.66.06,3.14.05s2.83.41,3.57.49a17.78,17.78,0,0,0,4.14.24c.37,0,.13-.92.18-1.09s-.06-.15-.38-.2a20.73,20.73,0,0,1-4.39-.17c-.65-.11-2.71-.4-3.45-.43s-4,.06-4.83.09a3.51,3.51,0,0,1-1.67-.49,1.7,1.7,0,0,1-.69-1Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M205.65,118.21c-2,.18-2.42.81-2.31,1.38a1.7,1.7,0,0,0,.69,1,3.51,3.51,0,0,0,1.67.49c.8,0,4.1-.11,4.83-.09s2.8.32,3.45.43a20.73,20.73,0,0,0,4.39.17,9,9,0,0,0-.11-3.42c0-.39.06-1,.32-1.08s-.18-.55-.49-.94a1.49,1.49,0,0,1-.61.63,5.16,5.16,0,0,1-1.72.36,2.7,2.7,0,0,1-2.37-.81h0c-.22-.21-.38-.41-.52-.52a4.93,4.93,0,0,1-2,1.72C210.11,117.9,207.13,118,205.65,118.21Z"/>
|
||||||
|
<path class="cls-22"
|
||||||
|
d="M215,92.8l-2.22,22.48.81.15,3.89.72.17,0,2.09-14.61.55-3.81,4.56.1,15.31.34a1.58,1.58,0,0,0,1.61-1.41l.38-3.25c-2.33.3-6.45-1-7.89-3.05l-17.82.94A1.52,1.52,0,0,0,215,92.8Z"/>
|
||||||
|
<path class="cls-23" d="M213.54,115.43l-.15.89h0a2.7,2.7,0,0,0,2.37.81,5.16,5.16,0,0,0,1.72-.36l0-.63Z"/>
|
||||||
|
<path class="cls-24"
|
||||||
|
d="M216.56,90.26a1,1,0,0,0-.77,1.23l0,.08h0a1.54,1.54,0,0,1,.57-.14l17.82-.94a2.6,2.6,0,0,1-.51-1.38Z"/>
|
||||||
|
<polygon class="cls-24"
|
||||||
|
points="229.08 111.78 228.91 111.25 224.81 97.86 224.81 97.86 220.24 97.76 219.69 101.57 224.34 115.04 225.61 114.24 229.15 112.03 229.08 111.78"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M221.62,119.06c-.3.18-1.18,1.26-1.13,1.79a4.27,4.27,0,0,0,0,.72h0a.41.41,0,0,0,.25.25,25.52,25.52,0,0,0,4.65.06,1.82,1.82,0,0,0,1.52-1.07,8.42,8.42,0,0,1,1.41-2.12c1.47-1.64,3.84-1,4.19-1.86a2.48,2.48,0,0,0-.13-2.22h0a.65.65,0,0,0-.25-.22,4.4,4.4,0,0,1-1.46-1.42,7.94,7.94,0,0,1-.48-1.73,3.32,3.32,0,0,0-1.32,0l.17.53c.34,0,.86.2.77.63a1.24,1.24,0,0,1-.36.78,2.64,2.64,0,0,0-.68.89c-.12.32-.16,1.15-.52,1.3s-.93.12-1-.24-.05-.59-.5-.67a6.64,6.64,0,0,0-1.05-.12h0c-.09.08.06.56.27.91a1,1,0,0,1,.05,1.14c-.23.37-1.4,2.18-2,2.3A16.34,16.34,0,0,0,221.62,119.06Z"/>
|
||||||
|
<path class="cls-20"
|
||||||
|
d="M220.53,121.58c0,1.09.68,1.25,1.73,1.16s2.4,0,3.41,0a2.29,2.29,0,0,0,2-1.21,9.7,9.7,0,0,1,1.87-2.59c.6-.62,2.7-.56,3.18-.83a2.56,2.56,0,0,0,.92-1.64c0-.45-.93-1.87-1.25-1.87a2.48,2.48,0,0,1,.13,2.22c-.35.81-2.72.22-4.19,1.86a8.42,8.42,0,0,0-1.41,2.12,1.82,1.82,0,0,1-1.52,1.07,25.52,25.52,0,0,1-4.65-.06A.41.41,0,0,1,220.53,121.58Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M225.61,114.24l.06.11h0a6.64,6.64,0,0,1,1.05.12c.45.08.38.31.5.67s.68.39,1,.24.4-1,.52-1.3a2.64,2.64,0,0,1,.68-.89,1.24,1.24,0,0,0,.36-.78c.09-.43-.43-.61-.77-.63l.07.25Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M232.16,59.7c.32,1.48-.53,2.08-.34,2.87s.73.2,1.17.53a2.75,2.75,0,0,0,2.57,1.63,2.82,2.82,0,0,0,.57-.09,5.3,5.3,0,0,0,.67-.23l.4-.19a4.58,4.58,0,0,0,1.86-1.57h0a3.48,3.48,0,0,0,.35-.66,4.41,4.41,0,0,0,0-3c-.74-2.39-2.92-3.84-4.87-3.24A3.83,3.83,0,0,0,232.16,59.7Z"/>
|
||||||
|
<path class="cls-21"
|
||||||
|
d="M234.78,75.13c-.13,1,.71,2.22,1.62,3.15l-1.9,2a1.52,1.52,0,0,1-.68.4l0,0s.37,7.15-.14,8.34a2.6,2.6,0,0,0,.51,1.38c1.44,2,5.56,3.35,7.89,3.05a3.18,3.18,0,0,0,.75-.17c.59-3.16.49-18.93.49-18.93v-.38a8.32,8.32,0,0,0-1.65-5.42l-.14-.18s-.65-1.31-1.16-2.11a2.85,2.85,0,0,1-.09.44,1.8,1.8,0,0,1-1.52,1.46,5.44,5.44,0,0,1-3.32-.6.62.62,0,0,1-.3-.48c-.35,1.31-.65,2.9-.65,2.9a22.06,22.06,0,0,0-1,5.65c0,.34.1,1,.13,1.37Z"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M235.68,67.06c-.07.17-.15.37-.23.59a5.44,5.44,0,0,0,3.32.6,1.8,1.8,0,0,0,1.52-1.46l-.33-.44-.49-.66a13,13,0,0,1-.41-3,4.58,4.58,0,0,1-1.86,1.57l-.4.19a5.3,5.3,0,0,1-.67.23,3,3,0,0,1-.2,1.77C235.89,66.53,235.8,66.76,235.68,67.06Z"/>
|
||||||
|
<path class="cls-23"
|
||||||
|
d="M219.65,89.54a.47.47,0,0,0-.15.4h0l.09,0c.41-.1,2.57-1.56,3.1-1.4a20.86,20.86,0,0,0,3.45-.12l4.9-6.64,2.1-3.72.53-.93c0-.37-.13-1-.13-1.37h0l-3,6.16L226,88.22s-2.83,0-3.12-.06A22.33,22.33,0,0,0,219.65,89.54Z"/>
|
||||||
|
<polygon class="cls-13" points="226.45 89.96 215.76 90.5 216.54 89.84 225.62 89.41 226.45 89.96"/>
|
||||||
|
<polygon class="cls-13" points="210.32 80.69 216.54 89.84 215.76 90.5 209.31 80.55 210.32 80.69"/>
|
||||||
|
<polygon class="cls-14"
|
||||||
|
points="226.45 89.96 226.45 90.9 214.93 91.58 208.34 80.94 209.31 80.55 215.76 90.5 226.45 89.96"/>
|
||||||
|
<path class="cls-17"
|
||||||
|
d="M231,81.74l-4.9,6.64a20.86,20.86,0,0,1-3.45.12c-.53-.16-2.69,1.3-3.1,1.4l-.09,0c-.35.21-.43,1.09.51.77a14,14,0,0,1,2.75-1c.62,0,2.54.18,3,.19a2.06,2.06,0,0,0,1.25-.25l5.72-6.24c.15-.12,3.66-5.17,3.66-5.17-.91-.93-1.75-2.15-1.62-3.15Z"/>
|
||||||
|
<path d="M230.93,58a1.76,1.76,0,0,1,.4-.37c.09,0,.11-.06.2-.45a4.22,4.22,0,0,1,4.07-2.68h0a4,4,0,0,1,3.82,2.13s1.32,2.72.83,4a9.55,9.55,0,0,1-.7,1.46,3.49,3.49,0,0,0-.34.71c.21.28.36.31.36.31l.34,0-.3.16a.41.41,0,0,1-.23.06.79.79,0,0,1-.37-.1.92.92,0,0,1-.47-.67c-.07-.16-.32-.3-.55-.43s-.49-.28-.51-.47a1.39,1.39,0,0,1,0-.39c0-.46.13-1.24-.3-1.41a1.2,1.2,0,0,0-.41-.11h0a2.41,2.41,0,0,1,0,1.26l-.16.37-.05-.4a2.34,2.34,0,0,0-1.64-2,1.32,1.32,0,0,0-.74.16,1.36,1.36,0,0,1-.65.16,1.83,1.83,0,0,1-.44-.12.7.7,0,0,0-.55-.05,1.69,1.69,0,0,0-.45.19,1,1,0,0,1-.75.15.89.89,0,0,1-.61-.57A1,1,0,0,1,230.93,58Z"/>
|
||||||
|
<line class="cls-25" x1="234.78" y1="75.13" x2="238.1" y2="70.52"/>
|
||||||
|
<path class="cls-25" d="M240.89,75.52l-2.58,4.2a6.44,6.44,0,0,1-1.91-1.44"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 21 KiB |
@@ -1,4 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<n-loading-bar-provider>
|
||||||
|
<LoadingContent />
|
||||||
<n-dialog-provider>
|
<n-dialog-provider>
|
||||||
<DialogContent />
|
<DialogContent />
|
||||||
<n-notification-provider>
|
<n-notification-provider>
|
||||||
@@ -8,18 +10,34 @@
|
|||||||
</n-message-provider>
|
</n-message-provider>
|
||||||
</n-notification-provider>
|
</n-notification-provider>
|
||||||
</n-dialog-provider>
|
</n-dialog-provider>
|
||||||
|
</n-loading-bar-provider>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, computed, ref, onMounted, onUnmounted } from 'vue'
|
import { defineComponent } from 'vue';
|
||||||
import { MessageContent } from '@/components/MessageContent'
|
import {
|
||||||
import { DialogContent } from '@/components/DialogContent'
|
NDialogProvider,
|
||||||
|
NNotificationProvider,
|
||||||
|
NMessageProvider,
|
||||||
|
NLoadingBarProvider,
|
||||||
|
} from 'naive-ui';
|
||||||
|
import { LoadingContent } from '@/components/LoadingContent';
|
||||||
|
import { MessageContent } from '@/components/MessageContent';
|
||||||
|
import { DialogContent } from '@/components/DialogContent';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Application',
|
name: 'Application',
|
||||||
components: { MessageContent, DialogContent },
|
components: {
|
||||||
|
NDialogProvider,
|
||||||
|
NNotificationProvider,
|
||||||
|
NMessageProvider,
|
||||||
|
NLoadingBarProvider,
|
||||||
|
LoadingContent,
|
||||||
|
MessageContent,
|
||||||
|
DialogContent,
|
||||||
|
},
|
||||||
setup() {
|
setup() {
|
||||||
return {}
|
return {};
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import AppProvider from './Application.vue'
|
import AppProvider from './Application.vue';
|
||||||
|
|
||||||
export { AppProvider }
|
export { AppProvider };
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import DialogContent from './index.vue'
|
import DialogContent from './index.vue';
|
||||||
|
|
||||||
export { DialogContent }
|
export { DialogContent };
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<template></template>
|
<template></template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { useDialog } from 'naive-ui'
|
import { useDialog } from 'naive-ui';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DialogContent',
|
name: 'DialogContent',
|
||||||
setup() {
|
setup() {
|
||||||
//挂载在 window 方便与在js中使用
|
//挂载在 window 方便与在js中使用
|
||||||
window.$dialog = useDialog()
|
window['$dialog'] = useDialog();
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
3
src/components/LoadingContent/index.ts
Normal file
3
src/components/LoadingContent/index.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import LoadingContent from './index.vue';
|
||||||
|
|
||||||
|
export { LoadingContent };
|
||||||
12
src/components/LoadingContent/index.vue
Normal file
12
src/components/LoadingContent/index.vue
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<template></template>
|
||||||
|
<script lang="ts">
|
||||||
|
import { useLoadingBar } from 'naive-ui';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'LoadingContent',
|
||||||
|
setup() {
|
||||||
|
//挂载在 window 方便与在js中使用
|
||||||
|
window['$loading'] = useLoadingBar();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -7,7 +7,6 @@
|
|||||||
@contextmenu.prevent
|
@contextmenu.prevent
|
||||||
>
|
>
|
||||||
<template v-if="!showLogin">
|
<template v-if="!showLogin">
|
||||||
|
|
||||||
<div class="lock-box">
|
<div class="lock-box">
|
||||||
<div class="lock">
|
<div class="lock">
|
||||||
<span class="lock-icon" title="解锁屏幕" @click="onLockLogin(true)">
|
<span class="lock-icon" title="解锁屏幕" @click="onLockLogin(true)">
|
||||||
@@ -16,14 +15,13 @@
|
|||||||
</n-icon>
|
</n-icon>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!--充电-->
|
<!--充电-->
|
||||||
<recharge
|
<recharge
|
||||||
:battery="battery"
|
:battery="battery"
|
||||||
:battery-status="batteryStatus"
|
:battery-status="batteryStatus"
|
||||||
:calc-discharging-time="calcDischargingTime"
|
:calc-discharging-time="calcDischargingTime"
|
||||||
></recharge>
|
/>
|
||||||
|
|
||||||
<div class="local-time">
|
<div class="local-time">
|
||||||
<div class="time">{{ hour }}:{{ minute }}</div>
|
<div class="time">{{ hour }}:{{ minute }}</div>
|
||||||
@@ -50,9 +48,10 @@
|
|||||||
type="password"
|
type="password"
|
||||||
autofocus
|
autofocus
|
||||||
v-model:value="loginParams.password"
|
v-model:value="loginParams.password"
|
||||||
placeholder="请输入登录密码">
|
placeholder="请输入登录密码"
|
||||||
|
>
|
||||||
<template #suffix>
|
<template #suffix>
|
||||||
<n-icon @click="onLogin" style="cursor: pointer;">
|
<n-icon @click="onLogin" style="cursor: pointer">
|
||||||
<LoadingOutlined v-if="loginLoading" />
|
<LoadingOutlined v-if="loginLoading" />
|
||||||
<arrow-right-outlined v-else />
|
<arrow-right-outlined v-else />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
@@ -68,58 +67,56 @@
|
|||||||
<div><a @click="goLogin">重新登录</a></div>
|
<div><a @click="goLogin">重新登录</a></div>
|
||||||
<div><a @click="onLogin">进入系统</a></div>
|
<div><a @click="onLogin">进入系统</a></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onMounted, reactive, toRefs, computed } from 'vue'
|
import { defineComponent, reactive, toRefs } from 'vue';
|
||||||
import { ResultEnum } from '@/enums/httpEnum'
|
import { ResultEnum } from '@/enums/httpEnum';
|
||||||
import recharge from './Recharge.vue'
|
import recharge from './Recharge.vue';
|
||||||
import {
|
import {
|
||||||
LockOutlined,
|
LockOutlined,
|
||||||
LoadingOutlined,
|
LoadingOutlined,
|
||||||
UnlockOutlined,
|
|
||||||
UserOutlined,
|
UserOutlined,
|
||||||
ApiOutlined,
|
ApiOutlined,
|
||||||
ArrowRightOutlined,
|
ArrowRightOutlined,
|
||||||
WifiOutlined,
|
WifiOutlined,
|
||||||
} from '@vicons/antd'
|
} from '@vicons/antd';
|
||||||
|
|
||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router';
|
||||||
import { useOnline } from '@/hooks/useOnline'
|
import { useOnline } from '@/hooks/useOnline';
|
||||||
import { useTime } from '@/hooks/useTime'
|
import { useTime } from '@/hooks/useTime';
|
||||||
import { useBattery } from '@/hooks/useBattery'
|
import { useBattery } from '@/hooks/useBattery';
|
||||||
import { useLockscreenStore } from '@/store/modules/lockscreen'
|
import { useLockscreenStore } from '@/store/modules/lockscreen';
|
||||||
import { useUserStore } from '@/store/modules/user'
|
import { useUserStore } from '@/store/modules/user';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Lockscreen',
|
name: 'Lockscreen',
|
||||||
components: {
|
components: {
|
||||||
LockOutlined,
|
LockOutlined,
|
||||||
LoadingOutlined,
|
LoadingOutlined,
|
||||||
UnlockOutlined,
|
|
||||||
UserOutlined,
|
UserOutlined,
|
||||||
ArrowRightOutlined,
|
ArrowRightOutlined,
|
||||||
ApiOutlined,
|
ApiOutlined,
|
||||||
WifiOutlined,
|
WifiOutlined,
|
||||||
recharge,
|
recharge,
|
||||||
},
|
},
|
||||||
setup(props, { emit }) {
|
setup() {
|
||||||
const useLockscreen = useLockscreenStore()
|
const useLockscreen = useLockscreenStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
|
||||||
// 获取时间
|
// 获取时间
|
||||||
const { month, day, hour, minute, second, week } = useTime()
|
const { month, day, hour, minute, second, week } = useTime();
|
||||||
const { online } = useOnline()
|
const { online } = useOnline();
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter();
|
||||||
const route = useRoute()
|
const route = useRoute();
|
||||||
|
|
||||||
const { battery, batteryStatus, calcDischargingTime } = useBattery()
|
const { battery, batteryStatus, calcDischargingTime } = useBattery();
|
||||||
const { username } = userStore.getUserInfo || {}
|
const userInfo: object = userStore.getUserInfo || {};
|
||||||
|
const username = userInfo['username'] || '';
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
showLogin: false,
|
showLogin: false,
|
||||||
loginLoading: false, // 正在登录
|
loginLoading: false, // 正在登录
|
||||||
@@ -127,45 +124,45 @@ export default defineComponent({
|
|||||||
errorMsg: '密码错误',
|
errorMsg: '密码错误',
|
||||||
loginParams: {
|
loginParams: {
|
||||||
username: username || '',
|
username: username || '',
|
||||||
password: ''
|
password: '',
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
// 解锁登录
|
// 解锁登录
|
||||||
const onLockLogin = (value: boolean) => (state.showLogin = value)
|
const onLockLogin = (value: boolean) => (state.showLogin = value);
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
const onLogin = async () => {
|
const onLogin = async () => {
|
||||||
if (!state.loginParams.password.trim()) {
|
if (!state.loginParams.password.trim()) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
const params = {
|
const params = {
|
||||||
isLock: true,
|
isLock: true,
|
||||||
...state.loginParams
|
...state.loginParams,
|
||||||
}
|
};
|
||||||
state.loginLoading = true
|
state.loginLoading = true;
|
||||||
const { code, result, message } = await userStore.login(params)
|
const { code, message } = await userStore.login(params);
|
||||||
if (code === ResultEnum.SUCCESS) {
|
if (code === ResultEnum.SUCCESS) {
|
||||||
onLockLogin(false)
|
onLockLogin(false);
|
||||||
useLockscreen.setLock(false)
|
useLockscreen.setLock(false);
|
||||||
} else {
|
} else {
|
||||||
state.errorMsg = message
|
state.errorMsg = message;
|
||||||
state.isLoginError = true
|
state.isLoginError = true;
|
||||||
}
|
|
||||||
state.loginLoading = false
|
|
||||||
}
|
}
|
||||||
|
state.loginLoading = false;
|
||||||
|
};
|
||||||
|
|
||||||
//重新登录
|
//重新登录
|
||||||
const goLogin = () => {
|
const goLogin = () => {
|
||||||
onLockLogin(false)
|
onLockLogin(false);
|
||||||
useLockscreen.setLock(false)
|
useLockscreen.setLock(false);
|
||||||
router.replace({
|
router.replace({
|
||||||
path: '/login',
|
path: '/login',
|
||||||
query: {
|
query: {
|
||||||
redirect: route.fullPath
|
redirect: route.fullPath,
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
@@ -181,10 +178,10 @@ export default defineComponent({
|
|||||||
calcDischargingTime,
|
calcDischargingTime,
|
||||||
onLockLogin,
|
onLockLogin,
|
||||||
onLogin,
|
onLogin,
|
||||||
goLogin
|
goLogin,
|
||||||
}
|
};
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue'
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'HuaweiCharge',
|
name: 'HuaweiCharge',
|
||||||
@@ -29,20 +29,20 @@ export default defineComponent({
|
|||||||
battery: {
|
battery: {
|
||||||
// 电池对象
|
// 电池对象
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({})
|
default: () => ({}),
|
||||||
},
|
},
|
||||||
calcDischargingTime: {
|
calcDischargingTime: {
|
||||||
// 电池剩余时间可用时间
|
// 电池剩余时间可用时间
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: '',
|
||||||
},
|
},
|
||||||
batteryStatus: {
|
batteryStatus: {
|
||||||
// 电池状态
|
// 电池状态
|
||||||
type: String,
|
type: String,
|
||||||
validator: (val: string) => ['充电中', '已充满', '已断开电源'].includes(val)
|
validator: (val: string) => ['充电中', '已充满', '已断开电源'].includes(val),
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
@@ -147,7 +147,6 @@ each(range(15), {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@keyframes rotate {
|
@keyframes rotate {
|
||||||
50% {
|
50% {
|
||||||
border-radius: 45% / 42% 38% 58% 49%;
|
border-radius: 45% / 42% 38% 58% 49%;
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import LockScreen from './Lockscreen.vue'
|
import LockScreen from './Lockscreen.vue';
|
||||||
|
|
||||||
export { LockScreen }
|
export { LockScreen };
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import MessageContent from './index.vue'
|
import MessageContent from './index.vue';
|
||||||
|
|
||||||
export { MessageContent }
|
export { MessageContent };
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<template></template>
|
<template></template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { useMessage } from 'naive-ui'
|
import { useMessage } from 'naive-ui';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MessageContent',
|
name: 'MessageContent',
|
||||||
setup() {
|
setup() {
|
||||||
//挂载在 window 方便与在js中使用
|
//挂载在 window 方便与在js中使用
|
||||||
window.$message = useMessage()
|
window['$message'] = useMessage();
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
ProTable 重封装组件说明
|
|
||||||
====
|
|
||||||
|
|
||||||
封装说明
|
|
||||||
----
|
|
||||||
|
|
||||||
> 基础的使用方式与 API 与 [官方版(data-table)](https://www.naiveui.com/zh-CN/os-theme/components/data-table#tree) 本一致,在其基础上,封装了加载数据的方法。
|
|
||||||
>
|
|
||||||
> 你无需在你是用表格的页面进行分页逻辑处理,仅需向 ProTable 组件传递绑定 `:api="Promise"` 对象即可
|
|
||||||
>
|
|
||||||
> 例子1
|
|
||||||
----
|
|
||||||
(基础使用)
|
|
||||||
|
|
||||||
```vue
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<ProTable
|
|
||||||
title="表格列表"
|
|
||||||
:columns="columns"
|
|
||||||
:api="loadDataTable"
|
|
||||||
:row-key="row => row.id"
|
|
||||||
@update:checked-row-keys="onCheckedRow"
|
|
||||||
>
|
|
||||||
<template #toolbar>
|
|
||||||
<n-button type="primary">添加会员</n-button>
|
|
||||||
</template>
|
|
||||||
</ProTable>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent } from 'vue'
|
|
||||||
import { ProTable } from '@/components/ProTable'
|
|
||||||
import { getTableList } from '@/api/table/list'
|
|
||||||
const columns = [
|
|
||||||
{
|
|
||||||
title: 'id',
|
|
||||||
key: 'id'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '名称',
|
|
||||||
key: 'name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '地址',
|
|
||||||
key: 'address'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '日期',
|
|
||||||
key: 'date'
|
|
||||||
},
|
|
||||||
]
|
|
||||||
export default defineComponent({
|
|
||||||
components: { ProTable },
|
|
||||||
setup() {
|
|
||||||
const loadDataTable = async (params) => {
|
|
||||||
const data = await getTableList(params);
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
columns,
|
|
||||||
loadDataTable
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
API
|
|
||||||
----
|
|
||||||
ProTable 在 NaiveUi 的 data-table 上进行了一层封装,支持了一些预设,并且封装了一些行为。这里只列出与 data-table 不同的 api。
|
|
||||||
|
|
||||||
> request:Promise 参考上面例子写法
|
|
||||||
> ref:可绑定ref 调用组件内部方法(data-table本身的方法和参数)
|
|
||||||
|
|
||||||
Methods
|
|
||||||
----
|
|
||||||
> reload:actionRef.value.reload()
|
|
||||||
|
|
||||||
> 其余方法,请打印查看
|
|
||||||
|
|
||||||
Slots
|
|
||||||
----
|
|
||||||
> 名称:tableTitle | 表格顶部左侧区域
|
|
||||||
> 名称:toolbar | 表格顶部右侧区域
|
|
||||||
|
|
||||||
|
|
||||||
更新时间
|
|
||||||
----
|
|
||||||
|
|
||||||
该文档最后更新于: 2021-07-12 PM 10:13
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export { default as ProTable } from './src/ProTable.vue';
|
|
||||||
@@ -1,296 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="table-toolbar">
|
|
||||||
|
|
||||||
<!--顶部左侧区域-->
|
|
||||||
<n-space align="center" class="table-toolbar-left">
|
|
||||||
<div class="table-toolbar-left-title" v-if="title">
|
|
||||||
{{ title }}
|
|
||||||
<n-tooltip trigger="hover" v-if="titleTooltip">
|
|
||||||
<template #trigger>
|
|
||||||
<n-icon size="18" class="ml-1 cursor-pointer text-gray-400">
|
|
||||||
<QuestionCircleOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</template>
|
|
||||||
{{ titleTooltip }}
|
|
||||||
</n-tooltip>
|
|
||||||
</div>
|
|
||||||
<slot name="tableTitle"></slot>
|
|
||||||
</n-space>
|
|
||||||
|
|
||||||
<div class="flex items-center table-toolbar-right">
|
|
||||||
|
|
||||||
<!--顶部右侧区域-->
|
|
||||||
<slot name="toolbar"></slot>
|
|
||||||
|
|
||||||
<!--刷新-->
|
|
||||||
<n-tooltip trigger="hover">
|
|
||||||
<template #trigger>
|
|
||||||
<div class="table-toolbar-right-icon" @click="reload">
|
|
||||||
<n-icon size="18">
|
|
||||||
<ReloadOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<span>刷新</span>
|
|
||||||
</n-tooltip>
|
|
||||||
|
|
||||||
<!--密度-->
|
|
||||||
<n-tooltip trigger="hover">
|
|
||||||
<template #trigger>
|
|
||||||
<div class="table-toolbar-right-icon">
|
|
||||||
<n-dropdown @select="densitySelect" trigger="click" :options="densityOptions" v-model:value="tableSize">
|
|
||||||
<n-icon size="18">
|
|
||||||
<ColumnHeightOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</n-dropdown>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<span>密度</span>
|
|
||||||
</n-tooltip>
|
|
||||||
|
|
||||||
<!--表格设置单独抽离成组件-->
|
|
||||||
<ColumnSetting></ColumnSetting>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="s-table">
|
|
||||||
<n-data-table
|
|
||||||
v-bind="getBindValues"
|
|
||||||
:pagination="pagination"
|
|
||||||
@update:page="updatePage"
|
|
||||||
@update:page-size="updatePageSize"
|
|
||||||
>
|
|
||||||
<template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
|
|
||||||
<slot :name="item" v-bind="data"></slot>
|
|
||||||
</template>
|
|
||||||
</n-data-table>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { NDataTable } from 'naive-ui'
|
|
||||||
import { ref, defineComponent, reactive, unref, onMounted, toRaw, onBeforeMount, computed, toRefs, watch } from "vue"
|
|
||||||
import { ReloadOutlined, ColumnHeightOutlined, SettingOutlined, DragOutlined, QuestionCircleOutlined } from '@vicons/antd'
|
|
||||||
import { createTableContext } from './hooks/useTableContext';
|
|
||||||
|
|
||||||
import ColumnSetting from './components/settings/ColumnSetting.vue'
|
|
||||||
|
|
||||||
import { useLoading } from './hooks/useLoading';
|
|
||||||
import { useColumns } from './hooks/useColumns';
|
|
||||||
import { useDataSource } from './hooks/useDataSource';
|
|
||||||
import { usePagination } from './hooks/usePagination';
|
|
||||||
|
|
||||||
import { basicProps } from './props'
|
|
||||||
|
|
||||||
import { BasicTableProps } from './types/table'
|
|
||||||
|
|
||||||
|
|
||||||
const densityOptions = [
|
|
||||||
{
|
|
||||||
type: "menu",
|
|
||||||
label: '紧凑',
|
|
||||||
key: 'small',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "menu",
|
|
||||||
label: '默认',
|
|
||||||
key: "medium"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "menu",
|
|
||||||
label: '宽松',
|
|
||||||
key: 'large'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
components: {
|
|
||||||
ReloadOutlined, ColumnHeightOutlined, SettingOutlined, DragOutlined, ColumnSetting, QuestionCircleOutlined
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
...NDataTable.props, // 这里继承原 UI 组件的 props
|
|
||||||
...basicProps
|
|
||||||
},
|
|
||||||
emits: [
|
|
||||||
'fetch-success',
|
|
||||||
'fetch-error',
|
|
||||||
'update:checked-row-keys'
|
|
||||||
],
|
|
||||||
setup(props, { emit }) {
|
|
||||||
|
|
||||||
const wrapRef = ref<Nullable<HTMLDivElement>>(null);
|
|
||||||
|
|
||||||
const tableData = ref<Recordable[]>([]);
|
|
||||||
const innerPropsRef = ref<Partial<BasicTableProps>>();
|
|
||||||
|
|
||||||
const getProps = computed(() => {
|
|
||||||
return { ...props, ...unref(innerPropsRef) } as BasicTableProps;
|
|
||||||
});
|
|
||||||
|
|
||||||
const { getLoading, setLoading } = useLoading(getProps);
|
|
||||||
|
|
||||||
const {
|
|
||||||
getPaginationInfo,
|
|
||||||
getPagination,
|
|
||||||
setPagination,
|
|
||||||
setShowPagination,
|
|
||||||
getShowPagination,
|
|
||||||
} = usePagination(getProps)
|
|
||||||
|
|
||||||
const { getDataSourceRef, getRowKey, getDataSource, setDataSource, reload } = useDataSource(
|
|
||||||
getProps, {
|
|
||||||
getPaginationInfo,
|
|
||||||
setPagination,
|
|
||||||
tableData,
|
|
||||||
setLoading
|
|
||||||
}, emit
|
|
||||||
)
|
|
||||||
|
|
||||||
const {
|
|
||||||
getPageColumns,
|
|
||||||
setColumns,
|
|
||||||
getColumns,
|
|
||||||
getCacheColumns,
|
|
||||||
setCacheColumnsField,
|
|
||||||
getColumnsRef
|
|
||||||
} = useColumns(getProps)
|
|
||||||
|
|
||||||
const state = reactive({
|
|
||||||
tableSize: 'medium',
|
|
||||||
isColumnSetting: false
|
|
||||||
})
|
|
||||||
|
|
||||||
//页码切换
|
|
||||||
function updatePage(page) {
|
|
||||||
setPagination({ page: page, });
|
|
||||||
reload()
|
|
||||||
}
|
|
||||||
|
|
||||||
//分页数量切换
|
|
||||||
function updatePageSize(size) {
|
|
||||||
setPagination({ page: 1, pageSize: size, });
|
|
||||||
reload()
|
|
||||||
}
|
|
||||||
|
|
||||||
//密度切换
|
|
||||||
function densitySelect(e) {
|
|
||||||
state.tableSize = e
|
|
||||||
}
|
|
||||||
|
|
||||||
//选中行
|
|
||||||
function updateCheckedRowKeys(rowKeys) {
|
|
||||||
emit('update:checked-row-keys', rowKeys)
|
|
||||||
}
|
|
||||||
|
|
||||||
//重置 Columns
|
|
||||||
const resetColumns = () => {
|
|
||||||
columns.map(item => {
|
|
||||||
item.isShow = true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取表格大小
|
|
||||||
const getTableSize = computed(() => state.tableSize)
|
|
||||||
|
|
||||||
//组装表格信息
|
|
||||||
const getBindValues = computed(() => {
|
|
||||||
const tableData = unref(getDataSourceRef);
|
|
||||||
let propsData = {
|
|
||||||
...unref(getProps),
|
|
||||||
loading: unref(getLoading),
|
|
||||||
columns: toRaw(unref(getPageColumns)),
|
|
||||||
rowKey: unref(getRowKey),
|
|
||||||
data: tableData,
|
|
||||||
size: unref(getTableSize),
|
|
||||||
remote: true
|
|
||||||
}
|
|
||||||
return propsData
|
|
||||||
})
|
|
||||||
|
|
||||||
//获取分页信息
|
|
||||||
const pagination = computed(() => toRaw(unref(getPaginationInfo)))
|
|
||||||
|
|
||||||
function setProps(props: Partial<BasicTableProps>) {
|
|
||||||
innerPropsRef.value = { ...unref(innerPropsRef), ...props };
|
|
||||||
}
|
|
||||||
|
|
||||||
const tableAction: TableActionType = {
|
|
||||||
reload,
|
|
||||||
setColumns,
|
|
||||||
setLoading,
|
|
||||||
setProps,
|
|
||||||
getColumns,
|
|
||||||
getPageColumns,
|
|
||||||
getCacheColumns,
|
|
||||||
setCacheColumnsField,
|
|
||||||
emit,
|
|
||||||
getSize: () => {
|
|
||||||
return unref(getBindValues).size as SizeType;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
createTableContext({ ...tableAction, wrapRef, getBindValues });
|
|
||||||
|
|
||||||
return {
|
|
||||||
...toRefs(state),
|
|
||||||
getBindValues,
|
|
||||||
densityOptions,
|
|
||||||
reload,
|
|
||||||
densitySelect,
|
|
||||||
updatePage,
|
|
||||||
updatePageSize,
|
|
||||||
updateCheckedRowKeys,
|
|
||||||
pagination,
|
|
||||||
resetColumns,
|
|
||||||
tableAction
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style lang='less' scoped>
|
|
||||||
.table-toolbar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 0 0 16px 0;
|
|
||||||
|
|
||||||
&-left {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
flex: 1;
|
|
||||||
|
|
||||||
&-title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: rgba(0, 0, 0, .85);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-right {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
flex: 1;
|
|
||||||
|
|
||||||
&-icon {
|
|
||||||
height: 18px;
|
|
||||||
margin-left: 12px;
|
|
||||||
font-size: 16px;
|
|
||||||
color: rgba(0, 0, 0, .75);
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
:hover {
|
|
||||||
color: #1890ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-toolbar-inner-popover-title {
|
|
||||||
padding: 2px 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
<template>
|
|
||||||
<n-tooltip trigger="hover">
|
|
||||||
<template #trigger>
|
|
||||||
<div class="cursor-pointer table-toolbar-right-icon">
|
|
||||||
<n-popover trigger="click" :width="230" class="toolbar-popover" placement="bottom-end">
|
|
||||||
<template #trigger>
|
|
||||||
<n-icon size="18">
|
|
||||||
<SettingOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</template>
|
|
||||||
<template #header>
|
|
||||||
<div class="table-toolbar-inner-popover-title">
|
|
||||||
<n-space>
|
|
||||||
<n-checkbox v-model:checked="checkAll" @update:checked="onCheckAll">列展示</n-checkbox>
|
|
||||||
<n-checkbox v-model:checked="selection" @update:checked="onSelection">勾选列</n-checkbox>
|
|
||||||
<n-button text type="info" size="small" class="mt-1" @click="resetColumns">重置</n-button>
|
|
||||||
</n-space>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<div class="table-toolbar-inner">
|
|
||||||
<Draggable v-model="columnsList" animation="300" item-key="key" @end="draggableEnd">
|
|
||||||
<template #item="{element, index}">
|
|
||||||
<div class="table-toolbar-inner-checkbox">
|
|
||||||
<span class="drag-icon">
|
|
||||||
<n-icon size="18">
|
|
||||||
<DragOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</span>
|
|
||||||
<n-checkbox-group v-model:value="checkList" @update:value="onChange">
|
|
||||||
<n-checkbox :value="element.key" :label="element.title"/>
|
|
||||||
</n-checkbox-group>
|
|
||||||
<div class="fixed-item">
|
|
||||||
<n-tooltip trigger="hover" placement="bottom">
|
|
||||||
<template #trigger>
|
|
||||||
<n-icon size="18" :color="element.fixed === 'left' ? '#2080f0':undefined"
|
|
||||||
class="transform -rotate-90 cursor-pointer" @click="fixedColumn(index,'left')">
|
|
||||||
<VerticalAlignTopOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</template>
|
|
||||||
<span>固定到左侧</span>
|
|
||||||
</n-tooltip>
|
|
||||||
<n-divider vertical/>
|
|
||||||
<n-tooltip trigger="hover" placement="bottom">
|
|
||||||
<template #trigger>
|
|
||||||
<n-icon size="18" :color="element.fixed === 'right' ? '#2080f0':undefined"
|
|
||||||
class="transform rotate-90 cursor-pointer" @click="fixedColumn(index,'right')">
|
|
||||||
<VerticalAlignTopOutlined/>
|
|
||||||
</n-icon>
|
|
||||||
</template>
|
|
||||||
<span>固定到右侧</span>
|
|
||||||
</n-tooltip>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</Draggable>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</n-popover>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<span>列设置</span>
|
|
||||||
</n-tooltip>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { ref, defineComponent, reactive, unref, toRaw, computed, toRefs, watchEffect } from "vue"
|
|
||||||
import { useTableContext } from '../../hooks/useTableContext';
|
|
||||||
import { ReloadOutlined, ColumnHeightOutlined, SettingOutlined, DragOutlined, VerticalAlignTopOutlined } from '@vicons/antd'
|
|
||||||
import Draggable from 'vuedraggable/src/vuedraggable'
|
|
||||||
|
|
||||||
interface Options {
|
|
||||||
title: string;
|
|
||||||
key: string;
|
|
||||||
fixed?: boolean | 'left' | 'right';
|
|
||||||
}
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
name: 'ColumnSetting',
|
|
||||||
components: {
|
|
||||||
ReloadOutlined, ColumnHeightOutlined, SettingOutlined, DragOutlined, Draggable,
|
|
||||||
VerticalAlignTopOutlined
|
|
||||||
},
|
|
||||||
setup(props, { emit }) {
|
|
||||||
const table = useTableContext();
|
|
||||||
const columnsList = ref<Options[]>([]);
|
|
||||||
const state = reactive({
|
|
||||||
selection: false,
|
|
||||||
checkAll: true,
|
|
||||||
checkList: [],
|
|
||||||
defaultCheckList: []
|
|
||||||
})
|
|
||||||
|
|
||||||
const getSelection = computed(() => {
|
|
||||||
return state.selection
|
|
||||||
})
|
|
||||||
|
|
||||||
watchEffect(() => {
|
|
||||||
const columns = table.getColumns();
|
|
||||||
if (columns.length) {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//初始化
|
|
||||||
function init() {
|
|
||||||
const columns = getColumns();
|
|
||||||
const checkList = columns.map(item => item.key)
|
|
||||||
state.checkList = checkList
|
|
||||||
state.defaultCheckList = checkList
|
|
||||||
columnsList.value = columns
|
|
||||||
}
|
|
||||||
|
|
||||||
//切换
|
|
||||||
function onChange(checkList) {
|
|
||||||
if (state.selection) {
|
|
||||||
checkList.unshift('selection')
|
|
||||||
}
|
|
||||||
setColumns(checkList)
|
|
||||||
}
|
|
||||||
|
|
||||||
//设置
|
|
||||||
function setColumns(columns) {
|
|
||||||
table.setColumns(columns)
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取
|
|
||||||
function getColumns() {
|
|
||||||
const newArr = []
|
|
||||||
table.getColumns().forEach(item => {
|
|
||||||
newArr.push({ ...item })
|
|
||||||
})
|
|
||||||
return newArr
|
|
||||||
}
|
|
||||||
|
|
||||||
//重置
|
|
||||||
function resetColumns() {
|
|
||||||
state.checkList = [...state.defaultCheckList]
|
|
||||||
state.checkAll = true;
|
|
||||||
setColumns(table.getCacheColumns(true));
|
|
||||||
}
|
|
||||||
|
|
||||||
//全选
|
|
||||||
function onCheckAll(e) {
|
|
||||||
let checkList = table.getCacheColumns(true)
|
|
||||||
if (e) {
|
|
||||||
setColumns(checkList);
|
|
||||||
state.checkList = checkList
|
|
||||||
} else {
|
|
||||||
setColumns([]);
|
|
||||||
state.checkList = []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//拖拽排序
|
|
||||||
function draggableEnd(e) {
|
|
||||||
const newColumns = toRaw(unref(columnsList))
|
|
||||||
setColumns(newColumns);
|
|
||||||
}
|
|
||||||
|
|
||||||
//勾选列
|
|
||||||
function onSelection(e) {
|
|
||||||
let checkList = table.getCacheColumns()
|
|
||||||
if (e) {
|
|
||||||
checkList.unshift({ type: 'selection', key: 'selection' })
|
|
||||||
setColumns(checkList);
|
|
||||||
} else {
|
|
||||||
checkList.splice(0, 1)
|
|
||||||
setColumns(checkList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//固定
|
|
||||||
function fixedColumn(index, fixed) {
|
|
||||||
let columnList = getColumns();
|
|
||||||
let columnInfo = columnList[index]
|
|
||||||
const isFixed = columnInfo.fixed === fixed ? undefined : fixed
|
|
||||||
columnInfo.fixed = isFixed
|
|
||||||
columnsList.value = columnList
|
|
||||||
table.setCacheColumnsField(columnInfo.key, { fixed: isFixed })
|
|
||||||
setColumns(columnList);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
...toRefs(state),
|
|
||||||
columnsList,
|
|
||||||
onChange,
|
|
||||||
onCheckAll,
|
|
||||||
onSelection,
|
|
||||||
resetColumns,
|
|
||||||
fixedColumn,
|
|
||||||
draggableEnd,
|
|
||||||
getSelection
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less">
|
|
||||||
.table-toolbar {
|
|
||||||
&-right {
|
|
||||||
&-icon {
|
|
||||||
height: 18px;
|
|
||||||
margin-left: 12px;
|
|
||||||
font-size: 16px;
|
|
||||||
color: rgba(0, 0, 0, .75);
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
:hover {
|
|
||||||
color: #1890ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-toolbar-inner {
|
|
||||||
&-checkbox {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #e6f7ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drag-icon {
|
|
||||||
display: inline-flex;
|
|
||||||
margin-right: 8px;
|
|
||||||
cursor: move;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fixed-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-end;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ant-checkbox-wrapper {
|
|
||||||
flex: 1;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #1890ff !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
import { ref, Ref, ComputedRef, unref, computed, watch, toRaw } from 'vue';
|
|
||||||
import type { BasicColumn, BasicTableProps } from '../types/table';
|
|
||||||
import { isEqual, cloneDeep } from 'lodash-es';
|
|
||||||
import { isArray, isString } from '@/utils/is';
|
|
||||||
|
|
||||||
export function useColumns(propsRef: ComputedRef<BasicTableProps>) {
|
|
||||||
const columnsRef = ref(unref(propsRef).columns) as unknown as Ref<BasicColumn[]>;
|
|
||||||
let cacheColumns = unref(propsRef).columns;
|
|
||||||
|
|
||||||
const getColumnsRef = computed(() => {
|
|
||||||
const columns = cloneDeep(unref(columnsRef));
|
|
||||||
return columns;
|
|
||||||
})
|
|
||||||
|
|
||||||
const getPageColumns = computed(() => {
|
|
||||||
const pageColumns = unref(getColumnsRef);
|
|
||||||
const columns = cloneDeep(pageColumns);
|
|
||||||
return columns
|
|
||||||
})
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => unref(propsRef).columns,
|
|
||||||
(columns) => {
|
|
||||||
columnsRef.value = columns;
|
|
||||||
cacheColumns = columns?.filter((item) => !item.flag) ?? [];
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
//设置
|
|
||||||
function setColumns(columnList: string[]) {
|
|
||||||
const columns: any[] = cloneDeep(columnList);
|
|
||||||
if (!isArray(columns)) return;
|
|
||||||
|
|
||||||
if (!columns.length) {
|
|
||||||
columnsRef.value = [];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const cacheKeys = cacheColumns.map((item) => item.key);
|
|
||||||
|
|
||||||
//针对拖拽排序
|
|
||||||
if (!isString(columns[0])) {
|
|
||||||
columnsRef.value = columns;
|
|
||||||
} else {
|
|
||||||
const newColumns: any[] = []
|
|
||||||
cacheColumns.forEach(item => {
|
|
||||||
if (columnList.includes(item.key)) {
|
|
||||||
newColumns.push({ ...item })
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!isEqual(cacheKeys, columns)) {
|
|
||||||
newColumns.sort((prev, next) => {
|
|
||||||
return (
|
|
||||||
cacheKeys.indexOf(prev.key) - cacheKeys.indexOf(next.key)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
columnsRef.value = newColumns
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取
|
|
||||||
function getColumns() {
|
|
||||||
const columns = toRaw(unref(propsRef).columns);
|
|
||||||
return columns.map(item => {
|
|
||||||
return { title: item.title, key: item.key, fixed: item.fixed || undefined }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取原始
|
|
||||||
function getCacheColumns(isKey?: boolean): any[] {
|
|
||||||
return isKey ? cacheColumns.map(item => item.key) : cacheColumns;
|
|
||||||
}
|
|
||||||
|
|
||||||
//更新原始数据单个字段
|
|
||||||
function setCacheColumnsField(dataIndex: string | undefined, value: Partial<BasicColumn>) {
|
|
||||||
if (!dataIndex || !value) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cacheColumns.forEach((item) => {
|
|
||||||
if (item.key === dataIndex) {
|
|
||||||
Object.assign(item, value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
getColumnsRef,
|
|
||||||
getCacheColumns,
|
|
||||||
setCacheColumnsField,
|
|
||||||
setColumns,
|
|
||||||
getColumns,
|
|
||||||
getPageColumns
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import Pagination from 'naive-ui/lib/pagination';
|
|
||||||
import { VNodeChild } from 'vue';
|
|
||||||
|
|
||||||
export interface PaginationProps {
|
|
||||||
page?: number;
|
|
||||||
pageCount?: number,
|
|
||||||
pageSize?: number,
|
|
||||||
pageSizes?: number[],
|
|
||||||
showSizePicker?: boolean,
|
|
||||||
showQuickJumper?: boolean,
|
|
||||||
}
|
|
||||||
4
src/components/Table/index.ts
Normal file
4
src/components/Table/index.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export { default as BasicTable } from './src/Table.vue';
|
||||||
|
export { default as TableAction } from './src/components/TableAction.vue';
|
||||||
|
export * from './src/types/table';
|
||||||
|
export * from './src/types/tableAction';
|
||||||
342
src/components/Table/src/Table.vue
Normal file
342
src/components/Table/src/Table.vue
Normal file
@@ -0,0 +1,342 @@
|
|||||||
|
<template>
|
||||||
|
<div class="table-toolbar">
|
||||||
|
<!--顶部左侧区域-->
|
||||||
|
<div class="flex items-center table-toolbar-left">
|
||||||
|
<template v-if="title">
|
||||||
|
<div class="table-toolbar-left-title">
|
||||||
|
{{ title }}
|
||||||
|
<n-tooltip trigger="hover" v-if="titleTooltip">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon size="18" class="ml-1 cursor-pointer text-gray-400">
|
||||||
|
<QuestionCircleOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
{{ titleTooltip }}
|
||||||
|
</n-tooltip>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<slot name="tableTitle"></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center table-toolbar-right">
|
||||||
|
<!--顶部右侧区域-->
|
||||||
|
<slot name="toolbar"></slot>
|
||||||
|
|
||||||
|
<!--刷新-->
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<div class="table-toolbar-right-icon" @click="reload">
|
||||||
|
<n-icon size="18">
|
||||||
|
<ReloadOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<span>刷新</span>
|
||||||
|
</n-tooltip>
|
||||||
|
|
||||||
|
<!--密度-->
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<div class="table-toolbar-right-icon">
|
||||||
|
<n-dropdown
|
||||||
|
@select="densitySelect"
|
||||||
|
trigger="click"
|
||||||
|
:options="densityOptions"
|
||||||
|
v-model:value="tableSize"
|
||||||
|
>
|
||||||
|
<n-icon size="18">
|
||||||
|
<ColumnHeightOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</n-dropdown>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<span>密度</span>
|
||||||
|
</n-tooltip>
|
||||||
|
|
||||||
|
<!--表格设置单独抽离成组件-->
|
||||||
|
<ColumnSetting />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="s-table">
|
||||||
|
<n-data-table
|
||||||
|
ref="tableElRef"
|
||||||
|
v-bind="getBindValues"
|
||||||
|
:pagination="pagination"
|
||||||
|
@update:page="updatePage"
|
||||||
|
@update:page-size="updatePageSize"
|
||||||
|
>
|
||||||
|
<template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
|
||||||
|
<slot :name="item" v-bind="data"></slot>
|
||||||
|
</template>
|
||||||
|
</n-data-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { NDataTable } from 'naive-ui';
|
||||||
|
import {
|
||||||
|
ref,
|
||||||
|
defineComponent,
|
||||||
|
reactive,
|
||||||
|
unref,
|
||||||
|
toRaw,
|
||||||
|
computed,
|
||||||
|
toRefs,
|
||||||
|
onMounted,
|
||||||
|
nextTick,
|
||||||
|
} from 'vue';
|
||||||
|
import { ReloadOutlined, ColumnHeightOutlined, QuestionCircleOutlined } from '@vicons/antd';
|
||||||
|
import { createTableContext } from './hooks/useTableContext';
|
||||||
|
|
||||||
|
import ColumnSetting from './components/settings/ColumnSetting.vue';
|
||||||
|
|
||||||
|
import { useLoading } from './hooks/useLoading';
|
||||||
|
import { useColumns } from './hooks/useColumns';
|
||||||
|
import { useDataSource } from './hooks/useDataSource';
|
||||||
|
import { usePagination } from './hooks/usePagination';
|
||||||
|
|
||||||
|
import { basicProps } from './props';
|
||||||
|
|
||||||
|
import { BasicTableProps } from './types/table';
|
||||||
|
|
||||||
|
import { getViewportOffset } from '@/utils/domUtils';
|
||||||
|
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn';
|
||||||
|
import { isBoolean } from '@/utils/is';
|
||||||
|
|
||||||
|
const densityOptions = [
|
||||||
|
{
|
||||||
|
type: 'menu',
|
||||||
|
label: '紧凑',
|
||||||
|
key: 'small',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'menu',
|
||||||
|
label: '默认',
|
||||||
|
key: 'medium',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'menu',
|
||||||
|
label: '宽松',
|
||||||
|
key: 'large',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
ReloadOutlined,
|
||||||
|
ColumnHeightOutlined,
|
||||||
|
ColumnSetting,
|
||||||
|
QuestionCircleOutlined,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
...NDataTable.props, // 这里继承原 UI 组件的 props
|
||||||
|
...basicProps,
|
||||||
|
},
|
||||||
|
emits: [
|
||||||
|
'fetch-success',
|
||||||
|
'fetch-error',
|
||||||
|
'update:checked-row-keys',
|
||||||
|
'edit-end',
|
||||||
|
'edit-cancel',
|
||||||
|
'edit-row-end',
|
||||||
|
'edit-change',
|
||||||
|
],
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const deviceHeight = ref(150);
|
||||||
|
const tableElRef = ref<ComponentRef>(null);
|
||||||
|
const wrapRef = ref<Nullable<HTMLDivElement>>(null);
|
||||||
|
let paginationEl: HTMLElement | null;
|
||||||
|
|
||||||
|
const tableData = ref<Recordable[]>([]);
|
||||||
|
const innerPropsRef = ref<Partial<BasicTableProps>>();
|
||||||
|
|
||||||
|
const getProps = computed(() => {
|
||||||
|
return { ...props, ...unref(innerPropsRef) } as BasicTableProps;
|
||||||
|
});
|
||||||
|
|
||||||
|
const { getLoading, setLoading } = useLoading(getProps);
|
||||||
|
|
||||||
|
const { getPaginationInfo, setPagination } = usePagination(getProps);
|
||||||
|
|
||||||
|
const { getDataSourceRef, getRowKey, reload } = useDataSource(
|
||||||
|
getProps,
|
||||||
|
{
|
||||||
|
getPaginationInfo,
|
||||||
|
setPagination,
|
||||||
|
tableData,
|
||||||
|
setLoading,
|
||||||
|
},
|
||||||
|
emit
|
||||||
|
);
|
||||||
|
|
||||||
|
const { getPageColumns, setColumns, getColumns, getCacheColumns, setCacheColumnsField } =
|
||||||
|
useColumns(getProps);
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
tableSize: 'medium',
|
||||||
|
isColumnSetting: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
//页码切换
|
||||||
|
function updatePage(page) {
|
||||||
|
setPagination({ page: page });
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
//分页数量切换
|
||||||
|
function updatePageSize(size) {
|
||||||
|
setPagination({ page: 1, pageSize: size });
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
//密度切换
|
||||||
|
function densitySelect(e) {
|
||||||
|
state.tableSize = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
//选中行
|
||||||
|
function updateCheckedRowKeys(rowKeys) {
|
||||||
|
emit('update:checked-row-keys', rowKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取表格大小
|
||||||
|
const getTableSize = computed(() => state.tableSize);
|
||||||
|
|
||||||
|
//组装表格信息
|
||||||
|
const getBindValues = computed(() => {
|
||||||
|
const tableData = unref(getDataSourceRef);
|
||||||
|
const maxHeight = tableData.length ? `${unref(deviceHeight)}px` : 'auto';
|
||||||
|
return {
|
||||||
|
...unref(getProps),
|
||||||
|
loading: unref(getLoading),
|
||||||
|
columns: toRaw(unref(getPageColumns)),
|
||||||
|
rowKey: unref(getRowKey),
|
||||||
|
data: tableData,
|
||||||
|
size: unref(getTableSize),
|
||||||
|
remote: true,
|
||||||
|
'max-height': maxHeight,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
//获取分页信息
|
||||||
|
const pagination = computed(() => toRaw(unref(getPaginationInfo)));
|
||||||
|
|
||||||
|
function setProps(props: Partial<BasicTableProps>) {
|
||||||
|
innerPropsRef.value = { ...unref(innerPropsRef), ...props };
|
||||||
|
}
|
||||||
|
|
||||||
|
const tableAction = {
|
||||||
|
reload,
|
||||||
|
setColumns,
|
||||||
|
setLoading,
|
||||||
|
setProps,
|
||||||
|
getColumns,
|
||||||
|
getPageColumns,
|
||||||
|
getCacheColumns,
|
||||||
|
setCacheColumnsField,
|
||||||
|
emit,
|
||||||
|
getSize: () => {
|
||||||
|
return unref(getBindValues).size;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const getCanResize = computed(() => {
|
||||||
|
const { canResize } = unref(getProps);
|
||||||
|
return canResize;
|
||||||
|
});
|
||||||
|
|
||||||
|
async function computeTableHeight() {
|
||||||
|
const table = unref(tableElRef);
|
||||||
|
if (!table) return;
|
||||||
|
if (!unref(getCanResize)) return;
|
||||||
|
const tableEl: any = table?.$el;
|
||||||
|
const headEl = tableEl.querySelector('.n-data-table-thead ');
|
||||||
|
const { bottomIncludeBody } = getViewportOffset(headEl);
|
||||||
|
const headerH = 64;
|
||||||
|
let paginationH = 2;
|
||||||
|
let marginH = 24;
|
||||||
|
if (!isBoolean(pagination)) {
|
||||||
|
paginationEl = tableEl.querySelector('.n-data-table__pagination') as HTMLElement;
|
||||||
|
if (paginationEl) {
|
||||||
|
const offsetHeight = paginationEl.offsetHeight;
|
||||||
|
paginationH += offsetHeight || 0;
|
||||||
|
} else {
|
||||||
|
paginationH += 28;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let height =
|
||||||
|
bottomIncludeBody - (headerH + paginationH + marginH + (props.resizeHeightOffset || 0));
|
||||||
|
const maxHeight = props.maxHeight;
|
||||||
|
height = maxHeight && maxHeight < height ? maxHeight : height;
|
||||||
|
deviceHeight.value = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
useWindowSizeFn(computeTableHeight, 280);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
computeTableHeight();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
createTableContext({ ...tableAction, wrapRef, getBindValues });
|
||||||
|
|
||||||
|
return {
|
||||||
|
...toRefs(state),
|
||||||
|
tableElRef,
|
||||||
|
getBindValues,
|
||||||
|
densityOptions,
|
||||||
|
reload,
|
||||||
|
densitySelect,
|
||||||
|
updatePage,
|
||||||
|
updatePageSize,
|
||||||
|
updateCheckedRowKeys,
|
||||||
|
pagination,
|
||||||
|
tableAction,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.table-toolbar {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0 0 16px 0;
|
||||||
|
|
||||||
|
&-left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
&-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-right {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
&-icon {
|
||||||
|
margin-left: 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: var(--text-color);
|
||||||
|
|
||||||
|
:hover {
|
||||||
|
color: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-toolbar-inner-popover-title {
|
||||||
|
padding: 2px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
41
src/components/Table/src/componentMap.ts
Normal file
41
src/components/Table/src/componentMap.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import type { Component } from 'vue';
|
||||||
|
import {
|
||||||
|
NInput,
|
||||||
|
NSelect,
|
||||||
|
NCheckbox,
|
||||||
|
NInputNumber,
|
||||||
|
NSwitch,
|
||||||
|
NDatePicker,
|
||||||
|
NTimePicker,
|
||||||
|
} from 'naive-ui';
|
||||||
|
import type { ComponentType } from './types/componentType';
|
||||||
|
|
||||||
|
export enum EventEnum {
|
||||||
|
NInput = 'on-input',
|
||||||
|
NInputNumber = 'on-input',
|
||||||
|
NSelect = 'on-update:value',
|
||||||
|
NSwitch = 'on-update:value',
|
||||||
|
NCheckbox = 'on-update:value',
|
||||||
|
NDatePicker = 'on-update:value',
|
||||||
|
NTimePicker = 'on-update:value',
|
||||||
|
}
|
||||||
|
|
||||||
|
const componentMap = new Map<ComponentType, Component>();
|
||||||
|
|
||||||
|
componentMap.set('NInput', NInput);
|
||||||
|
componentMap.set('NInputNumber', NInputNumber);
|
||||||
|
componentMap.set('NSelect', NSelect);
|
||||||
|
componentMap.set('NSwitch', NSwitch);
|
||||||
|
componentMap.set('NCheckbox', NCheckbox);
|
||||||
|
componentMap.set('NDatePicker', NDatePicker);
|
||||||
|
componentMap.set('NTimePicker', NTimePicker);
|
||||||
|
|
||||||
|
export function add(compName: ComponentType, component: Component) {
|
||||||
|
componentMap.set(compName, component);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function del(compName: ComponentType) {
|
||||||
|
componentMap.delete(compName);
|
||||||
|
}
|
||||||
|
|
||||||
|
export { componentMap };
|
||||||
136
src/components/Table/src/components/TableAction.vue
Normal file
136
src/components/Table/src/components/TableAction.vue
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
<template>
|
||||||
|
<div class="tableAction">
|
||||||
|
<div class="flex items-center justify-center">
|
||||||
|
<template v-for="(action, index) in getActions" :key="`${index}-${action.label}`">
|
||||||
|
<n-button v-bind="action" class="mx-2">{{ action.label }}</n-button>
|
||||||
|
</template>
|
||||||
|
<n-dropdown
|
||||||
|
v-if="dropDownActions && getDropdownList.length"
|
||||||
|
trigger="hover"
|
||||||
|
:options="getDropdownList"
|
||||||
|
@select="select"
|
||||||
|
>
|
||||||
|
<slot name="more"></slot>
|
||||||
|
<n-button v-bind="getMoreProps" class="mx-2" v-if="!$slots.more" icon-placement="right">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<span>更多</span>
|
||||||
|
<n-icon size="14" class="ml-1">
|
||||||
|
<DownOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</div>
|
||||||
|
<!-- <template #icon>-->
|
||||||
|
<!-- -->
|
||||||
|
<!-- </template>-->
|
||||||
|
</n-button>
|
||||||
|
</n-dropdown>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, PropType, computed, toRaw } from 'vue';
|
||||||
|
import { ActionItem } from '@/components/Table';
|
||||||
|
import { usePermission } from '@/hooks/web/usePermission';
|
||||||
|
import { isBoolean, isFunction } from '@/utils/is';
|
||||||
|
import { DownOutlined } from '@vicons/antd';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'TableAction',
|
||||||
|
components: { DownOutlined },
|
||||||
|
props: {
|
||||||
|
actions: {
|
||||||
|
type: Array as PropType<ActionItem[]>,
|
||||||
|
default: null,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
dropDownActions: {
|
||||||
|
type: Array as PropType<ActionItem[]>,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
type: String as PropType<String>,
|
||||||
|
default: 'button',
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
type: Function as PropType<Function>,
|
||||||
|
default: () => {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const { hasPermission } = usePermission();
|
||||||
|
|
||||||
|
const actionType =
|
||||||
|
props.style === 'button' ? 'default' : props.style === 'text' ? 'primary' : 'default';
|
||||||
|
const actionText =
|
||||||
|
props.style === 'button' ? undefined : props.style === 'text' ? true : undefined;
|
||||||
|
|
||||||
|
const getMoreProps = computed(() => {
|
||||||
|
return {
|
||||||
|
text: actionText,
|
||||||
|
type: actionType,
|
||||||
|
size: 'small',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const getDropdownList = computed(() => {
|
||||||
|
return (toRaw(props.dropDownActions) || [])
|
||||||
|
.filter((action) => {
|
||||||
|
return hasPermission(action.auth) && isIfShow(action);
|
||||||
|
})
|
||||||
|
.map((action) => {
|
||||||
|
const { popConfirm } = action;
|
||||||
|
return {
|
||||||
|
size: 'small',
|
||||||
|
text: actionText,
|
||||||
|
type: actionType,
|
||||||
|
...action,
|
||||||
|
...popConfirm,
|
||||||
|
onConfirm: popConfirm?.confirm,
|
||||||
|
onCancel: popConfirm?.cancel,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function isIfShow(action: ActionItem): boolean {
|
||||||
|
const ifShow = action.ifShow;
|
||||||
|
|
||||||
|
let isIfShow = true;
|
||||||
|
|
||||||
|
if (isBoolean(ifShow)) {
|
||||||
|
isIfShow = ifShow;
|
||||||
|
}
|
||||||
|
if (isFunction(ifShow)) {
|
||||||
|
isIfShow = ifShow(action);
|
||||||
|
}
|
||||||
|
return isIfShow;
|
||||||
|
}
|
||||||
|
|
||||||
|
const getActions = computed(() => {
|
||||||
|
return (toRaw(props.actions) || [])
|
||||||
|
.filter((action) => {
|
||||||
|
return hasPermission(action.auth) && isIfShow(action);
|
||||||
|
})
|
||||||
|
.map((action) => {
|
||||||
|
const { popConfirm } = action;
|
||||||
|
//需要展示什么风格,自己修改一下参数
|
||||||
|
return {
|
||||||
|
size: 'small',
|
||||||
|
text: actionText,
|
||||||
|
type: actionType,
|
||||||
|
...action,
|
||||||
|
...(popConfirm || {}),
|
||||||
|
onConfirm: popConfirm?.confirm,
|
||||||
|
onCancel: popConfirm?.cancel,
|
||||||
|
enable: !!popConfirm,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
getActions,
|
||||||
|
getDropdownList,
|
||||||
|
getMoreProps,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import type { FunctionalComponent, defineComponent } from 'vue';
|
||||||
|
import type { ComponentType } from '../../types/componentType';
|
||||||
|
import { componentMap } from '@/components/Table/src/componentMap';
|
||||||
|
|
||||||
|
import { h } from 'vue';
|
||||||
|
|
||||||
|
import { NPopover } from 'naive-ui';
|
||||||
|
|
||||||
|
export interface ComponentProps {
|
||||||
|
component: ComponentType;
|
||||||
|
rule: boolean;
|
||||||
|
popoverVisible: boolean;
|
||||||
|
ruleMessage: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const CellComponent: FunctionalComponent = (
|
||||||
|
{ component = 'NInput', rule = true, ruleMessage, popoverVisible }: ComponentProps,
|
||||||
|
{ attrs }
|
||||||
|
) => {
|
||||||
|
const Comp = componentMap.get(component) as typeof defineComponent;
|
||||||
|
|
||||||
|
const DefaultComp = h(Comp, attrs);
|
||||||
|
if (!rule) {
|
||||||
|
return DefaultComp;
|
||||||
|
}
|
||||||
|
return h(
|
||||||
|
NPopover,
|
||||||
|
{ 'display-directive': 'show', show: !!popoverVisible, manual: 'manual' },
|
||||||
|
{
|
||||||
|
trigger: () => DefaultComp,
|
||||||
|
default: () =>
|
||||||
|
h(
|
||||||
|
'span',
|
||||||
|
{
|
||||||
|
style: {
|
||||||
|
color: 'red',
|
||||||
|
width: '90px',
|
||||||
|
display: 'inline-block',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
default: () => ruleMessage,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
402
src/components/Table/src/components/editable/EditableCell.vue
Normal file
402
src/components/Table/src/components/editable/EditableCell.vue
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
<template>
|
||||||
|
<div class="editable-cell">
|
||||||
|
<div v-show="!isEdit" class="editable-cell-content" @click="handleEdit">
|
||||||
|
{{ getValues }}
|
||||||
|
<n-icon class="edit-icon" v-if="!column.editRow">
|
||||||
|
<FormOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</div>
|
||||||
|
<div class="flex editable-cell-content" v-show="isEdit" v-click-outside="onClickOutside">
|
||||||
|
<CellComponent
|
||||||
|
v-bind="getComponentProps"
|
||||||
|
:component="getComponent"
|
||||||
|
:style="getWrapperStyle"
|
||||||
|
:popoverVisible="getRuleVisible"
|
||||||
|
:ruleMessage="ruleMessage"
|
||||||
|
:rule="getRule"
|
||||||
|
:class="getWrapperClass"
|
||||||
|
ref="elRef"
|
||||||
|
@options-change="handleOptionsChange"
|
||||||
|
@pressEnter="handleEnter"
|
||||||
|
/>
|
||||||
|
<div class="editable-cell-action" v-if="!getRowEditable">
|
||||||
|
<n-icon class="cursor-pointer mx-2">
|
||||||
|
<CheckOutlined @click="handleSubmit" />
|
||||||
|
</n-icon>
|
||||||
|
<n-icon class="cursor-pointer mx-2">
|
||||||
|
<CloseOutlined @click="handleCancel" />
|
||||||
|
</n-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts">
|
||||||
|
import type { CSSProperties, PropType } from 'vue';
|
||||||
|
import type { BasicColumn } from '../../types/table';
|
||||||
|
import type { EditRecordRow } from './index';
|
||||||
|
|
||||||
|
import { defineComponent, ref, unref, nextTick, computed, watchEffect, toRaw } from 'vue';
|
||||||
|
import { FormOutlined, CloseOutlined, CheckOutlined } from '@vicons/antd';
|
||||||
|
import { CellComponent } from './CellComponent';
|
||||||
|
|
||||||
|
import { useTableContext } from '../../hooks/useTableContext';
|
||||||
|
|
||||||
|
import clickOutside from '@/directives/clickOutside';
|
||||||
|
|
||||||
|
import { propTypes } from '@/utils/propTypes';
|
||||||
|
import { isString, isBoolean, isFunction, isNumber, isArray } from '@/utils/is';
|
||||||
|
import { createPlaceholderMessage } from './helper';
|
||||||
|
import { set, omit } from 'lodash-es';
|
||||||
|
import { EventEnum } from '@/components/Table/src/componentMap';
|
||||||
|
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'EditableCell',
|
||||||
|
components: { FormOutlined, CloseOutlined, CheckOutlined, CellComponent },
|
||||||
|
directives: {
|
||||||
|
clickOutside,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: [String, Number, Boolean, Object] as PropType<string | number | boolean | Recordable>,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
record: {
|
||||||
|
type: Object as PropType<EditRecordRow>,
|
||||||
|
},
|
||||||
|
column: {
|
||||||
|
type: Object as PropType<BasicColumn>,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
|
index: propTypes.number,
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const table = useTableContext();
|
||||||
|
const isEdit = ref(false);
|
||||||
|
const elRef = ref();
|
||||||
|
const ruleVisible = ref(false);
|
||||||
|
const ruleMessage = ref('');
|
||||||
|
const optionsRef = ref<LabelValueOptions>([]);
|
||||||
|
const currentValueRef = ref<any>(props.value);
|
||||||
|
const defaultValueRef = ref<any>(props.value);
|
||||||
|
|
||||||
|
// const { prefixCls } = useDesign('editable-cell');
|
||||||
|
|
||||||
|
const getComponent = computed(() => props.column?.editComponent || 'NInput');
|
||||||
|
const getRule = computed(() => props.column?.editRule);
|
||||||
|
|
||||||
|
const getRuleVisible = computed(() => {
|
||||||
|
return unref(ruleMessage) && unref(ruleVisible);
|
||||||
|
});
|
||||||
|
|
||||||
|
const getIsCheckComp = computed(() => {
|
||||||
|
const component = unref(getComponent);
|
||||||
|
return ['NCheckbox', 'NSwitch'].includes(component);
|
||||||
|
});
|
||||||
|
|
||||||
|
const getComponentProps = computed(() => {
|
||||||
|
const compProps = props.column?.editComponentProps ?? {};
|
||||||
|
const editComponent = props.column?.editComponent ?? null;
|
||||||
|
const component = unref(getComponent);
|
||||||
|
const apiSelectProps: Recordable = {};
|
||||||
|
|
||||||
|
const isCheckValue = unref(getIsCheckComp);
|
||||||
|
|
||||||
|
const valueField = isCheckValue ? 'checked' : 'value';
|
||||||
|
const val = unref(currentValueRef);
|
||||||
|
|
||||||
|
let value = isCheckValue ? (isNumber(val) && isBoolean(val) ? val : !!val) : val;
|
||||||
|
|
||||||
|
if (component === 'NDatePicker') {
|
||||||
|
value = dayjs(value).valueOf();
|
||||||
|
}
|
||||||
|
|
||||||
|
const onEvent: any = editComponent ? EventEnum[editComponent] : undefined;
|
||||||
|
|
||||||
|
return {
|
||||||
|
placeholder: createPlaceholderMessage(unref(getComponent)),
|
||||||
|
...apiSelectProps,
|
||||||
|
...omit(compProps, 'onChange'),
|
||||||
|
[onEvent]: handleChange,
|
||||||
|
[valueField]: value,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const getValues = computed(() => {
|
||||||
|
const { editComponentProps, editValueMap } = props.column;
|
||||||
|
|
||||||
|
const value = unref(currentValueRef);
|
||||||
|
|
||||||
|
if (editValueMap && isFunction(editValueMap)) {
|
||||||
|
return editValueMap(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const component = unref(getComponent);
|
||||||
|
if (!component.includes('NSelect')) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
const options: LabelValueOptions = editComponentProps?.options ?? (unref(optionsRef) || []);
|
||||||
|
const option = options.find((item) => `${item.value}` === `${value}`);
|
||||||
|
|
||||||
|
return option?.label ?? value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const getWrapperStyle = computed((): CSSProperties => {
|
||||||
|
// if (unref(getIsCheckComp) || unref(getRowEditable)) {
|
||||||
|
// return {};
|
||||||
|
// }
|
||||||
|
return {
|
||||||
|
width: 'calc(100% - 48px)',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const getWrapperClass = computed(() => {
|
||||||
|
const { align = 'center' } = props.column;
|
||||||
|
return `edit-cell-align-${align}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
const getRowEditable = computed(() => {
|
||||||
|
const { editable } = props.record || {};
|
||||||
|
return !!editable;
|
||||||
|
});
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
defaultValueRef.value = props.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
const { editable } = props.column;
|
||||||
|
if (isBoolean(editable) || isBoolean(unref(getRowEditable))) {
|
||||||
|
isEdit.value = !!editable || unref(getRowEditable);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleEdit() {
|
||||||
|
if (unref(getRowEditable) || unref(props.column?.editRow)) return;
|
||||||
|
ruleMessage.value = '';
|
||||||
|
isEdit.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
const el = unref(elRef);
|
||||||
|
el?.focus?.();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleChange(e: any) {
|
||||||
|
const component = unref(getComponent);
|
||||||
|
if (!e) {
|
||||||
|
currentValueRef.value = e;
|
||||||
|
} else if (e?.target && Reflect.has(e.target, 'value')) {
|
||||||
|
currentValueRef.value = (e as ChangeEvent).target.value;
|
||||||
|
} else if (component === 'NCheckbox') {
|
||||||
|
currentValueRef.value = (e as ChangeEvent).target.checked;
|
||||||
|
} else if (isString(e) || isBoolean(e) || isNumber(e)) {
|
||||||
|
currentValueRef.value = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO 这里组件参数格式,和dayjs格式不一致
|
||||||
|
if (component === 'NDatePicker') {
|
||||||
|
let format = (props.column.editComponentProps?.format)
|
||||||
|
.replace(/yyyy/g, 'YYYY')
|
||||||
|
.replace(/dd/g, 'DD');
|
||||||
|
currentValueRef.value = dayjs(currentValueRef.value).format(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onChange = props.column?.editComponentProps?.onChange;
|
||||||
|
if (onChange && isFunction(onChange)) onChange(...arguments);
|
||||||
|
|
||||||
|
table.emit?.('edit-change', {
|
||||||
|
column: props.column,
|
||||||
|
value: unref(currentValueRef),
|
||||||
|
record: toRaw(props.record),
|
||||||
|
});
|
||||||
|
await handleSubmiRule();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleSubmiRule() {
|
||||||
|
const { column, record } = props;
|
||||||
|
const { editRule } = column;
|
||||||
|
const currentValue = unref(currentValueRef);
|
||||||
|
|
||||||
|
if (editRule) {
|
||||||
|
if (isBoolean(editRule) && !currentValue && !isNumber(currentValue)) {
|
||||||
|
ruleVisible.value = true;
|
||||||
|
const component = unref(getComponent);
|
||||||
|
ruleMessage.value = createPlaceholderMessage(component);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isFunction(editRule)) {
|
||||||
|
const res = await editRule(currentValue, record as Recordable);
|
||||||
|
if (!!res) {
|
||||||
|
ruleMessage.value = res;
|
||||||
|
ruleVisible.value = true;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
ruleMessage.value = '';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ruleMessage.value = '';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleSubmit(needEmit = true, valid = true) {
|
||||||
|
if (valid) {
|
||||||
|
const isPass = await handleSubmiRule();
|
||||||
|
if (!isPass) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { column, index, record } = props;
|
||||||
|
if (!record) return false;
|
||||||
|
const { key } = column;
|
||||||
|
const value = unref(currentValueRef);
|
||||||
|
if (!key) return;
|
||||||
|
|
||||||
|
const dataKey = key as string;
|
||||||
|
|
||||||
|
set(record, dataKey, value);
|
||||||
|
//const record = await table.updateTableData(index, dataKey, value);
|
||||||
|
needEmit && table.emit?.('edit-end', { record, index, key, value });
|
||||||
|
isEdit.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleEnter() {
|
||||||
|
if (props.column?.editRow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await handleSubmit();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleCancel() {
|
||||||
|
isEdit.value = false;
|
||||||
|
currentValueRef.value = defaultValueRef.value;
|
||||||
|
const { column, index, record } = props;
|
||||||
|
const { key } = column;
|
||||||
|
ruleVisible.value = true;
|
||||||
|
ruleMessage.value = '';
|
||||||
|
table.emit?.('edit-cancel', {
|
||||||
|
record,
|
||||||
|
index,
|
||||||
|
key: key,
|
||||||
|
value: unref(currentValueRef),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function onClickOutside() {
|
||||||
|
if (props.column?.editable || unref(getRowEditable)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const component = unref(getComponent);
|
||||||
|
|
||||||
|
if (component.includes('NInput')) {
|
||||||
|
handleCancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only ApiSelect
|
||||||
|
function handleOptionsChange(options: LabelValueOptions) {
|
||||||
|
optionsRef.value = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initCbs(cbs: 'submitCbs' | 'validCbs' | 'cancelCbs', handle: Fn) {
|
||||||
|
if (props.record) {
|
||||||
|
/* eslint-disable */
|
||||||
|
isArray(props.record[cbs])
|
||||||
|
? props.record[cbs]?.push(handle)
|
||||||
|
: (props.record[cbs] = [handle]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.record) {
|
||||||
|
initCbs('submitCbs', handleSubmit);
|
||||||
|
initCbs('validCbs', handleSubmiRule);
|
||||||
|
initCbs('cancelCbs', handleCancel);
|
||||||
|
|
||||||
|
if (props.column.key) {
|
||||||
|
if (!props.record.editValueRefs) props.record.editValueRefs = {};
|
||||||
|
props.record.editValueRefs[props.column.key] = currentValueRef;
|
||||||
|
}
|
||||||
|
/* eslint-disable */
|
||||||
|
props.record.onCancelEdit = () => {
|
||||||
|
isArray(props.record?.cancelCbs) && props.record?.cancelCbs.forEach((fn) => fn());
|
||||||
|
};
|
||||||
|
/* eslint-disable */
|
||||||
|
props.record.onSubmitEdit = async() => {
|
||||||
|
if (isArray(props.record?.submitCbs)) {
|
||||||
|
const validFns = (props.record?.validCbs || []).map((fn) => fn());
|
||||||
|
|
||||||
|
const res = await Promise.all(validFns);
|
||||||
|
|
||||||
|
const pass = res.every((item) => !!item);
|
||||||
|
|
||||||
|
if (!pass) return;
|
||||||
|
const submitFns = props.record?.submitCbs || [];
|
||||||
|
submitFns.forEach((fn) => fn(false, false));
|
||||||
|
table.emit?.('edit-row-end');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isEdit,
|
||||||
|
handleEdit,
|
||||||
|
currentValueRef,
|
||||||
|
handleSubmit,
|
||||||
|
handleChange,
|
||||||
|
handleCancel,
|
||||||
|
elRef,
|
||||||
|
getComponent,
|
||||||
|
getRule,
|
||||||
|
onClickOutside,
|
||||||
|
ruleMessage,
|
||||||
|
getRuleVisible,
|
||||||
|
getComponentProps,
|
||||||
|
handleOptionsChange,
|
||||||
|
getWrapperStyle,
|
||||||
|
getWrapperClass,
|
||||||
|
getRowEditable,
|
||||||
|
getValues,
|
||||||
|
handleEnter,
|
||||||
|
// getSize,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.editable-cell {
|
||||||
|
&-content {
|
||||||
|
position: relative;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
word-break: break-word;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
.edit-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
//position: absolute;
|
||||||
|
//top: 4px;
|
||||||
|
//right: 0;
|
||||||
|
display: none;
|
||||||
|
width: 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.edit-icon {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-action {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
15
src/components/Table/src/components/editable/helper.ts
Normal file
15
src/components/Table/src/components/editable/helper.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { ComponentType } from '../../types/componentType';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description: 生成placeholder
|
||||||
|
*/
|
||||||
|
export function createPlaceholderMessage(component: ComponentType) {
|
||||||
|
if (component === 'NInput') return '请输入';
|
||||||
|
if (
|
||||||
|
['NPicker', 'NSelect', 'NCheckbox', 'NRadio', 'NSwitch', 'NDatePicker', 'NTimePicker'].includes(
|
||||||
|
component
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return '请选择';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
49
src/components/Table/src/components/editable/index.ts
Normal file
49
src/components/Table/src/components/editable/index.ts
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import type { BasicColumn } from '@/components/Table/src/types/table';
|
||||||
|
import { h, Ref } from 'vue';
|
||||||
|
|
||||||
|
import EditableCell from './EditableCell.vue';
|
||||||
|
|
||||||
|
export function renderEditCell(column: BasicColumn) {
|
||||||
|
return (record, index) => {
|
||||||
|
const _key = column.key;
|
||||||
|
const value = record[_key];
|
||||||
|
record.onEdit = async (edit: boolean, submit = false) => {
|
||||||
|
if (!submit) {
|
||||||
|
record.editable = edit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!edit && submit) {
|
||||||
|
const res = await record.onSubmitEdit?.();
|
||||||
|
if (res) {
|
||||||
|
record.editable = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// cancel
|
||||||
|
if (!edit && !submit) {
|
||||||
|
record.onCancelEdit?.();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
return h(EditableCell, {
|
||||||
|
value,
|
||||||
|
record,
|
||||||
|
column,
|
||||||
|
index,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export type EditRecordRow<T = Recordable> = Partial<
|
||||||
|
{
|
||||||
|
onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>;
|
||||||
|
editable: boolean;
|
||||||
|
onCancel: Fn;
|
||||||
|
onSubmit: Fn;
|
||||||
|
submitCbs: Fn[];
|
||||||
|
cancelCbs: Fn[];
|
||||||
|
validCbs: Fn[];
|
||||||
|
editValueRefs: Recordable<Ref>;
|
||||||
|
} & T
|
||||||
|
>;
|
||||||
304
src/components/Table/src/components/settings/ColumnSetting.vue
Normal file
304
src/components/Table/src/components/settings/ColumnSetting.vue
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
<template>
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<div class="cursor-pointer table-toolbar-right-icon">
|
||||||
|
<n-popover trigger="click" :width="230" class="toolbar-popover" placement="bottom-end">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon size="18">
|
||||||
|
<SettingOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<template #header>
|
||||||
|
<div class="table-toolbar-inner-popover-title">
|
||||||
|
<n-space>
|
||||||
|
<n-checkbox v-model:checked="checkAll" @update:checked="onCheckAll"
|
||||||
|
>列展示</n-checkbox
|
||||||
|
>
|
||||||
|
<n-checkbox v-model:checked="selection" @update:checked="onSelection"
|
||||||
|
>勾选列</n-checkbox
|
||||||
|
>
|
||||||
|
<n-button text type="info" size="small" class="mt-1" @click="resetColumns"
|
||||||
|
>重置</n-button
|
||||||
|
>
|
||||||
|
</n-space>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="table-toolbar-inner">
|
||||||
|
<n-checkbox-group v-model:value="checkList" @update:value="onChange">
|
||||||
|
<Draggable v-model="columnsList" animation="300" item-key="key" @end="draggableEnd">
|
||||||
|
<template #item="{ element }">
|
||||||
|
<div
|
||||||
|
class="table-toolbar-inner-checkbox"
|
||||||
|
:class="{ 'table-toolbar-inner-checkbox-dark': getDarkTheme === true }"
|
||||||
|
>
|
||||||
|
<span class="drag-icon">
|
||||||
|
<n-icon size="18">
|
||||||
|
<DragOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</span>
|
||||||
|
<n-checkbox :value="element.key" :label="element.title" />
|
||||||
|
<div class="fixed-item">
|
||||||
|
<n-tooltip trigger="hover" placement="bottom">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon
|
||||||
|
size="18"
|
||||||
|
:color="element.fixed === 'left' ? '#2080f0' : undefined"
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="fixedColumn(element, 'left')"
|
||||||
|
>
|
||||||
|
<VerticalRightOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<span>固定到左侧</span>
|
||||||
|
</n-tooltip>
|
||||||
|
<n-divider vertical />
|
||||||
|
<n-tooltip trigger="hover" placement="bottom">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon
|
||||||
|
size="18"
|
||||||
|
:color="element.fixed === 'right' ? '#2080f0' : undefined"
|
||||||
|
class="cursor-pointer"
|
||||||
|
@click="fixedColumn(element, 'right')"
|
||||||
|
>
|
||||||
|
<VerticalLeftOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<span>固定到右侧</span>
|
||||||
|
</n-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</Draggable>
|
||||||
|
</n-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</n-popover>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<span>列设置</span>
|
||||||
|
</n-tooltip>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { ref, defineComponent, reactive, unref, toRaw, computed, toRefs, watchEffect } from 'vue';
|
||||||
|
import { useTableContext } from '../../hooks/useTableContext';
|
||||||
|
import {
|
||||||
|
SettingOutlined,
|
||||||
|
DragOutlined,
|
||||||
|
VerticalRightOutlined,
|
||||||
|
VerticalLeftOutlined,
|
||||||
|
} from '@vicons/antd';
|
||||||
|
import Draggable from 'vuedraggable/src/vuedraggable';
|
||||||
|
import { useDesignSetting } from '@/hooks/setting/useDesignSetting';
|
||||||
|
|
||||||
|
interface Options {
|
||||||
|
title: string;
|
||||||
|
key: string;
|
||||||
|
fixed?: boolean | 'left' | 'right';
|
||||||
|
}
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'ColumnSetting',
|
||||||
|
components: {
|
||||||
|
SettingOutlined,
|
||||||
|
DragOutlined,
|
||||||
|
Draggable,
|
||||||
|
VerticalRightOutlined,
|
||||||
|
VerticalLeftOutlined,
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
const { getDarkTheme } = useDesignSetting();
|
||||||
|
const table = useTableContext();
|
||||||
|
const columnsList = ref<Options[]>([]);
|
||||||
|
const cacheColumnsList = ref<Options[]>([]);
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
selection: false,
|
||||||
|
checkAll: true,
|
||||||
|
checkList: [],
|
||||||
|
defaultCheckList: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
const getSelection = computed(() => {
|
||||||
|
return state.selection;
|
||||||
|
});
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
const columns = table.getColumns();
|
||||||
|
if (columns.length) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//初始化
|
||||||
|
function init() {
|
||||||
|
const columns: any[] = getColumns();
|
||||||
|
const checkList: any = columns.map((item) => item.key);
|
||||||
|
state.checkList = checkList;
|
||||||
|
state.defaultCheckList = checkList;
|
||||||
|
columnsList.value = columns;
|
||||||
|
cacheColumnsList.value = columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
//切换
|
||||||
|
function onChange(checkList) {
|
||||||
|
if (state.selection) {
|
||||||
|
checkList.unshift('selection');
|
||||||
|
}
|
||||||
|
setColumns(checkList);
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置
|
||||||
|
function setColumns(columns) {
|
||||||
|
table.setColumns(columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取
|
||||||
|
function getColumns() {
|
||||||
|
let newRet = [];
|
||||||
|
table.getColumns().forEach((item) => {
|
||||||
|
newRet.push({ ...item });
|
||||||
|
});
|
||||||
|
return newRet.filter((item) => item.key != 'action' && item.title != '操作');
|
||||||
|
}
|
||||||
|
|
||||||
|
//重置
|
||||||
|
function resetColumns() {
|
||||||
|
state.checkList = [...state.defaultCheckList];
|
||||||
|
state.checkAll = true;
|
||||||
|
let cacheColumnsKeys: any[] = table.getCacheColumns();
|
||||||
|
let newColumns = cacheColumnsKeys.map((item) => {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
fixed: undefined,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
setColumns(newColumns);
|
||||||
|
columnsList.value = newColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
//全选
|
||||||
|
function onCheckAll(e) {
|
||||||
|
let checkList = table.getCacheColumns(true);
|
||||||
|
if (e) {
|
||||||
|
setColumns(checkList);
|
||||||
|
state.checkList = checkList;
|
||||||
|
} else {
|
||||||
|
setColumns([]);
|
||||||
|
state.checkList = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//拖拽排序
|
||||||
|
function draggableEnd() {
|
||||||
|
const newColumns = toRaw(unref(columnsList));
|
||||||
|
columnsList.value = newColumns;
|
||||||
|
setColumns(newColumns);
|
||||||
|
}
|
||||||
|
|
||||||
|
//勾选列
|
||||||
|
function onSelection(e) {
|
||||||
|
let checkList = table.getCacheColumns();
|
||||||
|
if (e) {
|
||||||
|
checkList.unshift({ type: 'selection', key: 'selection' });
|
||||||
|
setColumns(checkList);
|
||||||
|
} else {
|
||||||
|
checkList.splice(0, 1);
|
||||||
|
setColumns(checkList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//固定
|
||||||
|
function fixedColumn(item, fixed) {
|
||||||
|
if (!state.checkList.includes(item.key)) return;
|
||||||
|
let columns = getColumns();
|
||||||
|
const isFixed = item.fixed === fixed ? undefined : fixed;
|
||||||
|
let index = columns.findIndex((res) => res.key === item.key);
|
||||||
|
if (index !== -1) {
|
||||||
|
columns[index].fixed = isFixed;
|
||||||
|
}
|
||||||
|
table.setCacheColumnsField(item.key, { fixed: isFixed });
|
||||||
|
columnsList.value[index].fixed = isFixed;
|
||||||
|
setColumns(columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...toRefs(state),
|
||||||
|
columnsList,
|
||||||
|
getDarkTheme,
|
||||||
|
onChange,
|
||||||
|
onCheckAll,
|
||||||
|
onSelection,
|
||||||
|
resetColumns,
|
||||||
|
fixedColumn,
|
||||||
|
draggableEnd,
|
||||||
|
getSelection,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.table-toolbar {
|
||||||
|
&-inner-popover-title {
|
||||||
|
padding: 3px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-right {
|
||||||
|
&-icon {
|
||||||
|
margin-left: 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--text-color);
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
:hover {
|
||||||
|
color: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-toolbar-inner {
|
||||||
|
&-checkbox {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 14px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #e6f7ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drag-icon {
|
||||||
|
display: inline-flex;
|
||||||
|
margin-right: 8px;
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixed-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-checkbox-wrapper {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #1890ff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-checkbox-dark {
|
||||||
|
&:hover {
|
||||||
|
background: hsla(0, 0%, 100%, 0.08);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-popover {
|
||||||
|
.n-popover__content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import componentSetting from '@/settings/componentSetting'
|
import componentSetting from '@/settings/componentSetting';
|
||||||
|
|
||||||
const { table } = componentSetting
|
const { table } = componentSetting;
|
||||||
|
|
||||||
const { apiSetting, defaultPageSize, pageSizes } = table;
|
const { apiSetting, defaultPageSize, pageSizes } = table;
|
||||||
|
|
||||||
@@ -9,7 +9,3 @@ export const DEFAULTPAGESIZE = defaultPageSize;
|
|||||||
export const APISETTING = apiSetting;
|
export const APISETTING = apiSetting;
|
||||||
|
|
||||||
export const PAGESIZES = pageSizes;
|
export const PAGESIZES = pageSizes;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
163
src/components/Table/src/hooks/useColumns.ts
Normal file
163
src/components/Table/src/hooks/useColumns.ts
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
import { ref, Ref, ComputedRef, unref, computed, watch, toRaw, h } from 'vue';
|
||||||
|
import type { BasicColumn, BasicTableProps } from '../types/table';
|
||||||
|
import { isEqual, cloneDeep } from 'lodash-es';
|
||||||
|
import { isArray, isString, isBoolean, isFunction } from '@/utils/is';
|
||||||
|
import { usePermission } from '@/hooks/web/usePermission';
|
||||||
|
import { ActionItem } from '@/components/Table';
|
||||||
|
import { renderEditCell } from '../components/editable';
|
||||||
|
import { NTooltip, NIcon } from 'naive-ui';
|
||||||
|
import { FormOutlined } from '@vicons/antd';
|
||||||
|
|
||||||
|
export function useColumns(propsRef: ComputedRef<BasicTableProps>) {
|
||||||
|
const columnsRef = ref(unref(propsRef).columns) as unknown as Ref<BasicColumn[]>;
|
||||||
|
let cacheColumns = unref(propsRef).columns;
|
||||||
|
|
||||||
|
const getColumnsRef = computed(() => {
|
||||||
|
const columns = cloneDeep(unref(columnsRef));
|
||||||
|
|
||||||
|
handleActionColumn(propsRef, columns);
|
||||||
|
if (!columns) return [];
|
||||||
|
return columns;
|
||||||
|
});
|
||||||
|
|
||||||
|
const { hasPermission } = usePermission();
|
||||||
|
|
||||||
|
function isIfShow(action: ActionItem): boolean {
|
||||||
|
const ifShow = action.ifShow;
|
||||||
|
|
||||||
|
let isIfShow = true;
|
||||||
|
|
||||||
|
if (isBoolean(ifShow)) {
|
||||||
|
isIfShow = ifShow;
|
||||||
|
}
|
||||||
|
if (isFunction(ifShow)) {
|
||||||
|
isIfShow = ifShow(action);
|
||||||
|
}
|
||||||
|
return isIfShow;
|
||||||
|
}
|
||||||
|
|
||||||
|
const renderTooltip = (trigger, content) => {
|
||||||
|
return h(NTooltip, null, {
|
||||||
|
trigger: () => trigger,
|
||||||
|
default: () => content,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const getPageColumns = computed(() => {
|
||||||
|
const pageColumns = unref(getColumnsRef);
|
||||||
|
const columns = cloneDeep(pageColumns);
|
||||||
|
return columns
|
||||||
|
.filter((column) => {
|
||||||
|
// @ts-ignore
|
||||||
|
return hasPermission(column.auth) && isIfShow(column);
|
||||||
|
})
|
||||||
|
.map((column) => {
|
||||||
|
const { edit, editRow } = column;
|
||||||
|
if (edit) {
|
||||||
|
column.render = renderEditCell(column);
|
||||||
|
if (edit) {
|
||||||
|
const title: any = column.title;
|
||||||
|
column.title = () => {
|
||||||
|
return renderTooltip(
|
||||||
|
h('span', {}, [
|
||||||
|
h('span', { style: { 'margin-right': '5px' } }, title),
|
||||||
|
h(
|
||||||
|
NIcon,
|
||||||
|
{
|
||||||
|
size: 14,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
default: () => h(FormOutlined),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
'该列可编辑'
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return column;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => unref(propsRef).columns,
|
||||||
|
(columns) => {
|
||||||
|
columnsRef.value = columns;
|
||||||
|
cacheColumns = columns;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
function handleActionColumn(propsRef: ComputedRef<BasicTableProps>, columns: BasicColumn[]) {
|
||||||
|
const { actionColumn } = unref(propsRef);
|
||||||
|
if (!actionColumn) return;
|
||||||
|
// @ts-ignore
|
||||||
|
columns.push({
|
||||||
|
...actionColumn,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置
|
||||||
|
function setColumns(columnList: string[]) {
|
||||||
|
const columns: any[] = cloneDeep(columnList);
|
||||||
|
if (!isArray(columns)) return;
|
||||||
|
|
||||||
|
if (!columns.length) {
|
||||||
|
columnsRef.value = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const cacheKeys = cacheColumns.map((item) => item.key);
|
||||||
|
//针对拖拽排序
|
||||||
|
if (!isString(columns[0])) {
|
||||||
|
columnsRef.value = columns;
|
||||||
|
} else {
|
||||||
|
const newColumns: any[] = [];
|
||||||
|
cacheColumns.forEach((item) => {
|
||||||
|
if (columnList.includes(item.key)) {
|
||||||
|
newColumns.push({ ...item });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!isEqual(cacheKeys, columns)) {
|
||||||
|
newColumns.sort((prev, next) => {
|
||||||
|
return cacheKeys.indexOf(prev.key) - cacheKeys.indexOf(next.key);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
columnsRef.value = newColumns;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取
|
||||||
|
function getColumns() {
|
||||||
|
const columns = toRaw(unref(getColumnsRef));
|
||||||
|
return columns.map((item) => {
|
||||||
|
return { ...item, title: item.title, key: item.key, fixed: item.fixed || undefined };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取原始
|
||||||
|
function getCacheColumns(isKey?: boolean): any[] {
|
||||||
|
return isKey ? cacheColumns.map((item) => item.key) : cacheColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新原始数据单个字段
|
||||||
|
function setCacheColumnsField(dataIndex: string | undefined, value: Partial<BasicColumn>) {
|
||||||
|
if (!dataIndex || !value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cacheColumns.forEach((item) => {
|
||||||
|
if (item.key === dataIndex) {
|
||||||
|
Object.assign(item, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
getColumnsRef,
|
||||||
|
getCacheColumns,
|
||||||
|
setCacheColumnsField,
|
||||||
|
setColumns,
|
||||||
|
getColumns,
|
||||||
|
getPageColumns,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,21 +1,15 @@
|
|||||||
import { ref, ComputedRef, unref, computed, onMounted, onBeforeMount, watchEffect, watch } from 'vue';
|
import { ref, ComputedRef, unref, computed, onMounted, watchEffect, watch } from 'vue';
|
||||||
import type { BasicTableProps } from '../types/table';
|
import type { BasicTableProps } from '../types/table';
|
||||||
import type { PaginationProps } from '../types/pagination';
|
import type { PaginationProps } from '../types/pagination';
|
||||||
import { isFunction, isBoolean } from '@/utils/is';
|
import { isBoolean } from '@/utils/is';
|
||||||
import { DEFAULTPAGESIZE, APISETTING, PAGESIZES } from '../const';
|
import { APISETTING } from '../const';
|
||||||
|
|
||||||
export function useDataSource(
|
export function useDataSource(
|
||||||
propsRef: ComputedRef<BasicTableProps>,
|
propsRef: ComputedRef<BasicTableProps>,
|
||||||
{
|
{ getPaginationInfo, setPagination, setLoading, tableData },
|
||||||
getPaginationInfo,
|
emit
|
||||||
setPagination,
|
|
||||||
setLoading,
|
|
||||||
tableData,
|
|
||||||
getSelection
|
|
||||||
},
|
|
||||||
emit: EmitType
|
|
||||||
) {
|
) {
|
||||||
const dataSourceRef = ref<Recordable[]>([]);
|
const dataSourceRef = ref([]);
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
tableData.value = unref(dataSourceRef);
|
tableData.value = unref(dataSourceRef);
|
||||||
@@ -33,9 +27,11 @@ export function useDataSource(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const getRowKey = computed(() => {
|
const getRowKey = computed(() => {
|
||||||
const { rowKey } = unref(propsRef);
|
const { rowKey }: any = unref(propsRef);
|
||||||
return rowKey ? rowKey : () => {
|
return rowKey
|
||||||
return 'key'
|
? rowKey
|
||||||
|
: () => {
|
||||||
|
return 'key';
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -44,25 +40,6 @@ export function useDataSource(
|
|||||||
if (!dataSource || dataSource.length === 0) {
|
if (!dataSource || dataSource.length === 0) {
|
||||||
return unref(dataSourceRef);
|
return unref(dataSourceRef);
|
||||||
}
|
}
|
||||||
// if (unref(getAutoCreateKey)) {
|
|
||||||
// const firstItem = dataSource[0];
|
|
||||||
// const lastItem = dataSource[dataSource.length - 1];
|
|
||||||
//
|
|
||||||
// if (firstItem && lastItem) {
|
|
||||||
// if (!firstItem[ROW_KEY] || !lastItem[ROW_KEY]) {
|
|
||||||
// const data = cloneDeep(unref(dataSourceRef));
|
|
||||||
// data.forEach((item) => {
|
|
||||||
// if (!item[ROW_KEY]) {
|
|
||||||
// item[ROW_KEY] = buildUUID();
|
|
||||||
// }
|
|
||||||
// if (item.children && item.children.length) {
|
|
||||||
// setTableKey(item.children);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// dataSourceRef.value = data;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return unref(dataSourceRef);
|
return unref(dataSourceRef);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -72,12 +49,12 @@ export function useDataSource(
|
|||||||
const { request, pagination }: any = unref(propsRef);
|
const { request, pagination }: any = unref(propsRef);
|
||||||
|
|
||||||
//组装分页信息
|
//组装分页信息
|
||||||
const pageField = APISETTING.pageField
|
const pageField = APISETTING.pageField;
|
||||||
const sizeField = APISETTING.sizeField
|
const sizeField = APISETTING.sizeField;
|
||||||
const totalField = APISETTING.totalField
|
const totalField = APISETTING.totalField;
|
||||||
const listField = APISETTING.listField
|
const listField = APISETTING.listField;
|
||||||
|
|
||||||
let pageParams: Recordable = {};
|
let pageParams = {};
|
||||||
const { page = 1, pageSize = 10 } = unref(getPaginationInfo) as PaginationProps;
|
const { page = 1, pageSize = 10 } = unref(getPaginationInfo) as PaginationProps;
|
||||||
|
|
||||||
if ((isBoolean(pagination) && !pagination) || isBoolean(getPaginationInfo)) {
|
if ((isBoolean(pagination) && !pagination) || isBoolean(getPaginationInfo)) {
|
||||||
@@ -87,15 +64,15 @@ export function useDataSource(
|
|||||||
pageParams[sizeField] = pageSize;
|
pageParams[sizeField] = pageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
let params = {
|
const params = {
|
||||||
...pageParams,
|
...pageParams,
|
||||||
}
|
};
|
||||||
const res = await request(params);
|
const res = await request(params);
|
||||||
|
|
||||||
const resultTotal = res[totalField] || 0
|
const resultTotal = res[totalField] || 0;
|
||||||
const currentPage = res[pageField]
|
const currentPage = res[pageField];
|
||||||
|
|
||||||
// 假如数据变少,导致总页数变少并小于当前选中页码,通过getPaginationRef获取到的页码是不正确的,需获取正确的页码再次执行
|
// 如果数据异常,需获取正确的页码再次执行
|
||||||
if (resultTotal) {
|
if (resultTotal) {
|
||||||
const currentTotalPage = Math.ceil(resultTotal / pageSize);
|
const currentTotalPage = Math.ceil(resultTotal / pageSize);
|
||||||
if (page > currentTotalPage) {
|
if (page > currentTotalPage) {
|
||||||
@@ -105,7 +82,7 @@ export function useDataSource(
|
|||||||
fetch(opt);
|
fetch(opt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let resultInfo = res[listField] ? res[listField] : []
|
const resultInfo = res[listField] ? res[listField] : [];
|
||||||
dataSourceRef.value = resultInfo;
|
dataSourceRef.value = resultInfo;
|
||||||
setPagination({
|
setPagination({
|
||||||
[pageField]: currentPage,
|
[pageField]: currentPage,
|
||||||
@@ -118,10 +95,10 @@ export function useDataSource(
|
|||||||
}
|
}
|
||||||
emit('fetch-success', {
|
emit('fetch-success', {
|
||||||
items: unref(resultInfo),
|
items: unref(resultInfo),
|
||||||
resultTotal
|
resultTotal,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error);
|
||||||
emit('fetch-error', error);
|
emit('fetch-error', error);
|
||||||
dataSourceRef.value = [];
|
dataSourceRef.value = [];
|
||||||
// setPagination({
|
// setPagination({
|
||||||
@@ -135,22 +112,18 @@ export function useDataSource(
|
|||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
fetch();
|
fetch();
|
||||||
}, 16)
|
}, 16);
|
||||||
});
|
});
|
||||||
|
|
||||||
// onBeforeMount(()=> {
|
function setTableData(values) {
|
||||||
// fetch()
|
|
||||||
// })
|
|
||||||
|
|
||||||
function setTableData<T = Recordable>(values: T[]) {
|
|
||||||
dataSourceRef.value = values;
|
dataSourceRef.value = values;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDataSource<T = Recordable>() {
|
function getDataSource(): any[] {
|
||||||
return getDataSourceRef.value as T[];
|
return getDataSourceRef.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function reload(opt?: FetchParams) {
|
async function reload(opt?) {
|
||||||
await fetch(opt);
|
await fetch(opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,6 +133,6 @@ export function useDataSource(
|
|||||||
getDataSourceRef,
|
getDataSourceRef,
|
||||||
getDataSource,
|
getDataSource,
|
||||||
setTableData,
|
setTableData,
|
||||||
reload
|
reload,
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { PropType } from 'vue'
|
import type { PropType } from 'vue';
|
||||||
import { BasicColumn } from './types/table'
|
import { propTypes } from '@/utils/propTypes';
|
||||||
|
import { BasicColumn } from './types/table';
|
||||||
|
|
||||||
export const basicProps = {
|
export const basicProps = {
|
||||||
title: {
|
title: {
|
||||||
@@ -16,31 +17,35 @@ export const basicProps = {
|
|||||||
},
|
},
|
||||||
tableData: {
|
tableData: {
|
||||||
type: [Object],
|
type: [Object],
|
||||||
default: () => {
|
default: () => [],
|
||||||
},
|
|
||||||
},
|
},
|
||||||
columns: {
|
columns: {
|
||||||
type: [Array] as PropType<BasicColumn[]>,
|
type: [Array] as PropType<BasicColumn[]>,
|
||||||
default: () => [],
|
default: () => [],
|
||||||
required: true,
|
required: true,
|
||||||
|
|
||||||
},
|
},
|
||||||
request: {
|
request: {
|
||||||
type: Function as PropType<(...arg: any[]) => Promise<any>>,
|
type: Function as PropType<(...arg: any[]) => Promise<any>>,
|
||||||
default: null,
|
default: null,
|
||||||
required: true
|
required: true,
|
||||||
},
|
},
|
||||||
rowKey: {
|
rowKey: {
|
||||||
type: [String, Function] as PropType<string | ((record: Recordable) => string)>,
|
type: [String, Function] as PropType<string | ((record) => string)>,
|
||||||
default: undefined,
|
default: undefined,
|
||||||
},
|
},
|
||||||
pagination: {
|
pagination: {
|
||||||
type: [Object, Boolean],
|
type: [Object, Boolean],
|
||||||
default: () => {
|
default: () => {},
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
//废弃
|
||||||
showPagination: {
|
showPagination: {
|
||||||
type: [String, Boolean],
|
type: [String, Boolean],
|
||||||
default: 'auto'
|
default: 'auto',
|
||||||
}
|
},
|
||||||
}
|
actionColumn: {
|
||||||
|
type: Object as PropType<BasicColumn>,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
canResize: propTypes.bool.def(true),
|
||||||
|
resizeHeightOffset: propTypes.number.def(0),
|
||||||
|
};
|
||||||
8
src/components/Table/src/types/componentType.ts
Normal file
8
src/components/Table/src/types/componentType.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export type ComponentType =
|
||||||
|
| 'NInput'
|
||||||
|
| 'NInputNumber'
|
||||||
|
| 'NSelect'
|
||||||
|
| 'NCheckbox'
|
||||||
|
| 'NSwitch'
|
||||||
|
| 'NDatePicker'
|
||||||
|
| 'NTimePicker';
|
||||||
8
src/components/Table/src/types/pagination.ts
Normal file
8
src/components/Table/src/types/pagination.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export interface PaginationProps {
|
||||||
|
page?: number;
|
||||||
|
pageCount?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
pageSizes?: number[];
|
||||||
|
showSizePicker?: boolean;
|
||||||
|
showQuickJumper?: boolean;
|
||||||
|
}
|
||||||
35
src/components/Table/src/types/table.ts
Normal file
35
src/components/Table/src/types/table.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import type { TableBaseColumn } from 'naive-ui/lib/data-table/src/interface';
|
||||||
|
import { ComponentType } from './componentType';
|
||||||
|
export interface BasicColumn extends TableBaseColumn {
|
||||||
|
//编辑表格
|
||||||
|
edit?: boolean;
|
||||||
|
editRow?: boolean;
|
||||||
|
editable?: boolean;
|
||||||
|
editComponent?: ComponentType;
|
||||||
|
editComponentProps?: Recordable;
|
||||||
|
editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
|
||||||
|
editValueMap?: (value: any) => string;
|
||||||
|
onEditRow?: () => void;
|
||||||
|
// 权限编码控制是否显示
|
||||||
|
auth?: RoleEnum | RoleEnum[] | string | string[];
|
||||||
|
// 业务控制是否显示
|
||||||
|
ifShow?: boolean | ((column: BasicColumn) => boolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TableActionType {
|
||||||
|
reload: (opt) => Promise<void>;
|
||||||
|
emit?: any;
|
||||||
|
getColumns: (opt?) => BasicColumn[];
|
||||||
|
setColumns: (columns: BasicColumn[] | string[]) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BasicTableProps {
|
||||||
|
title?: string;
|
||||||
|
dataSource: Function;
|
||||||
|
columns: any[];
|
||||||
|
pagination: object;
|
||||||
|
showPagination: boolean;
|
||||||
|
actionColumn: any[];
|
||||||
|
canResize: boolean;
|
||||||
|
resizeHeightOffset: number;
|
||||||
|
}
|
||||||
26
src/components/Table/src/types/tableAction.ts
Normal file
26
src/components/Table/src/types/tableAction.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// @ts-ignore
|
||||||
|
import { NButton } from 'naive-ui';
|
||||||
|
import { RoleEnum } from '@/enums/roleEnum';
|
||||||
|
// @ts-ignore
|
||||||
|
export interface ActionItem extends NButton.props {
|
||||||
|
onClick?: Fn;
|
||||||
|
label?: string;
|
||||||
|
color?: 'success' | 'error' | 'warning';
|
||||||
|
icon?: string;
|
||||||
|
popConfirm?: PopConfirm;
|
||||||
|
disabled?: boolean;
|
||||||
|
divider?: boolean;
|
||||||
|
// 权限编码控制是否显示
|
||||||
|
auth?: RoleEnum | RoleEnum[] | string | string[];
|
||||||
|
// 业务控制是否显示
|
||||||
|
ifShow?: boolean | ((action: ActionItem) => boolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PopConfirm {
|
||||||
|
title: string;
|
||||||
|
okText?: string;
|
||||||
|
cancelText?: string;
|
||||||
|
confirm: Fn;
|
||||||
|
cancel?: Fn;
|
||||||
|
icon?: string;
|
||||||
|
}
|
||||||
1
src/components/Upload/index.ts
Normal file
1
src/components/Upload/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { default as BasicUpload } from './src/BasicUpload.vue';
|
||||||
306
src/components/Upload/src/BasicUpload.vue
Normal file
306
src/components/Upload/src/BasicUpload.vue
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
<template>
|
||||||
|
<div class="w-full">
|
||||||
|
<div class="upload">
|
||||||
|
<div class="upload-card">
|
||||||
|
<!--图片列表-->
|
||||||
|
<div
|
||||||
|
class="upload-card-item"
|
||||||
|
:style="getCSSProperties"
|
||||||
|
v-for="(item, index) in imgList"
|
||||||
|
:key="`img_${index}`"
|
||||||
|
>
|
||||||
|
<div class="upload-card-item-info">
|
||||||
|
<div class="img-box">
|
||||||
|
<img :src="item" />
|
||||||
|
</div>
|
||||||
|
<div class="img-box-actions">
|
||||||
|
<n-icon size="18" class="action-icon mx-2" @click="preview(item)">
|
||||||
|
<EyeOutlined />
|
||||||
|
</n-icon>
|
||||||
|
<n-icon size="18" class="action-icon mx-2" @click="remove(index)">
|
||||||
|
<DeleteOutlined />
|
||||||
|
</n-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--上传图片-->
|
||||||
|
<div
|
||||||
|
class="upload-card-item upload-card-item-select-picture"
|
||||||
|
:style="getCSSProperties"
|
||||||
|
v-if="imgList.length < maxNumber"
|
||||||
|
>
|
||||||
|
<n-upload
|
||||||
|
v-bind="$props"
|
||||||
|
:file-list-style="{ display: 'none' }"
|
||||||
|
@before-upload="beforeUpload"
|
||||||
|
@finish="finish"
|
||||||
|
>
|
||||||
|
<div class="flex justify-center flex-col">
|
||||||
|
<n-icon size="18" class="m-auto">
|
||||||
|
<PlusOutlined />
|
||||||
|
</n-icon>
|
||||||
|
<span class="upload-title">上传图片</span>
|
||||||
|
</div>
|
||||||
|
</n-upload>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--上传图片-->
|
||||||
|
<n-space>
|
||||||
|
<n-alert title="提示" type="info" v-if="helpText" class="flex w-full">
|
||||||
|
{{ helpText }}
|
||||||
|
</n-alert>
|
||||||
|
</n-space>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--预览图片-->
|
||||||
|
<n-modal
|
||||||
|
v-model:show="showModal"
|
||||||
|
preset="card"
|
||||||
|
title="预览"
|
||||||
|
:bordered="false"
|
||||||
|
:style="{ width: '520px' }"
|
||||||
|
>
|
||||||
|
<img :src="previewUrl" />
|
||||||
|
</n-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, toRefs, reactive, computed } from 'vue';
|
||||||
|
import { EyeOutlined, DeleteOutlined, PlusOutlined } from '@vicons/antd';
|
||||||
|
import { NUpload } from 'naive-ui';
|
||||||
|
import { basicProps } from './props';
|
||||||
|
import { useMessage, useDialog } from 'naive-ui';
|
||||||
|
import { ResultEnum } from '@/enums/httpEnum';
|
||||||
|
import componentSetting from '@/settings/componentSetting';
|
||||||
|
import { useGlobSetting } from '@/hooks/setting';
|
||||||
|
import { isString } from '@/utils/is';
|
||||||
|
|
||||||
|
const globSetting = useGlobSetting();
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'BasicUpload',
|
||||||
|
|
||||||
|
components: { EyeOutlined, DeleteOutlined, PlusOutlined },
|
||||||
|
props: {
|
||||||
|
...NUpload.props, // 这里继承原 UI 组件的 props
|
||||||
|
...basicProps,
|
||||||
|
},
|
||||||
|
emits: ['uploadChange', 'delete'],
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const getCSSProperties = computed(() => {
|
||||||
|
return {
|
||||||
|
width: `${props.width}px`,
|
||||||
|
height: `${props.height}px`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const message = useMessage();
|
||||||
|
const dialog = useDialog();
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
showModal: false,
|
||||||
|
previewUrl: '',
|
||||||
|
originalImgList: [],
|
||||||
|
imgList: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
//赋值默认图片显示
|
||||||
|
if (props.value.length) {
|
||||||
|
state.imgList = props.value.map((item) => {
|
||||||
|
return getImgUrl(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//预览
|
||||||
|
function preview(url: string) {
|
||||||
|
state.showModal = true;
|
||||||
|
state.previewUrl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除
|
||||||
|
function remove(index: number) {
|
||||||
|
dialog.info({
|
||||||
|
title: '提示',
|
||||||
|
content: '你确定要删除吗?',
|
||||||
|
positiveText: '确定',
|
||||||
|
negativeText: '取消',
|
||||||
|
onPositiveClick: () => {
|
||||||
|
state.imgList.splice(index, 1);
|
||||||
|
state.originalImgList.splice(index, 1);
|
||||||
|
emit('uploadChange', state.originalImgList);
|
||||||
|
emit('delete', state.originalImgList);
|
||||||
|
},
|
||||||
|
onNegativeClick: () => {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//组装完整图片地址
|
||||||
|
function getImgUrl(url: string): string {
|
||||||
|
const { imgUrl } = globSetting;
|
||||||
|
return /(^http|https:\/\/)/g.test(url) ? url : `${imgUrl}${url}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkFileType(fileType: string) {
|
||||||
|
return componentSetting.upload.fileType.includes(fileType);
|
||||||
|
}
|
||||||
|
|
||||||
|
//上传之前
|
||||||
|
function beforeUpload({ file }) {
|
||||||
|
const fileInfo = file.file;
|
||||||
|
const { maxSize, accept } = props;
|
||||||
|
const acceptRef = (isString(accept) && accept.split(',')) || [];
|
||||||
|
|
||||||
|
// 设置最大值,则判断
|
||||||
|
if (maxSize && fileInfo.size / 1024 / 1024 >= maxSize) {
|
||||||
|
message.error(`上传文件最大值不能超过${maxSize}M`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置类型,则判断
|
||||||
|
const fileType = componentSetting.upload.fileType;
|
||||||
|
if (acceptRef.length > 0 && !checkFileType(fileInfo.type)) {
|
||||||
|
message.error(`只能上传文件类型为${fileType.join(',')}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//上传结束
|
||||||
|
function finish({ event: Event }) {
|
||||||
|
const res = eval('(' + Event.target.response + ')');
|
||||||
|
const infoField = componentSetting.upload.apiSetting.infoField;
|
||||||
|
const { code } = res;
|
||||||
|
const message = res.msg || res.message || '上传失败';
|
||||||
|
const result = res[infoField];
|
||||||
|
//成功
|
||||||
|
if (code === ResultEnum.SUCCESS) {
|
||||||
|
let imgUrl = getImgUrl(result.photo);
|
||||||
|
state.imgList.push(imgUrl);
|
||||||
|
state.originalImgList.push(result.photo);
|
||||||
|
emit('uploadChange', state.originalImgList);
|
||||||
|
} else message.error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...toRefs(state),
|
||||||
|
finish,
|
||||||
|
preview,
|
||||||
|
remove,
|
||||||
|
beforeUpload,
|
||||||
|
getCSSProperties,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.upload {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&-card {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
margin: 0 8px 8px 0;
|
||||||
|
position: relative;
|
||||||
|
padding: 8px;
|
||||||
|
border: 1px solid #d9d9d9;
|
||||||
|
border-radius: 2px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: 0 0;
|
||||||
|
.upload-card-item-info::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-info::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-info {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.img-box-actions {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
opacity: 0;
|
||||||
|
transition: all 0.3s;
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-box {
|
||||||
|
position: relative;
|
||||||
|
//padding: 8px;
|
||||||
|
//border: 1px solid #d9d9d9;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-box-actions {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 10;
|
||||||
|
white-space: nowrap;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
opacity: 0;
|
||||||
|
transition: all 0.3s;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-icon {
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-item-select-picture {
|
||||||
|
border: 1px dashed #d9d9d9;
|
||||||
|
border-radius: 2px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #fafafa;
|
||||||
|
color: #666;
|
||||||
|
|
||||||
|
.upload-title {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
34
src/components/Upload/src/props.ts
Normal file
34
src/components/Upload/src/props.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { PropType } from 'vue';
|
||||||
|
import { NUpload } from 'naive-ui';
|
||||||
|
|
||||||
|
export const basicProps = {
|
||||||
|
...NUpload.props,
|
||||||
|
accept: {
|
||||||
|
type: String,
|
||||||
|
default: '.jpg,.png,.jpeg,.svg,.gif',
|
||||||
|
},
|
||||||
|
helpText: {
|
||||||
|
type: String as PropType<string>,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
maxSize: {
|
||||||
|
type: Number as PropType<number>,
|
||||||
|
default: 2,
|
||||||
|
},
|
||||||
|
maxNumber: {
|
||||||
|
type: Number as PropType<number>,
|
||||||
|
default: Infinity,
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
type: Array as PropType<string[]>,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: Number as PropType<number>,
|
||||||
|
default: 104,
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: Number as PropType<number>,
|
||||||
|
default: 104, //建议不小于这个尺寸 太小页面可能显示有异常
|
||||||
|
},
|
||||||
|
};
|
||||||
7
src/components/Upload/src/type/index.ts
Normal file
7
src/components/Upload/src/type/index.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export interface BasicProps {
|
||||||
|
title?: string;
|
||||||
|
dataSource: Function;
|
||||||
|
columns: any[];
|
||||||
|
pagination: object;
|
||||||
|
showPagination: boolean;
|
||||||
|
}
|
||||||
86
src/directives/clickOutside.ts
Normal file
86
src/directives/clickOutside.ts
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import { on } from '@/utils/domUtils';
|
||||||
|
import { isServer } from '@/utils/is';
|
||||||
|
import type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue';
|
||||||
|
|
||||||
|
type DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void;
|
||||||
|
|
||||||
|
type FlushList = Map<
|
||||||
|
HTMLElement,
|
||||||
|
{
|
||||||
|
documentHandler: DocumentHandler;
|
||||||
|
bindingFn: (...args: unknown[]) => unknown;
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
|
||||||
|
const nodeList: FlushList = new Map();
|
||||||
|
|
||||||
|
let startClick: MouseEvent;
|
||||||
|
|
||||||
|
if (!isServer) {
|
||||||
|
on(document, 'mousedown', (e: MouseEvent) => (startClick = e));
|
||||||
|
on(document, 'mouseup', (e: MouseEvent) => {
|
||||||
|
for (const { documentHandler } of nodeList.values()) {
|
||||||
|
documentHandler(e, startClick);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): DocumentHandler {
|
||||||
|
let excludes: HTMLElement[] = [];
|
||||||
|
if (Array.isArray(binding.arg)) {
|
||||||
|
excludes = binding.arg;
|
||||||
|
} else {
|
||||||
|
// due to current implementation on binding type is wrong the type casting is necessary here
|
||||||
|
excludes.push(binding.arg as unknown as HTMLElement);
|
||||||
|
}
|
||||||
|
return function (mouseup, mousedown) {
|
||||||
|
const popperRef = (
|
||||||
|
binding.instance as ComponentPublicInstance<{
|
||||||
|
popperRef: Nullable<HTMLElement>;
|
||||||
|
}>
|
||||||
|
).popperRef;
|
||||||
|
const mouseUpTarget = mouseup.target as Node;
|
||||||
|
const mouseDownTarget = mousedown.target as Node;
|
||||||
|
const isBound = !binding || !binding.instance;
|
||||||
|
const isTargetExists = !mouseUpTarget || !mouseDownTarget;
|
||||||
|
const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);
|
||||||
|
const isSelf = el === mouseUpTarget;
|
||||||
|
|
||||||
|
const isTargetExcluded =
|
||||||
|
(excludes.length && excludes.some((item) => item?.contains(mouseUpTarget))) ||
|
||||||
|
(excludes.length && excludes.includes(mouseDownTarget as HTMLElement));
|
||||||
|
const isContainedByPopper =
|
||||||
|
popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget));
|
||||||
|
if (
|
||||||
|
isBound ||
|
||||||
|
isTargetExists ||
|
||||||
|
isContainedByEl ||
|
||||||
|
isSelf ||
|
||||||
|
isTargetExcluded ||
|
||||||
|
isContainedByPopper
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
binding.value();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClickOutside: ObjectDirective = {
|
||||||
|
beforeMount(el, binding) {
|
||||||
|
nodeList.set(el, {
|
||||||
|
documentHandler: createDocumentHandler(el, binding),
|
||||||
|
bindingFn: binding.value,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
updated(el, binding) {
|
||||||
|
nodeList.set(el, {
|
||||||
|
documentHandler: createDocumentHandler(el, binding),
|
||||||
|
bindingFn: binding.value,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
unmounted(el) {
|
||||||
|
nodeList.delete(el);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ClickOutside;
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
import { ObjectDirective } from 'vue'
|
import { ObjectDirective } from 'vue';
|
||||||
import { usePermission } from "@/hooks/web/usePermission";
|
import { usePermission } from '@/hooks/web/usePermission';
|
||||||
|
|
||||||
export const permission: ObjectDirective = {
|
export const permission: ObjectDirective = {
|
||||||
mounted(el: HTMLButtonElement, binding, vnode) {
|
mounted(el: HTMLButtonElement, binding) {
|
||||||
if (binding.value == undefined) return
|
if (binding.value == undefined) return;
|
||||||
const { action, effect } = binding.value
|
const { action, effect } = binding.value;
|
||||||
const { hasPermission } = usePermission()
|
const { hasPermission } = usePermission();
|
||||||
if (!hasPermission(action)) {
|
if (!hasPermission(action)) {
|
||||||
if (effect == 'disabled') {
|
if (effect == 'disabled') {
|
||||||
el.disabled = true
|
el.disabled = true;
|
||||||
el.style["disabled"] = 'disabled'
|
el.style['disabled'] = 'disabled';
|
||||||
el.classList.add("n-button--disabled")
|
el.classList.add('n-button--disabled');
|
||||||
} else {
|
} else {
|
||||||
el.remove()
|
el.remove();
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
// token key
|
// token key
|
||||||
export const TOKEN_KEY = 'TOKEN'
|
export const TOKEN_KEY = 'TOKEN';
|
||||||
|
|
||||||
// user info key
|
// user info key
|
||||||
export const USER_INFO_KEY = 'USER__INFO__'
|
export const USER_INFO_KEY = 'USER__INFO__';
|
||||||
|
|
||||||
// role info key
|
// role info key
|
||||||
export const ROLES_KEY = 'ROLES__KEY__'
|
export const ROLES_KEY = 'ROLES__KEY__';
|
||||||
|
|
||||||
// project config key
|
// project config key
|
||||||
export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__'
|
export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__';
|
||||||
|
|
||||||
// lock info
|
// lock info
|
||||||
export const LOCK_INFO_KEY = 'LOCK__INFO__KEY__'
|
export const LOCK_INFO_KEY = 'LOCK__INFO__KEY__';
|
||||||
|
|
||||||
// base global local key
|
// base global local key
|
||||||
export const BASE_LOCAL_CACHE_KEY = 'LOCAL__CACHE__KEY__'
|
export const BASE_LOCAL_CACHE_KEY = 'LOCAL__CACHE__KEY__';
|
||||||
|
|
||||||
// base global session key
|
// base global session key
|
||||||
export const BASE_SESSION_CACHE_KEY = 'SESSION__CACHE__KEY__'
|
export const BASE_SESSION_CACHE_KEY = 'SESSION__CACHE__KEY__';
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ export enum ResultEnum {
|
|||||||
SUCCESS = 200,
|
SUCCESS = 200,
|
||||||
ERROR = -1,
|
ERROR = -1,
|
||||||
TIMEOUT = 10042,
|
TIMEOUT = 10042,
|
||||||
TYPE = 'success'
|
TYPE = 'success',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,7 +16,7 @@ export enum RequestEnum {
|
|||||||
POST = 'POST',
|
POST = 'POST',
|
||||||
PATCH = 'PATCH',
|
PATCH = 'PATCH',
|
||||||
PUT = 'PUT',
|
PUT = 'PUT',
|
||||||
DELETE = 'DELETE'
|
DELETE = 'DELETE',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,5 +30,5 @@ export enum ContentTypeEnum {
|
|||||||
// form-data 一般配合qs
|
// form-data 一般配合qs
|
||||||
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
|
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
|
||||||
// form-data 上传
|
// form-data 上传
|
||||||
FORM_DATA = 'multipart/form-data;charset=UTF-8'
|
FORM_DATA = 'multipart/form-data;charset=UTF-8',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
export enum PageEnum {
|
export enum PageEnum {
|
||||||
// basic login path
|
// 登录
|
||||||
BASE_LOGIN = '/login',
|
BASE_LOGIN = '/login',
|
||||||
// basic home path
|
BASE_LOGIN_NAME = 'Login',
|
||||||
|
//重定向
|
||||||
|
REDIRECT = '/redirect',
|
||||||
|
REDIRECT_NAME = 'Redirect',
|
||||||
|
// 首页
|
||||||
BASE_HOME = '/dashboard',
|
BASE_HOME = '/dashboard',
|
||||||
// error page path
|
//首页跳转默认路由
|
||||||
ERROR_PAGE = '/exception',
|
BASE_HOME_REDIRECT = '/dashboard/console',
|
||||||
// error log page path
|
// 错误
|
||||||
ERROR_LOG_PAGE = '/error-log/list',
|
ERROR_PAGE_NAME = 'ErrorPage',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ export enum RoleEnum {
|
|||||||
ADMIN = 'admin',
|
ADMIN = 'admin',
|
||||||
|
|
||||||
// 普通用户
|
// 普通用户
|
||||||
NORMAL = 'normal'
|
NORMAL = 'normal',
|
||||||
}
|
}
|
||||||
|
|||||||
36
src/hooks/event/useWindowSizeFn.ts
Normal file
36
src/hooks/event/useWindowSizeFn.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';
|
||||||
|
import { useDebounceFn } from '@vueuse/core';
|
||||||
|
|
||||||
|
interface WindowSizeOptions {
|
||||||
|
once?: boolean;
|
||||||
|
immediate?: boolean;
|
||||||
|
listenerOptions?: AddEventListenerOptions | boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions) {
|
||||||
|
let handler = () => {
|
||||||
|
fn();
|
||||||
|
};
|
||||||
|
const handleSize = useDebounceFn(handler, wait);
|
||||||
|
handler = handleSize;
|
||||||
|
|
||||||
|
const start = () => {
|
||||||
|
if (options && options.immediate) {
|
||||||
|
handler();
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', handler);
|
||||||
|
};
|
||||||
|
|
||||||
|
const stop = () => {
|
||||||
|
window.removeEventListener('resize', handler);
|
||||||
|
};
|
||||||
|
|
||||||
|
tryOnMounted(() => {
|
||||||
|
start();
|
||||||
|
});
|
||||||
|
|
||||||
|
tryOnUnmounted(() => {
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
return [start, stop];
|
||||||
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
import { useAsync } from './use-async'
|
import { useAsync } from './use-async';
|
||||||
|
|
||||||
export { useAsync }
|
export { useAsync };
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
|
|||||||
VITE_GLOB_APP_SHORT_NAME,
|
VITE_GLOB_APP_SHORT_NAME,
|
||||||
VITE_GLOB_API_URL_PREFIX,
|
VITE_GLOB_API_URL_PREFIX,
|
||||||
VITE_GLOB_UPLOAD_URL,
|
VITE_GLOB_UPLOAD_URL,
|
||||||
VITE_GLOB_PERMISSION_MODE,
|
VITE_GLOB_PROD_MOCK,
|
||||||
VITE_GLOB_PROD_MOCK
|
VITE_GLOB_IMG_URL,
|
||||||
} = getAppEnvConfig();
|
} = getAppEnvConfig();
|
||||||
|
|
||||||
if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
|
if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
|
||||||
@@ -27,8 +27,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
|
|||||||
shortName: VITE_GLOB_APP_SHORT_NAME,
|
shortName: VITE_GLOB_APP_SHORT_NAME,
|
||||||
urlPrefix: VITE_GLOB_API_URL_PREFIX,
|
urlPrefix: VITE_GLOB_API_URL_PREFIX,
|
||||||
uploadUrl: VITE_GLOB_UPLOAD_URL,
|
uploadUrl: VITE_GLOB_UPLOAD_URL,
|
||||||
permissionMode: VITE_GLOB_PERMISSION_MODE,
|
prodMock: VITE_GLOB_PROD_MOCK,
|
||||||
prodMock: VITE_GLOB_PROD_MOCK
|
imgUrl: VITE_GLOB_IMG_URL,
|
||||||
};
|
};
|
||||||
return glob as Readonly<GlobConfig>;
|
return glob as Readonly<GlobConfig>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { computed, unref, ref } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useDesignSettingStore } from '@/store/modules/designSetting';
|
import { useDesignSettingStore } from '@/store/modules/designSetting';
|
||||||
|
|
||||||
export function useDesignSetting() {
|
export function useDesignSetting() {
|
||||||
@@ -13,7 +13,6 @@ export function useDesignSetting() {
|
|||||||
return {
|
return {
|
||||||
getDarkTheme,
|
getDarkTheme,
|
||||||
getAppTheme,
|
getAppTheme,
|
||||||
getAppThemeList
|
getAppThemeList,
|
||||||
}
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import { computed, unref, ref } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useProjectSettingStore } from '@/store/modules/projectSetting';
|
import { useProjectSettingStore } from '@/store/modules/projectSetting';
|
||||||
|
|
||||||
export function useProjectSetting() {
|
export function useProjectSetting() {
|
||||||
|
|
||||||
const projectStore = useProjectSettingStore();
|
const projectStore = useProjectSettingStore();
|
||||||
|
|
||||||
const getNavMode = computed(() => projectStore.navMode);
|
const getNavMode = computed(() => projectStore.navMode);
|
||||||
@@ -29,6 +28,6 @@ export function useProjectSetting() {
|
|||||||
getMenuSetting,
|
getMenuSetting,
|
||||||
getCrumbsSetting,
|
getCrumbsSetting,
|
||||||
getPermissionMode,
|
getPermissionMode,
|
||||||
getShowFooter
|
getShowFooter,
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { Ref, isReactive, isRef } from 'vue'
|
import { isReactive, isRef } from 'vue';
|
||||||
|
|
||||||
function setLoading(loading, val) {
|
function setLoading(loading, val) {
|
||||||
if (loading != undefined && isRef(loading)) {
|
if (loading != undefined && isRef(loading)) {
|
||||||
loading.value = val
|
loading.value = val;
|
||||||
} else if (loading != undefined && isReactive(loading)) {
|
} else if (loading != undefined && isReactive(loading)) {
|
||||||
loading.loading = val
|
loading.loading = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useAsync = async (func: Promise<any>, loading: any): Promise<any> => {
|
export const useAsync = async (func: Promise<any>, loading: any): Promise<any> => {
|
||||||
setLoading(loading, true)
|
setLoading(loading, true);
|
||||||
|
|
||||||
return await func.finally(() => setLoading(loading, false))
|
return await func.finally(() => setLoading(loading, false));
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { computed, onMounted, reactive, toRefs } from 'vue'
|
import { computed, onMounted, reactive, toRefs } from 'vue';
|
||||||
|
|
||||||
interface Battery {
|
interface Battery {
|
||||||
charging: boolean // 当前电池是否正在充电
|
charging: boolean; // 当前电池是否正在充电
|
||||||
chargingTime: number // 距离充电完毕还需多少秒,如果为0则充电完毕
|
chargingTime: number; // 距离充电完毕还需多少秒,如果为0则充电完毕
|
||||||
dischargingTime: number // 代表距离电池耗电至空且挂起需要多少秒
|
dischargingTime: number; // 代表距离电池耗电至空且挂起需要多少秒
|
||||||
level: number // 代表电量的放大等级,这个值在 0.0 至 1.0 之间
|
level: number; // 代表电量的放大等级,这个值在 0.0 至 1.0 之间
|
||||||
[key: string]: any
|
[key: string]: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useBattery = () => {
|
export const useBattery = () => {
|
||||||
@@ -14,56 +14,56 @@ export const useBattery = () => {
|
|||||||
charging: false,
|
charging: false,
|
||||||
chargingTime: 0,
|
chargingTime: 0,
|
||||||
dischargingTime: 0,
|
dischargingTime: 0,
|
||||||
level: 100
|
level: 100,
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
// 更新电池使用状态
|
// 更新电池使用状态
|
||||||
const updateBattery = (target) => {
|
const updateBattery = (target) => {
|
||||||
for (const key in state.battery) {
|
for (const key in state.battery) {
|
||||||
state.battery[key] = target[key]
|
state.battery[key] = target[key];
|
||||||
}
|
|
||||||
state.battery.level = state.battery.level * 100
|
|
||||||
}
|
}
|
||||||
|
state.battery.level = state.battery.level * 100;
|
||||||
|
};
|
||||||
|
|
||||||
// 计算电池剩余可用时间
|
// 计算电池剩余可用时间
|
||||||
const calcDischargingTime = computed(() => {
|
const calcDischargingTime = computed(() => {
|
||||||
const hour = state.battery.dischargingTime / 3600
|
const hour = state.battery.dischargingTime / 3600;
|
||||||
const minute = (state.battery.dischargingTime / 60) % 60
|
const minute = (state.battery.dischargingTime / 60) % 60;
|
||||||
return `${ ~~hour }小时${ ~~minute }分钟`
|
return `${~~hour}小时${~~minute}分钟`;
|
||||||
})
|
});
|
||||||
|
|
||||||
// 电池状态
|
// 电池状态
|
||||||
const batteryStatus = computed(() => {
|
const batteryStatus = computed(() => {
|
||||||
if (state.battery.charging && state.battery.level >= 100) {
|
if (state.battery.charging && state.battery.level >= 100) {
|
||||||
return '已充满'
|
return '已充满';
|
||||||
} else if (state.battery.charging) {
|
} else if (state.battery.charging) {
|
||||||
return '充电中'
|
return '充电中';
|
||||||
} else {
|
} else {
|
||||||
return '已断开电源'
|
return '已断开电源';
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const BatteryManager: Battery = await (window.navigator as any).getBattery()
|
const BatteryManager: Battery = await (window.navigator as any).getBattery();
|
||||||
updateBattery(BatteryManager)
|
updateBattery(BatteryManager);
|
||||||
|
|
||||||
// 电池充电状态更新时被调用
|
// 电池充电状态更新时被调用
|
||||||
BatteryManager.onchargingchange = ({ target }) => {
|
BatteryManager.onchargingchange = ({ target }) => {
|
||||||
updateBattery(target)
|
updateBattery(target);
|
||||||
}
|
};
|
||||||
// 电池充电时间更新时被调用
|
// 电池充电时间更新时被调用
|
||||||
BatteryManager.onchargingtimechange = ({ target }) => {
|
BatteryManager.onchargingtimechange = ({ target }) => {
|
||||||
updateBattery(target)
|
updateBattery(target);
|
||||||
}
|
};
|
||||||
// 电池断开充电时间更新时被调用
|
// 电池断开充电时间更新时被调用
|
||||||
BatteryManager.ondischargingtimechange = ({ target }) => {
|
BatteryManager.ondischargingtimechange = ({ target }) => {
|
||||||
updateBattery(target)
|
updateBattery(target);
|
||||||
}
|
};
|
||||||
// 电池电量更新时被调用
|
// 电池电量更新时被调用
|
||||||
BatteryManager.onlevelchange = ({ target }) => {
|
BatteryManager.onlevelchange = ({ target }) => {
|
||||||
updateBattery(target)
|
updateBattery(target);
|
||||||
}
|
};
|
||||||
|
|
||||||
// new Intl.DateTimeFormat('zh', {
|
// new Intl.DateTimeFormat('zh', {
|
||||||
// year: 'numeric',
|
// year: 'numeric',
|
||||||
@@ -74,11 +74,11 @@ export const useBattery = () => {
|
|||||||
// second: '2-digit',
|
// second: '2-digit',
|
||||||
// hour12: false
|
// hour12: false
|
||||||
// }).format(new Date())
|
// }).format(new Date())
|
||||||
})
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
batteryStatus,
|
batteryStatus,
|
||||||
calcDischargingTime
|
calcDischargingTime,
|
||||||
}
|
};
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
import { ref, onMounted, onUnmounted } from 'vue'
|
import { ref, onMounted, onUnmounted } from 'vue';
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* description: 获取页面宽度
|
* description: 获取页面宽度
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function useDomWidth() {
|
export function useDomWidth() {
|
||||||
const domWidth = ref(window.innerWidth)
|
const domWidth = ref(window.innerWidth);
|
||||||
|
|
||||||
function resize() {
|
function resize() {
|
||||||
domWidth.value = document.body.clientWidth
|
domWidth.value = document.body.clientWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.addEventListener('resize', debounce(resize, 80))
|
window.addEventListener('resize', debounce(resize, 80));
|
||||||
})
|
});
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize);
|
||||||
})
|
});
|
||||||
|
|
||||||
return domWidth
|
return domWidth;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
import { ref, onMounted, onUnmounted, watch } from 'vue'
|
import { ref, onMounted, onUnmounted } from 'vue';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 用户网络是否可用
|
* @description 用户网络是否可用
|
||||||
* */
|
* */
|
||||||
export function useOnline() {
|
export function useOnline() {
|
||||||
const online = ref(true)
|
const online = ref(true);
|
||||||
|
|
||||||
const showStatus = (val) => {
|
const showStatus = (val) => {
|
||||||
online.value = typeof val == 'boolean' ? val : val.target.online
|
online.value = typeof val == 'boolean' ? val : val.target.online;
|
||||||
}
|
};
|
||||||
|
|
||||||
// 在页面加载后,设置正确的网络状态
|
// 在页面加载后,设置正确的网络状态
|
||||||
navigator.onLine ? showStatus(true) : showStatus(false)
|
navigator.onLine ? showStatus(true) : showStatus(false);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 开始监听网络状态的变化
|
// 开始监听网络状态的变化
|
||||||
window.addEventListener('online', showStatus)
|
window.addEventListener('online', showStatus);
|
||||||
|
|
||||||
window.addEventListener('offline', showStatus)
|
window.addEventListener('offline', showStatus);
|
||||||
})
|
});
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
// 移除监听网络状态的变化
|
// 移除监听网络状态的变化
|
||||||
window.removeEventListener('online', showStatus)
|
window.removeEventListener('online', showStatus);
|
||||||
|
|
||||||
window.removeEventListener('offline', showStatus)
|
window.removeEventListener('offline', showStatus);
|
||||||
})
|
});
|
||||||
|
|
||||||
return { online }
|
return { online };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
import { ref, onMounted, onUnmounted } from 'vue'
|
import { ref, onMounted, onUnmounted } from 'vue';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取本地时间
|
* @description 获取本地时间
|
||||||
*/
|
*/
|
||||||
export function useTime() {
|
export function useTime() {
|
||||||
let timer // 定时器
|
let timer; // 定时器
|
||||||
const year = ref(0) // 年份
|
const year = ref(0); // 年份
|
||||||
const month = ref(0) // 月份
|
const month = ref(0); // 月份
|
||||||
const week = ref('') // 星期几
|
const week = ref(''); // 星期几
|
||||||
const day = ref(0) // 天数
|
const day = ref(0); // 天数
|
||||||
const hour = ref<number | string>(0) // 小时
|
const hour = ref<number | string>(0); // 小时
|
||||||
const minute = ref<number | string>(0) // 分钟
|
const minute = ref<number | string>(0); // 分钟
|
||||||
const second = ref(0) // 秒
|
const second = ref(0); // 秒
|
||||||
|
|
||||||
// 更新时间
|
// 更新时间
|
||||||
const updateTime = () => {
|
const updateTime = () => {
|
||||||
const date = new Date()
|
const date = new Date();
|
||||||
year.value = date.getFullYear()
|
year.value = date.getFullYear();
|
||||||
month.value = date.getMonth() + 1
|
month.value = date.getMonth() + 1;
|
||||||
week.value = '日一二三四五六'.charAt(date.getDay())
|
week.value = '日一二三四五六'.charAt(date.getDay());
|
||||||
day.value = date.getDate()
|
day.value = date.getDate();
|
||||||
hour.value =
|
hour.value =
|
||||||
(date.getHours() + '')?.padStart(2, '0') ||
|
(date.getHours() + '')?.padStart(2, '0') ||
|
||||||
new Intl.NumberFormat(undefined, { minimumIntegerDigits: 2 }).format(date.getHours())
|
new Intl.NumberFormat(undefined, { minimumIntegerDigits: 2 }).format(date.getHours());
|
||||||
minute.value =
|
minute.value =
|
||||||
(date.getMinutes() + '')?.padStart(2, '0') ||
|
(date.getMinutes() + '')?.padStart(2, '0') ||
|
||||||
new Intl.NumberFormat(undefined, { minimumIntegerDigits: 2 }).format(date.getMinutes())
|
new Intl.NumberFormat(undefined, { minimumIntegerDigits: 2 }).format(date.getMinutes());
|
||||||
second.value = date.getSeconds()
|
second.value = date.getSeconds();
|
||||||
}
|
};
|
||||||
|
|
||||||
// 原生时间格式化
|
// 原生时间格式化
|
||||||
// new Intl.DateTimeFormat('zh', {
|
// new Intl.DateTimeFormat('zh', {
|
||||||
@@ -40,16 +40,16 @@ export function useTime() {
|
|||||||
// hour12: false
|
// hour12: false
|
||||||
// }).format(new Date())
|
// }).format(new Date())
|
||||||
|
|
||||||
updateTime()
|
updateTime();
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
clearInterval(timer)
|
clearInterval(timer);
|
||||||
timer = setInterval(() => updateTime(), 1000)
|
timer = setInterval(() => updateTime(), 1000);
|
||||||
})
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
clearInterval(timer)
|
clearInterval(timer);
|
||||||
})
|
});
|
||||||
|
|
||||||
return { month, day, hour, minute, second, week }
|
return { month, day, hour, minute, second, week };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,18 +12,16 @@ import echarts from '@/utils/lib/echarts';
|
|||||||
|
|
||||||
// import { useRootSetting } from '@/hooks/setting/useRootSetting';
|
// import { useRootSetting } from '@/hooks/setting/useRootSetting';
|
||||||
|
|
||||||
|
|
||||||
export function useECharts(
|
export function useECharts(
|
||||||
elRef: Ref<HTMLDivElement>,
|
elRef: Ref<HTMLDivElement>,
|
||||||
theme: 'light' | 'dark' | 'default' = 'light'
|
theme: 'light' | 'dark' | 'default' = 'light'
|
||||||
) {
|
) {
|
||||||
// const { getDarkMode } = useRootSetting();
|
// const { getDarkMode } = useRootSetting();
|
||||||
const getDarkMode = 'light'
|
const getDarkMode = 'light';
|
||||||
let chartInstance: echarts.ECharts | null = null;
|
let chartInstance: echarts.ECharts | null = null;
|
||||||
let resizeFn: Fn = resize;
|
let resizeFn: Fn = resize;
|
||||||
const cacheOptions = ref<EChartsOption>({});
|
const cacheOptions = ref<EChartsOption>({});
|
||||||
let removeResizeFn: Fn = () => {
|
let removeResizeFn: Fn = () => {};
|
||||||
};
|
|
||||||
|
|
||||||
resizeFn = useDebounceFn(resize, 200);
|
resizeFn = useDebounceFn(resize, 200);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useUserStore } from '@/store/modules/user'
|
import { useUserStore } from '@/store/modules/user';
|
||||||
|
|
||||||
export function usePermission() {
|
export function usePermission() {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
@@ -8,10 +8,10 @@ export function usePermission() {
|
|||||||
* @param accesses
|
* @param accesses
|
||||||
*/
|
*/
|
||||||
function _someRoles(accesses: string[]) {
|
function _someRoles(accesses: string[]) {
|
||||||
return userStore.getRoles.some(item => {
|
return userStore.getRoles.some((item) => {
|
||||||
const { value }: any = item
|
const { value }: any = item;
|
||||||
return accesses.includes(value)
|
return accesses.includes(value);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,8 +19,8 @@ export function usePermission() {
|
|||||||
* 可用于 v-if 显示逻辑
|
* 可用于 v-if 显示逻辑
|
||||||
* */
|
* */
|
||||||
function hasPermission(accesses: string[]): boolean {
|
function hasPermission(accesses: string[]): boolean {
|
||||||
if (!accesses.length) return true
|
if (!accesses || !accesses.length) return true;
|
||||||
return _someRoles(accesses)
|
return _someRoles(accesses);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,11 +28,11 @@ export function usePermission() {
|
|||||||
* @param accesses
|
* @param accesses
|
||||||
*/
|
*/
|
||||||
function hasEveryPermission(accesses: string[]): boolean {
|
function hasEveryPermission(accesses: string[]): boolean {
|
||||||
const rolesList = userStore.getRoles
|
const rolesList = userStore.getRoles;
|
||||||
if (Array.isArray(accesses)) {
|
if (Array.isArray(accesses)) {
|
||||||
return accesses.every((access) => !!rolesList[access])
|
return accesses.every((access) => !!rolesList[access]);
|
||||||
}
|
}
|
||||||
throw new Error(`[hasEveryPermission]: ${ accesses } should be a array !`)
|
throw new Error(`[hasEveryPermission]: ${accesses} should be a array !`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,11 +41,11 @@ export function usePermission() {
|
|||||||
* @param accessMap
|
* @param accessMap
|
||||||
*/
|
*/
|
||||||
function hasSomePermission(accesses: string[]): boolean {
|
function hasSomePermission(accesses: string[]): boolean {
|
||||||
const rolesList = userStore.getRoles
|
const rolesList = userStore.getRoles;
|
||||||
if (Array.isArray(accesses)) {
|
if (Array.isArray(accesses)) {
|
||||||
return accesses.some((access) => !!rolesList[access])
|
return accesses.some((access) => !!rolesList[access]);
|
||||||
}
|
}
|
||||||
throw new Error(`[hasSomePermission]: ${ accesses } should be a array !`)
|
throw new Error(`[hasSomePermission]: ${accesses} should be a array !`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return { hasPermission, hasEveryPermission, hasSomePermission };
|
return { hasPermission, hasEveryPermission, hasSomePermission };
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import PageFooter from './index.vue'
|
import PageFooter from './index.vue';
|
||||||
|
|
||||||
export { PageFooter }
|
export { PageFooter };
|
||||||
|
|||||||
@@ -1,48 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="page-footer">
|
<div class="page-footer">
|
||||||
<div class="page-footer-link">
|
<div class="page-footer-link">
|
||||||
<a href="https://github.com/jekip/naive-ui-admin" target="_blank">
|
<a href="https://github.com/jekip/naive-ui-admin" target="_blank"> 官网 </a>
|
||||||
官网
|
<a href="https://github.com/jekip/naive-ui-admin" target="_blank"> 社区 </a>
|
||||||
</a>
|
<a href="https://github.com/jekip/naive-ui-admin/issues" target="_blank"> 交流 </a>
|
||||||
<a href="https://github.com/jekip/naive-ui-admin" target="_blank">
|
|
||||||
社区
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/jekip/naive-ui-admin/issues" target="_blank">
|
|
||||||
交流
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="copyright">
|
<div class="copyright"> naive-ui-admin 1.4 · Made by Ah jung </div>
|
||||||
naive-ui-admin 0.1.0 · Made by Ah jung
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { GithubOutlined, CopyrightOutlined } from '@vicons/antd'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'PageFooter',
|
name: 'PageFooter',
|
||||||
components: { GithubOutlined, CopyrightOutlined },
|
components: {},
|
||||||
props: {
|
props: {
|
||||||
collapsed: {
|
collapsed: {
|
||||||
type: Boolean
|
type: Boolean,
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
.page-footer {
|
.page-footer {
|
||||||
margin: 48px 0 24px 0;
|
//margin: 28px 0 24px 0;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #808695;
|
color: #808695;
|
||||||
-webkit-transition: all .2s ease-in-out;
|
-webkit-transition: all 0.2s ease-in-out;
|
||||||
transition: all .2s ease-in-out;
|
transition: all 0.2s ease-in-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #515a6e;
|
color: #515a6e;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-drawer v-model:show="isDrawer" :width="width" :placement="placement">
|
<n-drawer v-model:show="isDrawer" :width="width" :placement="placement" :native-scrollbar="false">
|
||||||
<n-drawer-content :title="title">
|
<n-drawer-content :title="title">
|
||||||
<div class="drawer">
|
<div class="drawer">
|
||||||
<n-divider title-placement="center">主题</n-divider>
|
<n-divider title-placement="center">主题</n-divider>
|
||||||
@@ -7,17 +7,28 @@
|
|||||||
<div class="drawer-setting-item justify-center dark-switch">
|
<div class="drawer-setting-item justify-center dark-switch">
|
||||||
<n-tooltip placement="bottom">
|
<n-tooltip placement="bottom">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-switch v-model:value="designStore.darkTheme"/>
|
<n-switch v-model:value="designStore.darkTheme" class="dark-theme-switch">
|
||||||
|
<template #checked>
|
||||||
|
<n-icon size="14" color="#ffd93b">
|
||||||
|
<SunnySharp />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<template #unchecked>
|
||||||
|
<n-icon size="14" color="#ffd93b">
|
||||||
|
<Moon />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
</n-switch>
|
||||||
</template>
|
</template>
|
||||||
<span>深色主题</span>
|
<span>深色主题</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<n-divider title-placement="center">系统主题</n-divider>
|
<n-divider title-placement="center">系统主题</n-divider>
|
||||||
|
|
||||||
<div class="drawer-setting-item align-items-top">
|
<div class="drawer-setting-item align-items-top">
|
||||||
<span class="theme-item"
|
<span
|
||||||
|
class="theme-item"
|
||||||
v-for="(item, index) in appThemeList"
|
v-for="(item, index) in appThemeList"
|
||||||
:key="index"
|
:key="index"
|
||||||
:style="{ 'background-color': item }"
|
:style="{ 'background-color': item }"
|
||||||
@@ -53,7 +64,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<n-divider title-placement="center">导航栏风格</n-divider>
|
<n-divider title-placement="center">导航栏风格</n-divider>
|
||||||
|
|
||||||
<div class="drawer-setting-item align-items-top">
|
<div class="drawer-setting-item align-items-top">
|
||||||
@@ -82,7 +92,10 @@
|
|||||||
<div class="drawer-setting-item-style">
|
<div class="drawer-setting-item-style">
|
||||||
<n-tooltip placement="top">
|
<n-tooltip placement="top">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<img src="~@/assets/images/header-theme-dark.svg" @click="togNavTheme('header-dark')"/>
|
<img
|
||||||
|
src="~@/assets/images/header-theme-dark.svg"
|
||||||
|
@click="togNavTheme('header-dark')"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
<span>暗色顶栏</span>
|
<span>暗色顶栏</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
@@ -93,9 +106,7 @@
|
|||||||
<n-divider title-placement="center">界面功能</n-divider>
|
<n-divider title-placement="center">界面功能</n-divider>
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 固定顶栏 </div>
|
||||||
固定顶栏
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.headerSetting.fixed" />
|
<n-switch v-model:value="settingStore.headerSetting.fixed" />
|
||||||
</div>
|
</div>
|
||||||
@@ -111,9 +122,7 @@
|
|||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 固定多页签 </div>
|
||||||
固定多页签
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.multiTabsSetting.fixed" />
|
<n-switch v-model:value="settingStore.multiTabsSetting.fixed" />
|
||||||
</div>
|
</div>
|
||||||
@@ -122,127 +131,116 @@
|
|||||||
<n-divider title-placement="center">界面显示</n-divider>
|
<n-divider title-placement="center">界面显示</n-divider>
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 显示重载页面按钮 </div>
|
||||||
显示重载页面按钮
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.headerSetting.isReload" />
|
<n-switch v-model:value="settingStore.headerSetting.isReload" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 显示面包屑导航 </div>
|
||||||
显示面包屑导航
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.crumbsSetting.show" />
|
<n-switch v-model:value="settingStore.crumbsSetting.show" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 显示面包屑显示图标 </div>
|
||||||
显示面包屑显示图标
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.crumbsSetting.showIcon" />
|
<n-switch v-model:value="settingStore.crumbsSetting.showIcon" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<div class="drawer-setting-item-title">
|
<div class="drawer-setting-item-title"> 显示多页签 </div>
|
||||||
显示多页签
|
|
||||||
</div>
|
|
||||||
<div class="drawer-setting-item-action">
|
<div class="drawer-setting-item-action">
|
||||||
<n-switch v-model:value="settingStore.multiTabsSetting.show" />
|
<n-switch v-model:value="settingStore.multiTabsSetting.show" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!--1.15废弃,没啥用,占用操作空间-->
|
||||||
<div class="drawer-setting-item">
|
<!-- <div class="drawer-setting-item">-->
|
||||||
<div class="drawer-setting-item-title">
|
<!-- <div class="drawer-setting-item-title"> 显示页脚 </div>-->
|
||||||
显示页脚
|
<!-- <div class="drawer-setting-item-action">-->
|
||||||
</div>
|
<!-- <n-switch v-model:value="settingStore.showFooter" />-->
|
||||||
<div class="drawer-setting-item-action">
|
<!-- </div>-->
|
||||||
<n-switch v-model:value="settingStore.showFooter"/>
|
<!-- </div>-->
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="drawer-setting-item">
|
<div class="drawer-setting-item">
|
||||||
<n-alert type="warning" :showIcon="false">
|
<n-alert type="warning" :showIcon="false">
|
||||||
<p>{{ alertText }}</p>
|
<p>{{ alertText }}</p>
|
||||||
</n-alert>
|
</n-alert>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</n-drawer-content>
|
</n-drawer-content>
|
||||||
</n-drawer>
|
</n-drawer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, reactive, toRefs, watch, createVNode, computed, unref } from 'vue'
|
import { defineComponent, reactive, toRefs, watch } from 'vue';
|
||||||
import { useProjectSettingStore } from "@/store/modules/projectSetting";
|
import { useProjectSettingStore } from '@/store/modules/projectSetting';
|
||||||
import { useDesignSettingStore } from "@/store/modules/designSetting";
|
import { useDesignSettingStore } from '@/store/modules/designSetting';
|
||||||
import { CheckOutlined } from '@vicons/antd'
|
import { CheckOutlined } from '@vicons/antd';
|
||||||
import { darkTheme } from 'naive-ui'
|
import { Moon, SunnySharp } from '@vicons/ionicons5';
|
||||||
|
import { darkTheme } from 'naive-ui';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'ProjectSetting',
|
name: 'ProjectSetting',
|
||||||
|
components: { CheckOutlined, Moon, SunnySharp },
|
||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '项目配置'
|
default: '项目配置',
|
||||||
},
|
},
|
||||||
width: {
|
width: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 280
|
default: 280,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
components: { CheckOutlined },
|
setup(props) {
|
||||||
setup(props, { emit }) {
|
const settingStore = useProjectSettingStore();
|
||||||
const settingStore = useProjectSettingStore()
|
const designStore = useDesignSettingStore();
|
||||||
const designStore = useDesignSettingStore()
|
|
||||||
const { width, title } = props
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
width,
|
width: props.width,
|
||||||
title,
|
title: props.title,
|
||||||
isDrawer: false,
|
isDrawer: false,
|
||||||
placement: "right",
|
placement: 'right',
|
||||||
alertText: '该功能主要实时预览各种布局效果,更多完整配置在 projectSetting.ts 中设置,建议在生产环境关闭该布局预览功能。',
|
alertText:
|
||||||
appThemeList: designStore.appThemeList
|
'该功能主要实时预览各种布局效果,更多完整配置在 projectSetting.ts 中设置,建议在生产环境关闭该布局预览功能。',
|
||||||
})
|
appThemeList: designStore.appThemeList,
|
||||||
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => designStore.darkTheme,
|
() => designStore.darkTheme,
|
||||||
(to) => {
|
(to) => {
|
||||||
settingStore.navTheme = to ? 'header-dark' : 'dark'
|
settingStore.navTheme = to ? 'header-dark' : 'dark';
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
|
|
||||||
function openDrawer(isDrawer) {
|
function openDrawer() {
|
||||||
state.isDrawer = true
|
state.isDrawer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeDrawer() {
|
function closeDrawer() {
|
||||||
state.isDrawer = false
|
state.isDrawer = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function togNavTheme(theme) {
|
function togNavTheme(theme) {
|
||||||
settingStore.navTheme = theme
|
settingStore.navTheme = theme;
|
||||||
if (settingStore.navMode === 'horizontal' && theme === 'light') {
|
if (settingStore.navMode === 'horizontal' && theme === 'light') {
|
||||||
designStore.navTheme = 'dark'
|
settingStore.navTheme = 'dark';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function togTheme(color) {
|
function togTheme(color) {
|
||||||
designStore.appTheme = color
|
designStore.appTheme = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
function togNavMode(mode) {
|
function togNavMode(mode) {
|
||||||
settingStore.navMode = mode
|
settingStore.navMode = mode;
|
||||||
if (mode === 'horizontal') {
|
if (mode === 'horizontal') {
|
||||||
settingStore.setNavTheme('light')
|
settingStore.setNavTheme('light');
|
||||||
} else {
|
} else {
|
||||||
settingStore.setNavTheme('dark')
|
settingStore.setNavTheme('dark');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,9 +254,9 @@ export default defineComponent({
|
|||||||
darkTheme,
|
darkTheme,
|
||||||
openDrawer,
|
openDrawer,
|
||||||
closeDrawer,
|
closeDrawer,
|
||||||
}
|
};
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
@@ -301,7 +299,7 @@ export default defineComponent({
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
.n-icon {
|
.n-icon {
|
||||||
color: #fff
|
color: #fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -314,8 +312,7 @@ export default defineComponent({
|
|||||||
.justify-center {
|
.justify-center {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
.dark-switch .n-switch {
|
||||||
.dark-switch .n-switch--active {
|
|
||||||
::v-deep(.n-switch__rail) {
|
::v-deep(.n-switch__rail) {
|
||||||
background-color: #000e1c;
|
background-color: #000e1c;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { NLayout, NAvatar, NMenu, NDropdown, NBreadcrumb, NTooltip } from 'naive-ui'
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
SettingOutlined,
|
SettingOutlined,
|
||||||
SearchOutlined,
|
SearchOutlined,
|
||||||
@@ -13,12 +11,11 @@ import {
|
|||||||
ReloadOutlined,
|
ReloadOutlined,
|
||||||
LogoutOutlined,
|
LogoutOutlined,
|
||||||
UserOutlined,
|
UserOutlined,
|
||||||
CheckOutlined
|
CheckOutlined,
|
||||||
} from '@vicons/antd'
|
} from '@vicons/antd';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
SettingOutlined,
|
SettingOutlined,
|
||||||
NDropdown,
|
|
||||||
LockOutlined,
|
LockOutlined,
|
||||||
GithubOutlined,
|
GithubOutlined,
|
||||||
SearchOutlined,
|
SearchOutlined,
|
||||||
@@ -30,5 +27,5 @@ export default {
|
|||||||
ReloadOutlined,
|
ReloadOutlined,
|
||||||
LogoutOutlined,
|
LogoutOutlined,
|
||||||
UserOutlined,
|
UserOutlined,
|
||||||
CheckOutlined
|
CheckOutlined,
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import PageHeader from './index.vue'
|
import PageHeader from './index.vue';
|
||||||
|
|
||||||
export { PageHeader }
|
export { PageHeader };
|
||||||
|
|||||||
@@ -7,22 +7,27 @@
|
|||||||
<!--左侧菜单-->
|
<!--左侧菜单-->
|
||||||
<div class="layout-header-left" v-else>
|
<div class="layout-header-left" v-else>
|
||||||
<!-- 菜单收起 -->
|
<!-- 菜单收起 -->
|
||||||
<span class="ml-1 layout-header-trigger layout-header-trigger-min"
|
<div
|
||||||
@click="() => $emit('update:collapsed', !collapsed)">
|
class="ml-1 layout-header-trigger layout-header-trigger-min"
|
||||||
|
@click="() => $emit('update:collapsed', !collapsed)"
|
||||||
|
>
|
||||||
<n-icon size="18" v-if="collapsed">
|
<n-icon size="18" v-if="collapsed">
|
||||||
<MenuUnfoldOutlined />
|
<MenuUnfoldOutlined />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
<n-icon size="18" v-else>
|
<n-icon size="18" v-else>
|
||||||
<MenuFoldOutlined />
|
<MenuFoldOutlined />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</span>
|
</div>
|
||||||
<!-- 刷新 -->
|
<!-- 刷新 -->
|
||||||
<span class="mr-1 layout-header-trigger layout-header-trigger-min" v-if="headerSetting.isReload"
|
<div
|
||||||
@click="reloadPage">
|
class="mr-1 layout-header-trigger layout-header-trigger-min"
|
||||||
|
v-if="headerSetting.isReload"
|
||||||
|
@click="reloadPage"
|
||||||
|
>
|
||||||
<n-icon size="18">
|
<n-icon size="18">
|
||||||
<ReloadOutlined />
|
<ReloadOutlined />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</span>
|
</div>
|
||||||
<!-- 面包屑 -->
|
<!-- 面包屑 -->
|
||||||
<n-breadcrumb v-if="crumbsSetting.show">
|
<n-breadcrumb v-if="crumbsSetting.show">
|
||||||
<template v-for="routeItem in breadcrumbList" :key="routeItem.name">
|
<template v-for="routeItem in breadcrumbList" :key="routeItem.name">
|
||||||
@@ -33,12 +38,18 @@
|
|||||||
@select="dropdownSelect"
|
@select="dropdownSelect"
|
||||||
>
|
>
|
||||||
<span class="link-text">
|
<span class="link-text">
|
||||||
<component v-if="crumbsSetting.showIcon && routeItem.meta.icon" :is="routeItem.meta.icon"></component>
|
<component
|
||||||
|
v-if="crumbsSetting.showIcon && routeItem.meta.icon"
|
||||||
|
:is="routeItem.meta.icon"
|
||||||
|
/>
|
||||||
{{ routeItem.meta.title }}
|
{{ routeItem.meta.title }}
|
||||||
</span>
|
</span>
|
||||||
</n-dropdown>
|
</n-dropdown>
|
||||||
<span class="link-text" v-else>
|
<span class="link-text" v-else>
|
||||||
<component v-if="crumbsSetting.showIcon && routeItem.meta.icon" :is="routeItem.meta.icon"></component>
|
<component
|
||||||
|
v-if="crumbsSetting.showIcon && routeItem.meta.icon"
|
||||||
|
:is="routeItem.meta.icon"
|
||||||
|
/>
|
||||||
{{ routeItem.meta.title }}
|
{{ routeItem.meta.title }}
|
||||||
</span>
|
</span>
|
||||||
</n-breadcrumb-item>
|
</n-breadcrumb-item>
|
||||||
@@ -46,7 +57,11 @@
|
|||||||
</n-breadcrumb>
|
</n-breadcrumb>
|
||||||
</div>
|
</div>
|
||||||
<div class="layout-header-right">
|
<div class="layout-header-right">
|
||||||
<span class="layout-header-trigger layout-header-trigger-min" v-for="item in iconList" :key="item.icon.name">
|
<div
|
||||||
|
class="layout-header-trigger layout-header-trigger-min"
|
||||||
|
v-for="item in iconList"
|
||||||
|
:key="item.icon.name"
|
||||||
|
>
|
||||||
<n-tooltip placement="bottom">
|
<n-tooltip placement="bottom">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-icon size="18">
|
<n-icon size="18">
|
||||||
@@ -55,26 +70,33 @@
|
|||||||
</template>
|
</template>
|
||||||
<span>{{ item.tips }}</span>
|
<span>{{ item.tips }}</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</span>
|
</div>
|
||||||
<!--切换全屏-->
|
<!--切换全屏-->
|
||||||
<span class="layout-header-trigger layout-header-trigger-min">
|
<div class="layout-header-trigger layout-header-trigger-min">
|
||||||
|
<n-tooltip placement="bottom">
|
||||||
|
<template #trigger>
|
||||||
<n-icon size="18">
|
<n-icon size="18">
|
||||||
<component :is="fullscreenIcon" @click="toggleFullScreen" />
|
<component :is="fullscreenIcon" @click="toggleFullScreen" />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</span>
|
</template>
|
||||||
|
<span>全屏</span>
|
||||||
|
</n-tooltip>
|
||||||
|
</div>
|
||||||
<!-- 个人中心 -->
|
<!-- 个人中心 -->
|
||||||
<span class="layout-header-trigger layout-header-trigger-min">
|
<div class="layout-header-trigger layout-header-trigger-min">
|
||||||
<n-dropdown trigger="hover" @select="avatarSelect" :options="avatarOptions">
|
<n-dropdown trigger="hover" @select="avatarSelect" :options="avatarOptions">
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<n-avatar>
|
<n-avatar round>
|
||||||
{{ username }}
|
{{ username }}
|
||||||
<template #icon><UserOutlined/></template>
|
<template #icon>
|
||||||
|
<UserOutlined />
|
||||||
|
</template>
|
||||||
</n-avatar>
|
</n-avatar>
|
||||||
</div>
|
</div>
|
||||||
</n-dropdown>
|
</n-dropdown>
|
||||||
</span>
|
</div>
|
||||||
<!--设置-->
|
<!--设置-->
|
||||||
<span class="layout-header-trigger layout-header-trigger-min" @click="openSetting">
|
<div class="layout-header-trigger layout-header-trigger-min" @click="openSetting">
|
||||||
<n-tooltip placement="bottom-end">
|
<n-tooltip placement="bottom-end">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-icon size="18" style="font-weight: bold">
|
<n-icon size="18" style="font-weight: bold">
|
||||||
@@ -83,7 +105,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<span>项目配置</span>
|
<span>项目配置</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</span>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--项目配置-->
|
<!--项目配置-->
|
||||||
@@ -91,42 +113,36 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, reactive, toRefs, createVNode, ref, computed, unref } from 'vue'
|
import { defineComponent, reactive, toRefs, ref, computed, unref } from 'vue';
|
||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router';
|
||||||
import components from './components'
|
import components from './components';
|
||||||
import { NDialogProvider, useDialog, useMessage, useNotification } from 'naive-ui'
|
import { NDialogProvider, useDialog, useMessage } from 'naive-ui';
|
||||||
import { TABS_ROUTES } from '@/store/mutation-types'
|
import { TABS_ROUTES } from '@/store/mutation-types';
|
||||||
import { useUserStore } from '@/store/modules/user'
|
import { useUserStore } from '@/store/modules/user';
|
||||||
import { useLockscreenStore } from '@/store/modules/lockscreen'
|
import { useLockscreenStore } from '@/store/modules/lockscreen';
|
||||||
import ProjectSetting from './ProjectSetting.vue'
|
import ProjectSetting from './ProjectSetting.vue';
|
||||||
import { AsideMenu } from '@/layout/components/Menu'
|
import { AsideMenu } from '@/layout/components/Menu';
|
||||||
import { useProjectSetting } from "@/hooks/setting/useProjectSetting";
|
import { useProjectSetting } from '@/hooks/setting/useProjectSetting';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'PageHeader',
|
name: 'PageHeader',
|
||||||
components: { ...components, NDialogProvider, ProjectSetting, AsideMenu },
|
components: { ...components, NDialogProvider, ProjectSetting, AsideMenu },
|
||||||
props: {
|
props: {
|
||||||
collapsed: {
|
collapsed: {
|
||||||
type: Boolean
|
type: Boolean,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore();
|
||||||
const useLockscreen = useLockscreenStore()
|
const useLockscreen = useLockscreenStore();
|
||||||
const message = useMessage()
|
const message = useMessage();
|
||||||
const notification = useNotification()
|
const dialog = useDialog();
|
||||||
const dialog = useDialog()
|
const { getNavMode, getNavTheme, getHeaderSetting, getMenuSetting, getCrumbsSetting } =
|
||||||
const {
|
useProjectSetting();
|
||||||
getNavMode,
|
|
||||||
getNavTheme,
|
|
||||||
getHeaderSetting,
|
|
||||||
getMenuSetting,
|
|
||||||
getCrumbsSetting
|
|
||||||
} = useProjectSetting()
|
|
||||||
|
|
||||||
const { username } = userStore?.info || {}
|
const { username } = userStore?.info || {};
|
||||||
|
|
||||||
const drawerSetting = ref()
|
const drawerSetting = ref();
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
username: username || '',
|
username: username || '',
|
||||||
@@ -135,153 +151,144 @@ export default defineComponent({
|
|||||||
navTheme: getNavTheme,
|
navTheme: getNavTheme,
|
||||||
headerSetting: getHeaderSetting,
|
headerSetting: getHeaderSetting,
|
||||||
crumbsSetting: getCrumbsSetting,
|
crumbsSetting: getCrumbsSetting,
|
||||||
})
|
});
|
||||||
|
|
||||||
const getChangeStyle = computed(() => {
|
const getChangeStyle = computed(() => {
|
||||||
const { collapsed } = props
|
const { collapsed } = props;
|
||||||
const { minMenuWidth, menuWidth }: any = unref(getMenuSetting)
|
const { minMenuWidth, menuWidth }: any = unref(getMenuSetting);
|
||||||
return {
|
return {
|
||||||
'left': collapsed ? `${ minMenuWidth }px` : `${ menuWidth }px`,
|
left: collapsed ? `${minMenuWidth}px` : `${menuWidth}px`,
|
||||||
'width': `calc(100% - ${ collapsed ? `${ minMenuWidth }px` : `${ menuWidth }px` })`
|
width: `calc(100% - ${collapsed ? `${minMenuWidth}px` : `${menuWidth}px`})`,
|
||||||
}
|
};
|
||||||
})
|
});
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter();
|
||||||
const route = useRoute()
|
const route = useRoute();
|
||||||
|
|
||||||
const generator: any = (routerMap, parent) => {
|
const generator: any = (routerMap) => {
|
||||||
return routerMap.map((item, key) => {
|
return routerMap.map((item) => {
|
||||||
const currentMenu = {
|
const currentMenu = {
|
||||||
...item,
|
...item,
|
||||||
label: item.meta.title,
|
label: item.meta.title,
|
||||||
key: item.name,
|
key: item.name,
|
||||||
disabled: item.path === '/',
|
disabled: item.path === '/',
|
||||||
}
|
};
|
||||||
// 是否有子菜单,并递归处理
|
// 是否有子菜单,并递归处理
|
||||||
if (item.children && item.children.length > 0) {
|
if (item.children && item.children.length > 0) {
|
||||||
// Recursion
|
// Recursion
|
||||||
currentMenu.children = generator(item.children, currentMenu)
|
currentMenu.children = generator(item.children, currentMenu);
|
||||||
}
|
|
||||||
return currentMenu
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
return currentMenu;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const breadcrumbList = computed(() => {
|
const breadcrumbList = computed(() => {
|
||||||
return generator(route.matched)
|
return generator(route.matched);
|
||||||
})
|
});
|
||||||
|
|
||||||
const dropdownSelect = (key) => {
|
const dropdownSelect = (key) => {
|
||||||
router.push({ name: key })
|
router.push({ name: key });
|
||||||
}
|
};
|
||||||
|
|
||||||
// 刷新页面
|
// 刷新页面
|
||||||
const reloadPage = () => {
|
const reloadPage = () => {
|
||||||
router.push({
|
router.push({
|
||||||
path: '/redirect' + unref(route).fullPath
|
path: '/redirect' + unref(route).fullPath,
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
// 退出登录
|
// 退出登录
|
||||||
const doLogout = () => {
|
const doLogout = () => {
|
||||||
dialog.warning({
|
dialog.info({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
content: '您确定要退出登录吗',
|
content: '您确定要退出登录吗',
|
||||||
positiveText: '确定',
|
positiveText: '确定',
|
||||||
negativeText: '取消',
|
negativeText: '取消',
|
||||||
onPositiveClick: () => {
|
onPositiveClick: () => {
|
||||||
userStore.logout().then((res) => {
|
userStore.logout().then(() => {
|
||||||
message.success('成功退出登录')
|
message.success('成功退出登录');
|
||||||
// 移除标签页
|
// 移除标签页
|
||||||
localStorage.removeItem(TABS_ROUTES)
|
localStorage.removeItem(TABS_ROUTES);
|
||||||
router
|
router
|
||||||
.replace({
|
.replace({
|
||||||
name: 'Login',
|
name: 'Login',
|
||||||
query: {
|
query: {
|
||||||
redirect: route.fullPath
|
redirect: route.fullPath,
|
||||||
}
|
|
||||||
})
|
|
||||||
.finally(() => location.reload())
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
onNegativeClick: () => {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
.finally(() => location.reload());
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onNegativeClick: () => {},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// 切换全屏图标
|
// 切换全屏图标
|
||||||
const toggleFullscreenIcon = () =>
|
const toggleFullscreenIcon = () =>
|
||||||
(state.fullscreenIcon =
|
(state.fullscreenIcon =
|
||||||
document.fullscreenElement !== null ? 'FullscreenExitOutlined' : 'FullscreenOutlined')
|
document.fullscreenElement !== null ? 'FullscreenExitOutlined' : 'FullscreenOutlined');
|
||||||
|
|
||||||
// 监听全屏切换事件
|
// 监听全屏切换事件
|
||||||
document.addEventListener('fullscreenchange', toggleFullscreenIcon)
|
document.addEventListener('fullscreenchange', toggleFullscreenIcon);
|
||||||
|
|
||||||
// 全屏切换
|
// 全屏切换
|
||||||
const toggleFullScreen = () => {
|
const toggleFullScreen = () => {
|
||||||
if (!document.fullscreenElement) {
|
if (!document.fullscreenElement) {
|
||||||
document.documentElement.requestFullscreen()
|
document.documentElement.requestFullscreen();
|
||||||
} else {
|
} else {
|
||||||
if (document.exitFullscreen) {
|
if (document.exitFullscreen) {
|
||||||
document.exitFullscreen()
|
document.exitFullscreen();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 图标列表
|
// 图标列表
|
||||||
const iconList = [
|
const iconList = [
|
||||||
{
|
{
|
||||||
icon: 'SearchOutlined',
|
icon: 'SearchOutlined',
|
||||||
tips: '搜索'
|
tips: '搜索',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'GithubOutlined',
|
icon: 'GithubOutlined',
|
||||||
tips: 'github',
|
tips: 'github',
|
||||||
eventObject: {
|
eventObject: {
|
||||||
click: () => window.open('https://github.com/jekip/naive-ui-admin')
|
click: () => window.open('https://github.com/jekip/naive-ui-admin'),
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'LockOutlined',
|
icon: 'LockOutlined',
|
||||||
tips: '锁屏',
|
tips: '锁屏',
|
||||||
eventObject: {
|
eventObject: {
|
||||||
click: () => useLockscreen.setLock(true)
|
click: () => useLockscreen.setLock(true),
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
]
|
];
|
||||||
const avatarOptions = [
|
const avatarOptions = [
|
||||||
{
|
{
|
||||||
label: '个人中心',
|
label: '个人设置',
|
||||||
key: 1
|
key: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '退出登录',
|
label: '退出登录',
|
||||||
key: 2
|
key: 2,
|
||||||
},
|
},
|
||||||
]
|
];
|
||||||
|
|
||||||
//头像下拉菜单
|
//头像下拉菜单
|
||||||
const avatarSelect = (key) => {
|
const avatarSelect = (key) => {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 1:
|
case 1:
|
||||||
openUserCentre()
|
router.push({ name: 'Setting' });
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
doLogout()
|
doLogout();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
function openSetting() {
|
function openSetting() {
|
||||||
const { openDrawer } = drawerSetting.value
|
const { openDrawer } = drawerSetting.value;
|
||||||
openDrawer()
|
openDrawer();
|
||||||
}
|
|
||||||
|
|
||||||
function openUserCentre() {
|
|
||||||
notification.info({
|
|
||||||
content: '提示',
|
|
||||||
meta: '客官,该功能正在开发中呢...'
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -298,9 +305,9 @@ export default defineComponent({
|
|||||||
reloadPage,
|
reloadPage,
|
||||||
drawerSetting,
|
drawerSetting,
|
||||||
openSetting,
|
openSetting,
|
||||||
}
|
};
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
@@ -311,7 +318,7 @@ export default defineComponent({
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
height: @header-height;
|
height: @header-height;
|
||||||
box-shadow: 0 1px 4px rgb(0 21 41 / 8%);
|
box-shadow: 0 1px 4px rgb(0 21 41 / 8%);
|
||||||
transition: all .2s ease-in-out;
|
transition: all 0.2s ease-in-out;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
z-index: 11;
|
z-index: 11;
|
||||||
//color: #fff;
|
//color: #fff;
|
||||||
@@ -369,7 +376,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: hsla(0, 0%, 100%, .08);
|
background: hsla(0, 0%, 100%, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
.anticon {
|
.anticon {
|
||||||
@@ -389,7 +396,7 @@ export default defineComponent({
|
|||||||
color: #515a6e;
|
color: #515a6e;
|
||||||
|
|
||||||
.n-icon {
|
.n-icon {
|
||||||
color: #515a6e
|
color: #515a6e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-header-left {
|
.layout-header-left {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user