Browse Source

初始化程序

master
超级管理员 3 years ago
parent
commit
08c81e24f4
  1. 5
      .env
  2. 5
      .env.development
  3. 5
      .env.production
  4. 6
      .env.test
  5. 15
      .eslintignore
  6. 25
      .eslintrc.js
  7. 9
      .prettierignore
  8. 122
      index.html
  9. 12955
      package-lock.json
  10. 81
      package.json
  11. 14
      prettier.config.js
  12. BIN
      public/favicon.ico
  13. 17
      public/index.html
  14. 1
      public/vite.svg
  15. 37
      src/App.vue
  16. 108
      src/api/AxiosRequestConfig.md
  17. 44
      src/api/helper/errorCodeType.ts
  18. 57
      src/api/request.ts
  19. 9
      src/api/user.ts
  20. BIN
      src/assets/403_images/403.png
  21. BIN
      src/assets/403_images/403_cloud.png
  22. BIN
      src/assets/404_images/404.png
  23. BIN
      src/assets/404_images/404_cloud.png
  24. 539
      src/assets/iconfont/demo.css
  25. 763
      src/assets/iconfont/demo_index.html
  26. 115
      src/assets/iconfont/iconfont.css
  27. 1
      src/assets/iconfont/iconfont.js
  28. 184
      src/assets/iconfont/iconfont.json
  29. BIN
      src/assets/iconfont/iconfont.ttf
  30. BIN
      src/assets/iconfont/iconfont.woff
  31. BIN
      src/assets/iconfont/iconfont.woff2
  32. BIN
      src/assets/image/allow.png
  33. BIN
      src/assets/image/avatar.png
  34. BIN
      src/assets/image/berserk.jpg
  35. BIN
      src/assets/image/center-inner1.png
  36. BIN
      src/assets/image/charts/1-1-bg.png
  37. BIN
      src/assets/image/circle-bg.png
  38. BIN
      src/assets/image/cro-avatar.jpg
  39. BIN
      src/assets/image/error/401.gif
  40. BIN
      src/assets/image/error/404.jpeg
  41. BIN
      src/assets/image/error/404s.png
  42. BIN
      src/assets/image/login/side-logo.png
  43. BIN
      src/assets/logo.png
  44. 1
      src/assets/lottie/login-side.json
  45. 1
      src/assets/vue.svg
  46. 86
      src/components/AvatarCropper/index.vue
  47. 162
      src/components/Charts/Keyboard.vue
  48. 274
      src/components/Charts/LineMarker.vue
  49. 238
      src/components/Charts/MixChart.vue
  50. 127
      src/components/Charts/gauge/index.vue
  51. 58
      src/components/Charts/mixins/resize.js
  52. 121
      src/components/CodeMirror/index.vue
  53. 5
      src/components/CountTo/index.js
  54. 202
      src/components/CountTo/index.vue
  55. 51
      src/components/CountTo/requestAnimationFrame.js
  56. 269
      src/components/DataScreen/Multiline/index.vue
  57. 179
      src/components/DataScreen/pie/index.vue
  58. 115
      src/components/RightClickMenu/index.vue
  59. 119
      src/components/SearchForm/advancedForm/index.vue
  60. 35
      src/components/SvgIcon/index.vue
  61. 26
      src/components/SwitchDark/index.vue
  62. 304
      src/components/Table/EditableProTable/index.vue
  63. 249
      src/components/Table/PropTable/index.vue
  64. 88
      src/components/Upload/index.vue
  65. 80
      src/components/WangEdior/index.vue
  66. 8
      src/components/pipeline/index.vue
  67. 154
      src/components/pipeline/zb-pipeline-start.vue
  68. 2
      src/config/index.ts
  69. 11
      src/icons/index.js
  70. 1
      src/icons/svg/borrow.svg
  71. 1
      src/icons/svg/compass.svg
  72. 1
      src/icons/svg/dashboard.svg
  73. 1
      src/icons/svg/entrust.svg
  74. 1
      src/icons/svg/example.svg
  75. 1
      src/icons/svg/exit-fullscreen.svg
  76. 1
      src/icons/svg/eye-open.svg
  77. 1
      src/icons/svg/eye.svg
  78. 1
      src/icons/svg/form.svg
  79. 1
      src/icons/svg/fullscreen.svg
  80. 1
      src/icons/svg/go-out.svg
  81. 1
      src/icons/svg/home.svg
  82. 1
      src/icons/svg/horn.svg
  83. 1
      src/icons/svg/inquiry.svg
  84. 1
      src/icons/svg/link.svg
  85. 1
      src/icons/svg/nested.svg
  86. 1
      src/icons/svg/notice.svg
  87. 1
      src/icons/svg/password.svg
  88. 1
      src/icons/svg/put-in.svg
  89. 1
      src/icons/svg/report-form.svg
  90. 1
      src/icons/svg/settings.svg
  91. 1
      src/icons/svg/size.svg
  92. 1
      src/icons/svg/synchronous.svg
  93. 1
      src/icons/svg/table.svg
  94. 1
      src/icons/svg/take-over.svg
  95. 1
      src/icons/svg/task.svg
  96. 1
      src/icons/svg/todo.svg
  97. 1
      src/icons/svg/tree.svg
  98. 1
      src/icons/svg/update.svg
  99. 1
      src/icons/svg/user.svg
  100. 22
      src/icons/svgo.yml

5
.env

@ -0,0 +1,5 @@
# port
VITE_PORT = 8100

5
.env.development

@ -0,0 +1,5 @@
# 本地环境
NODE_ENV = 'development'
# 本地环境接口地址
VUE_APP_BASE_API = '/api'

5
.env.production

@ -0,0 +1,5 @@
# 线上环境
NODE_ENV = "production"
# 线上环境接口地址
VUE_APP_BASE_API = '/api'

6
.env.test

@ -0,0 +1,6 @@
# 测试环境
NODE_ENV = "test"
# 测试环境接口地址
VUE_APP_BASE_API = '/api'

15
.eslintignore

@ -0,0 +1,15 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.husky
.local
/bin
Dockerfile

25
.eslintrc.js

@ -0,0 +1,25 @@
module.exports = {
"env": {
"browser": true,
"es2021": true,
"node":true
},
"extends": [
"eslint:recommended",
"plugin:vue/vue3-essential",
"plugin:@typescript-eslint/recommended",
'plugin:prettier/recommended'
],
"parser": "vue-eslint-parser",
"parserOptions": {
"ecmaVersion": "latest",
"parser": "@typescript-eslint/parser",
"sourceType": "module"
},
"plugins": [
"vue",
"@typescript-eslint"
],
"rules": {
}
}

9
.prettierignore

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

122
index.html

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vue admin perfect</title>
</head>
<body>
<div id="app">
<style>
.first-loading-wrp {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 90vh;
min-height: 90vh;
}
.first-loading-wrp > h1 {
font-size: 30px;
font-weight: bolder;
}
.first-loading-wrp .loading-wrp {
display: flex;
align-items: center;
justify-content: center;
padding: 98px;
}
.dot {
position: relative;
box-sizing: border-box;
display: inline-block;
width: 64px;
height: 64px;
font-size: 64px;
transform: rotate(45deg);
animation: antRotate 1.2s infinite linear;
}
.dot i {
position: absolute;
display: block;
width: 28px;
height: 28px;
background-color: #1890ff;
border-radius: 100%;
opacity: 0.3;
transform: scale(0.75);
transform-origin: 50% 50%;
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: 0.4s;
animation-delay: 0.4s;
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: 0.8s;
animation-delay: 0.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>
<div id="vue-admin-perfect">
<div class="first-loading-wrp">
<div class="loading-wrp">
<span class="dot dot-spin">
<i></i>
<i></i>
<i></i>
<i></i>
</span>
</div>
<h1>vue-admin-perfect</h1>
</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

12955
package-lock.json

File diff suppressed because it is too large

81
package.json

@ -0,0 +1,81 @@
{
"name": "vue-admin-perfect",
"private": true,
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build:dev": "vite build --mode development",
"build:test": "vite build --mode test",
"build:prod": "vite build --mode production",
"build": "vite build",
"preview": "vite preview",
"build:ts": "vue-tsc --noEmit --skipLibCheck && vite build",
"lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix",
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\""
},
"dependencies": {
"@better-scroll/core": "^2.4.2",
"@vueuse/core": "^9.1.1",
"@wangeditor/editor": "^5.1.14",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^0.27.2",
"clipboard": "^2.0.10",
"codemirror": "^5.65.9",
"core-js": "^3.6.5",
"dayjs": "^1.11.4",
"default-passive-events": "^2.0.0",
"echarts": "^5.3.1",
"echarts-liquidfill": "^3.1.0",
"element-plus": "^2.2.21",
"exceljs": "^4.3.0",
"file-saver": "^2.0.5",
"fuse.js": "^6.6.2",
"jszip": "^3.9.1",
"mavon-editor": "^2.10.4",
"md-editor-v3": "^1.11.3",
"nprogress": "^0.2.0",
"path-browserify": "^1.0.1",
"path-to-regexp": "^6.2.0",
"pinia": "^2.0.21",
"pinia-persistedstate-plugin": "^0.1.0",
"pinia-plugin-persistedstate": "^2.1.1",
"print-js": "^1.6.0",
"sass": "^1.54.0",
"splitpanes": "^3.1.1",
"svg-sprite-loader": "^6.0.11",
"vue": "^3.2.39",
"vue-cropper": "^1.0.3",
"vue-cropperjs": "^5.0.0",
"vue-fuse": "^4.1.1",
"vue-mugen-scroll": "^0.2.6",
"vue-qr": "^4.0.6",
"vue-router": "^4.1.6",
"vue-splitpane": "^1.0.6",
"vuedraggable": "^4.1.0",
"vuex": "^4.0.0-0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.32.0",
"@typescript-eslint/parser": "^5.32.0",
"@vitejs/plugin-vue": "^3.0.0",
"consola": "^2.15.3",
"dart-sass": "^1.25.0",
"eslint": "^8.21.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.3.0",
"fast-glob": "^3.2.11",
"prettier": "^2.7.1",
"typescript": "^4.6.4",
"unplugin-auto-import": "^0.10.3",
"unplugin-vue-components": "^0.21.2",
"unplugin-vue-define-options": "^0.7.3",
"vite": "^3.0.0",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-vue-setup-extend": "^0.4.0",
"vue-tsc": "^0.38.4"
}
}

14
prettier.config.js

@ -0,0 +1,14 @@
module.exports = {
// 一行的字符数,如果超过会进行换行,默认为80
printWidth: 100,
// 行位是否使用分号,默认为true
semi: false,
vueIndentScriptAndStyle: true,
// 字符串是否使用单引号,默认为false,使用双引号
singleQuote: true,
// 是否使用尾逗号,有三个可选值"<none|es5|all>"
trailingComma: 'all',
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
};

BIN
public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

17
public/index.html

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

1
public/vite.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

37
src/App.vue

@ -0,0 +1,37 @@
<template>
<el-config-provider :size="globalComSize" :locale="zhCn">
<router-view></router-view>
</el-config-provider>
</template>
<script lang="ts" setup>
import {computed} from "vue";
import {useSettingStore} from "@/store/modules/setting"
// element
import zhCn from 'element-plus/es/locale/lang/zh-cn'
const SettingStore = useSettingStore()
//
const globalComSize = computed(():string=>SettingStore.themeConfig.globalComSize)
</script>
<style lang="scss">
#app {
position: relative;
width: 100%;
height: 100%;
font-family: Avenir, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #2c3e50;
}
.el-pager li:focus {
border: none;
}
.el-dropdown:focus {
border: none;
}
.svg-icon:focus {
border: none;
}
</style>

108
src/api/AxiosRequestConfig.md

@ -0,0 +1,108 @@
```
export interface AxiosRequestConfig {
// `url` 是用于请求的服务器 URL
url?: string;
// `method` 是创建请求时使用的方法
method?: Method;
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL?: string;
// `transformRequest` 允许在向服务器发送前,修改请求数据
// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
transformRequest?: AxiosTransformer | AxiosTransformer[];
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse?: AxiosTransformer | AxiosTransformer[];
// `headers` 是即将被发送的自定义请求头
headers?: any;
// `params` 是即将与请求一起发送的 URL 参数
// 必须是一个无格式对象(plain object)或 URLSearchParams 对象
params?: any;
// `paramsSerializer` 是一个负责 `params` 序列化的函数
paramsSerializer?: (params: any) => string;
// `data` 是作为请求主体被发送的数据
// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
// 在没有设置 `transformRequest` 时,必须是以下类型之一:
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
// - 浏览器专属:FormData, File, Blob
// - Node 专属: Stream
data?: any;
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求话费了超过 `timeout` 的时间,请求将被中断
timeout?: number;
// 超时提示消息
timeoutErrorMessage?: string;
// `withCredentials` 表示跨域请求时是否需要使用凭证
withCredentials?: boolean;
// `adapter` 允许自定义处理请求,以使测试更轻松
adapter?: AxiosAdapter;
// `auth` 表示应该使用 HTTP 基础验证,并提供凭据
auth?: AxiosBasicCredentials;
// `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType?: ResponseType;
// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
xsrfCookieName?: string;
// `xsrfHeaderName` 是携带 xsrf 令牌值的 http 标头的名称
xsrfHeaderName?: string;
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress?: (progressEvent: any) => void;
// `onDownloadProgress` 允许为下载处理进度事件
onDownloadProgress?: (progressEvent: any) => void;
// `maxContentLength` 定义允许的响应内容的最大尺寸
maxContentLength?: number;
// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。
// 如果 `validateStatus` 返回 `true` (或者设置为 `null``undefined`),
// promise 将被 resolve; 否则,promise 将被 rejecte
validateStatus?: ((status: number) => boolean) | null;
// 请求体最大尺寸
maxBodyLength?: number;
// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
// 如果设置为0,将不会 follow 任何重定向
maxRedirects?: number;
// `socketPath` 定义了一个在 node.js 中使用的 UNIX Socket。
// 只能指定 `socketPath``proxy`
// 如果两者都指定,则使用 `socketPath`
socketPath?: string | null;
// `httpAgent``httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。
httpAgent?: any;
httpsAgent?: any;
// 'proxy' 定义代理服务器的主机名称和端口
proxy?: AxiosProxyConfig | false;
// `cancelToken` 指定用于取消请求的 cancel token
cancelToken?: CancelToken;
// 将其设置为`false`,它将不会解压缩您的响应,而是保留原始的Content-Encoding头。
// 默认是true
decompress?: boolean;
// 控制响应数据是否转换
transitional?: TransitionalOptions
}
```

44
src/api/helper/errorCodeType.ts

@ -0,0 +1,44 @@
export const errorCodeType = function(code:string):string{
let errMessage:string = "未知错误"
switch (code) {
case 400:
errMessage = '请求失败!请您稍后重试'
break
case 401:
errMessage = '未授权,请重新登录'
break
case 403:
errMessage = '当前账号无权限访问!'
break
case 404:
errMessage = '你所访问的资源不存在!'
break
case 405:
errMessage = '请求方式错误!请您稍后重试'
break
case 408:
errMessage = '请求超时!请您稍后重试'
break
case 500:
errMessage = '服务器端出错'
break
case 501:
errMessage = '网络未实现'
break
case 502:
errMessage = '网络错误'
break
case 503:
errMessage = '服务不可用'
break
case 504:
errMessage = '网络超时'
break
case 505:
errMessage = 'http版本不支持该请求'
break
default:
errMessage = `其他连接错误 --${code}`
}
return errMessage
}

57
src/api/request.ts

@ -0,0 +1,57 @@
import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from "element-plus";
import {useUserStore} from "@/store/modules/user"
// 创建axios实例 进行基本参数配置
const service = axios.create({
// 默认请求地址,根据环境的不同可在.env 文件中进行修改
baseURL: import.meta.env.VUE_APP_BASE_API,
// 设置接口访问超时时间
timeout: 3000000, // request timeout,
// 跨域时候允许携带凭证
withCredentials: true
})
// request interceptor 接口请求拦截
service.interceptors.request.use((config:AxiosRequestConfig)=>{
/**
* token,token进行JWT校验
* token storagevuexpinia
*/
const userStore = useUserStore();
const token: string = userStore.token;
// 自定义请求头
if(token){ config.headers['Authorization'] = token}
return config
},(error: AxiosError) => {
// 请求错误,这里可以用全局提示框进行提示
return Promise.reject(error);
})
// response interceptor 接口响应拦截
service.interceptors.response.use((response: AxiosResponse) =>{
// 直接返回res,当然你也可以只返回res.data
// 系统如果有自定义code也可以在这里处理
return response
},(error: AxiosError) => {
return Promise.reject(error)
})
/**
* @description
* opt
* err
* type
* duration
*/
function showErrMessage (opt, err, type:any= 'error', duration:number = 5000){
ElMessage({
message: err.msg,
type:type,
duration: duration
})
}
export default service

9
src/api/user.ts

@ -0,0 +1,9 @@
import request from './request'
export function login(data) {
return request({
url: '/vue-element-perfect/user/login',
method: 'post',
data
})
}

BIN
src/assets/403_images/403.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

BIN
src/assets/403_images/403_cloud.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
src/assets/404_images/404.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
src/assets/404_images/404_cloud.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

539
src/assets/iconfont/demo.css

@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

763
src/assets/iconfont/demo_index.html

@ -0,0 +1,763 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iconfont Demo</title>
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
<script src="iconfont.js"></script>
<!-- jQuery -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
<!-- 代码高亮 -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
<style>
.main .logo {
margin-top: 0;
height: auto;
}
.main .logo a {
display: flex;
align-items: center;
}
.main .logo .sub-title {
margin-left: 0.5em;
font-size: 22px;
color: #fff;
background: linear-gradient(-45deg, #3967FF, #B500FE);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div class="main">
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
</a></h1>
<div class="nav-tabs">
<ul id="tabs" class="dib-box">
<li class="dib active"><span>Unicode</span></li>
<li class="dib"><span>Font class</span></li>
<li class="dib"><span>Symbol</span></li>
</ul>
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3641732" target="_blank" class="nav-more">查看项目</a>
</div>
<div class="tab-container">
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe6a0;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe6a0;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6a7;</span>
<div class="name">大暴雨</div>
<div class="code-name">&amp;#xe6a7;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe627;</span>
<div class="name">刷新</div>
<div class="code-name">&amp;#xe627;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe629;</span>
<div class="name">刷新</div>
<div class="code-name">&amp;#xe629;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe68d;</span>
<div class="name">多云-2-copy</div>
<div class="code-name">&amp;#xe68d;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe679;</span>
<div class="name">多云-1</div>
<div class="code-name">&amp;#xe679;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67a;</span>
<div class="name">大雪</div>
<div class="code-name">&amp;#xe67a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67b;</span>
<div class="name">大雨</div>
<div class="code-name">&amp;#xe67b;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67c;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe67c;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67d;</span>
<div class="name">多云-3</div>
<div class="code-name">&amp;#xe67d;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67e;</span>
<div class="name">多云-2</div>
<div class="code-name">&amp;#xe67e;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe67f;</span>
<div class="name">雷雨交加</div>
<div class="code-name">&amp;#xe67f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe680;</span>
<div class="name">多云</div>
<div class="code-name">&amp;#xe680;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe681;</span>
<div class="name">中雨</div>
<div class="code-name">&amp;#xe681;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe682;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe682;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe683;</span>
<div class="name">小雨</div>
<div class="code-name">&amp;#xe683;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe684;</span>
<div class="name">小雪</div>
<div class="code-name">&amp;#xe684;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe685;</span>
<div class="name">闪电</div>
<div class="code-name">&amp;#xe685;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe686;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe686;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe687;</span>
<div class="name">中雪</div>
<div class="code-name">&amp;#xe687;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe688;</span>
<div class="name">扬尘</div>
<div class="code-name">&amp;#xe688;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe689;</span>
<div class="name">月亮</div>
<div class="code-name">&amp;#xe689;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe68a;</span>
<div class="name">雨夹雪</div>
<div class="code-name">&amp;#xe68a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe68b;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe68b;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe68c;</span>
<div class="name"></div>
<div class="code-name">&amp;#xe68c;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
<hr>
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
</blockquote>
<p>Unicode 使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1663216428515') format('woff2'),
url('iconfont.woff?t=1663216428515') format('woff'),
url('iconfont.ttf?t=1663216428515') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-yin"></span>
<div class="name">
</div>
<div class="code-name">.icon-yin
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-dabaoyu"></span>
<div class="name">
大暴雨
</div>
<div class="code-name">.icon-dabaoyu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shuaxin1"></span>
<div class="name">
刷新
</div>
<div class="code-name">.icon-shuaxin1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shuaxin"></span>
<div class="name">
刷新
</div>
<div class="code-name">.icon-shuaxin
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-duoyun-2-copy"></span>
<div class="name">
多云-2-copy
</div>
<div class="code-name">.icon-duoyun-2-copy
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-duoyun-1"></span>
<div class="name">
多云-1
</div>
<div class="code-name">.icon-duoyun-1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-daxue"></span>
<div class="name">
大雪
</div>
<div class="code-name">.icon-daxue
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-dayu"></span>
<div class="name">
大雨
</div>
<div class="code-name">.icon-dayu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-feng"></span>
<div class="name">
</div>
<div class="code-name">.icon-feng
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-duoyun-3"></span>
<div class="name">
多云-3
</div>
<div class="code-name">.icon-duoyun-3
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-duoyun-2"></span>
<div class="name">
多云-2
</div>
<div class="code-name">.icon-duoyun-2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-leiyujiaojia"></span>
<div class="name">
雷雨交加
</div>
<div class="code-name">.icon-leiyujiaojia
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-duoyun"></span>
<div class="name">
多云
</div>
<div class="code-name">.icon-duoyun
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhongyu"></span>
<div class="name">
中雨
</div>
<div class="code-name">.icon-zhongyu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-wu"></span>
<div class="name">
</div>
<div class="code-name">.icon-wu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xiaoyu"></span>
<div class="name">
小雨
</div>
<div class="code-name">.icon-xiaoyu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xiaoxue"></span>
<div class="name">
小雪
</div>
<div class="code-name">.icon-xiaoxue
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shandian"></span>
<div class="name">
闪电
</div>
<div class="code-name">.icon-shandian
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xue"></span>
<div class="name">
</div>
<div class="code-name">.icon-xue
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhongxue"></span>
<div class="name">
中雪
</div>
<div class="code-name">.icon-zhongxue
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yangchen"></span>
<div class="name">
扬尘
</div>
<div class="code-name">.icon-yangchen
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yueliang"></span>
<div class="name">
月亮
</div>
<div class="code-name">.icon-yueliang
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yujiaxue"></span>
<div class="name">
雨夹雪
</div>
<div class="code-name">.icon-yujiaxue
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-qing"></span>
<div class="name">
</div>
<div class="code-name">.icon-qing
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-mai"></span>
<div class="name">
</div>
<div class="code-name">.icon-mai
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
<hr>
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
<p>与 Unicode 使用方式相比,具有如下特点:</p>
<ul>
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
</code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yin"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-yin</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-dabaoyu"></use>
</svg>
<div class="name">大暴雨</div>
<div class="code-name">#icon-dabaoyu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shuaxin1"></use>
</svg>
<div class="name">刷新</div>
<div class="code-name">#icon-shuaxin1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shuaxin"></use>
</svg>
<div class="name">刷新</div>
<div class="code-name">#icon-shuaxin</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-duoyun-2-copy"></use>
</svg>
<div class="name">多云-2-copy</div>
<div class="code-name">#icon-duoyun-2-copy</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-duoyun-1"></use>
</svg>
<div class="name">多云-1</div>
<div class="code-name">#icon-duoyun-1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-daxue"></use>
</svg>
<div class="name">大雪</div>
<div class="code-name">#icon-daxue</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-dayu"></use>
</svg>
<div class="name">大雨</div>
<div class="code-name">#icon-dayu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-feng"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-feng</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-duoyun-3"></use>
</svg>
<div class="name">多云-3</div>
<div class="code-name">#icon-duoyun-3</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-duoyun-2"></use>
</svg>
<div class="name">多云-2</div>
<div class="code-name">#icon-duoyun-2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-leiyujiaojia"></use>
</svg>
<div class="name">雷雨交加</div>
<div class="code-name">#icon-leiyujiaojia</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-duoyun"></use>
</svg>
<div class="name">多云</div>
<div class="code-name">#icon-duoyun</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhongyu"></use>
</svg>
<div class="name">中雨</div>
<div class="code-name">#icon-zhongyu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-wu"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-wu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xiaoyu"></use>
</svg>
<div class="name">小雨</div>
<div class="code-name">#icon-xiaoyu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xiaoxue"></use>
</svg>
<div class="name">小雪</div>
<div class="code-name">#icon-xiaoxue</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shandian"></use>
</svg>
<div class="name">闪电</div>
<div class="code-name">#icon-shandian</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xue"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-xue</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhongxue"></use>
</svg>
<div class="name">中雪</div>
<div class="code-name">#icon-zhongxue</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yangchen"></use>
</svg>
<div class="name">扬尘</div>
<div class="code-name">#icon-yangchen</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yueliang"></use>
</svg>
<div class="name">月亮</div>
<div class="code-name">#icon-yueliang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yujiaxue"></use>
</svg>
<div class="name">雨夹雪</div>
<div class="code-name">#icon-yujiaxue</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-qing"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-qing</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-mai"></use>
</svg>
<div class="name"></div>
<div class="code-name">#icon-mai</div>
</li>
</ul>
<div class="article markdown">
<h2 id="symbol-">Symbol 引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
<pre><code class="language-html">&lt;style&gt;
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
&lt;/style&gt;
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
&lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
&lt;/svg&gt;
</code></pre>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.tab-container .content:first').show()
$('#tabs li').click(function (e) {
var tabContent = $('.tab-container .content')
var index = $(this).index()
if ($(this).hasClass('active')) {
return
} else {
$('#tabs li').removeClass('active')
$(this).addClass('active')
tabContent.hide().eq(index).fadeIn()
}
})
})
</script>
</body>
</html>

115
src/assets/iconfont/iconfont.css

@ -0,0 +1,115 @@
@font-face {
font-family: "iconfont"; /* Project id 3641732 */
src: url('./iconfont.woff2?t=1663216428515') format('woff2'),
url('./iconfont.woff?t=1663216428515') format('woff'),
url('./iconfont.ttf?t=1663216428515') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-yin:before {
content: "\e6a0";
}
.icon-dabaoyu:before {
content: "\e6a7";
}
.icon-shuaxin1:before {
content: "\e627";
}
.icon-shuaxin:before {
content: "\e629";
}
.icon-duoyun-2-copy:before {
content: "\e68d";
}
.icon-duoyun-1:before {
content: "\e679";
}
.icon-daxue:before {
content: "\e67a";
}
.icon-dayu:before {
content: "\e67b";
}
.icon-feng:before {
content: "\e67c";
}
.icon-duoyun-3:before {
content: "\e67d";
}
.icon-duoyun-2:before {
content: "\e67e";
}
.icon-leiyujiaojia:before {
content: "\e67f";
}
.icon-duoyun:before {
content: "\e680";
}
.icon-zhongyu:before {
content: "\e681";
}
.icon-wu:before {
content: "\e682";
}
.icon-xiaoyu:before {
content: "\e683";
}
.icon-xiaoxue:before {
content: "\e684";
}
.icon-shandian:before {
content: "\e685";
}
.icon-xue:before {
content: "\e686";
}
.icon-zhongxue:before {
content: "\e687";
}
.icon-yangchen:before {
content: "\e688";
}
.icon-yueliang:before {
content: "\e689";
}
.icon-yujiaxue:before {
content: "\e68a";
}
.icon-qing:before {
content: "\e68b";
}
.icon-mai:before {
content: "\e68c";
}

1
src/assets/iconfont/iconfont.js

File diff suppressed because one or more lines are too long

184
src/assets/iconfont/iconfont.json

@ -0,0 +1,184 @@
{
"id": "3641732",
"name": "weather",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "28557556",
"name": "阴",
"font_class": "yin",
"unicode": "e6a0",
"unicode_decimal": 59040
},
{
"icon_id": "28557770",
"name": "大暴雨",
"font_class": "dabaoyu",
"unicode": "e6a7",
"unicode_decimal": 59047
},
{
"icon_id": "7724796",
"name": "刷新",
"font_class": "shuaxin1",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "6999224",
"name": "刷新",
"font_class": "shuaxin",
"unicode": "e629",
"unicode_decimal": 58921
},
{
"icon_id": "31772217",
"name": "多云-2-copy",
"font_class": "duoyun-2-copy",
"unicode": "e68d",
"unicode_decimal": 59021
},
{
"icon_id": "29265274",
"name": "多云-1",
"font_class": "duoyun-1",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "29265275",
"name": "大雪",
"font_class": "daxue",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "29265276",
"name": "大雨",
"font_class": "dayu",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "29265277",
"name": "风",
"font_class": "feng",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "29265278",
"name": "多云-3",
"font_class": "duoyun-3",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "29265279",
"name": "多云-2",
"font_class": "duoyun-2",
"unicode": "e67e",
"unicode_decimal": 59006
},
{
"icon_id": "29265280",
"name": "雷雨交加",
"font_class": "leiyujiaojia",
"unicode": "e67f",
"unicode_decimal": 59007
},
{
"icon_id": "29265281",
"name": "多云",
"font_class": "duoyun",
"unicode": "e680",
"unicode_decimal": 59008
},
{
"icon_id": "29265282",
"name": "中雨",
"font_class": "zhongyu",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "29265283",
"name": "雾",
"font_class": "wu",
"unicode": "e682",
"unicode_decimal": 59010
},
{
"icon_id": "29265284",
"name": "小雨",
"font_class": "xiaoyu",
"unicode": "e683",
"unicode_decimal": 59011
},
{
"icon_id": "29265285",
"name": "小雪",
"font_class": "xiaoxue",
"unicode": "e684",
"unicode_decimal": 59012
},
{
"icon_id": "29265286",
"name": "闪电",
"font_class": "shandian",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "29265287",
"name": "雪",
"font_class": "xue",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "29265288",
"name": "中雪",
"font_class": "zhongxue",
"unicode": "e687",
"unicode_decimal": 59015
},
{
"icon_id": "29265289",
"name": "扬尘",
"font_class": "yangchen",
"unicode": "e688",
"unicode_decimal": 59016
},
{
"icon_id": "29265290",
"name": "月亮",
"font_class": "yueliang",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "29265291",
"name": "雨夹雪",
"font_class": "yujiaxue",
"unicode": "e68a",
"unicode_decimal": 59018
},
{
"icon_id": "29265292",
"name": "晴",
"font_class": "qing",
"unicode": "e68b",
"unicode_decimal": 59019
},
{
"icon_id": "29265293",
"name": "霾",
"font_class": "mai",
"unicode": "e68c",
"unicode_decimal": 59020
}
]
}

BIN
src/assets/iconfont/iconfont.ttf

Binary file not shown.

BIN
src/assets/iconfont/iconfont.woff

Binary file not shown.

BIN
src/assets/iconfont/iconfont.woff2

Binary file not shown.

BIN
src/assets/image/allow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

BIN
src/assets/image/avatar.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
src/assets/image/berserk.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
src/assets/image/center-inner1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
src/assets/image/charts/1-1-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
src/assets/image/circle-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
src/assets/image/cro-avatar.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
src/assets/image/error/401.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
src/assets/image/error/404.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
src/assets/image/error/404s.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
src/assets/image/login/side-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

BIN
src/assets/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

1
src/assets/lottie/login-side.json

File diff suppressed because one or more lines are too long

1
src/assets/vue.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

86
src/components/AvatarCropper/index.vue

@ -0,0 +1,86 @@
<template>
<vue-cropper
ref="cropper"
:img="avatarUrl"
:output-size="defaultOptions.outputSize"
:output-type="defaultOptions.outputType"
:info="defaultOptions.info"
:full="defaultOptions.full"
:fixed="defaultOptions.fixed"
:autoCropWidth="defaultOptions.autoCropWidth"
:autoCropHeight="defaultOptions.autoCropHeight"
:fixed-box="defaultOptions.fixedBox"
:auto-crop="defaultOptions.autoCrop"
:center-box="defaultOptions.centerBox"
@real-time="realTime"
/>
</template>
<script lang="ts" setup>
import {defineExpose, reactive, ref} from 'vue'
import { VueCropper } from 'vue-cropper'
import 'vue-cropper/dist/index.css'
const emit = defineEmits(['change'])
let props = defineProps({
avatarUrl:{
type:String
},
options:{
type:Object,
default:()=>{}
}
})
let cropper = ref()
const defaultOptions = reactive({
outputSize:0.8, //
outputType: 'png', //
info: true, //
fixed: true, //
autoCrop: true, //
anMoveBox: true, //
original: false, //
autoCropWidth: 300, //
autoCropHeight: 300, //
//
centerBox: false, //
high: true, // dpr
fixedBox: false, //
full: false, //
...props.options
})
const getBase64 = ()=>{
return new Promise(resolve => {
cropper.value.getCropData((data) => {
resolve(data)
})
})
}
const rotateLeft = () => {
cropper.value.rotateLeft()
}
const rotateRight = () => {
cropper.value.rotateRight()
}
const zoom = (percent) => {
cropper.value.changeScale(percent)
}
//
const realTime = (data)=>{
emit('change',data)
}
defineExpose({
getBase64,
rotateLeft,
rotateRight,
zoom
})
</script>

162
src/components/Charts/Keyboard.vue

@ -0,0 +1,162 @@
<template>
<div :id="id" :class="className" :style="{ height: height, width: width }" />
</template>
<script lang="ts">
import echarts from 'echarts'
import resize from './mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart',
},
id: {
type: String,
default: 'chart',
},
width: {
type: String,
default: '200px',
},
height: {
type: String,
default: '200px',
},
},
data() {
return {
chart: null,
}
},
mounted() {
this.initChart()
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(document.getElementById(this.id))
const xAxisData = []
const data = []
const data2 = []
for (let i = 0; i < 50; i++) {
xAxisData.push(i)
data.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5)
data2.push((Math.sin(i / 5) * (i / 5 + 10) + i / 6) * 3)
}
this.chart.setOption({
backgroundColor: '#08263a',
grid: {
left: '5%',
right: '5%',
},
xAxis: [
{
show: false,
data: xAxisData,
},
{
show: false,
data: xAxisData,
},
],
visualMap: {
show: false,
min: 0,
max: 50,
dimension: 0,
inRange: {
color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055'],
},
},
yAxis: {
axisLine: {
show: false,
},
axisLabel: {
textStyle: {
color: '#4a657a',
},
},
splitLine: {
show: true,
lineStyle: {
color: '#08263f',
},
},
axisTick: {
show: false,
},
},
series: [
{
name: 'back',
type: 'bar',
data: data2,
z: 1,
itemStyle: {
normal: {
opacity: 0.4,
barBorderRadius: 5,
shadowBlur: 3,
shadowColor: '#111',
},
},
},
{
name: 'Simulate Shadow',
type: 'line',
data,
z: 2,
showSymbol: false,
animationDelay: 0,
animationEasing: 'linear',
animationDuration: 1200,
lineStyle: {
normal: {
color: 'transparent',
},
},
areaStyle: {
normal: {
color: '#08263a',
shadowBlur: 50,
shadowColor: '#000',
},
},
},
{
name: 'front',
type: 'bar',
data,
xAxisIndex: 1,
z: 3,
itemStyle: {
normal: {
barBorderRadius: 5,
},
},
},
],
animationEasing: 'elasticOut',
animationEasingUpdate: 'elasticOut',
animationDelay(idx) {
return idx * 20
},
animationDelayUpdate(idx) {
return idx * 20
},
})
},
},
}
</script>

274
src/components/Charts/LineMarker.vue

@ -0,0 +1,274 @@
<template>
<div :id="id" :class="className" :style="{ height: height, width: width }" />
</template>
<script lang="ts" setup>
import * as echarts from 'echarts'
import { computed, nextTick, onMounted, ref, watch } from 'vue'
import { EChartsType } from 'echarts/core'
let props = defineProps({
className: {
type: String,
default: 'chart',
},
id: {
type: String,
default: 'chart',
},
width: {
type: String,
default: '200px',
},
height: {
type: String,
default: '200px',
},
})
const isCollapse = computed(() => {
return store.state.app.isCollapse
})
let chart: EChartsType
const initChart = () => {
let chart = echarts.init(document.getElementById(props.id))
chart.setOption({
backgroundColor: '#394056',
title: {
top: 20,
text: 'Requests',
textStyle: {
fontWeight: 'normal',
fontSize: 16,
color: '#F1F1F3',
},
left: '1%',
},
tooltip: {
trigger: 'axis',
axisPointer: {
lineStyle: {
color: '#57617B',
},
},
},
legend: {
top: 20,
icon: 'rect',
itemWidth: 14,
itemHeight: 5,
itemGap: 13,
data: ['CMCC', 'CTCC', 'CUCC'],
right: '4%',
textStyle: {
fontSize: 12,
color: '#F1F1F3',
},
},
grid: {
top: 100,
left: '2%',
right: '2%',
bottom: '2%',
containLabel: true,
},
xAxis: [
{
type: 'category',
boundaryGap: false,
axisLine: {
lineStyle: {
color: '#57617B',
},
},
data: [
'13:00',
'13:05',
'13:10',
'13:15',
'13:20',
'13:25',
'13:30',
'13:35',
'13:40',
'13:45',
'13:50',
'13:55',
],
},
],
yAxis: [
{
type: 'value',
name: '(%)',
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: '#57617B',
},
},
axisLabel: {
margin: 10,
textStyle: {
fontSize: 14,
},
},
splitLine: {
lineStyle: {
color: '#57617B',
},
},
},
],
series: [
{
name: 'CMCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
normal: {
width: 1,
},
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: 'rgba(137, 189, 27, 0.3)',
},
{
offset: 0.8,
color: 'rgba(137, 189, 27, 0)',
},
],
false,
),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10,
},
},
itemStyle: {
normal: {
color: 'rgb(137,189,27)',
borderColor: 'rgba(137,189,2,0.27)',
borderWidth: 12,
},
},
data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122],
},
{
name: 'CTCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
normal: {
width: 1,
},
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: 'rgba(0, 136, 212, 0.3)',
},
{
offset: 0.8,
color: 'rgba(0, 136, 212, 0)',
},
],
false,
),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10,
},
},
itemStyle: {
normal: {
color: 'rgb(0,136,212)',
borderColor: 'rgba(0,136,212,0.2)',
borderWidth: 12,
},
},
data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150],
},
{
name: 'CUCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
normal: {
width: 1,
},
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: 'rgba(219, 50, 51, 0.3)',
},
{
offset: 0.8,
color: 'rgba(219, 50, 51, 0)',
},
],
false,
),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10,
},
},
itemStyle: {
normal: {
color: 'rgb(219,50,51)',
borderColor: 'rgba(219,50,51,0.2)',
borderWidth: 12,
},
},
data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122],
},
],
})
return chart
}
watch(isCollapse, () => {
setTimeout(() => {
chart && chart.resize()
}, 300)
})
onMounted(() => {
chart = initChart()
window.addEventListener('resize', function () {
chart && chart.resize()
})
})
</script>

238
src/components/Charts/MixChart.vue

@ -0,0 +1,238 @@
<template>
<div :id="id" :class="className" :style="{ height: height, width: width }" />
</template>
<script lang="ts">
import echarts from 'echarts'
import resize from './mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart',
},
id: {
type: String,
default: 'chart',
},
width: {
type: String,
default: '200px',
},
height: {
type: String,
default: '200px',
},
},
data() {
return {
chart: null,
}
},
mounted() {
this.initChart()
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(document.getElementById(this.id))
const xData = (function () {
const data = []
for (let i = 1; i < 13; i++) {
data.push(i + 'month')
}
return data
})()
this.chart.setOption({
backgroundColor: '#344b58',
title: {
text: 'statistics',
x: '20',
top: '20',
textStyle: {
color: '#fff',
fontSize: '22',
},
subtextStyle: {
color: '#90979c',
fontSize: '16',
},
},
tooltip: {
trigger: 'axis',
axisPointer: {
textStyle: {
color: '#fff',
},
},
},
grid: {
left: '5%',
right: '5%',
borderWidth: 0,
top: 150,
bottom: 95,
textStyle: {
color: '#fff',
},
},
legend: {
x: '5%',
top: '10%',
textStyle: {
color: '#90979c',
},
data: ['female', 'male', 'average'],
},
calculable: true,
xAxis: [
{
type: 'category',
axisLine: {
lineStyle: {
color: '#90979c',
},
},
splitLine: {
show: false,
},
axisTick: {
show: false,
},
splitArea: {
show: false,
},
axisLabel: {
interval: 0,
},
data: xData,
},
],
yAxis: [
{
type: 'value',
splitLine: {
show: false,
},
axisLine: {
lineStyle: {
color: '#90979c',
},
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
},
splitArea: {
show: false,
},
},
],
dataZoom: [
{
show: true,
height: 30,
xAxisIndex: [0],
bottom: 30,
start: 10,
end: 80,
handleIcon:
'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
handleSize: '110%',
handleStyle: {
color: '#d3dee5',
},
textStyle: {
color: '#fff',
},
borderColor: '#90979c',
},
{
type: 'inside',
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: 'female',
type: 'bar',
stack: 'total',
barMaxWidth: 35,
barGap: '10%',
itemStyle: {
normal: {
color: 'rgba(255,144,128,1)',
label: {
show: true,
textStyle: {
color: '#fff',
},
position: 'insideTop',
formatter(p) {
return p.value > 0 ? p.value : ''
},
},
},
},
data: [709, 1917, 2455, 2610, 1719, 1433, 1544, 3285, 5208, 3372, 2484, 4078],
},
{
name: 'male',
type: 'bar',
stack: 'total',
itemStyle: {
normal: {
color: 'rgba(0,191,183,1)',
barBorderRadius: 0,
label: {
show: true,
position: 'top',
formatter(p) {
return p.value > 0 ? p.value : ''
},
},
},
},
data: [327, 1776, 507, 1200, 800, 482, 204, 1390, 1001, 951, 381, 220],
},
{
name: 'average',
type: 'line',
stack: 'total',
symbolSize: 10,
symbol: 'circle',
itemStyle: {
normal: {
color: 'rgba(252,230,48,1)',
barBorderRadius: 0,
label: {
show: true,
position: 'top',
formatter(p) {
return p.value > 0 ? p.value : ''
},
},
},
},
data: [1036, 3693, 2962, 3810, 2519, 1915, 1748, 4675, 6209, 4323, 2865, 4298],
},
],
})
},
},
}
</script>

127
src/components/Charts/gauge/index.vue

@ -0,0 +1,127 @@
<template>
<div class="echarts" ref="echarts"></div>
</template>
<script>
import * as echarts from "echarts";
export default {
data(){
return{
chart:null
}
},
methods:{
initEcharts(){
let option = {
series: [
{
type: 'gauge',
startAngle: 180,
endAngle: 0,
center: ['50%', '80%'],
radius: '100%',
min: 0,
max: 1,
z: 5,
splitNumber: 12,
axisLine: {
show: true,
lineStyle: {
width: 6,
color: [
[0.12, "#d92d4d"],
[0.35, "#eb8349"],
[0.63, "#e6e462"],
[0.8, "#74c7da"],
[1, "#67b45a"],
]
}
},
axisTick: {
splitNumber: 13,
show: true,
lineStyle: {
color: "auto",
width: 2,
},
length: 17,
},
splitLine: {
length: 25,
lineStyle: {
color: 'auto',
width: 8
}
},
axisLabel: {
color: '#a0a7b8',
fontSize: 20,
distance: -60,
rotate: 'tangential',
formatter: function (value) {
var value = value.toFixed(2);
if (value == 0.0) {
return "危";
} else if (value == 0.25) {
return "差";
} else if (value == 0.5) {
return "中";
} else if (value == 0.75) {
return "良";
} else if (value == 1.0) {
return "优";
} else {
return "";
}
}
},
title: {
offsetCenter: [0, '-10%'],
fontSize: 20
},
anchor: {
show: true,
showAbove: true,
size: 25,
itemStyle: {
borderWidth: 10
}
},
detail: {
fontSize: 30,
offsetCenter: [0, '-25%'],
valueAnimation: true,
formatter: function (value) {
return Math.round(value * 100);
},
color: 'auto'
},
data: [
{
value: 0.7,
name: 'Grade Rating'
}
]
}
]
};
this.chart = echarts.init(this.$refs.echarts)
this.chart.setOption(option)
}
},
mounted() {
this.initEcharts()
}
}
</script>
<style lang="scss" scoped>
.echarts {
width: 100%;
height: 100%;
}
</style>

58
src/components/Charts/mixins/resize.js

@ -0,0 +1,58 @@
import { debounce } from '@/utils/index.js'
export default {
data() {
return {
$_sidebarElm: null,
$_resizeHandler: null,
}
},
mounted() {
this.initListener()
},
activated() {
if (!this.$_resizeHandler) {
// avoid duplication init
this.initListener()
}
// when keep-alive chart activated, auto resize
this.resize()
},
beforeDestroy() {
this.destroyListener()
},
deactivated() {
this.destroyListener()
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_sidebarResizeHandler(e) {
if (e.propertyName === 'width') {
this.$_resizeHandler()
}
},
initListener() {
this.$_resizeHandler = debounce(() => {
this.resize()
}, 100)
window.addEventListener('resize', this.$_resizeHandler)
this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
this.$_sidebarElm &&
this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
},
destroyListener() {
window.removeEventListener('resize', this.$_resizeHandler)
this.$_resizeHandler = null
this.$_sidebarElm &&
this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
},
resize() {
const { chart } = this
chart && chart.resize()
},
},
}

121
src/components/CodeMirror/index.vue

@ -0,0 +1,121 @@
<template>
<textarea ref="codeEditor" placeholder="请输入..." ></textarea>
</template>
<script>
import { defineComponent, onBeforeUnmount, onMounted, ref, toRefs, watch } from "vue";
// codemirror
import _CodeMirror from "codemirror";
import "codemirror/lib/codemirror.css";
// language
import 'codemirror/mode/javascript/javascript.js'
// theme css
import 'codemirror/theme/monokai.css'
// :
import "codemirror/addon/fold/foldgutter.css";
import "codemirror/addon/fold/foldcode.js";
import "codemirror/addon/fold/brace-fold.js";
import "codemirror/addon/fold/comment-fold.js";
import "codemirror/addon/fold/indent-fold.js";
import "codemirror/addon/fold/foldgutter.js";
// :
// :
import "codemirror/addon/scroll/annotatescrollbar.js";
import "codemirror/addon/search/matchesonscrollbar.js";
import "codemirror/addon/search/match-highlighter.js";
import "codemirror/addon/search/jump-to-line.js";
import "codemirror/addon/dialog/dialog.js";
import "codemirror/addon/dialog/dialog.css";
import "codemirror/addon/search/searchcursor.js";
import "codemirror/addon/search/search.js";
// :
// placeholder
import "codemirror/addon/display/placeholder.js";
import "codemirror/addon/selection/active-line.js"; //styleActiveLinetrue
const CodeMirror = window.CodeMirror || _CodeMirror;
export default defineComponent({
props: {
modelValue: String,
defaultValue: String,
readOnly: {
type: Boolean,
default: false
}
},
setup(props, context) {
const { modelValue, defaultValue, readOnly } = toRefs(props);
const codeEditor = ref();
let editor;
watch(modelValue, () => {
if (null != editor && modelValue.value && modelValue.value !== editor.getValue()) {
// v-model
editor.setValue(modelValue.value);
}
});
watch(readOnly, () => {
if (null != editor) {
editor.setOption("readOnly", readOnly.value);
}
});
onMounted(() => {
editor = CodeMirror.fromTextArea(codeEditor.value, {
value: modelValue.value,
// mime: "text/javascript",
mode: "application/json",
indentWithTabs: false, // n*tabntabfalse
smartIndent: true, // true
lineNumbers: true, //
matchBrackets: true, //
readOnly: readOnly.value,
// :
foldGutter: true,
lineWrapping: true, //
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"],
// :
styleActiveLine: false //
});
// change
editor.on("change", () => {
// v-model
context.emit("update:modelValue", editor.getValue());
});
if (defaultValue.value) {
editor.setValue(defaultValue.value);
}
});
onBeforeUnmount(() => {
if (null !== editor) {
editor.toTextArea();
editor = null;
}
});
return { codeEditor };
}
});
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss">
.CodeMirror-wrap{
height: 100%;
}
.CodeMirror-gutters {
position: absolute;
top: 0;
left: 0;
z-index: 3;
min-height: 100%;
white-space: nowrap;
background-color: transparent;
border-right: 1px solid #ddd;
}
</style>

5
src/components/CountTo/index.js

@ -0,0 +1,5 @@
import CountTo from './index.vue'
export default CountTo
if (typeof window !== 'undefined' && window.Vue) {
window.Vue.component('count-to', CountTo)
}

202
src/components/CountTo/index.vue

@ -0,0 +1,202 @@
<template>
<span>
{{ displayValue }}
</span>
</template>
<script lang="ts">
import { requestAnimationFrame, cancelAnimationFrame } from './requestAnimationFrame.js'
export default {
props: {
startVal: {
type: Number,
required: false,
default: 0,
},
endVal: {
type: Number,
required: false,
default: 2017,
},
duration: {
type: Number,
required: false,
default: 3000,
},
autoplay: {
type: Boolean,
required: false,
default: true,
},
decimals: {
type: Number,
required: false,
default: 0,
validator(value) {
return value >= 0
},
},
decimal: {
type: String,
required: false,
default: '.',
},
separator: {
type: String,
required: false,
default: ',',
},
prefix: {
type: String,
required: false,
default: '',
},
suffix: {
type: String,
required: false,
default: '',
},
useEasing: {
type: Boolean,
required: false,
default: true,
},
easingFn: {
type: Function,
default(t, b, c, d) {
return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b
},
},
},
data() {
return {
localStartVal: this.startVal,
displayValue: this.formatNumber(this.startVal),
printVal: null,
paused: false,
localDuration: this.duration,
startTime: null,
timestamp: null,
remaining: null,
rAF: null,
}
},
computed: {
countDown() {
return this.startVal > this.endVal
},
},
watch: {
startVal() {
if (this.autoplay) {
this.start()
}
},
endVal() {
if (this.autoplay) {
this.start()
}
},
},
mounted() {
if (this.autoplay) {
this.start()
}
this.$emit('mountedCallback')
},
methods: {
start() {
this.localStartVal = this.startVal
this.startTime = null
this.localDuration = this.duration
this.paused = false
this.rAF = requestAnimationFrame(this.count)
},
pauseResume() {
if (this.paused) {
this.resume()
this.paused = false
} else {
this.pause()
this.paused = true
}
},
pause() {
cancelAnimationFrame(this.rAF)
},
resume() {
this.startTime = null
this.localDuration = +this.remaining
this.localStartVal = +this.printVal
requestAnimationFrame(this.count)
},
reset() {
this.startTime = null
cancelAnimationFrame(this.rAF)
this.displayValue = this.formatNumber(this.startVal)
},
count(timestamp) {
if (!this.startTime) this.startTime = timestamp
this.timestamp = timestamp
const progress = timestamp - this.startTime
this.remaining = this.localDuration - progress
if (this.useEasing) {
if (this.countDown) {
this.printVal =
this.localStartVal -
this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration)
} else {
this.printVal = this.easingFn(
progress,
this.localStartVal,
this.endVal - this.localStartVal,
this.localDuration,
)
}
} else {
if (this.countDown) {
this.printVal =
this.localStartVal -
(this.localStartVal - this.endVal) * (progress / this.localDuration)
} else {
this.printVal =
this.localStartVal +
(this.endVal - this.localStartVal) * (progress / this.localDuration)
}
}
if (this.countDown) {
this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal
} else {
this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal
}
this.displayValue = this.formatNumber(this.printVal)
if (progress < this.localDuration) {
this.rAF = requestAnimationFrame(this.count)
} else {
this.$emit('callback')
}
},
isNumber(val) {
return !isNaN(parseFloat(val))
},
formatNumber(num) {
num = num.toFixed(this.decimals)
num += ''
const x = num.split('.')
let x1 = x[0]
const x2 = x.length > 1 ? this.decimal + x[1] : ''
const rgx = /(\d+)(\d{3})/
if (this.separator && !this.isNumber(this.separator)) {
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + this.separator + '$2')
}
}
return this.prefix + x1 + x2 + this.suffix
},
},
destroyed() {
cancelAnimationFrame(this.rAF)
},
}
</script>

51
src/components/CountTo/requestAnimationFrame.js

@ -0,0 +1,51 @@
let lastTime = 0
const prefixes = 'webkit moz ms o'.split(' ') // 各浏览器前缀
let requestAnimationFrame
let cancelAnimationFrame
const isServer = typeof window === 'undefined'
if (isServer) {
requestAnimationFrame = function () {
return
}
cancelAnimationFrame = function () {
return
}
} else {
requestAnimationFrame = window.requestAnimationFrame
cancelAnimationFrame = window.cancelAnimationFrame
let prefix
// 通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式
for (let i = 0; i < prefixes.length; i++) {
if (requestAnimationFrame && cancelAnimationFrame) {
break
}
prefix = prefixes[i]
requestAnimationFrame = requestAnimationFrame || window[prefix + 'RequestAnimationFrame']
cancelAnimationFrame =
cancelAnimationFrame ||
window[prefix + 'CancelAnimationFrame'] ||
window[prefix + 'CancelRequestAnimationFrame']
}
// 如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout
if (!requestAnimationFrame || !cancelAnimationFrame) {
requestAnimationFrame = function (callback) {
const currTime = new Date().getTime()
// 为了使setTimteout的尽可能的接近每秒60帧的效果
const timeToCall = Math.max(0, 16 - (currTime - lastTime))
const id = window.setTimeout(() => {
callback(currTime + timeToCall)
}, timeToCall)
lastTime = currTime + timeToCall
return id
}
cancelAnimationFrame = function (id) {
window.clearTimeout(id)
}
}
}
export { requestAnimationFrame, cancelAnimationFrame }

269
src/components/DataScreen/Multiline/index.vue

@ -0,0 +1,269 @@
<template>
<div ref="chartsRef" class="echarts"/>
</template>
<script lang="ts" setup>
import * as echarts from 'echarts'
import { EChartsType } from 'echarts/core'
import { onMounted, ref } from 'vue'
const chartsRef = ref<HTMLElement | null>()
let colorList = ['#46ea91', '#2ba0ff', '#ed593b', '#7357ff', '#f2d750'];
const options = {
legend: {
icon: 'circle',
top: '5%',
right: '5%',
itemWidth: 6,
itemGap: 5,
textStyle: {
color: '#fff',
padding: [3, 0, 0, 0],
},
},
tooltip: {
trigger: 'axis',
},
grid: {
top: '14%',
left: '3%',
right: '4%',
bottom: '10%',
containLabel: true,
},
xAxis: [
{
type: 'category',
data: ['1', '2', '3', '4', '5', '6', '7', '8'],
axisLine: {
lineStyle: {
color: '#33BBFF',
},
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
textStyle: {
color: '#5FBBEB',
},
// x
fontSize: 12,
// margin:x
margin: 10,
},
axisPointer: {
label: {
// padding: [11, 5, 7],
padding: [0, 0, 0, 0],
// marginaxisLabelmargin!
margin: 10,
//
fontSize: 12,
backgroundColor: 'rgba(0,0,0,0)',
},
},
boundaryGap: false,
},
],
yAxis: [
{
name: '单位/件',
axisTick: {
show: false,
},
axisLine: {
show: true,
lineStyle: {
color: '#05D5FF',
},
},
axisLabel: {
textStyle: {
color: '#5FBBEB',
},
},
splitLine: {
show: false,
},
},
],
series: [
{
name: '咨询',
type: 'line',
data: [100, 20, 30, 102, 15, 30, 20, 18],
symbolSize: 1,
symbol: 'circle',
smooth: true,
showSymbol: false,
lineStyle: {
width: 2,
color: new echarts.graphic.LinearGradient(1, 1, 0, 0, [
{
offset: 0,
color: '#90ffc6',
},
{
offset: 1,
color: '#46ea91',
},
]),
shadowColor: 'rgba(144, 255, 198, .3)',
shadowBlur: 5,
shadowOffsetY: 5,
},
itemStyle: {
normal: {
color: colorList[0],
borderColor: colorList[0],
},
},
},
{
name: '求助',
type: 'line',
data: [20, 12, 11, 14, 25, 16, 10, 20],
symbolSize: 1,
symbol: 'circle',
smooth: true,
showSymbol: false,
lineStyle: {
width: 2,
color: new echarts.graphic.LinearGradient(1, 1, 0, 0, [
{
offset: 0,
color: '#67bcfc',
},
{
offset: 1,
color: '#2ba0ff',
},
]),
shadowColor: 'rgba(105, 188, 252,.3)',
shadowBlur: 5,
shadowOffsetY: 5,
},
itemStyle: {
normal: {
color: colorList[1],
borderColor: colorList[1],
},
},
},
{
name: '无效',
type: 'line',
data: [150, 120, 170, 140, 100, 160, 110, 110],
symbolSize: 1,
symbol: 'circle',
smooth: true,
showSymbol: false,
lineStyle: {
width: 2,
color: new echarts.graphic.LinearGradient(1, 1, 0, 0, [
{
offset: 0,
color: '#fc937e ',
},
{
offset: 1,
color: '#ed593b',
},
]),
shadowColor: 'rgb(252, 147, 126,.3)',
shadowBlur: 2,
shadowOffsetY: 2,
},
itemStyle: {
normal: {
color: colorList[2],
borderColor: colorList[2],
},
},
},
{
name: '投诉举报',
type: 'line',
data: [200, 80, 100, 30, 60, 50, 110, 20],
symbolSize: 1,
symbol: 'circle',
smooth: true,
showSymbol: false,
lineStyle: {
width: 2,
color: new echarts.graphic.LinearGradient(1, 1, 0, 0, [
{
offset: 0,
color: '#a390ff',
},
{
offset: 1,
color: '#7357ff',
},
]),
shadowColor: 'rgba(115, 87, 255, .1)',
shadowBlur: 5,
shadowOffsetY: 5,
},
itemStyle: {
normal: {
color: colorList[3],
borderColor: colorList[3],
},
},
},
{
name: '建议',
type: 'line',
data: [20, 80, 150, 30, 60, 50, 50, 20],
symbolSize: 1,
symbol: 'circle',
smooth: true,
showSymbol: false,
lineStyle: {
width: 2,
color: new echarts.graphic.LinearGradient(1, 1, 0, 0, [
{
offset: 0,
color: '#ffeb86',
},
{
offset: 1,
color: '#f2d750',
},
]),
shadowColor: 'rgba(255, 235, 134, .5)',
shadowBlur: 5,
shadowOffsetY: 5,
},
itemStyle: {
normal: {
color: colorList[4],
borderColor: colorList[4],
},
},
},
],
};
let chart: EChartsType
const initChart = () => {
const chart = echarts.init(chartsRef.value)
chart.setOption(options)
return chart
}
onMounted(() => {
chart = initChart()
window.addEventListener('resize', function () {
chart && chart.resize()
})
})
</script>
<style lang="scss" scoped>
.echarts{
width: 100%;
height: 100%;
}
</style>

179
src/components/DataScreen/pie/index.vue

@ -0,0 +1,179 @@
<template>
<div ref="chartsRef" class="echarts"/>
</template>
<script lang="ts" setup>
import * as echarts from 'echarts'
import { EChartsType } from 'echarts/core'
import { onMounted, ref } from 'vue'
const chartsRef = ref<HTMLElement | null>()
var trafficWay = [
{
name: 'Ⅰ类',
value: 20,
},
{
name: 'Ⅱ类',
value: 20,
},
{
name: 'Ⅲ类',
value: 20,
},
{
name: 'Ⅳ类',
value: 20,
},
{ name: 'Ⅴ类', value: 20 },
{ name: '劣Ⅴ类', value: 20 },
];
var data = [];
var color = ['#fd566a', '#9787ff', '#fdb36a', '#fdd56a', '#6da7ff', '#63e1f2', '#ff3000'];
for (var i = 0; i < trafficWay.length; i++) {
data.push(
{
value: trafficWay[i].value,
name: trafficWay[i].name,
itemStyle: {
normal: {
borderWidth: 5,
shadowBlur: 20,
borderColor: color[i],
shadowColor: color[i],
},
},
},
{
value: 2,
name: '',
itemStyle: {
normal: {
label: {
show: false,
},
labelLine: {
show: false,
},
color: 'rgba(0, 0, 0, 0)',
borderColor: 'rgba(0, 0, 0, 0)',
borderWidth: 0,
},
},
}
);
}
var seriesOption = [
{
name: '',
type: 'pie',
clockWise: false,
radius: [105, 109],
hoverAnimation: false,
itemStyle: {
normal: {
label: {
show: true,
position: 'outside',
formatter: function (params) {
var percent = 0;
var total = 0;
for (var i = 0; i < trafficWay.length; i++) {
total += trafficWay[i].value;
}
percent = ((params.value / total) * 100).toFixed(0);
if (params.name !== '') {
return params.name + '\t' + percent + '%';
} else {
return '';
}
},
},
labelLine: {
length: 10,
length2: 20,
show: true,
color: '#00ffff',
},
},
},
data: data,
},
];
let options = {
color: color,
title: [{
text: '水质监测',
top: '44%',
textAlign: 'center',
left: '49.50%',
backgroundColor: '#163253',
borderRadius: 100,
textStyle: {
color: '#fff',
fontSize: 20,
fontWeight: '400',
},
}, {
text: '水环境监测站',
top: '49%',
textAlign: 'center',
left: '49.50%',
textStyle: {
color: '#fff',
fontSize: 20,
fontWeight: '400',
},
}, {
text: '9',
top: '53%',
textAlign: 'center',
left: '48%',
textStyle: {
color: '#f6ea2f',
fontSize: 25,
fontWeight: '800',
fontStyle: 'italic'
},
}, {
text: '个',
top: '53.5%',
textAlign: 'center',
left: '50.5%',
textStyle: {
color: '#fff',
fontSize: 16,
fontWeight: '400',
},
}],
tooltip: {
show: false,
},
toolbox: {
show: false,
},
series: seriesOption,
};
let chart: EChartsType
const initChart = () => {
const chart = echarts.init(chartsRef.value)
chart.setOption(options)
return chart
}
onMounted(() => {
chart = initChart()
window.addEventListener('resize', function () {
chart && chart.resize()
})
})
</script>
<style lang="scss" scoped>
.echarts{
width: 100%;
height: 100%;
}
</style>

115
src/components/RightClickMenu/index.vue

@ -0,0 +1,115 @@
<template>
<div class="g-right-click-menu" :style="style" v-if="isShow" ref="rightMenu">
<div
v-for="(item, index) in data"
:key="index"
class="operating"
@click.stop="operatingRightAction($event, item)"
>{{ item.label }}</div
>
</div>
</template>
<script lang="ts">
export default {
props: {
data: {
type: Array,
default: () => [],
},
left: {
type: Number,
default: 0,
},
type: {
type: Number,
default: 1,
},
dataInfo: {
type: Object,
default: () => {},
},
top: {
type: Number,
default: 0,
},
isViewInfo: {
type: Boolean,
default: true,
},
},
watch: {
left: {
handler(newName, oldName) {
if (newName) {
this.isShow = true
}
},
// wacthfirstNamehandler
// immediate: true
},
},
computed: {
style() {
let clientHeight = document.body.clientHeight
let y = this.top
if (clientHeight - y < 100) {
return `left:${this.left}px;bottom:${clientHeight - y}px`
} else {
return `left:${this.left}px;top:${this.top}px`
}
},
},
data() {
return {
isShow: false,
}
},
methods: {
/**
* @func 点击操作
* @param val 1置顶/取消置顶 2开启/关闭免打扰 3开启/关闭星标 4删除会话
*/
operatingRightAction($event, val) {
this.$emit('ok', $event, val)
this.isShow = false
},
},
mounted() {
let _self = this
window.addEventListener('click', function () {
_self.isShow = false
})
window.addEventListener('mousedown', function (e) {
if (e.which === 3) {
_self.isShow = false
}
})
},
}
</script>
<style lang="scss" scoped>
.g-right-click-menu {
left: 0;
background: white;
width: 148px;
height: auto;
position: fixed;
//border: 1px solid #c4c4c4;
z-index: 9;
//box-shadow: 0 1px 2px 0px rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
.operating {
font-size: 12px;
padding-left: 23px;
cursor: pointer;
line-height: 27px;
}
.operating:hover {
background: #e2e2e2;
}
.last-delete {
border-top: 1px solid #ededed;
}
}
</style>

119
src/components/SearchForm/advancedForm/index.vue

@ -0,0 +1,119 @@
<template>
<div class="advancedForm">
<el-form
ref="ruleFormRef"
:inline="true"
:label-position="'right'"
:model="formInline"
class="form-inline">
<el-row
:class="{
'not-show':byHeight&&!isExpand
}"
:gutter="gutterWidth">
<el-col :span="item.span"
v-for="item,index in columns"
:key="item.name"
v-show="byHeight?true:(index< (showRow*3)||isExpand)">
<el-form-item :label="item.title" :label-width="labelWidth" v-if="item.type==='input'">
<el-input
clearable
v-model="formInline[item.name]" :placeholder="item.placeholder" />
</el-form-item>
<template v-else-if="item.type==='date'">
<el-form-item :label="item.title" :label-width="labelWidth" >
<el-date-picker
value-format="YYYY-MM-DD"
v-model="formInline[item.name]"
type="date"
:placeholder="item.placeholder"
/>
</el-form-item>
</template>
</el-col>
</el-row>
</el-form>
<div class="search-btn">
<el-button type="primary" @click="onSubmit">查询</el-button>
<el-button @click="resetForm(ruleFormRef)">重置</el-button>
<el-button link type="primary" @click="isExpand = !isExpand">{{ isExpand ? '合并' : '展开'}}<el-icon>
<arrow-down v-if="!isExpand" />
<arrow-up v-else /> </el-icon
></el-button>
</div>
</div>
</template>
<script lang="ts" setup>
import {reactive, ref} from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
const ruleFormRef = ref<FormInstance>()
let props = defineProps({
//
labelWidth: {
default: "100px",
},
gutterWidth: {
type: Number,
default: 24,
},
showRow:{
type: Number,
default: 1,
},
columns:{
type:Array,
default:()=>[]
},
byHeight:{
type:Boolean,
default:false
}
})
const emit = defineEmits(['submit','reset'])
//
const isExpand = ref(false)
const formInline = reactive({
})
for(let item of props.columns){
formInline[item.name] = null
}
const onSubmit = () => {
emit('submit',formInline)
}
const resetForm = (formEl: FormInstance | undefined) => {
console.log('formEl',formEl)
if (!formEl) return
formEl.resetFields()
const keys = Object.keys(formInline);
keys.forEach(key => {
formInline[key] = null;
});
emit("reset", formInline);
}
</script>
<style lang="scss" scoped>
.advancedForm{
display: flex;
justify-content: space-between;
.form-inline{
flex: 1;
}
.el-form--inline .el-form-item{
width: 100%;
margin-right: 10px;
}
.search-btn{
margin-left: 40px;
}
.not-show{
height: 40px;
overflow: hidden;
}
}
</style>

35
src/components/SvgIcon/index.vue

@ -0,0 +1,35 @@
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName"></use>
</svg>
</template>
<script lang="ts">
import { computed } from 'vue'
export default {
name: 'baseSvgIcon',
props: {
iconClass: { type: String },
className: { type: String },
},
setup(props) {
const iconName = computed(() => {
return props.iconClass ? `#icon-${props.iconClass}` : '#icon'
})
const svgClass = computed(() => {
return props.className ? 'svg-icon ' + props.className : 'svg-icon'
})
return { iconName, svgClass }
},
}
</script>
<style scoped lang="scss">
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>

26
src/components/SwitchDark/index.vue

@ -0,0 +1,26 @@
<template>
<el-switch
@change="switchDark"
inline-prompt
v-model="themeConfig.isDark"
:active-icon="Sunny"
:inactive-icon="Moon"
/>
</template>
<script setup lang="ts" name="switchDark">
import { Sunny, Moon } from "@element-plus/icons-vue";
import {computed, ref} from "vue";
import {useSettingStore} from "@/store/modules/setting"
const SettingStore = useSettingStore()
//
const themeConfig = computed(()=>SettingStore.themeConfig)
//
const switchDark = () => {
const body = document.documentElement as HTMLElement;
if (themeConfig.value.isDark) body.setAttribute("class", "dark");
else body.setAttribute("class", "");
};
</script>

304
src/components/Table/EditableProTable/index.vue

@ -0,0 +1,304 @@
<template>
<div class="m-edit-table">
<div style="margin-top: 15px; margin-bottom: 15px" v-if="mode !== 'hide' && mode !== 'bottom'">
<el-button style="width: 100%" @click="add">
<el-icon style="margin-right: 4px"><plus /></el-icon> </el-button
>
</div>
<el-table :data="transData" style="width: 100%" row-key="id" border>
<template v-for="item in columns">
<el-table-column
v-if="item.type"
:type="item.type"
:width="item.width"
:align="item.align"
:fixed="item.fixed"
:label="item.label"
/>
<el-table-column
v-else
:prop="item.name"
:width="item.width"
:align="item.align"
:fixed="item.fixed"
:label="item.label"
>
<template #default="scope">
<template v-if="!item.slot">
<template v-if="item.readonly">
{{ scope.row[item.name] }}
</template>
<template v-else-if="item.valueType === 'select'">
<el-select
clearable
:placeholder="`请选择`"
v-model="scope.row[item.name]"
v-if="scope.row.edit"
>
<el-option
v-for="ite in item.options"
:key="ite.value"
:label="ite.label"
:value="ite.value"
/>
</el-select>
<span v-else>{{ filterOption(item, scope) }}</span>
</template>
<template v-else-if="item.valueType === 'date'">
<el-date-picker
v-model="scope.row[item.name]"
type="date"
value-format="YYYY-MM-DD"
clearable
placeholder="请选择"
v-if="scope.row.edit"
/>
<span v-else>{{ scope.row[item.name] || '--' }}</span>
</template>
<template v-else>
<el-input
clearable
placeholder="请输入"
v-model="scope.row[item.name]"
v-if="scope.row.edit"
></el-input>
<span v-else>{{ scope.row[item.name] || '--' }}</span>
</template>
</template>
<slot v-else :name="item.name" :item="item" :row="scope.row"></slot>
</template>
</el-table-column>
</template>
<el-table-column prop="operator" label="操作" width="250px" fixed="right">
<template #default="scope">
<el-button
v-if="scope.row.edit"
type="primary"
size="small"
icon="CircleCheckFilled"
@click="confirmEdit(scope.row)"
>
保存
</el-button>
<el-button
v-else
type="primary"
size="small"
icon="Edit"
@click="scope.row.edit = !scope.row.edit"
>
编辑
</el-button>
<el-popover
trigger="click"
v-model:visible="scope.row.visible"
placement="top"
:width="160"
>
<p style="display: flex; align-items: center; margin-bottom: 10px">
<el-icon color="#faad14" style="margin-right: 10px"><warning-filled /></el-icon>
删除此行</p
>
<div style="text-align: right; margin: 0">
<el-button size="small" @click="scope.row.visible = false">取消</el-button>
<el-button size="small" type="primary" @click="deleteAction(scope.row)"
>确定</el-button
>
</div>
<template #reference>
<el-button icon="Delete" @click="deleteCurrent(scope.row)" type="danger" size="small"
>删除</el-button
>
</template>
</el-popover>
<el-button
v-if="scope.row.edit"
type="primary"
size="small"
icon="Edit"
@click="cancelEdit(scope.row)"
>
取消
</el-button>
</template>
</el-table-column>
</el-table>
<div style="margin-top: 15px" v-if="mode !== 'hide' && mode !== 'top'">
<el-button style="width: 100%" @click="add">
<el-icon style="margin-right: 4px"><plus /></el-icon> </el-button
>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, onMounted, ref, watch } from 'vue'
import { deepObjClone } from '@/utils/index'
import { ElMessage, ElMessageBox } from 'element-plus'
import { reactive } from 'vue'
const emit = defineEmits(['del', 'add', 'onChange'])
let transData = ref([])
let props = defineProps({
columns: {
type: Array,
default: () => [],
},
data: {
type: Array,
default: () => [],
},
editableKeys: {
type: Array,
default: () => [],
},
mode: {
type: String,
default: 'bottom',
},
})
//
const deleteCurrent = (row)=>{
// console.log('----------',row)
// row.visible = true
}
const getData = () => {
let arr = deepObjClone(transData.value)
for (let item of arr) {
for (let attr in item) {
if (attr.includes('te__mp')) {
delete item[attr]
}
}
}
emit('onChange', arr)
}
let obj = {}
for (let item of props.columns) {
props.data.forEach((it) => {
if (!obj[item.name]) {
obj[item.name] = null
}
})
}
//
const reset = () => {
transData.value = props.data
for (let item of transData.value) {
if (props.editableKeys.includes(item.id)) {
item.edit = true
}
}
getData()
}
onMounted(() => {
watch(
() => props.data,
(val) => {
// //
transData.value = deepObjClone(val)
//
for (let item of transData.value) {
if (props.editableKeys.includes(item.id)) {
item.edit = true
}
for (let attr in item) {
let temp = `${attr}te__mp`
item[temp] = item[attr]
}
}
},
{
immediate: true,
deep: true,
},
)
})
const visible = ref(false)
const handleSizeChange = (val: number) => {
console.log(`${val} items per page`)
}
const listLoading = ref(false)
//
const confirmEdit = (row) => {
row.edit = false
for (let attr in row) {
if (attr.includes('te__mp')) {
row[attr] = row[attr.replace('te__mp', '')]
}
}
getData()
}
//
const cancelEdit = (row) => {
row.edit = !row.edit
for (let attr in row) {
if (attr !== 'edit') {
if (!attr.includes('te__mp')) {
row[attr] = row[attr + 'te__mp']
}
}
}
}
const deleteAction = (row) => {
row.visible = false
transData.value = transData.value.filter((item) => item.id !== row.id)
emit('del', row)
}
//
const add = () => {
let id = ~~(Math.random() * 1000000).toFixed(0)
let obj1 = Object.assign({}, obj, {
id: id,
edit: true,
visible: false,
})
for (let attr in obj1) {
let temp = `${attr}te__mp`
obj1[temp] = obj1[attr]
}
if (props.mode === 'bottom') {
transData.value.push(obj1)
}
if (props.mode === 'top') {
transData.value.unshift(obj1)
}
}
const filterOption = (item, scope) => {
let obj = item.options.find((ite) => ite.value === scope.row[item.name])
if (obj) {
return obj.label
}
return '--'
}
defineExpose({
reset,
})
</script>
<style scoped>
.edit-input {
padding-right: 100px;
}
.cancel-btn {
position: absolute;
right: 15px;
top: 10px;
}
.inline-edit-table {
width: 100%;
}
</style>

249
src/components/Table/PropTable/index.vue

@ -0,0 +1,249 @@
<template>
<div class="zb-pro-table">
<div class="header">
<el-form :inline="true"
class="search-form"
:model="formInline" ref="ruleFormRef" >
<template v-for="(item, index) in formSearchData" :key="index">
<el-form-item :label="item.label" v-show="isExpand ? isExpand : index < 2">
<template v-if="item.valueType === 'input'">
<el-input v-model="formInline[item.name]" :placeholder="`请输入${item.label}`" />
</template>
<template v-if="item.valueType === 'select'">
<el-select
style="width: 100%"
v-model="formInline[item.name]" :placeholder="`请选择${item.label}`">
<el-option
v-for="ite in item.options"
:key="ite.value"
:label="ite.label"
:value="ite.value"
/>
</el-select>
</template>
</el-form-item>
</template>
</el-form>
<div class="search">
<el-button type="primary" @click="onSubmit" :icon="Search">查询</el-button>
<el-button @click="reset(ruleFormRef)">重置</el-button>
<el-button link type="primary" @click="isExpand = !isExpand">{{ isExpand ? '合并' : '展开'}}<el-icon>
<arrow-down v-if="!isExpand" />
<arrow-up v-else /> </el-icon
></el-button>
</div>
</div>
<!----------底部---------------------->
<div class="footer">
<!-----------工具栏操作工具----------------->
<div class="operator">
<slot name="btn"></slot>
</div>
<!-- ------------表格--------------->
<div class="table">
<el-table
class="zb-table"
v-loading="loading"
@selection-change="(val) => emit('selection-change', val)"
:data="list"
:border="true"
>
<template v-for="item in columns">
<el-table-column
v-if="item.type"
:type="item.type"
:width="item.width"
:align="item.align!=null?item.align:'center'"
:fixed="item.fixed"
:label="item.label"
/>
<el-table-column
v-else
:prop="item.name"
:width="item.width"
:align="item.align!=null?item.align:'center'"
:fixed="item.fixed"
:label="item.label"
>
<template #default="scope">
<span v-if="!item.slot">{{ scope.row[item.name] }}</span>
<slot v-else :name="item.name" :item="item" :row="scope.row"></slot>
</template>
</el-table-column>
</template>
</el-table>
</div>
<!-- ------------分页--------------->
<div class="pagination">
<el-pagination
v-model:currentPage="currentPage1"
:page-size="10"
background
layout="total, sizes, prev, pager, next, jumper"
:total="data.length"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue'
import {Search } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance } from 'element-plus'
const ruleFormRef = ref<FormInstance>()
const emit = defineEmits(['reset', 'onSubmit', 'selection-change'])
let props = defineProps({
columns: {
type: Array,
default: () => [],
},
data: {
type: Array,
default: () => [],
},
loading: {
type: Boolean,
default: false,
},
})
const currentPage1 = ref(1)
//
const isExpand = ref(false)
const handleSizeChange = (val: number) => {
console.log(`${val} items per page`)
}
const handleCurrentChange = (val: number) => {
console.log(`current page: ${val}`)
currentPage1.value = val
}
const list = computed(() => {
let arr = JSON.parse(JSON.stringify(props.data))
return arr.splice((currentPage1.value - 1) * 10, 10)
})
const listLoading = ref(false)
const confirmEdit = (row) => {
row.edit = false
}
const cancelEdit = (row) => {
row.edit = false
}
import { reactive } from 'vue'
let obj = {}
let search = []
for (let item of props.columns) {
if (item.inSearch) {
obj[item.name] = null
}
if (item.inSearch) {
search.push(item)
}
}
const formSearchData = ref(search)
const formInline = reactive(obj)
const onSubmit = () => {
console.log('submit!', formInline)
emit('onSubmit', formInline)
}
const reset = (formEl: FormInstance | undefined) => {
formSearchData.value.forEach((item) => {
formInline[item.name] = null
})
emit('reset')
}
const deleteAction = (row) => {
ElMessageBox.confirm('你确定要删除当前项吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
draggable: true,
})
.then(() => {
list.value = list.value.filter((item) => item.id !== row.id)
ElMessage.success('删除成功')
})
.catch(() => {})
}
</script>
<style scoped lang="scss">
.edit-input {
padding-right: 100px;
}
.cancel-btn {
position: absolute;
right: 15px;
top: 10px;
}
.zb-pro-table {
width: 100%;
height: 100%;
display:flex;
flex-direction:column;
.header{
display: flex;
padding: 16px 16px 0 16px;
margin-bottom: 16px;
border-radius: 4px;
background: white;
box-shadow: 0 0 12px rgb(0 0 0 / 5%);
.search-form{
flex: 1;
::v-deep{
.el-input--default{
width: 200px;
}
}
}
.search{
flex-shrink: 0;
white-space: nowrap;
}
}
.footer{
flex: 1;
display: flex;
padding: 16px;
flex-direction: column;
border-radius: 4px;
overflow: hidden;
background: white;
box-shadow: 0 0 12px rgb(0 0 0 / 5%);
min-height: 300px;
.operator{
margin-bottom: 15px
}
.table{
position: relative;
flex: 1;
}
.zb-table{
position: absolute;
height: 100%;
}
}
::v-deep{
.el-table__header th{
font-size: 15px;
font-weight: 700;
color: #252525;
}
}
.pagination{
width: 100%;
display: flex;
justify-content: center;
padding-top: 20px;
box-sizing: border-box;
}
}
</style>

88
src/components/Upload/index.vue

@ -0,0 +1,88 @@
<template>
<el-upload
action=""
:before-upload="beforeUploadAction"
:list-type="listType"
:multiple="multiple"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:file-list="fileList"
>
<el-icon><Plus /></el-icon>
</el-upload>
<el-dialog v-model="dialogVisible" width="50%" top="80px">
<img w-full :src="dialogImageUrl" alt="预览图片" style="width: 100%" />
</el-dialog>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile } from 'element-plus'
import { ElMessage } from 'element-plus'
let emit = defineEmits(['update'])
let props = defineProps({
modelValue: Array,
multiple: {
type: Boolean,
default: true,
},
listType: {
type: String,
default: 'picture-card',
},
showFileList: {
type: Boolean,
default: true,
},
})
let fileList = ref([])
const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles)
}
const beforeUploadAction = (file, fileLi) => {
return new Promise((resolve, reject) => {
var reader = new FileReader()
let reg = /\.jpg$|\.jpeg$|\.gif$|\.png$/i
reader.readAsDataURL(file)
let name = file.name
if (reg.test(name)) {
reader.onload = (e: FileReader) => {
fileList.value.push({
name: name,
url: e.target.result,
})
emit('update', fileList.value)
resolve(e.target.result)
}
} else {
ElMessage.error('请上传图片')
reject()
}
})
}
const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
dialogImageUrl.value = uploadFile.url!
dialogVisible.value = true
}
onMounted(() => {
watch(
() => props.modelValue,
(value) => {
fileList.value = value
},
{
immediate: true,
},
)
})
</script>

80
src/components/WangEdior/index.vue

@ -0,0 +1,80 @@
<template>
<div class="m-wangEditor">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
class="editor-content'"
style="height: 300px; overflow-y: hidden;"
v-model="valueHtml"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="handleCreated"
/>
</div>
</template>
<script lang="ts" setup>
// wangEditor
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import '@wangeditor/editor/dist/css/style.css' // css
import {onBeforeUnmount, onMounted, watch, shallowRef, ref, computed} from 'vue'
let editors = null
// shallowRef
const editorRef = shallowRef()
const toolbarConfig = {}
const editorConfig = { placeholder: '请输入内容...' }
// HTML
const mode = ref('default')
let emit = defineEmits(['update:modelValue'])
let props = defineProps({
modelValue: String,
})
const getEditorData = () => {
//
let data = editors.txt.html()
alert(data)
}
const handleCreated = (editor) => {
editorRef.value = editor // editor
}
const valueHtml = computed({
get(){
return props.modelValue
},
set(val){
//
if (editorRef.value.isEmpty()) val = "";
emit('update:modelValue', val)
}
})
//
onBeforeUnmount(()=>{
// API
const editor = editorRef.value
if (editor == null) {
return
}
editor.destroy()
})
</script>
<style lang="scss" scoped>
.m-wangEditor{
z-index: 99;
width: 100%;
border: 1px solid #cccccc;
.editor-toolbar {
border-bottom: 1px solid #cccccc;
}
.editor-content {
overflow-y: hidden;
}
}
</style>

8
src/components/pipeline/index.vue

@ -0,0 +1,8 @@
<template>
<div class="zb-pipeline">
<zb-pipeline-start />
</div>
</template>
<script lang="ts" setup>
import ZbPipelineStart from './zb-pipeline-start'
</script>

154
src/components/pipeline/zb-pipeline-start.vue

@ -0,0 +1,154 @@
<template>
<div class="zb-pipeline-start-wrapper">
<div
class="zb-pipeline-start"
v-bind:class="control === value ? 'active' : ''"
v-on:click="handleClick"
>
<div class="zb-pipeline-start-header">
<zb-icon type="play-filled" />
</div>
<div class="zb-pipeline-start-body">
<div class="zb-pipeline-start-title">开始</div>
<div class="zb-pipeline-start-tooltip">
<el-tooltip placement="top-start" content="点击进行构建基础设置">
<el-icon>
<Help />
</el-icon>
</el-tooltip>
<!-- <zb-tooltip placement="right">-->
<!-- <zb-icon type="help" />-->
<!-- <div slot="content">点击进行构建基础设置</div>-->
<!-- </zb-tooltip>-->
</div>
</div>
</div>
<slot></slot>
</div>
</template>
<script lang="ts" setup>
import { Help } from '@element-plus/icons-vue'
</script>
<style>
/* zb-pipeline-start-wrapper */
.zb-pipeline-start-wrapper {
position: relative;
padding: 0 40px;
}
/* zb-pipeline-start */
.zb-pipeline-start {
cursor: pointer;
user-select: none;
position: relative;
display: flex;
justify-content: flex-start;
align-items: stretch;
width: 200px;
height: 40px;
border-radius: 2px;
background-color: #fff;
}
.zb-pipeline-start:after {
content: '';
position: absolute;
top: 20px;
right: -40px;
display: block;
width: 40px;
height: 1px;
background-color: #2d8cf0;
}
.zb-pipeline-start .zb-pipeline-start-header {
display: flex;
justify-content: center;
align-items: center;
width: 40px;
border-width: 1px 0 1px 1px;
border-style: solid;
border-color: #2d8cf0;
border-radius: 2px 0 0 2px;
background-color: #2d8cf0;
color: #fff;
font-size: 14px;
font-weight: 600;
transition: all 0.2s cubic-bezier(0.23, 1, 0.32, 1);
}
.zb-pipeline-start .zb-pipeline-start-body {
flex: 1;
display: flex;
border-width: 1px 1px 1px 0;
border-style: solid;
border-color: #e3e8f0;
border-radius: 0 2px 2px 0;
padding: 0 8px;
overflow: hidden;
transition: all 0.2s cubic-bezier(0.23, 1, 0.32, 1);
}
.zb-pipeline-start .zb-pipeline-start-title {
flex: 1;
display: block;
overflow: hidden;
color: #262626;
font-size: 14px;
font-weight: 600;
line-height: 38px;
white-space: nowrap;
text-overflow: ellipsis;
}
.zb-pipeline-start .zb-pipeline-start-tooltip {
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
margin-left: 8px;
}
.zb-pipeline-start .zb-pipeline-start-tooltip .zb-tooltip {
display: block;
}
.zb-pipeline-start .zb-pipeline-start-tooltip .zb-icon {
display: block;
color: #595959;
font-size: 14px;
}
/* zb-pipeline-start hover */
.zb-pipeline-start:hover {
}
.zb-pipeline-start:hover:after {
}
.zb-pipeline-start:hover .zb-pipeline-start-header {
border-color: #2d8cf0;
}
.zb-pipeline-start:hover .zb-pipeline-start-body {
border-color: #2d8cf0;
}
.zb-pipeline-start:hover .zb-pipeline-start-title {
}
.zb-pipeline-start:hover .zb-pipeline-start-tooltip {
}
.zb-pipeline-start:hover .zb-pipeline-start-tooltip .zb-tooltip {
}
.zb-pipeline-start:hover .zb-pipeline-start-tooltip .zb-icon {
}
/* zb-pipeline-start active */
.zb-pipeline-start.active {
}
.zb-pipeline-start.active:after {
}
.zb-pipeline-start.active .zb-pipeline-start-header {
border-color: #2d8cf0;
}
.zb-pipeline-start.active .zb-pipeline-start-body {
border-color: #2d8cf0;
}
.zb-pipeline-start.active .zb-pipeline-start-title {
}
.zb-pipeline-start.active .zb-pipeline-start-tooltip {
}
.zb-pipeline-start.active .zb-pipeline-start-tooltip .zb-tooltip {
}
.zb-pipeline-start.active .zb-pipeline-start-tooltip .zb-icon {
}
</style>

2
src/config/index.ts

@ -0,0 +1,2 @@
// * 默认主题颜色
export const PRIMARY_COLOR: string = "#409eff";

11
src/icons/index.js

@ -0,0 +1,11 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg component
// const req = require.context('./svg', false, /\.svg$/)
const req = import.meta.globEager('./svg/*.svg')
const requireAll = (requireContext) => requireContext.keys().map(requireContext)
requireAll(req)
export default SvgIcon

1
src/icons/svg/borrow.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029714218" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11558" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M955.53024 25.74336c-0.21504 4.10624-0.59904 8.21248-0.60928 12.3136-0.0256 176.56832-0.0256 353.13664-0.0256 529.70496 0 4.0448 0 8.09472 0 13.53216-18.24256-6.05696-35.1488-11.6736-52.92032-17.57696 0-159.46752 0-319.0784 0-479.2064-264.97024 0-529.0496 0-793.73312 0 0 262.23104 0 524.06784 0 787.28704 3.67104 0 7.33696 0 11.01312 0 113.05472 0 226.10432 0.06144 339.16416-0.14336 6.89664-0.01024 11.35104 2.2016 16.384 6.96832 14.90944 14.14656 30.74048 27.3152 46.72 41.29792-2.28864 0.19456-4.84352 0.59392-7.39328 0.59392-151.16288 0.04096-302.32576 0.04096-453.48864-0.01536-2.7904 0-5.58592-0.67072-8.37632-1.024 0-297.7536 0-595.51232 0-893.73696C353.3568 25.74336 654.44352 25.74336 955.53024 25.74336z" p-id="11559"></path><path d="M724.95104 938.53696c-19.03616-4.41856-38.4768-7.5776-57.0368-13.48096-79.46752-25.22112-139.67872-75.4176-185.66656-145.76128 15.55968-15.35488 30.3872-31.39584 46.65856-45.80352 48.24064-42.72128 101.74976-76.79488 164.58752-93.78304 87.00416-23.552 164.79744-3.36896 234.8288 51.42528 30.44864 23.82336 56.32 52.11136 79.92832 82.56512 1.3312 1.70496 2.95424 3.18464 4.43392 4.77184 0 1.26976 0 2.5344 0 3.80928-0.64 0.61952-1.50528 1.13152-1.87904 1.87904-39.46496 78.97088-104.05888 125.4144-188.90752 145.06496-18.69824 4.33664-37.94432 6.272-56.93952 9.31328C751.62112 938.53696 738.28352 938.53696 724.95104 938.53696zM843.53024 783.9488c-0.20992-52.58752-43.17696-95.04768-96.10752-94.98624-52.70016 0.06144-96.13312 43.0336-96.22528 95.21664-0.09216 52.66944 43.42272 95.46752 96.92672 95.3088C801.1008 879.32928 843.73504 836.62336 843.53024 783.9488z" p-id="11560"></path><path d="M753.65888 305.55648c-141.88544 0-282.78272 0-424.3712 0 0-25.03168 0-49.85344 0-75.13088 141.48608 0 282.5984 0 424.3712 0C753.65888 255.52896 753.65888 280.12032 753.65888 305.55648z" p-id="11561"></path><path d="M753.75616 369.3312c0 24.61184 0 48.90112 0 74.00448-141.6448 0-282.97728 0-424.73472 0 0-24.63744 0-48.97792 0-74.00448C470.50752 369.3312 611.85024 369.3312 753.75616 369.3312z" p-id="11562"></path><path d="M753.73056 506.86464c0 24.9344 0 49.51552 0 74.66496-141.5936 0-282.7264 0-424.49408 0 0-24.704 0-49.32096 0-74.66496C470.4256 506.86464 611.78368 506.86464 753.73056 506.86464z" p-id="11563"></path><path d="M184.58112 579.75808c0-24.1408 0-47.45728 0-71.30112 24.15616 0 47.80544 0 72.15616 0 0 23.63904 0 47.21152 0 71.30112C232.74496 579.75808 209.1008 579.75808 184.58112 579.75808z" p-id="11564"></path><path d="M184.81152 229.8624c24.22784 0 47.86176 0 72.57088 0 0 22.58432 0.11264 44.672-0.24064 66.75968-0.0256 1.6384-3.4048 4.5824-5.25312 4.608-22.10816 0.32256-44.22656 0.20992-67.08224 0.20992C184.81152 277.30432 184.81152 254.08 184.81152 229.8624z" p-id="11565"></path><path d="M257.024 370.95424c0 23.92576 0 46.98112 0 70.88128-23.97696 0-47.55968 0-72.05888 0 0-23.25504 0-46.7712 0-70.88128C208.72192 370.95424 232.3712 370.95424 257.024 370.95424z" p-id="11566"></path></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
src/icons/svg/compass.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1611049126119" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6991" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M507.592348 170.411409l286.702191 850.632348-286.702191-184.943305L222.608696 1021.043757l284.983652-850.632348z m-57.904974-63.256487V2.72473h13.677078l38.039374 65.82094 11.112626 21.512904h0.712348c-0.712348-10.542748-1.709635-22.225252-1.709635-33.052939V2.72473h12.537322v104.430192h-13.534609l-38.039374-65.963409-11.255095-21.512904h-0.569879c0.569878 10.542748 1.567165 21.655374 1.567166 32.62553v54.850783h-12.537322z" p-id="6992"></path></svg>

After

Width:  |  Height:  |  Size: 831 B

1
src/icons/svg/dashboard.svg

@ -0,0 +1 @@
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
src/icons/svg/entrust.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1611639887130" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2534" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M12.672 576.896c-15.744-17.92-15.744-37.12 0-57.92 26.048-22.4 63.232-21.312 111.552 3.456l169.92 123.84H512l63.488-56.064-111.68-21.184C407.744 558.72 381.12 537.6 384 505.6c2.816-31.872 19.904-51.584 51.2-59.008h333.952a12.8 12.8 0 0 1 8.64 3.328l236.8 216.448a12.8 12.8 0 0 1 0.768 18.112L823.424 893.952a12.8 12.8 0 0 1-17.472 1.28l-109.76-89.024H274.304a12.8 12.8 0 0 1-8.512-3.264L12.672 576.896z m93.952-215.68a12.8 12.8 0 0 1-12.8-12.8v-51.2c0-7.104 5.76-12.8 12.8-12.8h486.4c7.04 0 12.8 5.696 12.8 12.8v51.2a12.8 12.8 0 0 1-12.8 12.8h-486.4z m0-153.344a12.8 12.8 0 0 1-12.8-12.8v-51.2c0-7.04 5.76-12.8 12.8-12.8h486.4c7.04 0 12.8 5.76 12.8 12.8v51.2a12.8 12.8 0 0 1-12.8 12.8h-486.4z" p-id="2535"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
src/icons/svg/example.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>

After

Width:  |  Height:  |  Size: 497 B

1
src/icons/svg/exit-fullscreen.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/icons/svg/eye-open.svg

@ -0,0 +1 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
src/icons/svg/eye.svg

@ -0,0 +1 @@
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>

After

Width:  |  Height:  |  Size: 944 B

1
src/icons/svg/form.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

1
src/icons/svg/fullscreen.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>

After

Width:  |  Height:  |  Size: 421 B

1
src/icons/svg/go-out.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029567541" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10079" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M73.56 719.53l139.377-139.377a50.404 50.404 0 0 1 47.047-15.246c14.336 3.754 20.992 15.246 24.804 28.16 3.811 12.97-3.812 36.181-17.351 47.786l-74.81 70.429h290.987c16.896 0 32.598 5.916 41.017 20.537a47.388 47.388 0 0 1 0 47.445c-8.42 14.62-24.12 19.342-41.017 19.342H192.628l74.809 72.59c12.003 11.947 21.845 33.337 17.35 47.787-4.55 14.507-13.425 21.049-25.998 24.52-12.572 3.413-33.848-0.171-45.852-12.118L70.715 789.163a47.332 47.332 0 0 1-13.312-40.335 47.275 47.275 0 0 1 16.156-29.297z" p-id="10080"></path><path d="M718.62 944.754a47.388 47.388 0 0 1-41.016-23.723c-8.534-14.62-8.534-25.088 0-39.765A47.388 47.388 0 0 1 718.62 857.6h150.073l-3.015-495.275L512 152.405 143.132 362.382v116.054c0 26.168-17.066 45.226-43.235 45.226-26.283-0.057-43.008-19.058-43.008-45.226V336.213c0-16.327 8.363-31.573 22.243-40.277L486.798 62.692a47.388 47.388 0 0 1 50.29 0l393.216 233.244c13.88 8.704 22.357 23.893 22.3 40.334l3.016 561.095c0 26.17-21.22 47.389-47.446 47.389h-189.61 0.056z" p-id="10081"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
src/icons/svg/home.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1598501102472" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5445" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M515.072 47.104c1.024 0 4.096 0 6.144 2.048l422.912 422.912c-32.768 2.048-55.296 25.6-55.296 59.392l0 430.08c-3.072 8.192-8.192 14.336-10.24 15.36l-200.704 0c-3.072 0-9.216-6.144-10.24-9.216L667.648 727.04c0-34.816-24.576-59.392-59.392-59.392L417.792 667.648c-34.816 0-59.392 24.576-59.392 59.392l0 239.616c0 2.048 0 9.216-9.216 9.216l-201.728 0c-3.072 0-9.216-6.144-10.24-9.216L137.216 537.6c0-33.792-22.528-58.368-55.296-59.392L508.928 49.152C510.976 47.104 514.048 47.104 515.072 47.104M515.072 6.144C502.784 6.144 489.472 11.264 480.256 20.48l-466.944 466.944c-6.144 6.144-25.6 31.744 6.144 31.744l56.32 0c12.288 0 18.432 6.144 18.432 18.432l0 429.056c0 25.6 25.6 50.176 50.176 50.176L348.16 1016.832c31.744 0 50.176-25.6 50.176-50.176L398.336 727.04c0-12.288 6.144-18.432 18.432-18.432l189.44 0c12.288 0 18.432 6.144 18.432 18.432l0 239.616c0 25.6 25.6 50.176 50.176 50.176l201.728 0c25.6 0 44.032-25.6 50.176-50.176L926.72 531.456c0-12.288 6.144-18.432 18.432-18.432l56.32 0c39.936 0 12.288-25.6 12.288-25.6L549.888 20.48C540.672 11.264 527.36 6.144 515.072 6.144L515.072 6.144z" p-id="5446"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
src/icons/svg/horn.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1598520407375" class="icon" viewBox="0 0 1144 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1915" xmlns:xlink="http://www.w3.org/1999/xlink" width="223.4375" height="200"><defs><style type="text/css"></style></defs><path d="M787.012239 1024L260.43588 797.717621H0V226.232989h260.43588L787.012239 0zM43.21665 754.500971h226.109513l474.469426 203.859111v-892.732512l-474.469426 203.859112H43.21665zM855.763755 801.113215v-43.21665c135.6015 0 245.915086-110.313586 245.915086-245.915086s-110.313586-245.927434-245.915086-245.927434v-43.21665a287.242551 287.242551 0 0 1 204.451798 84.679939 287.242551 287.242551 0 0 1 84.692286 204.464145 287.242551 287.242551 0 0 1-84.692286 204.451797 287.242551 287.242551 0 0 1-204.451798 84.679939z" p-id="1916"></path></svg>

After

Width:  |  Height:  |  Size: 920 B

1
src/icons/svg/inquiry.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1602475136802" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7282" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M910.222222 455.111111 682.666667 455.111111C619.832889 455.111111 568.888889 404.167111 568.888889 341.333333L568.888889 113.777778C568.888889 50.944 619.832889 0 682.666667 0L910.222222 0C973.056 0 1024 50.944 1024 113.777778L1024 341.333333C1024 404.167111 973.056 455.111111 910.222222 455.111111ZM967.111111 113.777778C967.111111 82.346667 941.653333 56.888889 910.222222 56.888889L682.666667 56.888889C651.235556 56.888889 625.777778 82.346667 625.777778 113.777778L625.777778 341.333333C625.777778 372.764444 651.235556 398.222222 682.666667 398.222222L910.222222 398.222222C941.653333 398.222222 967.111111 372.764444 967.111111 341.333333L967.111111 113.777778ZM341.333333 1024 113.777778 1024C50.944 1024 0 973.056 0 910.222222L0 682.666667C0 619.832889 50.944 568.888889 113.777778 568.888889L341.333333 568.888889C404.167111 568.888889 455.111111 619.832889 455.111111 682.666667L455.111111 910.222222C455.111111 973.056 404.167111 1024 341.333333 1024ZM398.222222 682.666667C398.222222 651.235556 372.764444 625.777778 341.333333 625.777778L113.777778 625.777778C82.346667 625.777778 56.888889 651.235556 56.888889 682.666667L56.888889 910.222222C56.888889 941.653333 82.346667 967.111111 113.777778 967.111111L341.333333 967.111111C372.764444 967.111111 398.222222 941.653333 398.222222 910.222222L398.222222 682.666667ZM682.666667 568.888889 910.222222 568.888889C973.056 568.888889 1024 619.832889 1024 682.666667L1024 910.222222C1024 973.056 973.056 1024 910.222222 1024L682.666667 1024C619.832889 1024 568.888889 973.056 568.888889 910.222222L568.888889 682.666667C568.888889 619.832889 619.832889 568.888889 682.666667 568.888889ZM625.777778 910.222222C625.777778 941.653333 651.235556 967.111111 682.666667 967.111111L910.222222 967.111111C941.653333 967.111111 967.111111 941.653333 967.111111 910.222222L967.111111 682.666667C967.111111 651.235556 941.653333 625.777778 910.222222 625.777778L682.666667 625.777778C651.235556 625.777778 625.777778 651.235556 625.777778 682.666667L625.777778 910.222222Z" p-id="7283"></path></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

1
src/icons/svg/link.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

1
src/icons/svg/nested.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>

After

Width:  |  Height:  |  Size: 821 B

1
src/icons/svg/notice.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1602473140401" class="icon" viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200.390625" height="200"><defs><style type="text/css"></style></defs><path d="M990.802993 1024H52.604489c-18.386035 0-33.197007-14.810973-33.197008-33.197007V395.299751c0-18.386035 14.810973-33.197007 33.197008-33.197008H990.802993c18.386035 0 33.197007 14.810973 33.197007 33.197008V990.802993c0 18.386035-14.810973 33.197007-33.197007 33.197007z m-915.215961-56.179551h892.233417V418.282294H75.587032v549.538155z" p-id="4055"></path><path d="M518.894763 64.351122m-64.351122 0a64.351122 64.351122 0 1 0 128.702244 0 64.351122 64.351122 0 1 0-128.702244 0Z" p-id="4056"></path><path d="M766.084788 403.471322l-244.636409-244.636409L277.322693 403.471322l-39.836409-39.836409 283.962095-284.472818 284.472818 284.472818z" p-id="4057"></path><path d="M821.753616 631.253865H221.653865c-15.321696 0-28.089776-12.76808-28.089775-28.089775s12.76808-28.089776 28.089775-28.089776h600.099751c15.321696 0 28.089776 12.76808 28.089776 28.089776s-12.76808 28.089776-28.089776 28.089775zM524.512718 805.410474H221.653865c-15.321696 0-28.089776-12.76808-28.089775-28.089776s12.76808-28.089776 28.089775-28.089775h302.858853c15.321696 0 28.089776 12.76808 28.089776 28.089775s-12.76808 28.089776-28.089776 28.089776z" p-id="4058"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
src/icons/svg/password.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>

After

Width:  |  Height:  |  Size: 623 B

1
src/icons/svg/put-in.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029634880" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10822" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M514.332 719.53L374.955 580.154a50.404 50.404 0 0 0-47.047-15.246c-14.336 3.754-20.992 15.246-24.804 28.16-3.812 12.97 3.812 36.181 17.351 47.786l74.809 70.429H104.277c-16.896 0-32.597 5.916-41.017 20.537a47.388 47.388 0 0 0 0 47.445c8.42 14.62 24.121 19.342 41.017 19.342h290.987l-74.809 72.59c-12.003 11.947-21.845 33.337-17.351 47.787 4.551 14.507 13.426 21.049 25.998 24.52 12.573 3.413 33.85-0.171 45.853-12.118l142.222-142.222a47.332 47.332 0 0 0 13.312-40.335 47.275 47.275 0 0 0-16.157-29.297z" p-id="10823"></path><path d="M718.62 944.754a47.388 47.388 0 0 1-41.016-23.723c-8.534-14.62-8.534-25.088 0-39.765A47.388 47.388 0 0 1 718.62 857.6h150.073l-3.015-495.275L512 152.405 143.132 362.382v116.054c0 26.168-17.066 45.226-43.235 45.226-26.283-0.057-43.008-19.058-43.008-45.226V336.213c0-16.327 8.363-31.573 22.243-40.277L486.798 62.692a47.388 47.388 0 0 1 50.29 0l393.216 233.244c13.88 8.704 22.357 23.893 22.3 40.334l3.016 561.095c0 26.17-21.22 47.389-47.446 47.389h-189.61z" p-id="10824"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
src/icons/svg/report-form.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029353518" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8423" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M938.688 938.688V512H1024v512H0v-85.312h938.688zM682.688 0H1024v341.312h-85.312V145.088l-384 384L384 358.4 115.2 627.2l-59.712-59.712L384 238.912 554.688 409.6l324.224-324.288h-196.224V0zM213.312 640h85.376v213.312H213.312V640zM384 554.688h85.312v298.624H384V554.688zM554.688 640H640v213.312H554.688V640z m170.624-170.688h85.376v384h-85.376v-384z" p-id="8424"></path></svg>

After

Width:  |  Height:  |  Size: 750 B

1
src/icons/svg/settings.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029138663" class="icon" viewBox="0 0 1032 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6595" xmlns:xlink="http://www.w3.org/1999/xlink" width="201.5625" height="200"><defs><style type="text/css"></style></defs><path d="M981.686 389.29h-76.165c-8.463-25.39-16.926-50.778-33.852-76.166l59.24-59.24c8.463-8.463 8.463-33.85 0-42.314L803.967 84.628c-8.463-8.463-33.851-8.463-42.314 0l-59.24 50.777-76.165-25.388V33.85C626.248 16.926 617.785 0 600.86 0H414.678c-16.926 0-25.389 16.926-25.389 33.851v76.166l-76.165 25.388-59.24-50.777c-8.463-8.463-33.85-8.463-42.314 0L84.628 211.57c-8.463 8.463-8.463 33.851 0 42.314l50.777 50.777c-8.463 33.851-16.926 59.24-25.388 84.628H33.85C16.926 389.29 0 397.752 0 414.678v177.719c0 16.925 16.926 33.85 33.851 33.85h76.166l25.388 76.166-50.777 59.24c-8.463 8.463-8.463 33.851 0 42.314L211.57 930.909c8.463 8.463 33.851 8.463 42.314 0l50.777-50.777c25.389 16.926 50.777 25.389 76.165 33.851v76.166c0 16.925 16.926 33.851 33.852 33.851h177.719c16.925 0 33.85-16.926 33.85-33.851v-76.166c25.39-8.462 50.778-16.925 76.166-33.85l59.24 50.776c8.463 8.463 33.851 8.463 42.314 0l126.942-126.942c8.463-8.463 8.463-33.851 0-42.314l-50.777-50.777c16.926-25.388 25.389-50.777 33.851-76.165h76.166c16.925 0 33.851-16.926 33.851-33.851V414.678c-8.463-16.926-25.388-25.389-42.314-25.389z m-33.851 177.718h-67.703c-16.925 0-25.388 8.463-33.851 25.389 0 33.85-16.926 67.702-33.851 101.553-8.463 8.463-8.463 25.389 0 42.314l50.777 50.777-84.628 84.628-42.315-59.24c-16.925-8.462-33.85-8.462-42.314 0-33.85 16.926-67.702 33.852-101.553 42.315-16.926 0-25.389 16.925-25.389 33.851v67.703h-118.48v-67.703c0-16.926-8.462-25.388-25.388-33.851-33.85-8.463-67.702-25.389-101.553-42.314-8.463-8.463-25.389-8.463-42.314 0l-50.777 50.777-84.628-84.628 50.777-50.777c8.462-8.463 8.462-25.389 8.462-42.314-16.925-25.389-33.85-59.24-42.314-93.091 0-16.926-16.925-25.389-33.85-25.389h-59.24v-118.48h67.702c16.926 0 25.388-8.462 33.851-25.388 0-33.85 16.926-67.702 33.851-101.553 8.463-8.463 8.463-25.389-8.462-42.314l-42.314-42.314 84.628-84.628 50.777 50.776c8.462 8.463 25.388 8.463 42.314 8.463 25.388-25.388 59.24-42.314 93.09-50.777 16.926 0 25.389-16.925 25.389-33.85v-59.24h118.48v67.702c0 16.926 8.462 25.388 25.388 33.851 33.85 0 67.702 16.926 101.553 33.851 8.463 8.463 25.389 8.463 42.314-8.462l50.777-50.777 84.628 84.628-59.24 50.777c-8.462 16.925-8.462 33.851 0 42.314 16.926 33.851 33.852 67.702 42.315 101.553 0 16.926 16.925 25.389 33.851 25.389h67.703v118.48z" p-id="6596"></path><path d="M507.769 321.587c-101.554 0-186.182 84.628-186.182 186.182S406.215 693.95 507.769 693.95 693.95 609.322 693.95 507.77 609.322 321.587 507.77 321.587z m0 313.124c-67.703 0-126.943-59.24-126.943-126.942s59.24-126.943 126.943-126.943S634.71 440.066 634.71 507.77 575.47 634.71 507.769 634.71z" p-id="6597"></path></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

1
src/icons/svg/size.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>

After

Width:  |  Height:  |  Size: 211 B

1
src/icons/svg/synchronous.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1602474677990" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4785" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M462.72 771.968z" p-id="4786"></path><path d="M241.92 486.528c0-0.704 0-1.344-0.64-2.688 0 3.328 0 4.032 0.64 2.688z m-1.984-6.144c1.344 1.408 1.344 2.688 1.344 3.392v-1.984s-0.704-0.64-1.344-1.408z" p-id="4787"></path><path d="M479.616 693.184c40.384-43.84 81.472-88.192 121.856-131.968 40.448-44.48 81.472-90.176 121.984-131.968v-0.704a19.328 19.328 0 0 0 6.656-14.848v-3.968c0-12.096-11.456-22.912-26.304-22.912H590.656c0-5.376-0.704-10.112-1.344-15.424l-8.832-38.4a408.96 408.96 0 0 0-16.704-41.088 275.648 275.648 0 0 0-33.024-53.184 285.568 285.568 0 0 0-45.12-44.48c-66.624-54.4-159.552-86.144-251.84-97.6a2623.296 2623.296 0 0 0-77.312-6.656c-2.688 0-6.144-0.64-6.144-0.64a46.528 46.528 0 0 0-10.752-1.408h-17.536c-15.488 0-30.976-0.64-44.416 4.736-21.568 8.064-16.128 36.992 6.08 40.96 0.64 0 1.344 0 1.344 0.704l6.016 2.048c4.096 1.344 8.064 3.456 12.8 5.376 8.768 4.032 18.176 8.064 26.944 12.16 17.536 8 34.368 16.832 50.496 26.24 16.896 9.408 27.648 16.128 43.84 27.648 14.784 10.752 28.928 22.144 42.368 33.664 3.328 3.328 6.08 6.016 9.408 8.704 1.408 1.344 2.048 2.688 3.392 4.032 0 0 3.392 2.688 3.392 3.392 6.016 6.016 11.456 12.8 16.128 19.52 5.376 6.08 9.408 12.8 13.504 19.52 5.376 8.064 7.424 12.8 10.752 19.52 2.688 5.376 4.032 10.752 6.016 16.832 0 0 1.344 7.424 3.392 22.912v15.488h2.048c0 4.032 0 8-0.704 12.032v4.032l-87.552-1.92h-3.328l-41.792-4.736c-17.472-1.408-31.616 6.72-32.96 17.536l-0.64 4.032a15.808 15.808 0 0 0 6.016 14.08v0.64c12.864 12.8 33.024 29.632 47.872 43.776 8.064 7.424 14.784 14.144 17.536 18.816v0.64c0.576 0.832 1.28 1.472 1.28 1.472 63.936 70.656 127.168 141.312 190.528 211.392 13.504 14.784 34.304 14.144 47.808 0zM263.488 431.296c31.616 0.704 62.592 1.344 94.208 1.344 11.52 0.704 24.256-6.72 26.304-16.192a211.2 211.2 0 0 0 6.08-53.824 165.248 165.248 0 0 0-12.096-55.872c-14.144-35.008-39.104-65.92-68.032-93.568-28.928-26.944-63.296-49.856-98.304-70.72-1.984-1.344-4.032-1.984-6.144-3.392 2.048 0 4.096 0 6.08 0.704 18.944 1.344 45.824 6.08 68.736 11.456 10.752 1.92 21.568 4.672 32.32 8 4.672 1.408 10.048 2.688 14.784 4.736 2.688 0.64 5.376 1.408 7.36 2.048 1.344 0.64 2.688 0.64 4.032 1.28 0.704 0 1.344 0.704 2.048 0.704 20.16 7.424 39.68 16.128 57.856 25.6 18.944 10.176 31.04 18.88 48.512 32.32 7.424 6.08 14.784 12.8 21.568 18.816 1.344 2.048 3.328 3.392 4.736 5.376 0.64 0 0.64 0.704 0.64 0.704 0.64 0 0.64 0.64 1.344 1.344 4.032 4.032 7.36 8 10.752 12.8 5.376 7.424 10.752 14.784 15.488 22.208 6.08 10.752 8.768 15.552 13.44 25.6 8.064 18.816 15.488 37.696 19.52 57.28v1.344c0 1.344 0.64 3.328 0.64 4.672 0 4.032 0.64 8.064 0.64 12.096l2.048 21.568c2.112 12.096 11.52 22.272 27.712 22.272h85.504c-32.256 35.008-63.232 69.312-94.912 103.68-33.728 36.288-66.688 72.704-100.288 108.992-64.064-71.36-128.64-142.016-192.576-213.376z" p-id="4788"></path><path d="M702.016 129.984H960v68.032h-257.984z" p-id="4789"></path><path d="M896 192h64v768h-64zM64 896h832v64H64zM64 576h64v320H64z" p-id="4790"></path></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
src/icons/svg/table.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>

After

Width:  |  Height:  |  Size: 597 B

1
src/icons/svg/take-over.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597029291418" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7675" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M672.914286 0c36.571429 0 58.514286 29.257143 73.142857 73.142857h138.971428c36.571429 0 58.514286 21.942857 65.828572 58.514286V958.171429c0 36.571429-29.257143 58.514286-58.514286 65.828571H138.971429c-36.571429 0-65.828571-21.942857-65.828572-58.514286V138.971429c0-36.571429 29.257143-58.514286 58.514286-65.828572h109.714286c7.314286-43.885714 36.571429-73.142857 73.142857-73.142857h358.4z m190.171428 146.285714H753.371429c-7.314286 43.885714-36.571429 73.142857-73.142858 73.142857h-365.714285c-36.571429 0-65.828571-29.257143-73.142857-73.142857H160.914286c-7.314286 0-14.628571 7.314286-14.628572 14.628572v775.314285c0 7.314286 7.314286 14.628571 14.628572 14.628572h709.485714c7.314286 0 14.628571-7.314286 14.628571-14.628572V160.914286c-7.314286-7.314286-14.628571-14.628571-21.942857-14.628572zM694.857143 629.028571c21.942857 0 36.571429 14.628571 36.571428 36.571429s-14.628571 36.571429-36.571428 36.571429H416.914286l65.828571 65.828571c14.628571 14.628571 14.628571 36.571429 0 51.2-7.314286 7.314286-14.628571 7.314286-29.257143 7.314286s-14.628571 7.314286-21.942857 0L299.885714 694.857143C292.571429 680.228571 292.571429 665.6 292.571429 650.971429c7.314286-14.628571 21.942857-21.942857 36.571428-21.942858h365.714286zM592.457143 380.342857L724.114286 512c7.314286 7.314286 7.314286 21.942857 7.314285 36.571429-7.314286 14.628571-21.942857 21.942857-36.571428 21.942857h-365.714286c-21.942857 0-36.571429-14.628571-36.571428-36.571429s14.628571-36.571429 36.571428-36.571428h277.942857l-65.828571-65.828572c-14.628571-14.628571-14.628571-36.571429 0-51.2 14.628571-21.942857 36.571429-14.628571 51.2 0z m73.142857-307.2H343.771429c-14.628571 0-21.942857 14.628571-21.942858 36.571429s7.314286 36.571429 14.628572 36.571428h329.142857c14.628571 0 21.942857-14.628571 21.942857-36.571428 0-14.628571-7.314286-29.257143-21.942857-36.571429z" p-id="7676"></path></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

1
src/icons/svg/task.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597028828110" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3177" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 96v832a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32h832a32 32 0 0 1 32 32zM128 128v768h768V128z m384 192h320v64h-320z m0 256h320v64h-320zM192 366.04l43.876-45.252 50.912 50.912 115.964-115.968 45.256 45.256-138.592 138.592a32 32 0 0 1-45.256 0zM384 544v128a32 32 0 0 1-32 32H224a32 32 0 0 1-32-32v-128a32 32 0 0 1 32-32h128a32 32 0 0 1 32 32z m-128 32v64h64v-64z" p-id="3178"></path></svg>

After

Width:  |  Height:  |  Size: 786 B

1
src/icons/svg/todo.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1611544228947" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1113" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.914 63.99c-247.012 0-447.925 200.912-447.925 447.924s200.913 447.925 447.925 447.925 447.925-200.913 447.925-447.925S758.926 63.989 511.914 63.989z m0 831.687c-211.577 0-383.763-172.186-383.763-383.763 0-211.577 172.014-383.763 383.763-383.763s383.763 172.014 383.763 383.763-172.186 383.763-383.763 383.763z" p-id="1114"></path><path d="M672.06 511.914H512.085v-223.79c0-17.718-14.277-32.167-31.995-32.167-17.717 0-31.994 14.45-31.994 32.167V544.08c0 17.717 14.277 31.994 31.994 31.994H672.06c17.718 0 32.167-14.277 32.167-31.994-0.172-17.89-14.621-32.167-32.167-32.167z" p-id="1115"></path></svg>

After

Width:  |  Height:  |  Size: 980 B

1
src/icons/svg/tree.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/icons/svg/update.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1603260612294" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2867" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M223.425605 449.2744l161.632237 0 0 253.65714c0 16.954137 13.745049 30.699186 30.699186 30.699186 16.95516 0 30.699186-13.745049 30.699186-30.699186l0-284.356326c0-16.95516-13.744026-30.699186-30.699186-30.699186L291.035446 387.876028l217.23665-248.51605L733.039255 387.580293 607.104031 387.580293c-16.954137 0-30.699186 13.745049-30.699186 30.699186l0 284.652062c0 16.954137 13.745049 30.699186 30.699186 30.699186s30.699186-13.745049 30.699186-30.699186L637.803217 448.978664l164.448376 0c12.140505 0 23.140023-7.154957 28.063149-18.251689 4.922103-11.097756 2.841721-24.053835-5.307889-33.05279L530.62315 72.570829c-5.881964-6.495948-14.273075-10.134825-23.024389-10.091846-8.763594 0.076748-17.076934 3.895727-22.844288 10.494005L200.312188 398.371056c-7.92653 9.067516-9.818623 21.931498-4.839215 32.896224S211.383338 449.2744 223.425605 449.2744z" p-id="2868"></path><path d="M222.354204 829.113381l581.732178 0c16.954137 0 30.699186-13.745049 30.699186-30.699186s-13.745049-30.699186-30.699186-30.699186L222.354204 767.715009c-16.954137 0-30.699186 13.745049-30.699186 30.699186S205.400067 829.113381 222.354204 829.113381z" p-id="2869"></path><path d="M804.086381 896.729361 222.354204 896.729361c-16.954137 0-30.699186 13.745049-30.699186 30.699186s13.745049 30.699186 30.699186 30.699186l581.732178 0c16.954137 0 30.699186-13.745049 30.699186-30.699186S821.041542 896.729361 804.086381 896.729361z" p-id="2870"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/icons/svg/user.svg

@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>

After

Width:  |  Height:  |  Size: 440 B

22
src/icons/svgo.yml

@ -0,0 +1,22 @@
# replace default config
# multipass: true
# full: true
plugins:
# - name
#
# or:
# - name: false
# - name: true
#
# or:
# - name:
# param1: 1
# param2: 2
- removeAttrs:
attrs:
- 'fill'
- 'fill-rule'

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

Loading…
Cancel
Save