Commit c1446d69 authored by 赵啸非's avatar 赵啸非

app-ui

parent da20f6ea
module.exports = {
plugins: {
autoprefixer: {}
}
}
\ No newline at end of file
module.exports = {
presets: [
'@vue/app'
]
}
\ No newline at end of file
{
"name": "app",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "vue-cli-service serve",
"dev2": "vue-cli-service serve --use ",
"dev3": "vue-cli-service serve --use 现网",
"build": "vue-cli-service build"
},
"dependencies": {
"@chenfengyuan/vue-qrcode": "^1.0.2",
"@xunlei/vue-context-menu": "^1.0.2",
"axios": "^0.18.0",
"clipboard": "2.0.6",
"core-js": "3.8.1",
"echarts": "^4.3.0",
"element-react": "^1.4.34",
"element-ui": "^2.15.5",
"file-saver": "2.0.4",
"form-gen-parser": "^1.0.3",
"fuse.js": "6.4.3",
"highlight.js": "^9.18.5",
"js-beautify": "1.13.0",
"js-cookie": "2.2.1",
"jsencrypt": "3.0.0-rc.1",
"json-bigint": "^0.3.0",
"muse-ui": "^3.0.2",
"nprogress": "0.2.0",
"quill": "1.3.7",
"screenfull": "5.0.2",
"sockjs-client": "^1.5.1",
"sortablejs": "1.10.2",
"stompjs": "^2.3.3",
"v-charts": "^1.17.10",
"vkbeautify": "^0.99.3",
"vue": "^2.6.14",
"vue-amap": "^0.5.8",
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-router": "3.4.9",
"vue2-org-tree": "^1.3.5",
"vuedraggable": "2.24.3",
"vuex": "3.6.0",
"workflow-bpmn-modeler": "^0.2.8"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.6",
"@vue/cli-plugin-eslint": "4.4.6",
"@vue/cli-service": "4.4.6",
"babel-eslint": "10.1.0",
"chalk": "4.1.0",
"connect": "3.6.6",
"eslint": "7.15.0",
"eslint-plugin-vue": "7.2.0",
"less": "^3.0.4",
"less-loader": "^4.1.0",
"lint-staged": "10.5.3",
"node-sass": "^5.0.0",
"runjs": "4.4.2",
"sass": "1.32.0",
"sass-loader": "^10.1.0",
"script-ext-html-webpack-plugin": "2.1.5",
"svg-sprite-loader": "5.1.1",
"vue-formatter": "^0.0.8",
"vue-template-compiler": "^2.6.10"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
class Cache {
constructor(fecthUrl, durtion) {
this.cache = {
time: 0,
data: '',
};
this.durtion = durtion;
this.fecthUrl = fecthUrl;
}
async getData() {
const currTime = new Date().getTime();
// 缓存过期,重新拉取
if(currTime - this.cache.time > this.durtion * 1000) {
const data = await this.fecthData();
this.setData(data);
return data;
}
return this.cache.data
}
setData(data) {
this.cache.data = data;
this.cache.time = new Date().getTime();
}
fecthData() {
return new Promise((resolve)=>{
setTimeout(()=>{
resolve('data from fecth');
}, 2000)
})
}
}
class TreeCache extends Cache {
constructor(fecthUrl, durtion) {
super(fecthUrl, durtion);
}
async getData() {
const data = await super.getData();
return data+'1111111111';
}
}
let cache = new TreeCache('', 4);
cache.setData([1,2,3])
cache.getData().then(console.log)
setTimeout(()=>{
cache.getData().then(console.log)
}, 5000)
<!DOCTYPE html>
<html>
<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="<%= BASE_URL %>favicon.ico">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic">
<link rel="stylesheet" href="https://cdn.bootcss.com/material-design-icons/3.0.1/iconfont/material-icons.css">
<title>工作流管理平台</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.15.5/lib/theme-chalk/index.css">
</head>
<body>
<noscript>
<strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="https://unpkg.com/vue@2.6.14/dist/vue.runtime.min.js"></script>
<script src="https://unpkg.com/vuex@3.6.0/dist/vuex.min.js"></script>
<script src="https://unpkg.com/vue-router@3.4.9/dist/vue-router.min.js"></script>
<script src="https://unpkg.com/element-ui@2.15.5/lib/index.js"></script>
</body>
</html>
<template>
<div id="app">
<router-view/>
</div>
</template>
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
\ No newline at end of file
<?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="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>
\ No newline at end of file
<?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="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>
\ No newline at end of file
<?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="1576153230908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="971" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z" p-id="972"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
\ No newline at end of file
<?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="1575982282951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="902" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z" p-id="903"></path><path d="M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z" p-id="904"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
\ No newline at end of file
<?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="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" fill="#bfbfbf" p-id="2423"></path></svg>
\ No newline at end of file
<?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="1577252187056" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2508" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z" p-id="2509"></path><path d="M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z" p-id="2510"></path></svg>
\ No newline at end of file
<?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="1575804206892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3145" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z" p-id="3146"></path></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1579774833889" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1376" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z" p-id="1377"></path><path d="M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z" p-id="1378"></path></svg>
\ No newline at end of file
<?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="1577186573535" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1068" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z" p-id="1069"></path></svg>
\ No newline at end of file
<?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="1566035680909" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1002.0848 744.672l-33.568 10.368c0.96 7.264 2.144 14.304 2.144 21.76 0 7.328-1.184 14.432-2.368 21.568l33.792 10.56c7.936 2.24 14.496 7.616 18.336 14.752 3.84 7.328 4.672 15.808 1.952 23.552-5.376 16-23.168 24.672-39.936 19.68l-34.176-10.624c-7.136 12.8-15.776 24.672-26.208 35.2l20.8 27.488a28.96 28.96 0 0 1 5.824 22.816 29.696 29.696 0 0 1-12.704 19.616 32.544 32.544 0 0 1-44.416-6.752l-20.8-27.552c-13.696 6.56-28.192 11.2-43.008 13.888v33.632c0 16.736-14.112 30.432-31.648 30.432-17.6 0-31.872-13.696-31.872-30.432v-33.632a167.616 167.616 0 0 1-42.88-13.888l-20.928 27.552c-10.72 13.76-30.08 16.64-44.288 6.752a29.632 29.632 0 0 1-12.704-19.616 29.28 29.28 0 0 1 5.696-22.816l20.896-27.808a166.72 166.72 0 0 1-27.008-34.688l-33.376 10.432c-16.8 5.184-34.56-3.552-39.936-19.616a29.824 29.824 0 0 1 20.224-38.24l33.472-10.432c-0.8-7.264-2.016-14.304-2.016-21.824 0-7.36 1.184-14.496 2.304-21.632l-33.792-10.368c-16.672-5.376-25.632-22.496-20.224-38.432 5.376-16 23.136-24.672 39.936-19.68l34.016 10.752c7.328-12.672 15.84-24.8 26.336-35.328l-20.8-27.552a29.44 29.44 0 0 1 6.944-42.432 32.704 32.704 0 0 1 44.384 6.752l20.832 27.616c13.696-6.432 28.224-11.2 43.104-13.952v-33.568c0-16.736 14.048-30.432 31.648-30.432 17.536 0 31.808 13.568 31.808 30.432v33.504c15.072 2.688 29.344 7.808 42.848 14.016l20.992-27.616a32.48 32.48 0 0 1 44.224-6.752 29.568 29.568 0 0 1 7.136 42.432l-21.024 27.808c10.432 10.432 19.872 21.888 27.04 34.752l33.376-10.432c16.768-5.12 34.56 3.68 39.936 19.68 5.536 15.936-3.712 33.056-20.32 38.304z m-206.016-74.432c-61.344 0-111.136 47.808-111.136 106.56 0 58.88 49.792 106.496 111.136 106.496 61.312 0 111.104-47.616 111.104-106.496 0-58.752-49.792-106.56-111.104-106.56z" p-id="3602"></path><path d="M802.7888 57.152h-76.448c0-22.08-21.024-38.24-42.848-38.24H39.3968a39.68 39.68 0 0 0-39.36 40.032v795.616s41.888 120.192 110.752 120.192H673.2848a227.488 227.488 0 0 1-107.04-97.44H117.6368s-40.608-13.696-40.608-41.248l470.304-0.256 1.664 3.36a227.68 227.68 0 0 1-12.64-73.632c0-60.576 24-118.624 66.88-161.44a228.352 228.352 0 0 1 123.552-63.392l-3.2 0.288 2.144-424.672h38.208l0.576 421.024c27.04 0 52.672 4.8 76.64 13.344V101.536c0.032 0-6.304-44.384-38.368-44.384zM149.7648 514.336H72.3888v-77.408H149.7648v77.408z m0-144.32H72.3888v-77.44H149.7648v77.44z m0-137.248H72.3888v-77.44H149.7648v77.44z m501.856 281.568H206.0848v-77.408h445.536v77.408z m0-144.32H206.0848v-77.44h445.536v77.44z m0-137.248H206.0848v-77.44h445.536v77.44z" p-id="3603"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
\ No newline at end of file
<?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="1569915748289" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3062" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h64v64H256.35456v-64z m448 0h64v64h-64v-64z" fill="#333333" p-id="3063"></path><path d="M539.04256 845.248V512.192a32.448 32.448 0 0 0-32-32.192c-17.664 0-32 14.912-32 32.192v333.056l-36.096-36.096a32.192 32.192 0 0 0-45.056 0.192 31.616 31.616 0 0 0-0.192 45.056l90.88 90.944a31.36 31.36 0 0 0 22.528 9.088 30.08 30.08 0 0 0 22.4-9.088l90.88-90.88a32.192 32.192 0 0 0-0.192-45.12 31.616 31.616 0 0 0-45.056-0.192l-36.096 36.096z" fill="#333333" p-id="3064"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
\ No newline at end of file
<?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="1566036347051" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5853" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M832 128H192a64.19 64.19 0 0 0-64 64v640a64.19 64.19 0 0 0 64 64h640a64.19 64.19 0 0 0 64-64V192a64.19 64.19 0 0 0-64-64z m0 703.89l-0.11 0.11H192.11l-0.11-0.11V768h640zM832 544H720L605.6 696.54 442.18 435.07 333.25 544H192v-64h114.75l147.07-147.07L610.4 583.46 688 480h144z m0-288H192v-63.89l0.11-0.11h639.78l0.11 0.11z" p-id="5854"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
\ No newline at end of file
<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<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>
\ No newline at end of file
<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>
\ No newline at end of file
<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>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1581238998885" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4187" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.542857 14.057143C228.914286 13.942857 0 242.742857 0 525.142857 0 748.457143 143.2 938.285714 342.628571 1008c26.857143 6.742857 22.742857-12.342857 22.742858-25.371429v-88.571428c-155.085714 18.171429-161.371429-84.457143-171.771429-101.6C172.571429 756.571429 122.857143 747.428571 137.714286 730.285714c35.314286-18.171429 71.314286 4.571429 113.028571 66.171429 30.171429 44.685714 89.028571 37.142857 118.857143 29.714286 6.514286-26.857143 20.457143-50.857143 39.657143-69.485715-160.685714-28.8-227.657143-126.857143-227.657143-243.428571 0-56.571429 18.628571-108.571429 55.2-150.514286-23.314286-69.142857 2.171429-128.342857 5.6-137.142857 66.4-5.942857 135.428571 47.542857 140.8 51.771429 37.714286-10.171429 80.8-15.542857 129.028571-15.542858 48.457143 0 91.657143 5.6 129.714286 15.885715 12.914286-9.828571 76.914286-55.771429 138.628572-50.171429 3.314286 8.8 28.228571 66.628571 6.285714 134.857143 37.028571 42.057143 55.885714 94.514286 55.885714 151.2 0 116.8-67.428571 214.971429-228.571428 243.314286a145.714286 145.714286 0 0 1 43.542857 104v128.571428c0.914286 10.285714 0 20.457143 17.142857 20.457143 202.4-68.228571 348.114286-259.428571 348.114286-484.685714 0-282.514286-229.028571-511.2-511.428572-511.2z" p-id="4188"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
\ No newline at end of file
<?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="1575802859706" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3102" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 224H128c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V288c0-35.2-28.8-64-64-64z m0 480c0 19.2-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V320c0-19.2 12.8-32 32-32h704c19.2 0 32 12.8 32 32v384z" p-id="3103"></path><path d="M224 352c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V384c0-16-12.8-32-32-32z" p-id="3104"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
\ No newline at end of file
<?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="1566036191400" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5472" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M934.912 1016.832H192c-14.336 0-25.6-11.264-25.6-25.6v-189.44c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v163.84h691.712V64H217.6v148.48c0 14.336-11.264 25.6-25.6 25.6s-25.6-11.264-25.6-25.6v-174.08c0-14.336 11.264-25.6 25.6-25.6h742.912c14.336 0 25.6 11.264 25.6 25.6v952.832c0 14.336-11.264 25.6-25.6 25.6z" p-id="5473"></path><path d="M232.96 371.2h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 540.16h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 698.88h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM574.464 762.88c-134.144 0-243.2-109.056-243.2-243.2S440.32 276.48 574.464 276.48s243.2 109.056 243.2 243.2-109.056 243.2-243.2 243.2z m0-435.2c-105.984 0-192 86.016-192 192S468.48 711.68 574.464 711.68s192-86.016 192-192S680.448 327.68 574.464 327.68z" p-id="5474"></path><path d="M663.04 545.28h-87.04c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h87.04c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6z" p-id="5475"></path><path d="M576 545.28c-14.336 0-25.6-11.264-25.6-25.6v-87.04c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v87.04c0 14.336-11.264 25.6-25.6 25.6z" p-id="5476"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
\ No newline at end of file
<?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="1566035943711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4805" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M208.736 566.336H64.384v59.328h144.352v-59.328z m0-336.096H165.44V74.592c0-7.968 4.896-14.848 10.464-14.848h502.016V0.448H175.936c-38.72 1.248-69.248 34.368-68.192 74.144v155.648H64.384V289.6h144.352V230.24z m0 168.096H64.384v59.328h144.352v-59.328z m714.656 76.576h-57.76v474.496c0 7.936-4.896 14.848-10.464 14.848H175.936c-5.568 0-10.464-6.912-10.464-14.848v-155.68h43.296v-59.296H64.384v59.296h43.328v155.68c-1.024 39.776 29.472 72.896 68.192 74.144h679.232c38.72-1.184 69.248-34.368 68.256-74.144V474.912z m14.944-290.336l-83.072-85.312a71.264 71.264 0 0 0-52.544-21.728 71.52 71.52 0 0 0-51.616 23.872L386.528 507.264a30.496 30.496 0 0 0-6.176 10.72L308.16 740.512a30.016 30.016 0 0 0 6.976 30.24c7.712 7.968 19.2 10.752 29.568 7.2l216.544-74.112a28.736 28.736 0 0 0 12.128-7.936L940.448 287.456a75.552 75.552 0 0 0-2.112-102.88z m-557.12 518.272l39.104-120.64 78.336 80.416-117.44 40.224z m170.048-70.016l-103.552-106.016 200.16-222.4 103.52 106.304-200.128 222.112zM897.952 247.072l-0.256 0.224-107.136 119.168-103.52-106.528 106.432-118.624a14.144 14.144 0 0 1 10.304-4.736 13.44 13.44 0 0 1 10.464 4.288l83.264 85.696c5.472 5.6 5.664 14.72 0.448 20.512z" p-id="4806"></path></svg>
\ No newline at end of file
<?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="1566036016814" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5261" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 128h-85.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666666v640H170.666667V213.333333h42.666666a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0-42.666667 42.666667v725.333333a42.666667 42.666667 0 0 0 42.666667 42.666667h768a42.666667 42.666667 0 0 0 42.666667-42.666667V170.666667a42.666667 42.666667 0 0 0-42.666667-42.666667z" p-id="5262"></path><path d="M341.333333 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666666 42.666667zM512 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333334 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM682.666667 298.666667a42.666667 42.666667 0 0 0 42.666666-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM341.333333 768a42.666667 42.666667 0 0 0 42.666667-42.666667 128 128 0 0 1 256 0 42.666667 42.666667 0 0 0 85.333333 0 213.333333 213.333333 0 0 0-107.52-184.32A128 128 0 0 0 640 469.333333a128 128 0 0 0-256 0 128 128 0 0 0 22.186667 71.68A213.333333 213.333333 0 0 0 298.666667 725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667z m128-298.666667a42.666667 42.666667 0 1 1 42.666667 42.666667 42.666667 42.666667 0 0 1-42.666667-42.666667z" p-id="5263"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
\ No newline at end of file
<?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="1543827393750" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4695" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
</style></defs><path d="M64 64V640H896V64H64zM0 0h960v704H0V0z" p-id="4696"></path><path d="M192 896H768v64H192zM448 640H512v256h-64z" p-id="4697"></path><path d="M479.232 561.604267l309.9904-348.330667-47.803733-42.5472-259.566934 291.669333L303.957333 240.008533 163.208533 438.6048l52.224 37.009067 91.6224-129.28z" p-id="4698"></path></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1575802851180" 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="M279.272727 791.272727h512a46.545455 46.545455 0 0 1 0 93.090909H279.272727a46.545455 46.545455 0 0 1 0-93.090909z m33.838546-617.984V651.636364H193.722182V395.170909c0-37.003636-0.884364-59.298909-2.653091-66.746182a24.948364 24.948364 0 0 0-14.615273-16.989091c-8.005818-3.863273-25.786182-5.771636-53.341091-5.771636h-11.822545v-55.854545c57.716364-12.381091 101.562182-37.888 131.490909-76.520728h70.283636z m303.709091 396.8V651.636364H354.164364v-68.235637c77.777455-127.255273 124.043636-206.010182 138.705454-236.218182 14.661818-30.254545 22.016-53.853091 22.016-70.74909 0-13.032727-2.234182-22.714182-6.656-29.137455-4.421818-6.376727-11.170909-9.588364-20.247273-9.588364a22.248727 22.248727 0 0 0-20.200727 10.612364c-4.468364 7.121455-6.656 21.178182-6.656 42.263273v45.521454H354.164364v-17.454545c0-26.763636 1.396364-47.941818 4.142545-63.348364 2.746182-15.499636 9.541818-30.72 20.386909-45.661091 10.798545-14.987636 24.901818-26.298182 42.216727-33.978182 17.361455-7.68 38.167273-11.543273 62.37091-11.543272 47.476364 0 83.316364 11.776 107.706181 35.328 24.296727 23.552 36.445091 53.341091 36.445091 89.367272 0 27.368727-6.842182 56.32-20.48 86.853819-13.730909 30.533818-54.039273 95.325091-121.018182 194.420363h130.885819z m270.615272-189.393454c18.152727 6.097455 31.650909 16.104727 40.494546 29.975272 8.843636 13.917091 13.312 46.452364 13.312 97.652364 0 38.027636-4.328727 67.490909-13.032727 88.529455-8.657455 20.945455-23.598545 36.910545-44.869819 47.848727-21.271273 10.938182-48.593455 16.384-81.873454 16.384-37.794909 0-67.490909-6.330182-89.088-19.083636-21.550545-12.660364-35.746909-28.253091-42.542546-46.638546-6.795636-18.432-10.193455-50.362182-10.193454-95.883636v-37.841455h119.389091v77.730909c0 20.666182 1.210182 33.838545 3.723636 39.424 2.420364 5.585455 7.912727 8.424727 16.337455 8.424728 9.309091 0 15.36-3.537455 18.338909-10.612364 2.932364-7.121455 4.421818-25.6 4.421818-55.575273v-33.047273c0-18.338909-2.048-31.744-6.190546-40.215272a30.72 30.72 0 0 0-18.338909-16.709818c-8.052364-2.653091-23.738182-4.189091-46.964363-4.561455V357.050182c28.392727 0 45.893818-1.070545 52.596363-3.258182a22.946909 22.946909 0 0 0 14.475637-14.149818c2.932364-7.307636 4.421818-18.711273 4.421818-34.257455v-26.624c0-16.756364-1.722182-27.741091-5.12-33.047272-3.490909-5.352727-8.843636-8.005818-16.151273-8.005819-8.285091 0-13.963636 2.792727-16.989091 8.378182-3.025455 5.632-4.561455 17.640727-4.561454 35.933091v39.284364h-119.389091v-40.773818c0-45.661091 10.472727-76.567273 31.325091-92.625455 20.898909-16.058182 54.085818-24.064 99.607272-24.064 56.878545 0 95.511273 11.170909 115.805091 33.373091 20.293818 22.248727 30.394182 53.201455 30.394182 92.765091 0 26.810182-3.630545 46.173091-10.891636 58.088727-7.307636 11.915636-20.107636 22.807273-38.446546 32.628364z" p-id="2868"></path></svg>
\ No newline at end of file
<?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="1568899557259" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="535" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M356.246145 681.56286c-68.156286-41.949414-107.246583-103.84102-107.246583-169.805384 0-65.966411 39.090297-127.860063 107.246583-169.809477 12.046361-7.414877 15.800871-23.190165 8.385994-35.236526-7.413853-12.046361-23.191188-15.801894-35.236526-8.387018-39.640836 24.399713-72.539106 56.044434-95.137801 91.515297-23.86657 37.461193-36.481889 79.620385-36.481889 121.917724 0 42.297338 12.615319 84.454484 36.481889 121.914654 22.598694 35.469839 55.496965 67.11456 95.137801 91.51325 4.185322 2.576685 8.821923 3.804652 13.400195 3.804652 8.598842 0 16.998139-4.329609 21.836331-12.190647C372.047016 704.752002 368.291482 688.976714 356.246145 681.56286zM263.943926 754.580874c-92.603071-61.111846-145.713686-149.623739-145.713686-242.840794 0-93.195565 53.094242-181.682899 145.667637-242.774279 11.805884-7.79043 15.061021-23.677259 7.269567-35.483142-7.79043-11.805884-23.677259-15.062044-35.483142-7.269567C128.487861 296.954249 67.006602 401.024489 67.006602 511.74008c0 110.73708 61.496609 214.830857 168.721703 285.593504 4.343935 2.867304 9.240455 4.238534 14.08274 4.238534 8.317433 0 16.476253-4.046153 21.400403-11.507078C279.003923 778.258133 275.748786 762.372328 263.943926 754.580874zM788.660552 226.213092c-11.80486-7.791453-27.692712-4.536316-35.483142 7.269567-7.79043 11.805884-4.536316 27.692712 7.269567 35.483142 92.575442 61.092403 145.670707 149.579737 145.670707 242.774279 0 93.216032-53.111638 181.727924-145.715733 242.840794-11.805884 7.79043-15.059997 23.678282-7.269567 35.484166 4.925173 7.461949 13.081946 11.507078 21.400403 11.507078 4.841262 0 9.739828-1.37123 14.083763-4.238534 107.22714-70.761624 168.724773-174.857447 168.724773-285.593504C957.341323 401.025513 895.860063 296.955272 788.660552 226.213092zM790.090111 633.67213c23.865547-37.459147 36.480866-79.617315 36.480866-121.914654 0-42.298362-12.615319-84.45653-36.480866-121.917724-22.598694-35.470863-55.496965-67.115584-95.139847-91.515297-12.047384-7.413853-27.821649-3.659343-35.236526 8.387018-7.414877 12.045337-3.659343 27.821649 8.385994 35.236526 68.156286 41.949414 107.247606 103.842043 107.247606 169.809477 0 65.964364-39.090297 127.85597-107.247606 169.804361-12.045337 7.414877-15.800871 23.190165-8.385994 35.237549 4.838192 7.861038 13.236466 12.190647 21.835308 12.190647 4.579295 0 9.215896-1.227967 13.400195-3.804652C734.591099 700.786691 767.490394 669.142993 790.090111 633.67213zM567.129086 518.274914c24.12342-17.150612 39.887452-45.305859 39.887452-77.07133 0-52.128241-42.452881-94.538143-94.634334-94.538143-52.18043 0-94.633311 42.408879-94.633311 94.538143 0 31.695886 15.696494 59.797921 39.730886 76.958766-49.875944 21.128203-84.917018 70.234621-84.917018 127.301338 0 2.366907 0.061398 4.762467 0.182149 7.119141l1.249457 24.296359 276.373515 0 1.238201-24.308639c0.119727-2.358721 0.181125-4.750187 0.181125-7.106862C651.786185 588.497255 616.865861 539.465538 567.129086 518.274914zM512.381182 397.889079c23.937179 0 43.411719 19.430538 43.411719 43.314505 0 23.882943-19.47454 43.313481-43.411719 43.313481-23.936155 0-43.409672-19.430538-43.409672-43.313481C468.971509 417.320641 488.445026 397.889079 512.381182 397.889079zM426.08884 625.656573c9.119705-38.542828 44.254923-67.337641 86.085634-67.337641s76.966952 28.794813 86.085634 67.337641L426.08884 625.656573z" p-id="536"></path></svg>
\ No newline at end of file
<?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="1575802846045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2750" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z" p-id="2751"></path></svg>
\ No newline at end of file
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg>
\ No newline at end of file
<?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="1567417214476" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2266" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M761.503029 2.90619 242.121921 2.90619c-32.405037 0-58.932204 26.060539-58.932204 58.527998l0 902.302287c0 32.156374 26.217105 58.216913 58.932204 58.216913l519.381108 0c32.344662 0 58.591443-26.060539 58.591443-58.216913L820.094472 61.123103C820.094472 28.966729 793.847691 2.90619 761.503029 2.90619M452.878996 61.123103l98.147344 0c6.780427 0 12.31549 5.536087 12.31549 12.253068 0 6.748704-5.535063 12.253068-12.31549 12.253068l-98.147344 0c-6.779404 0-12.345166-5.504364-12.345166-12.253068C440.532807 66.659189 446.099592 61.123103 452.878996 61.123103M501.641583 980.593398c-29.636994 0-53.987588-23.946388-53.987588-53.677527 0-29.356608 24.039509-53.614082 53.987588-53.614082 29.91738 0 53.987588 23.883967 53.987588 53.614082C555.629171 956.647009 531.559986 980.593398 501.641583 980.593398M766.35657 803.142893c0 16.23373-13.186324 29.107945-29.233811 29.107945l-470.618521 0c-16.35755 0-29.325909-13.186324-29.325909-29.107945L237.178329 163.500794c0-16.232706 13.279445-29.138644 29.325909-29.138644l470.246037 0c16.420995 0 29.357632 13.1853 29.357632 29.138644l0 639.642099L766.35657 803.142893zM766.35657 803.142893" p-id="2267"></path></svg>
\ No newline at end of file
<?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="1566035724641" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3998" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M136.4 434.3h77.7c21.5 0 38.9-17.4 38.9-38.9s-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9zM252.9 628.6c0-21.5-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9H214c21.5-0.1 38.9-17.5 38.9-38.9z" p-id="3999"></path><path d="M874.7 97.5H227c-28.6 0-51.8 23.2-51.8 51.8v194.3h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v129.5h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v194.3c0 28.6 23.2 51.8 51.8 51.8h647.7c28.6 0 51.8-23.2 51.8-51.8V149.3c0-28.6-23.2-51.8-51.8-51.8z m-311.3 723c-15.6 0-146.7-71.6-146.7-91 0-19.4 102-368.6 102-368.6l-83.6-104s-12.3-23.1 24.6-23.1h208.9c36.9 0 18.4 23.1 18.4 23.1l-79 104s102 351.3 102 368.6c0.1 17.3-131 91-146.6 91z m169.2-253.6l-27.9 40.2-74.5-240 103.4 171.7c4.6 7.9 4.2 20.6-1 28.1z" p-id="4000"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M18.448 57.545l-.244-.744-.198-.968-.132-.53v-2.181l.236-.859.24-.908.317-.953.428-1.06.561-1.103.794-1.104v-.773l.077-.724.123-.984.34-1.106.313-1.194.25-.548.289-.511.371-.569.405-.423v-2.73l.234-1.407.236-1.633.42-1.955.577-2.035.43-1.118.426-1.217.468-1.135.559-1.216.57-1.332.655-1.247.737-1.331.929-1.33.43-.762.457-.624.995-1.406 1.025-1.403 1.163-1.444 1.246-1.405 1.352-1.384 1.41-1.423 1.708-1.536 1.083-.934 1.322-1.008 1.34-.89 1.448-.855 1.392-.76 1.57-.63 1.667-.775 1.657-.532 1.653-.552 1.787-.548 1.785-.417 1.876-.347L59.128.68l1.879-.245 1.876-.252 2.002-.106h5.912l1.97.243 1.981.231 2.019.207 1.874.441 1.979.413 1.857.475 2.035.53 1.862.646 1.782.738 1.904.78 1.736.853 1.689.95 1.655 1.044 1.425.971.662.548.693.401 1.323 1.1 1.115 1.064 1.112 1.1 1.083 1.214.894 1.178 1.064 1.217.74 1.306.752 1.162.798 1.352.661 1.175 1.113 2.489.546 1.286.428 1.192.428 1.294.384 1.217.267 1.047.347 1.231.607 2.198.388 1.924.253 1.861.217 1.497.342 2.28.077.362.274.41.737 1.18.473.8.42.832.534.892.472 1.07.307 1.093.334 1.2.252 1.232.115.605.106.746v.648l-.106.643v.8l-.192.774-.35 1.5-.403.76-.299.852v.213l.142.264.4.623 1.746 2.53 1.377 1.9.66 1.267.889 1.389.774 1.52.893 1.627.894 1.828 1.006 2.069.567 1.268.518 1.239.447 1.307.44 1.175.336 1.235.342 1.16.432 2.261.343 2.31.235 2.05v2.891l-.158 1.025-.226 1.768-.308 1.59-.48 1.44-.18.588-.336.707-.28.493-.375.607-.33.383-.42.494-.375.4-.401.34-.48.207-.432.207-.355.114h-.543l-.346-.114-.66-.32-.302-.212-.317-.223-.347-.304-.35-.342-.579-.63-.684-.89-.539-.917-.538-.734-.526-.855-.741-1.517-.833-1.579-.098-.055h-.138l-.338.247-.196.415-.326.516-.567 1.533-.856 2.182-1.096 2.626-.824 1.308-.864 1.366-1.027 1.536-1.09 1.503-.557.68-.676.743-1.555 1.497.136.135.21.214.777.446 3.235 1.524 1.41.779 1.347.756 1.332.953 1.187.982.574.443.432.511.445.593.367.643.198.533.242.64.105.554.115.647-.115.433v.44l-.105.454-.242.415-.092.325-.22.394-.587.784-.543.627-.42.47-.35.348-.893.638-1.01.556-1.077.532-1.155.511-1.287.495-.693.207-.608.167-1.496.342-1.545.325-1.552.323-1.689.27-1.74.072-1.785.21h-5.539l-1.998-.114-1.86-.168-2.005-.27-1.99-.209-2.095-.286-2.03-.495-1.981-.374-1.968-.552-2.019-.707-1.98-.585-1.044-.342-.927-.323-.586-.223-.582-.12h-1.647l-1.904-.131-.962-.096-1.24-.135-.795.705-1.085.665-1.471.701-1.628.875-.99.475-1.033.376-2.281.914-1.24.305-1.3.343-1.803.344-1.13.086-1.193.1-1.246.135-1.45.053h-5.926l-3.346-.053-3.25-.321-1.644-.23-1.589-.23-1.546-.227-1.547-.305-1.442-.456-1.434-.325-1.294-.51-1.223-.474-1.142-.533-.99-.583-.984-.71-.336-.343-.44-.415-.334-.362-.3-.417-.278-.415-.215-.42-.311-.89-.109-.46-.138-.51v-.473l.138-.533v-.53l.109-.53v-1.069l.052-.564.259-.647.215-.646.39-.779.286-.3.236-.348.615-.738.49-.38.464-.266.428-.338.676-.21.543-.324.676-.341.77-.227.775-.231.897-.192.85-.11 1.008-.13 1.093-.081.284-.092h.063l.137-.115v-.13l-.2-.266-.58-.27-1.45-1.231-.975-.761-1.127-.967-1.136-1.082-1.181-1.382-1.36-1.558-.508-.843-.672-.87-.58-1.007-.522-1.1-.704-1.047-.459-1.194-.547-1.192-.546-1.33-.397-1.273-.378-1.575-.112-.057h-.115l-.059-.113h-.14l-.23.113-.114.057-.158.264-.057.321-.119.286-.206.477-.664 1.157-.345.701-.546.612-.58.736-.641.816-.677.724-.795.701-.734.658-.814.524-.89.546-.855.325-1.008.247-.99.095h-.233l-.228-.095-.18-.384-.29-.188-.38-.912-.237-.493-.255-.707-.21-.734-.113-.724-.313-1.648-.12-.972v-3.185l.12-2.379.196-1.214.23-1.252.21-1.347.374-1.254.42-1.443.431-1.407.578-1.448.545-1.38.754-1.4.699-1.52.855-1.425 1.006-1.538 1.023-1.382 1.069-1.538.891-1.071 1.142-1.227 1.202-1.237.56-.59.678-.662.985-.836 1.012-.853 1.647-1.446 1.242-.889z"/></svg>
\ No newline at end of file
<?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="1581238842264" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1409" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 0C229.233778 0 0 229.233778 0 512s229.233778 512 512 512 512-229.233778 512-512A512 512 0 0 0 512 0z m0 938.666667C276.366222 938.666667 85.333333 747.633778 85.333333 512 85.333333 276.366222 276.366222 85.333333 512 85.333333c235.633778 0 426.666667 191.032889 426.666667 426.666667a426.666667 426.666667 0 0 1-426.666667 426.666667z m0-717.653334a170.666667 170.666667 0 0 0-170.666667 170.666667 42.666667 42.666667 0 0 0 85.333334 0 85.333333 85.333333 0 1 1 85.333333 85.333333 42.666667 42.666667 0 0 0-42.666667 42.666667v111.36a42.666667 42.666667 0 0 0 85.333334 0v-74.24A170.666667 170.666667 0 0 0 512 221.013333z m-42.666667 542.293334a42.666667 42.666667 0 1 0 85.333334 0 42.666667 42.666667 0 0 0-85.333334 0z" p-id="1410"></path></svg>
\ No newline at end of file
<?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="1575966775973" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="879" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M507.39346659 71.84873358c241.53533667 0 437.39770766 195.85422109 437.39770767 437.37442191 0 241.53766571-195.86237099 437.38955776-437.39770767 437.38955776-241.50040803 0-437.34997219-195.85189205-437.34997219-437.38955776C70.0434944 267.70295467 265.89189347 71.84873358 507.39346659 71.84873358L507.39346659 71.84873358zM507.39346659 282.81899805c-125.00686734 0-226.37039389 101.38914133-226.37039388 226.41813048 0 125.01268821 101.36352768 226.39717262 226.37039388 226.39717262 125.04295993 0 226.42395136-101.38448441 226.42395136-226.39717262C733.81625401 384.20813938 632.43642653 282.81899805 507.39346659 282.81899805L507.39346659 282.81899805zM507.39346659 120.78172615c-214.46664192 0-388.42047261 173.95150279-388.4204726 388.44026539 0 214.51204949 173.95499463 388.46122325 388.4204726 388.46122325 214.52369237 0 388.46005817-173.94800981 388.46005818-388.46122325C895.85236082 294.73322894 721.91715897 120.78172615 507.39346659 120.78172615z" p-id="880"></path></svg>
\ No newline at end of file
<?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="1577246781606" class="icon" viewBox="0 0 1069 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1098" xmlns:xlink="http://www.w3.org/1999/xlink" width="84.5595703125" height="81"><defs><style type="text/css"></style></defs><path d="M633.72929961 378.02038203l9.49872568 18.68789795 20.78025469 2.79745225 206.61592412 27.33248408a11.46496817 11.46496817 0 0 1 6.6095543 19.47324902l-147.2675168 147.35350284-14.89299345 14.89299345 3.8006376 20.68280244 37.84585956 204.89044571a11.46496817 11.46496817 0 0 1-16.4808914 12.2961788L554.68980898 751.84713388l-18.68789794-9.49299345-18.48726123 9.99171915-183.23885392 99.34968163a11.46496817 11.46496817 0 0 1-16.78471347-11.8662416l32.5433127-205.79617881 3.29617793-20.78598692-15.19108243-14.49172002-151.03375839-143.48407587a11.46496817 11.46496817 0 0 1 6.09936328-19.63949062l205.79617881-32.63503185 20.78598691-3.2961788L428.87898125 380.72038203 518.59235674 192.64331182a11.46496817 11.46496817 0 0 1 20.56815264-0.26369385l94.56879023 185.63503183zM496.64840732 85.52038203l-121.75796162 254.98089229L95.76433145 384.76178369A34.3949045 34.3949045 0 0 0 77.46050938 443.66879023l204.87324901 194.66369385-44.16879023 279.1146498a34.3949045 34.3949045 0 0 0 50.36560489 35.61592325l248.4-134.67898038 251.84522285 128.27579591a34.3949045 34.3949045 0 0 0 49.43694287-36.89426777l-51.30573223-277.85350284 199.73120977-199.90891758a34.3949045 34.3949045 0 0 0-19.82866201-58.40827998l-280.11783428-37.03184736L558.32993633 84.71210205a34.3949045 34.3949045 0 0 0-61.68152901 0.80254775z" p-id="1099"></path></svg>
\ No newline at end of file
<?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="1605865043777" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="856" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1023.786667 611.84c-0.426667 9.770667-13.354667 20.693333-39.893334 34.56-54.613333 28.458667-337.749333 144.896-397.994666 176.298667-60.288 31.402667-93.738667 31.104-141.354667 8.32-47.616-22.741333-348.842667-144.469333-403.114667-170.368-27.093333-12.970667-40.917333-23.893333-41.386666-34.218667v103.509333c0 10.325333 14.250667 21.290667 41.386666 34.261334 54.272 25.941333 355.541333 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.362667 60.245333-31.402667 343.338667-147.797333 397.994666-176.298667 27.776-14.464 40.106667-25.728 40.106667-35.925333v-102.058667l-0.213333-0.085333z m0-168.746667c-0.512 9.770667-13.397333 20.650667-39.893334 34.517334-54.613333 28.458667-337.749333 144.896-397.994666 176.298666-60.288 31.402667-93.738667 31.104-141.354667 8.362667-47.616-22.741333-348.842667-144.469333-403.114667-170.410667-27.093333-12.928-40.917333-23.893333-41.386666-34.176v103.509334c0 10.325333 14.250667 21.248 41.386666 34.218666 54.272 25.941333 355.498667 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.32 60.245333-31.402667 343.338667-147.84 397.994666-176.298666 27.776-14.506667 40.106667-25.770667 40.106667-35.968v-102.058667l-0.256-0.042667z m0-175.018666c0.469333-10.410667-13.141333-19.541333-40.533334-29.610667-53.248-19.498667-334.634667-131.498667-388.522666-151.253333-53.888-19.712-75.818667-18.901333-139.093334 3.84C392.234667 113.706667 92.629333 231.253333 39.338667 252.074667c-26.666667 10.496-39.68 20.181333-39.253334 30.506666V386.133333c0 10.325333 14.250667 21.248 41.386667 34.218667 54.272 25.941333 355.498667 147.669333 403.114667 170.410667 47.616 22.741333 81.066667 23.04 141.354666-8.362667 60.245333-31.402667 343.338667-147.84 397.994667-176.298667 27.776-14.506667 40.106667-25.770667 40.106667-35.968V268.074667h-0.341334zM366.677333 366.08l237.269334-36.437333-71.68 105.088-165.546667-68.650667z m524.8-94.634667l-140.330666 55.466667-15.232 5.973333-140.245334-55.466666 155.392-61.44 140.373334 55.466666z m-411.989333-101.674666l-22.954667-42.325334 71.594667 27.989334 67.498667-22.101334-18.261334 43.733334 68.778667 25.770666-88.704 9.216-19.882667 47.786667-32.085333-53.290667-102.4-9.216 76.416-27.562666z m-176.768 59.733333c70.058667 0 126.805333 21.973333 126.805333 49.109333s-56.746667 49.152-126.805333 49.152-126.848-22.058667-126.848-49.152c0-27.136 56.789333-49.152 126.848-49.152z" p-id="857"></path></svg>
\ No newline at end of file
<?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="1579339929870" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1182" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M152 854.856875h325.7146875V237.715625H134.856875v600q0 6.99375 5.0746875 12.0684375T152 854.856875z m737.143125-17.1421875v-600H546.284375v617.1421875H872q6.99375 0 12.0684375-5.07375t5.0746875-12.0684375z m68.5715625-651.429375V837.715625q0 35.3821875-25.16625 60.5484375T872 923.4284375H152q-35.383125 0-60.5484375-25.1653125T66.284375 837.7146875V186.284375q0-35.3821875 25.16625-60.5484375T152 100.5715625h720q35.383125 0 60.5484375 25.1653125t25.16625 60.5484375z" p-id="1183"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
\ No newline at end of file
<?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="1575803481213" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="804" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M62 511.97954521C62 263.86590869 263.90681826 62 511.97954521 62s449.97954521 201.825 449.97954521 449.97954521c0 248.19545479-201.90681826 449.97954521-449.97954521 449.97954521C263.90681826 962 62 760.175 62 511.97954521M901.98636348 511.97954521c0-215.24318174-175.00909131-390.41590869-390.00681827-390.41590869-215.03863652 0-389.96590869 175.17272695-389.96590868 390.41590869 0 215.28409131 175.00909131 390.45681826 389.96590868 390.45681826C727.01818174 902.47727305 901.98636348 727.30454521 901.98636348 511.97954521M264.17272695 430.28409131c0-5.76818174 2.12727305-11.51590869 6.64772696-15.87272696 8.71363652-8.75454521 22.88863652-8.75454521 31.725 0l209.4340913 208.22727305L721.45454521 414.53409131c8.75454521-8.71363652 22.97045479-8.71363652 31.90909132 0 8.71363652 8.75454521 8.71363652 22.88863652 0 31.60227304L511.97954521 685.74090869 270.71818174 446.01363653C266.27954521 441.77954521 264.17272695 436.05227305 264.17272695 430.28409131" p-id="805"></path></svg>
\ No newline at end of file
<?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="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" fill="#bfbfbf" p-id="6718"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M42.913 101.36c1.642 0 3.198.332 4.667.996a12.28 12.28 0 0 1 3.89 2.772c1.123 1.184 1.987 2.582 2.592 4.193.605 1.612.908 3.318.908 5.118 0 1.8-.303 3.507-.908 5.118-.605 1.611-1.469 3.01-2.593 4.194a13.3 13.3 0 0 1-3.889 2.843 10.582 10.582 0 0 1-4.667 1.066c-1.729 0-3.306-.355-4.732-1.066a13.604 13.604 0 0 1-3.825-2.843c-1.123-1.185-1.988-2.583-2.593-4.194a14.437 14.437 0 0 1-.907-5.118c0-1.8.302-3.506.907-5.118.605-1.61 1.47-3.009 2.593-4.193a12.515 12.515 0 0 1 3.825-2.772c1.426-.664 3.003-.996 4.732-.996zm53.932.285c1.643 0 3.22.331 4.733.995a11.386 11.386 0 0 1 3.889 2.772c1.08 1.185 1.945 2.583 2.593 4.194.648 1.61.972 3.317.972 5.118 0 1.8-.324 3.506-.972 5.117-.648 1.611-1.513 3.01-2.593 4.194a12.253 12.253 0 0 1-3.89 2.843 11 11 0 0 1-4.732 1.066 10.58 10.58 0 0 1-4.667-1.066 12.478 12.478 0 0 1-3.824-2.843c-1.08-1.185-1.945-2.583-2.593-4.194a13.581 13.581 0 0 1-.973-5.117c0-1.801.325-3.507.973-5.118.648-1.611 1.512-3.01 2.593-4.194a11.559 11.559 0 0 1 3.824-2.772 11.212 11.212 0 0 1 4.667-.995zm21.781-80.747c2.42 0 4.3.355 5.64 1.066 1.34.71 2.29 1.587 2.852 2.63a6.427 6.427 0 0 1 .778 3.34c-.044 1.185-.195 2.204-.454 3.057-.26.853-.8 2.606-1.62 5.26a589.268 589.268 0 0 1-2.788 8.743 1236.373 1236.373 0 0 0-3.047 9.453c-.994 3.128-1.75 5.592-2.269 7.393-1.123 3.79-2.55 6.42-4.278 7.89-1.728 1.469-3.846 2.203-6.352 2.203H39.023l1.945 12.795h65.342c4.148 0 6.223 1.943 6.223 5.828 0 1.896-.41 3.53-1.232 4.905-.821 1.374-2.442 2.061-4.862 2.061H38.505c-1.729 0-3.176-.426-4.343-1.28-1.167-.852-2.14-1.966-2.917-3.34a21.277 21.277 0 0 1-1.88-4.478 44.128 44.128 0 0 1-1.102-4.55c-.087-.568-.324-1.942-.713-4.122-.39-2.18-.865-4.904-1.426-8.174l-1.88-10.947c-.692-4.027-1.383-8.079-2.075-12.154-1.642-9.572-3.5-20.234-5.574-31.986H6.87c-1.296 0-2.377-.356-3.24-1.067a9.024 9.024 0 0 1-2.14-2.558 10.416 10.416 0 0 1-1.167-3.2C.108 8.53 0 7.488 0 6.54c0-1.896.583-3.46 1.75-4.69C2.917.615 4.494 0 6.482 0h13.095c1.728 0 3.111.284 4.148.853 1.037.569 1.858 1.28 2.463 2.132a8.548 8.548 0 0 1 1.297 2.701c.26.948.475 1.754.648 2.417.173.758.346 1.825.519 3.199.173 1.374.345 2.772.518 4.193.26 1.706.519 3.507.778 5.403h88.678z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg>
\ No newline at end of file
<?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="1577185310368" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1238" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M951.453125 476.84375H523.671875a131.8359375 131.8359375 0 0 0-254.1796875 0H72.546875v70.3125h196.9453125a131.8359375 131.8359375 0 0 0 254.1796875 0H951.453125z" p-id="1239"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
\ No newline at end of file
<?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="1566036776944" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6463" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M64 223.995345h168.001164v47.997673c0 26.428509 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.569164 41.984-47.997673v-47.997673h504.003491a32.004655 32.004655 0 0 0 0-64.009309H455.996509V111.988364c0-26.428509-18.878836-47.997673-41.984-47.997673H273.985164c-23.095855 0-41.984 21.569164-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.009309zM288.004655 128h111.997672V256H288.004655V128zM960 479.995345H791.998836v-47.997672c0-26.372655-18.878836-47.997673-41.984-47.997673H609.978182c-23.095855 0-41.984 21.634327-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.00931h504.003491v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h168.001164a32.004655 32.004655 0 1 0-0.009309-64.00931zM735.995345 576H623.997673v-128h111.997672v128zM960 800.293236v-0.288581H455.996509v-47.997673c0-26.363345-18.878836-47.997673-41.984-47.997673H274.050327c-23.105164 0-41.984 21.634327-41.984 47.997673v47.997673H64v0.288581a32.004655 32.004655 0 0 0 0 64.009309c0.986764 0 1.917673-0.195491 2.885818-0.288581h165.115346v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h501.108364c0.968145 0.093091 1.899055 0.288582 2.895127 0.288581a32.004655 32.004655 0 1 0-0.009309-64.009309zM400.002327 896H288.004655V768h111.997672v128z" fill="" p-id="6464"></path></svg>
\ No newline at end of file
<?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="1576042673958" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1110" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M692 792H332c-150 0-270-120-270-270s120-270 270-270h360c150 0 270 120 270 270 0 147-120 270-270 270zM332 312c-117 0-210 93-210 210s93 210 210 210h360c117 0 210-93 210-210s-93-210-210-210H332z" p-id="1111"></path><path d="M341 522m-150 0a150 150 0 1 0 300 0 150 150 0 1 0-300 0Z" p-id="1112"></path></svg>
\ No newline at end of file
<?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="1543827724451" class="icon" style="" viewBox="0 0 1084 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10233" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
</style></defs><path d="M1080.09609 434.500756c-4.216302-23.731757-26.9241-47.945376-50.595623-53.185637l-17.648235-4.095836a175.940257 175.940257 0 0 1-101.612877-80.832531 177.807476 177.807476 0 0 1-18.732427-129.801867l5.541425-16.684509c7.10748-23.129428-2.108151-54.992624-20.599646-70.833873 0 0-16.624276-14.094495-63.244529-41.199293-46.800951-26.984332-66.858502-34.513443-66.858502-34.513443-22.76803-8.372371-54.631227-0.361397-71.255503 17.407304l-12.287509 13.251234a173.470708 173.470708 0 0 1-120.465769 48.065842A174.13327 174.13327 0 0 1 421.329029 33.590675L409.583617 20.761071C393.140039 2.99237 361.096144-4.898138 338.267881 3.353767c0 0-20.358715 7.529111-67.099434 34.513443-46.800951 27.34573-63.244529 41.440225-63.244529 41.440225-18.431263 15.66055-27.646894 47.222582-20.539413 70.592941l5.059562 16.865207a178.048407 178.048407 0 0 1-18.672194 129.621169 174.916297 174.916297 0 0 1-102.275439 81.073463l-17.045906 3.854904c-23.310126 5.42096-46.258856 29.333415-50.595623 53.185637 0 0-3.854905 21.382674-3.854905 75.712737 0 54.330062 3.854905 75.712736 3.854905 75.712736 4.216302 23.972688 26.9241 47.945376 50.595623 53.185637l16.624276 3.854905a174.253736 174.253736 0 0 1 102.395904 81.314394c23.310126 40.837896 28.911785 87.337683 18.732427 129.801867l-4.81863 16.443578c-7.10748 23.129428 2.108151 54.992624 20.599646 70.833872 0 0 16.624276 14.094495 63.244529 41.199293 46.800951 27.104798 66.918735 34.513443 66.918735 34.513443 22.707798 8.372371 54.631227 0.361397 71.255503-17.407303l11.624947-12.588673a175.096996 175.096996 0 0 1 242.256662 0.120465l11.624947 12.648906c16.383345 17.708468 48.427239 25.598976 71.255503 17.347071 0 0 20.358715-7.529111 67.159666-34.513443 46.740719-27.104798 63.124063-41.199293 63.124064-41.199293 18.491496-15.600317 27.707127-47.463513 20.599646-70.833873l-5.059562-17.106139a176.723284 176.723284 0 0 1 18.672194-129.139305 176.060722 176.060722 0 0 1 102.395904-81.314394l16.68451-3.854905c23.310126-5.42096 46.258856-29.333415 50.595623-53.185637 0 0 3.854905-21.382674 3.854904-75.712737-0.240932-54.330062-4.095836-75.833202-4.095836-75.833202z m-537.819428 293.334149c-119.261112 0-216.175824-97.336342-216.175824-217.621412a216.657687 216.657687 0 0 1 216.236057-217.320249c119.200879 0 216.115591 97.276109 216.11559 217.56118-0.240932 120.044139-96.974945 217.320248-216.175823 217.320249z" p-id="10234" fill="#bfbfbf"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.921.052H49.08c-1.865 0-3.198 1.599-3.198 3.464v6.661c0 1.865 1.6 3.464 3.198 3.464h29.84c1.865 0 3.198-1.599 3.198-3.464V3.516C82.385 1.65 80.786.052 78.92.052zm45.563 0H94.642c-1.865 0-3.464 1.599-3.464 3.464v6.661c0 1.865 1.599 3.464 3.464 3.464h29.842c1.865-.266 3.464-1.599 3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464zm0 22.382H40.02c-1.866 0-3.464-1.599-3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464H3.516C1.65.052.052 1.651.052 3.516V124.75c0 1.598 1.599 3.197 3.464 3.197h120.968c1.865 0 3.464-1.599 3.464-3.464V25.898c0-1.865-1.599-3.464-3.464-3.464z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1575802855098" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2984" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 160H128c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V224c0-35.2-28.8-64-64-64z m0 608c0 16-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V256c0-16 12.8-32 32-32h704c19.2 0 32 12.8 32 32v512z" p-id="2985"></path><path d="M224 288c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V320c0-16-12.8-32-32-32z m608 480c19.2 0 32-12.8 32-32V608L704 768h128z" p-id="2986"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M125.5 36.984L95.336 2.83C93.735 1.018 91.565 0 89.3 0c-2.263 0-4.433 1.018-6.033 2.83l-3.786 4.286c-1.6 1.812-3.77 2.83-6.032 2.831H54.553c-2.263 0-4.434-1.018-6.033-2.83L44.734 2.83C43.134 1.018 40.964 0 38.701 0c-2.263 0-4.434 1.018-6.034 2.83L2.5 36.984C.9 38.796 0 41.254 0 43.815c0 2.562.899 5.02 2.5 6.831L14.565 64.31c2.178 2.468 5.367 3.403 8.33 2.444 1.35-.435 2.709.592 2.709 2.18v49.407c0 5.313 3.84 9.66 8.532 9.66h59.726c4.693 0 8.532-4.347 8.532-9.66V68.934c0-1.59 1.36-2.616 2.71-2.181 2.962.96 6.15.024 8.329-2.444L125.5 50.646c1.6-1.811 2.499-4.269 2.499-6.83 0-2.563-.899-5.02-2.5-6.832z"/></svg>
\ No newline at end of file
<?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="1579774825624" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1248" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M498.595712 482.290351 345.420077 482.290351l0 57.307194 210.477712 0L555.897789 274.196942l-57.301054 0L498.596735 482.290351zM498.595712 482.290351" p-id="1249"></path><path d="M577.685002 644.98478l379.879913 0 0 57.302077L577.685002 702.286858 577.685002 644.98478 577.685002 644.98478zM577.685002 644.98478" p-id="1250"></path><path d="M577.685002 773.764795l379.879913 0 0 57.307194L577.685002 831.071989 577.685002 773.764795 577.685002 773.764795zM577.685002 773.764795" p-id="1251"></path><path d="M577.685002 902.549927l379.879913 0 0 57.307194L577.685002 959.857121 577.685002 902.549927 577.685002 902.549927zM577.685002 902.549927" p-id="1252"></path><path d="M102.523001 382.290823c4.450359 2.615571 9.470699 3.954055 14.530948 3.954055 2.969635 0 5.952572-0.461511 8.836249-1.394766l190.809767-61.886489c15.052834-4.882194 23.297612-21.040199 18.415418-36.08894-4.882194-15.052834-21.040199-23.297612-36.093033-18.415418L175.676092 308.458257c15.994276-26.115797 35.170011-50.537 57.370639-72.743768 73.767074-73.767074 171.845857-114.388237 276.16783-114.388237 104.32095 0 202.39564 40.622186 276.16169 114.388237s114.393353 171.845857 114.393353 276.16783c0 26.427906-2.615571 52.449559-7.709589 77.780481l58.302871 0c4.464685-25.499767 6.708795-51.470255 6.708795-77.780481 0-60.449767-11.845793-119.102608-35.204803-174.336584-22.559808-53.334719-54.850236-101.226472-95.968725-142.349055-41.122583-41.122583-89.017406-73.408917-142.348032-95.968725C628.317169 75.866898 569.659211 64.021106 509.215584 64.021106c-60.448744 0-119.106702 11.845793-174.336584 35.207873-53.334719 22.559808-101.230566 54.846142-142.349055 95.968725-23.980157 23.980157-44.934398 50.278103-62.727647 78.601172l-20.738323-105.655342c-3.043313-15.527648-18.105357-25.642007-33.631982-22.599717-15.527648 3.048429-25.64303 18.105357-22.599717 33.637098l36.102243 183.932126C90.51348 371.153158 95.460142 378.13313 102.523001 382.290823L102.523001 382.290823zM102.523001 382.290823" p-id="1253"></path><path d="M126.020158 587.9416 67.768453 587.9416c5.759167 33.679054 15.368012 66.544579 28.789697 98.278327 22.559808 53.333696 54.850236 101.225449 95.971795 142.348032 41.122583 41.122583 89.014336 73.408917 142.349055 95.968725 54.112432 22.88829 111.517863 34.71157 170.668031 35.18229L505.547031 902.395408c-102.94972-0.941442-199.594851-41.445948-272.499277-114.349351C177.545672 732.543975 140.810003 663.275355 126.020158 587.9416L126.020158 587.9416zM126.020158 587.9416" p-id="1254"></path></svg>
\ No newline at end of file
<?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="1577099827399" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1008" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M520 559h204c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32H488c-17.673 0-32-14.327-32-32 0-0.167 0.001-0.334 0.004-0.5a32.65 32.65 0 0 1-0.004-0.5V277c0-17.673 14.327-32 32-32 17.673 0 32 14.327 32 32v282z m-8 401C264.576 960 64 759.424 64 512S264.576 64 512 64s448 200.576 448 448-200.576 448-448 448z m0-64c212.077 0 384-171.923 384-384S724.077 128 512 128 128 299.923 128 512s171.923 384 384 384z" p-id="1009"></path></svg>
\ No newline at end of file
<?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="1553828490559" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1684" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M898.831744 900.517641 103.816972 900.517641c-36.002982 0-65.363683-29.286-65.363683-65.313541l0-554.949184c0-36.041868 29.361725-65.326844 65.363683-65.326844l795.015795 0c36.002982 0 65.198931 29.284977 65.198931 65.326844l0 554.949184C964.030675 871.231641 934.834726 900.517641 898.831744 900.517641L898.831744 900.517641zM103.816972 255.593236c-13.576203 0-24.711821 11.085476-24.711821 24.662703l0 554.949184c0 13.576203 11.136641 24.662703 24.711821 24.662703l795.015795 0c13.577227 0 24.547069-11.086499 24.547069-24.662703l0-554.949184c0-13.577227-10.970866-24.662703-24.547069-24.662703L103.816972 255.593236 103.816972 255.593236zM664.346245 251.774257c-11.161201 0-20.332071-9.080819-20.332071-20.332071l0-101.278661c0-13.576203-11.047614-24.623817-24.699542-24.623817L383.181611 105.539708c-13.576203 0-24.712845 11.04659-24.712845 24.623817l0 101.278661c0 11.252275-9.041934 20.332071-20.332071 20.332071-11.20111 0-20.319791-9.080819-20.319791-20.332071l0-101.278661c0-35.989679 29.323862-65.275679 65.364707-65.275679l236.133022 0c36.06745 0 65.402569 29.284977 65.402569 65.275679l0 101.278661C684.717202 242.694461 675.636383 251.774257 664.346245 251.774257L664.346245 251.774257zM413.233044 521.725502 75.694471 521.725502c-11.163247 0-20.333094-9.117658-20.333094-20.35663 0-11.252275 9.169847-20.332071 20.333094-20.332071l337.538573 0c11.277858 0 20.319791 9.080819 20.319791 20.332071C433.552835 512.607844 424.510902 521.725502 413.233044 521.725502L413.233044 521.725502zM912.894018 521.725502 575.367725 521.725502c-11.213389 0-20.332071-9.117658-20.332071-20.35663 0-11.252275 9.118682-20.332071 20.332071-20.332071l337.526293 0c11.290137 0 20.332071 9.080819 20.332071 20.332071C933.226089 512.607844 924.184155 521.725502 912.894018 521.725502L912.894018 521.725502zM557.56322 634.217552 445.085496 634.217552c-11.213389 0-20.332071-9.079796-20.332071-20.331048l0-168.763658c0-11.251252 9.118682-20.332071 20.332071-20.332071l112.478747 0c11.290137 0 20.370956 9.080819 20.370956 20.332071l0 168.763658C577.934177 625.137757 568.853357 634.217552 557.56322 634.217552L557.56322 634.217552zM465.417567 593.514525l71.827909 0L537.245476 465.454918l-71.827909 0L465.417567 593.514525 465.417567 593.514525z" p-id="1685" fill="#bfbfbf"></path></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1577540289643" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7922" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M530.944 458.24l4.8 3.456 122.176 106.816a32 32 0 0 1-37.44 51.584l-4.672-3.392L546.56 556.16v280.704a32 32 0 0 1-26.24 31.488l-5.76 0.512a32 32 0 0 1-31.424-26.24l-0.512-5.76-0.064-280.704-69.12 60.48a32 32 0 0 1-40.96 0.896l-4.16-3.968a32 32 0 0 1-0.96-40.96l4.032-4.16 122.176-106.816a32 32 0 0 1 37.312-3.456zM497.92 128c128.128 0 239.168 82.304 275.52 199.04 123.968 11.264 221.312 113.088 221.312 237.44 0 128.128-103.68 232.96-234.88 238.272h-5.888l-35.52 0.192a32 32 0 0 1-0.192-64l35.264-0.128 4.672-0.064c96.384-3.84 172.544-80.896 172.544-174.272 0-96.128-80.512-174.464-179.584-174.464h-1.984a32 32 0 0 1-32-25.28C695.872 264.96 604.736 192 497.92 192 381.824 192 285.44 277.76 274.816 388.48a32 32 0 0 1-28.352 28.8c-83.968 9.152-147.84 78.208-147.84 159.552l0.192 7.936c3.84 85.76 77.056 154.112 166.592 154.112h45.632a32 32 0 0 1 0 64h-45.632C142.016 802.944 40.32 708.032 34.88 586.88l-0.192-9.28c0-106.88 76.352-197.184 179.968-219.904C239.488 226.112 357.76 128 497.856 128z" p-id="7923"></path></svg>
\ No newline at end of file
<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>
\ No newline at end of file
<?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="1569580729849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1939" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M513.3 958.5c-142.2 0-397.9-222.1-401.6-440.5V268c1.7-39.6 31.7-72.3 71.1-77.3 49-4.6 97.1-16.5 142.7-35.3 47.8-14 91.9-38.3 129.4-71.1 30.3-24.4 72.9-26.3 105.3-4.6 39.9 30.7 83.8 55.9 130.5 74.6 48.6 14.7 98.2 25.9 148.4 33.7 38.5 7.6 67.1 40.3 69.5 79.5 3.3 84.9 2.5 169.9-2.6 254.7-33.7 281.6-253.7 436.4-392.7 436.3z m-0.1-813.7c-7.2-0.2-14.3 2-20 6.4-39.7 35.2-86.8 61.1-137.7 75.7-46.8 19.2-96.2 31-146.6 35.2-11 3.2-18.8 13-19.5 24.4v230.1c3.5 180.3 223.3 361 323.9 361s287.3-120.2 317.6-360.5c7.3-142.7 0-228.6 0-229.6-1.3-13.3-11-24.3-24-27.3-49.6-7.7-98.6-19-146.5-33.7-46.3-19.5-89.7-45.3-129-76.7-5.8-3.8-12.7-5.5-19.5-4.9l1.3-0.1z" fill="#C6CCDA" p-id="1940"></path><path d="M750.1 428L490.7 673.2c-11.7 11.1-29.5 12.9-43.1 4.2l-6.8-5.8-141.2-149.4c-9.3-9.3-12.7-22.9-9-35.5 3.8-12.6 14.1-22.1 27-24.8 12.9-2.7 26.1 1.9 34.6 11.9L469 597.5l233.7-221c14.6-12.8 36.8-11.6 49.9 2.7 13.2 14.2 11.5 35.3-2.5 48.8" fill="#C6CCDA" p-id="1941"></path></svg>
\ No newline at end of file
<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.527 116.793c.178.008.348.024.527.024h40.233c4.711-.005 8.53-3.677 8.534-8.21V18.895c-.004-4.532-3.823-8.204-8.534-8.209H79.054c-.179 0-.353.016-.527.024V0L0 10.082v107.406l78.527 10.342v-11.037zm0-101.362c.174-.024.348-.052.527-.052h40.233c2.018 0 3.659 1.578 3.659 3.52v89.713c-.003 1.942-1.64 3.517-3.659 3.519H79.054c-.179 0-.353-.028-.527-.052V15.431zM30.262 75.757l-18.721-.46V72.37l11.3-16.673v-.148l-10.266.164v-4.51l17.504-.44v3.264L18.696 70.76v.144l11.566.176v4.678zm9.419.231l-5.823-.144V50.671l5.823-.144v25.461zm22.255-11.632c-2.168 1.922-5.353 2.76-9.02 2.736-.702.004-1.402-.04-2.097-.131v9.303l-5.997-.148V50.743c1.852-.352 4.473-.647 8.218-.743 3.838-.096 6.608.539 8.48 1.913 1.807 1.306 3.032 3.5 3.032 6.112s-.926 4.833-2.612 6.331h-.004zM53.36 54.45c-.856-.01-1.71.083-2.541.275v7.682c.523.116 1.167.152 2.06.152 3.301-.004 5.36-1.614 5.36-4.314 0-2.425-1.772-3.843-4.875-3.791l-.004-.004zm39.847-37.066h9.564v3.795h-9.564v-3.795zm-9.568 5.68h9.564v3.8h-9.564v-3.8zm9.568 6.216h9.564v3.799h-9.564V29.28zm0 12h9.564v3.794h-9.564V41.28zm-9.568-6.096h9.564v3.795h-9.564v-3.795zm9.472 47.064c2.512 0 4.921-.96 6.697-2.67 1.776-1.708 2.773-4.026 2.772-6.442l-1.748-15.263c0-5.033-2.492-9.112-7.725-9.112-5.232 0-7.72 4.079-7.72 9.112l-1.752 15.263c-.001 2.417.996 4.735 2.773 6.444 1.777 1.71 4.187 2.669 6.7 2.668h.003zm-3.135-16.75h6.27v12.743h-6.27V65.5z"/></svg>
\ No newline at end of file
# 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'
html {
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
box-sizing: border-box;
}
html * {
outline: 0;
box-sizing: inherit;
-webkit-text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0,0,0,0)
}
html,body {
height: 100%;
min-height: 100%;
font-family: "Microsoft Yahei", "Helvetica Neue", Helvetica, STHeiTi, Arial, sans-serif;
}
body {
overflow-y: scroll;
}
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td,hr,button,article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {
margin: 0;
padding: 0
}
input,select,textarea,button {
font-size: 100%;
-webkit-appearance: none;
border:0;
outline: 0;
}
table {
border-collapse: collapse;
border-spacing: 0
}
fieldset,img {
border: 0
}
abbr,acronym {
border: 0;
font-variant: normal
}
del {
text-decoration: line-through
}
address,caption,cite,code,dfn,em,th,var {
font-style: normal;
font-weight: 500
}
ol,ul {
list-style: none
}
caption,th {
text-align: left
}
h1,h2,h3,h4,h5,h6 {
font-size: 100%;
font-weight: 500
}
q:before,q:after {
content: ''
}
sub,sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline
}
sup {
top: -.5em
}
sub {
bottom: -.25em
}
ins,a {
text-decoration: none;
cursor: pointer;
}
/* ============================================================
flex:定义布局为盒模型
flex-v:盒模型垂直布局
flex-1:子元素占据剩余的空间
flex-align-center:子元素垂直居中
flex-pack-center:子元素水平居中
flex-pack-justify:子元素两端对齐
兼容性:ios 4+、android 2.3+、winphone8+
============================================================ */
.flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
.flex-v{-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
.flex-1{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;}
.flex-align-center{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;}
.flex-pack-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}
.flex-pack-justify{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}
.clearfix{
&:after{
content: '';
display: table;
clear: both;
font-size: 0;
}
}
.fl{float: left};
.fr{float: right};
.hide{display: none;}
.disabled{
pointer-events: none;
}
#app,.pages{
.flex;
.flex-v;
height: 100%;
}
.ellipsis{
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
[v-cloak] {
display: none;
}
[disabled] {
pointer-events: none;
}
.el-dialog{
.el-checkbox-group{
.el-checkbox{
margin: 5px 0;
width: 33.33%;
}
.pointBox{
width: 50%;
}
}
}
.el-table th {
user-select: all;
}
.el-progress-bar{
padding-right: 70px;
margin-right: -70px;
}
#operatorUserCabinCheckBox .el-checkbox{
white-space: normal !important;
width: 100%
}
#operatorUserCabinCheckBox .el-checkbox__label{
display: inline;
}
// 统计页面隔日期变色
.page-statistics{
.chart{
margin-bottom: 80px;
border: 1px solid #ededed;
height: 400px;
}
.el-table th, .el-table tr{
&.color-gray{
background-color: #f0f9eb;
}
}
}
// 选择柜子弹窗
.choose-cabin-dialog{
h2{
margin-bottom: 10px;
padding-bottom: 10px;
font-size: 16px;
border-bottom: 1px solid;
.search{
margin-left: 20px;
width: 200px;
}
}
.el-row{
margin-bottom: 20px;
max-height: 150px;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
}
@media screen and (max-width: 800px){
.page{
margin: 5px 5px;
}
.el-dialog{
width: 98%!important;
.el-checkbox-group{
.el-checkbox{
margin: 5px 0;
width: 50%;
font-size: 12px;
.el-checkbox__label{
font-size: 12px;
}
}
}
}
}
.mobile-table-card{
margin: 10px auto;
padding: 10px;
box-shadow: 0 0 5px #ccc;
.mobile-table-cell{
padding: 5px 0;
border-bottom: 1px dotted #eee;
.cell-title{
font-size: 13px;
color: #666;
}
.cell-content{
padding-left: 5px;
text-align: right;
word-break: break-word;
}
}
}
\ No newline at end of file
.org-tree-container {
display: inline-block;
padding: 15px;
background-color: #fff;
}
.org-tree {
// display: inline-block;
display: table;
text-align: center;
&:before, &:after {
content: '';
display: table;
}
&:after {
clear: both;
}
}
.org-tree-node,
.org-tree-node-children {
position: relative;
margin: 0;
padding: 0;
list-style-type: none;
&:before, &:after {
transition: all .35s;
}
}
.org-tree-node-label {
position: relative;
display: inline-block;
.org-tree-node-label-inner {
padding: 10px 15px;
text-align: center;
border-radius: 3px;
box-shadow: 0 1px 5px rgba(0, 0, 0, .15);
}
}
.org-tree-node-btn {
position: absolute;
top: 100%;
left: 50%;
width: 20px;
height: 20px;
z-index: 10;
margin-left: -11px;
margin-top: 9px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 50%;
box-shadow: 0 0 2px rgba(0, 0, 0, .15);
cursor: pointer;
transition: all .35s ease;
&:hover {
background-color: #e7e8e9;
transform: scale(1.15);
}
&:before, &:after {
content: '';
position: absolute;
}
&:before {
top: 50%;
left: 4px;
right: 4px;
height: 0;
border-top: 1px solid #ccc;
}
&:after {
top: 4px;
left: 50%;
bottom: 4px;
width: 0;
border-left: 1px solid #ccc;
}
&.expanded:after {
border: none;
}
}
.org-tree-node {
padding-top: 20px;
display: table-cell;
vertical-align: top;
&.is-leaf, &.collapsed {
padding-left: 10px;
padding-right: 10px;
}
&:before, &:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 19px;
}
&:after {
left: 50%;
border-left: 1px solid #ddd;
}
&:not(:first-child):before,
&:not(:last-child):after {
border-top: 1px solid #ddd;
}
}
.collapsable .org-tree-node.collapsed {
padding-bottom: 30px;
.org-tree-node-label:after {
content: '';
position: absolute;
top: 100%;
left: 0;
width: 50%;
height: 20px;
border-right: 1px solid #ddd;
}
}
.org-tree > .org-tree-node {
padding-top: 0;
&:after {
border-left: 0;
}
}
.org-tree-node-children {
padding-top: 20px;
display: table;
&:before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 0;
height: 20px;
border-left: 1px solid #ddd;
}
&:after {
content: '';
display: table;
clear: both;
}
}
.horizontal {
.org-tree-node {
// display: flex;
// flex-direction: row;
// justify-content: flex-start;
// align-items: center;
display: table-cell;
float: none;
padding-top: 0;
padding-left: 20px;
&.is-leaf, &.collapsed {
padding-top: 10px;
padding-bottom: 10px;
}
&:before, &:after {
width: 19px;
height: 50%;
}
&:after {
top: 50%;
left: 0;
border-left: 0;
}
&:only-child:before {
top: 1px;
border-bottom: 1px solid #ddd;
}
&:not(:first-child):before,
&:not(:last-child):after {
border-top: 0;
border-left: 1px solid #ddd;
}
&:not(:only-child):after {
border-top: 1px solid #ddd;
}
.org-tree-node-inner {
display: table;
}
}
.org-tree-node-label {
display: table-cell;
vertical-align: middle;
}
&.collapsable .org-tree-node.collapsed {
padding-right: 30px;
.org-tree-node-label:after {
top: 0;
left: 100%;
width: 20px;
height: 50%;
border-right: 0;
border-bottom: 1px solid #ddd;
}
}
.org-tree-node-btn {
top: 50%;
left: 100%;
margin-top: -11px;
margin-left: 9px;
}
& > .org-tree-node:only-child:before {
border-bottom: 0;
}
.org-tree-node-children {
// display: flex;
// flex-direction: column;
// justify-content: center;
// align-items: flex-start;
display: table-cell;
padding-top: 0;
padding-left: 20px;
&:before {
top: 50%;
left: 0;
width: 20px;
height: 0;
border-left: 0;
border-top: 1px solid #ddd;
}
&:after {
display: none;
}
& > .org-tree-node {
display: block;
}
}
}
export default {
methods: {
},
data() {
return {
loading: false, // ajax请求状态
toString: [], // 需要把number转化为string的表单字段name数组
}
}
}
\ No newline at end of file
export default {
created () {
this.getData();
},
beforeDestroy () {
clearTimeout(this.loadingTimer);
},
methods: {
// 渲染前置处理
beforeRender(data) {
return data
},
// 渲染后置处理
afterRender(data) {
},
// 提交表单的前置处理
beforeSubmit(data) {
return data
},
// 提交表单的后置处理, 会阻断默认的回退行为
afterSubmit(data) {
this.$router.go(-1);
},
// 默认拉取数据
getData() {
this.loading = true;
this.$post(this.urls.currUrl || this.pageInfo.currUrl, this.query)
.then(({data})=>{
const res = this.beforeRender(data);
// 转化枚举类型字段的number值为string
res.entity = this.util_toString(res.entity, this.toString);
this.form = Object.assign({}, this.form, res.entity);
this.dict = Object.assign({}, this.dict, res.dict);
this.afterRender(res);
})
.catch(error=>{
console.error(error)
this.$message.error(error.message);
})
.then(data=>{
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.loading = false;
}, 300);
})
},
// 提交表单
submitForm(ref) {
const el = ref || this.$refs.form;
el.validate((valid) => {
if (!valid) return;
this.loading = true;
this.$post( this.urls.saveUrl || this.pageInfo.saveUrl, {
entity: this.beforeSubmit(this.form),
...this.extendFormData
})
.then(res=>{
// 更新数据
if (res.data.import) {
this.$message.success(res.msg);
} else {
this.$message.success('更新成功');
}
this.afterSubmit(res);
})
.catch(error=>{
this.$message.error(error.message);
})
.then(data=>{
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.loading = false;
}, 200);
})
});
},
// 复制一个数组或对象
util_copy(data) {
return JSON.parse(JSON.stringify(data))
},
// 工具方法,把数字转化为字符串
util_toString(data, array) {
const dataCopy = Object.assign({}, data);
array.forEach(item=>{
dataCopy[item] = dataCopy[item] === undefined ? '' : dataCopy[item]+'';
})
return dataCopy;
},
// 从dict字段暴力取值,取不到则返回原值
util_formatter(key, val) {
try {
return this.dict[key][val]
} catch (error) {
return val;
}
}
},
computed: {
pageInfo() {
let currUrl = this.$route.path;
let urlArray = currUrl.split('/');
let type = urlArray.pop();
urlArray.push('save');
let saveUrl = urlArray.join('/');
return {
type,
currUrl,
saveUrl,
};
},
},
data() {
return {
loadingTimer: null,
loading: false, // ajax请求状态
query: this.$route.query, // ajax请求参数
urls: {}, // 用户自定义的请求地址,内容和pageInfo等同
form: {}, // 表单数据
extendFormData: {}, // 额外的表单数据
rules: {}, // 表单验证规则
dict: {}, // 数据字典
toString: [], // 需要把number转化为string的表单字段name数组
}
}
}
import axios from 'axios';
import {
formatter,formatterAmount, formatterDate,formatterDateOnly, find,
} from '@/assets/utils/table';
const tagsMap = {
1: 'danger',
0: 'success'
};
export default {
mounted() {
this.getData();
},
watch: {
'$route'(route) {
this.query = Object.assign({}, this.query, route.query);
this.getData();
}
},
beforeDestroy () {
this.source.cancel('自动取消ajax操作');
clearTimeout(this.loadingTimer);
},
methods: {
beforeFecth() {
return Promise.resolve();
},
// 表格接收数据前
beforeRender(data){return data},
// 表格接收数据后
afterRender(data){},
// 删除动作发生后
afterDel(data){},
// 默认拉取数据
async getData() {
try {
await this.beforeFecth();
} catch (error) {
return;
}
this.tableData.loading = true;
this.$post(this.pageInfo.list, this.query,{
cancelToken: this.source.token
})
.then(({data})=>{
this.tableData = this.beforeRender(
Object.assign({}, this.tableData, data)
);
this.afterRender(this.tableData);
})
.catch(error=>{
if(error.message == '自动取消ajax操作') return
this.$message.error(error.message);
})
.then(data=>{
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.tableData.loading = false;
}, 300);
})
},
// 复制一个数组或对象
util_copy(data) {
if(typeof data !== 'object') return data;
return JSON.parse(JSON.stringify(data))
},
_showAll(item) {
let data = this.util_copy(item);
data.isShowAll = true;
this.util_update(item.id, data)
},
// 超长文本展开收起
util_short(key, size) {
return row => {
let string = row[key] || '';
if(string.length < size || row.isShowAll) return string;
return (
<span>
{string.substr(0, 50)+'...'}
<el-button size='mini' type='text' onClick={()=>{this._showAll(row)}}>更多</el-button>
</span>
)
}
},
// 从dict字段暴力取值,取不到则返回原值
util_formatter(key, val) {
try {
return this.tableData.dict[key][val]
} catch (error) {
return val;
}
},
// 通过id修改某条记录
util_update(id, newData, idColumnName) {
let table = this.tableData.result;
let {index, data} = find(table, !idColumnName ? 'id' : idColumnName, id);
table.splice(index, 1, Object.assign({}, data, newData));
},
// 工具方法,把数字转化为字符串
util_toString(data, array) {
const dataCopy = Object.assign({}, data);
for(var item in data) {
dataCopy[item] = dataCopy[item] === undefined ? '' : dataCopy[item]+'';
}
return dataCopy;
},
util_formatterDate(time, fmt) {
if(!time) return '';
let date = new Date(Number(time));
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"[h|H]+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
},
util_getPrevMonthDate() {
let date = new Date();
var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();
if(month == 0){//年份为0代表,是本年的第一月,所以不能减
month = 11;//月份为上年的最后月份
year--;//年份减1
return new Date(year,month,day);
}
month--;//否则,只减去月份
return new Date(year,month,day);
},
// 格式化单元格数据
formatter(row, column, val) {
const content = formatter(this.tableData, column, val);
return content;
// return content ? <el-tag type={'info'} size='mini'>{content}</el-tag> : val
},
formatterLink(row, column, val) {
const content = formatter(this.tableData, column-2, val);
return <el-link type="primary" href={val} target="_blank">{row.attachName}</el-link>
//return content;
// return content ? <el-tag type={'info'} size='mini'>{content}</el-tag> : val
},
formatterString(row, column, val) {
return formatter(this.tableData, column, val)
},
// 格式化单元格数据 0显示 0.00
formatterAmount(row, column) {
return formatterAmount(row, column)
},
// 格式化单元格数据钱单位里换算成元
formatterMoney(row, column, val) {
return ((val || 0) / 1000).toFixed(2)
},
// 格式化单元格数据
formatterDate(row, column) {
return formatterDate(row, column)
},
// 格式化单元格数据 只要年月日
formatterDateOnly(row, column) {
return formatterDateOnly(row, column)
},
// 多选表格行
handleSelectionChange(val) {
this.selection = val.map(i=>i.id);
},
// 当某一行被点击时会触发该事件
handleRowClick(row, column, event) {
},
// 合并表格行列
handleSpanMethod() {
},
// 自定义表格排序
handleSortChange() {
},
// 设置单元行样式
tableRowClassName() {},
// 批量删除
toBatchDel() {
this.toDel(this.selection.join(','), true);
},
// 单个删除
toDel(id, isBatch) {
if(!id) {
return this.$message.warning('请选中一条记录');
}
this.$post(this.pageInfo.del, {id: id})
.then(res=>{
this.$message.success(res.msg)
// 更新数据
if(isBatch) {
// 批量删除,刷新页面
this.getData();
}else{
let table = this.tableData.result;
let {index} = find(table, 'id', id);
table.splice(index, 1);
this.tableData.pageInfo.totalResult -= 1;
}
this.afterDel(id);
})
.catch(error=>{
this.$message.error(error.message);
})
},
// 新增
toAdd() {
this.$router.push({
path: this.pageInfo.add,
query: this.tableConfig.addQuery,
})
},
// 编辑
toEdit(row, query) {
this.$router.push({
path: this.pageInfo.edit,
query: Object.assign({}, {id: row.id}, query)
})
},
// 查看
toView(row, query) {
this.$router.push({
path: this.pageInfo.view,
query: Object.assign({}, {id: row.id}, query)
})
},
// 导入
toImport() {
this.$router.push({
path: this.pageInfo.importView,
query: this.tableConfig.addQuery,
})
},
// 查看
toBack() {
this.$router.push({
path: this.pageInfo.back
})
},
// 开启、关闭
open() {
},
},
computed: {
tableConfig() {
return Object.assign({}, this.defaultConfig, this.config)
},
pageInfo() {
const urls = { // 操作所需的url地址,和url同路径
list: this.$route.path,
edit: this.$route.path.replace('/list', '/edit'),
save: this.$route.path.replace('/list', '/save'),
del: this.$route.path.replace('/list', '/delete'),
add: this.$route.path.replace('/list', '/add'),
view: this.$route.path.replace('/list', '/view'),
importView: this.$route.path.replace('/list', '/importView'),
}
return Object.assign({}, urls, this.urls)
},
},
data() {
return {
source: axios.CancelToken.source(),
loadingTimer: null,
query: this.$route.query, // url-query参数
selection: [], // 表格内置的多选
urls: {},
toString: [],
defaultConfig: {
search: [], // 头部搜索配置
columns: [], // 表格列信息配置
addQuery: {}, // 新增按钮携带的参数
buttons: [], // 增加查询区域自定义操作按钮,格式:[{label:'按钮显示名称',isShow:是否显示true/false,loading:true/false,type:'类型',icon:'图标',method:function(){}}]
methods: {
handleSelectionChange: this.handleSelectionChange,
handleRowClick: this.handleRowClick,
tableRowClassName: this.tableRowClassName,
handleSpanMethod: this.handleSpanMethod,
handleSortChange: this.handleSortChange,
edit: this.toEdit,
add: this.toAdd,
del: this.toBatchDel,
back: this.toBack,
importView: this.toImport,
refresh: this.getData,
}
},
tableData: { // 表格数据
loading: true, // ajax请求状态
dict: {},
result: [],
pageInfo: {},
}
}
}
}
import axios from 'axios';
import Qs from 'qs';
const JSONbig = require('json-bigint')({"storeAsString": true});
import cookie from './cookie';
import httpErrorHandler from './httpErrorHandler';
const instance = axios.create({
baseURL: '/m',
headers: {
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'dataType': 'json',
}
},
transformResponse: [data=>{
try {
JSON.parse(data);
return JSONbig.parse(data);
} catch (error) {
return data;
}
}],
});
instance.interceptors.request.use(config => {
//config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
config.data = Qs.stringify(config.data, {arrayFormat: 'indices', allowDots: true});
//brackets
// 也可以在这里给请求添加token之类的字段
// config.headers['Content-Type'] = 'application/json;charset=UTF-8'
// config.headers.timestamp = Math.floor(new Date().getTime() / 1000)
// config.headers.token = sessionStorage.getItem('token') || ''
console.log("request config",config);
return config;
}, err => {
return Promise.reject(err);
});
instance.interceptors.response.use(response=>{
return response.data
},httpErrorHandler);
/**
* 封装后的axios post方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function post(url, option, config = {}) {
const data = Object.assign({}, option, {
__mortals_token__: cookie.getItem('__mortals_token__'),
})
return instance.post(url, data, config)
}
/**
* 封装后的axios get方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function get(url, option, config = {}) {
const data = Object.assign({}, option, {
__mortals_token__: cookie.getItem('__mortals_token__'),
})
return instance.get(url, { params: data }, config)
}
// 文件上传
const uploadInstance = axios.create({
baseURL: '/m',
headers: {
post: {
'Content-Type': 'multipart/form-data',
}
}
});
uploadInstance.interceptors.response.use(response=>{
return response.data
},httpErrorHandler);
/**
* 封装后的axios upload方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function upload(url, option, config = {}) {
let formdata = new FormData();
Object.keys(option).forEach(key=>{
formdata.append(key, option[key])
})
return uploadInstance.post(url, formdata, config)
}
import {normalCallPost} from './index';
export default class Cache {
constructor(fecthUrl, durtion) {
this.cache = {
time: 0,
data: [],
};
this.durtion = durtion;
this.fecthUrl = fecthUrl;
}
async getData() {
const currTime = new Date().getTime();
// 缓存过期,重新拉取
if(currTime - this.cache.time > this.durtion * 1000) {
const data = await this.fecthData();
this.setData(data);
return data;
}
return this.cache.data
}
setData(data) {
this.cache.data = data;
this.cache.time = new Date().getTime();
}
fecthData() {
return new Promise(async (resolve)=>{
const {data} = await normalCallPost(this.fecthUrl, {pageInfo: {prePageResult: -1}});
resolve(data.result);
})
}
}
\ No newline at end of file
export default {
getItem: function (sKey) {
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toUTCString();
break;
}
}
document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
return true;
},
removeItem: function (sKey, sPath, sDomain) {
if (!sKey || !this.hasItem(sKey)) { return false; }
document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
return true;
},
hasItem: function (sKey) {
return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
},
keys: /* optional method: you can safely remove it! */ function () {
var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
return aKeys;
}
};
import axios from 'axios';
const instance = axios.create({
baseURL: '/m',
headers: {
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'dataType': 'json',
}
},
});
instance.interceptors.request.use(config => {
// 也可以在这里给请求添加token之类的字段
config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
return config;
}, err => {
return Promise.reject(err);
});
// class DataScreenApi {
// request
// }
\ No newline at end of file
const Filter = function() {};
Filter.install = (Vue, options) => {
/**
* 转换日期格式为 yyyy-MM-dd
*
* @param {date} value 需要转换的日期
* @returns
*/
Vue.filter('date', function (value) {
if(!value) return '';
let date = new Date(value);
let y = date.getFullYear();
let m = date.getMonth() + 1;
let d = date.getDate();
return y + '.' + m + '.' + d;
});
Vue.filter('courseType', function (value) {
const courseTypeMap = {
1: '直播',
2: '点播',
}
return courseTypeMap[value] ? courseTypeMap[value] : value;
});
}
export default Filter;
// 全局组件注册
import LayoutTable from '@/components/Table.vue';
import LayoutForm from '@/components/Form.vue';
import TableButtons from '@/components/tools/TableButtons';
import FormButtons from '@/components/tools/FormButtons';
import Breadcrumb from '@/components/Breadcrumb';
import MySwitch from '@/components/Switch';
import Confirm from '@/components/Confirm';
import FormField from '@/components/FormField';
import Upload from '@/components/Upload';
import TreeTable from '@/components/TreeTable.vue';
import TopicInfo from '@/components/TopicInfo.vue';
import LimitIndex from '@/components/LimitIndex.vue';
const Prototype = function() {};
Prototype.install = (Vue, options) => {
Vue.component('LayoutTable', LayoutTable) // 表格
Vue.component('LayoutForm', LayoutForm) // 表单
Vue.component('TableButtons', TableButtons) // 表格内的编辑和删除
Vue.component('FormButtons', FormButtons) // 表单内的保存和取消
Vue.component('Breadcrumb', Breadcrumb) // 面包屑导航
Vue.component('Field', FormField) // 表单字段
Vue.component('MySwitch', MySwitch) // 拨动开关
Vue.component('Confirm', Confirm) // 局部确认窗口
Vue.component('Upload', Upload) // 文件上传
Vue.component('TreeTable', TreeTable) // 文件上传
Vue.component('TopicInfo', TopicInfo) // 文件上传
Vue.component('LimitIndex', LimitIndex) // 文件上传
}
export default Prototype;
export default (error) => {
if(error.message === '自动取消ajax操作') return Promise.reject(error);
if (!error.response) {
console.error(error);
return Promise.reject({
message: '未知错误',
error,
});
};
let tip = '';
const status = error.response.status;
switch (status) {
case 400:
tip = '错误的请求参数';
break;
case 401:
tip = '没有该操作权限';
break;
case 403:
tip = '用户未登录或登录失效,请重新登录';
break;
case 404:
tip = '错误的请求地址';
break;
case 405:
tip = '请修改当前密码(原因:首次登录或超过期限未修改密码)';
break;
case 500:
case 501:
case 502:
case 503:
case 504:
tip = '服务器错误';
break;
default:
tip = '未知错误' + status;
}
if(status === 405){
window.location='/#/login/updatePwd';
}else{
tip +=',将自动返回主页';
window.location='/#/';
}
return Promise.reject({
message: tip,
error,
status,
});
}
\ No newline at end of file
import Qs from 'qs';
import {post, get, upload} from './ajax';
import queue from './queue';
import axios from 'axios';
import cookie from './cookie';
import httpErrorHandler from './httpErrorHandler';
/**
* 获取参数的类型
*
* @param {any} data
* @returns {string} 参数类型
*/
export const type = (data) => {
return Object.prototype.toString.call(data).replace(/(\[object |\])/g, '')
};
/**
* 获取登录状态
*
* @returns
*/
export const getLoginStatus = () => {
return window.sessionStorage.isLogin;
}
/**
* 解析url参数
*
* @returns {object} localtion的query对象
*/
export const query = () => {
return Qs.parse(window.location.href.split('?')[1])
}
/**
* 编码url参数
*
* @param {object} data 参数对象
* @returns string
*/
export const encodeURI = (data) => {
return Qs.stringify(data, {arrayFormat: 'repeat', allowDots: true});
}
/**
* formatterDate
*
* @param {*} time 需要处理的时间
* @returns {string} val 解析后的结果
*/
export function formatterDate(time) {
if(!time) return '';
let date = new Date(Number(time));
let Y = date.getFullYear() + '-';
let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
let D = panLeft(date.getDate()) + ' ';
let h = panLeft(date.getHours()) + ':';
let m = panLeft(date.getMinutes()) + ':';
let s = panLeft(date.getSeconds());
return Y+M+D+h+m+s;
};
/**
* formatterDate
*
* @param {*} time 需要处理的时间串
* @returns {string} val 解析后的结果 yyyy-MM-dd
*/
export function formatterDateDay(datetime) {
if (!datetime) return "";
if (datetime instanceof Date) {
let Y = datetime.getFullYear() + "-";
let M =
(datetime.getMonth() + 1 < 10
? "0" + (datetime.getMonth() + 1)
: datetime.getMonth() + 1) + "-";
let D = panLeft(datetime.getDate());
return Y + M + D;
} else {
let transformDate = new Date(Number(datetime));
let Y = transformDate.getFullYear() + "-";
let M =
(transformDate.getMonth() + 1 < 10
? "0" + (transformDate.getMonth() + 1)
: transformDate.getMonth() + 1) + "-";
let D = panLeft(transformDate.getDate());
return Y + M + D;
}
return datetime;
};
/**
* 当前日期加天数后得到的相应日期
* @param {*} day
*/
export function getAddDay(day){
var today = new Date();
var targetday_milliseconds=today.getTime() + 1000*60*60*24*day;
today.setTime(targetday_milliseconds);
var tYear = today.getFullYear();
var tMonth = today.getMonth();
var tDate = today.getDate();
tMonth = doHandleMonth(tMonth + 1);
tDate = doHandleMonth(tDate);
return tYear+""+tMonth+""+tDate;
}
function doHandleMonth(month){
var m = month;
if(month.toString().length == 1){
m = "0" + month;
}
return m;
}
function panLeft(num){
return num < 10 ? '0'+num : num;
}
/**
* call方法
*
* @param {Function} callMethod 调用的http包装方法
* @param {String} url 调用接口
* @param {Object} formData 需要发送参数
* @param {Object} [config] 配置
* @returns {Promise} axios请求
*/
const call = (callMethod, url, formData, config = {}) => {
return new Promise((resolve, reject)=>{
callMethod(url, formData, config).then( res =>{
const {code, msg, data} = res;
if(code !== 1){
reject({
message: msg || ''
});
return;
}
resolve(res);
})
.catch(error=>{
if(error.status === 403) {
window.location.href = '/#/login'
}
reject(error);
})
})
};
/**
* 普通的ajax post请求
*
* @param {Object} formData 需要发送参数
* @param {String} url 调用接口
* @param {Object} [config] 配置
* @returns 科里化后的call方法
*/
export const normalCallPost = (url, formData, config = {}) => {
return call(post, url, formData, config);
};
/**
* 普通的ajax get请求
*
* @param {Object} formData 需要发送参数
* @param {String} url 调用接口
* @param {Object} [config] 配置
* @returns 科里化后的call方法
*/
export const normalCallGet = (url, formData, config= {}) => {
return call(get, url, formData, config);
};
/**
* 普通的ajax download请求
*
* @param {Object} formData 需要发送参数
* @param {String} url 调用接口
* @param {Object} [config] 配置
* @returns {Promise<blob>}
*/
export const download = (url, formData, config= {}) => {
return new Promise(async (resolve, reject)=>{
const option = Object.assign({}, config, {
responseType:'blob'
})
try {
const data = await post(url, formData, option)
let downloadUrl = window.URL.createObjectURL(new Blob([data]))
let link = document.createElement('a')
link.style.display ='none';
link.href = downloadUrl;
link.setAttribute('download', `${url.substr(1).replace(/\//g, '_')}_${new Date().getTime()}.xls`);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
resolve();
} catch (error) {
reject(error);
}
})
};
export const downloadWithCustName = (url, formData, config= {}) => {
return new Promise(async (resolve, reject)=>{
const option = Object.assign({}, config, {
responseType:'blob',
baseURL: '/m',
headers: {
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
}
})
try {
const params = Object.assign({}, formData, {
__mortals_token__: cookie.getItem('__mortals_token__'),
})
var requestData = Qs.stringify(params, {arrayFormat: 'repeat', allowDots: true});
axios.post(url, requestData, option)
.then(response => {
if (response.data.type == 'application/json'){
var reader = new FileReader();
reader.onload = function(event) {
var content = reader.result;
reject(content);
};
reader.readAsText(response.data);
return;
}
const filename = decodeURI(response.headers['content-disposition'].split(';')[1].split('=')[1]) || `${url.substr(1).replace(/\//g, '_')}_${new Date().getTime()}.xls`
let downloadUrl = window.URL.createObjectURL(new Blob([response.data]))
let link = document.createElement('a')
link.style.display ='none';
link.href = downloadUrl;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
resolve();
}, err => {
reject(err);
}).catch((error) => {
reject(error)
})
} catch (error) {
reject(error);
}
})
};
/**
* 普通的ajax upload请求
*
* @param {Object} formData 需要发送参数
* @param {String} url 调用接口
* @param {Object} [config] 配置
* @returns 科里化后的call方法
*/
export const normalCallUpload = (url, formData, config= {}) => {
return call(upload, url, formData, config);
};
/**
* 使用队列的ajax请求,后自动cancel前一个请求
*
* @param {Object} formData 需要发送参数
* @param {String} url 调用接口
* @param {Object} [config] 配置
* @returns 科里化后的call方法
*/
export const queueCall = (url, formData, config = {}) => {
return call(queue, url, formData, config);
};
/**
* 根据条件查询用户列表
*/
export async function getUserListByQuery(query) {
try {
/* //下拉只获取正常状态数据:status{0: "停用", 1: "正常", 2: "冻结", 3: "销户", 4: "离职"}
query["query.status"] = 1;*/
const data = await normalCallPost('/user/list', query);
const list = data.data.result.map(({id,loginName, realName,mobile})=>{
return {id,loginName, realName,mobile}
});
return list;
} catch (error) {
return [];
}
};
\ No newline at end of file
// 远程加载highcharts及3d组件
const chartCached = {};
export default function load(src) {
return new Promise((resolve, reject)=>{
const cached = chartCached[src];
if(cached) {
return resolve()
}
var script = document.createElement('script');
script.type = "text/javascript";
script.onload = function() {
chartCached[src] = true;
resolve();
};
script.onerror = reject;
script.src = src;
document.body.appendChild(script);
})
}
\ No newline at end of file
import cookie from './cookie';
import * as utils from './index';
const Prototype = function() {};
Prototype.install = (Vue, options) => {
Vue.prototype.$queue = utils.queueCall; // {function} post请求队列
Vue.prototype.$getType = utils.type; // {function} 获取js对象类型
Vue.prototype.$getQuery = utils.query; // {function} 获取url的query参数
Vue.prototype.$post = utils.normalCallPost; // {function} ajax post
Vue.prototype.$get = utils.normalCallGet; // {function} ajax get
Vue.prototype.$upload = utils.normalCallUpload; // {function} ajax get
Vue.prototype.$isLogin = utils.getLoginStatus; // {function} 登录状态
Vue.prototype.$cookie = cookie; // {object} cookie操作
}
export default Prototype;
import axios from 'axios';
import Qs from 'qs';
import cookie from './cookie';
import httpErrorHandler from './httpErrorHandler';
const isDev = process.env.NODE_ENV === 'development';
const queue = [];
const cancelToken = axios.CancelToken;
const token = (config) =>{
return `${config.url}_${config.method}`
}
const instance = axios.create({
baseURL: '/m',
headers: {
token: cookie.getItem('fe_t'),
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'dataType': 'json',
}
}
});
const removeQueue = (config) => {
for(let i=0, size = queue.length; i < size; i++){
const task = queue[i];
if(task.token === token(config)) {
task.cancel();
queue.splice(i, 1);
}
}
}
//添加请求拦截器
instance.interceptors.request.use(config=>{
removeQueue(config); //在一个ajax发送前执行一下取消操作
config.cancelToken = new cancelToken((c)=>{
queue.push({ token: token(config), cancel: c });
});
return config;
}, error => {
return Promise.reject(error);
});
//添加响应拦截器
instance.interceptors.response.use(response=>{
removeQueue(response.config);
return response.data
}, httpErrorHandler);
/**
* 封装后的ajax post方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} config 自定义配置
* @returns
*/
export default (url, data, config = {}) => {
return instance.post(url, data, config)
}
// table-list 所需的一系列操作方法
/**
* formatter
*
* @param {*} tableData 表单数据
* @param {*} column 列数据
* @returns {string} val 解析后的结果
*/
const formatter = (tableData, column, val) => {
const key = column.property;
if(tableData.dict && tableData.dict[key]){
const dict = tableData.dict[key]
return dict[val] || val;
}
return val;
};
/**
* formatterAmount
*
* @param {*} row 单元格数据
* @param {*} column 列数据
* @returns {string} val 解析后的结果
*/
const formatterAmount = (row, column) => {
const property = column.property;
const amount = row[property];
if(!amount){
return '0.00';
}
if(amount == 0){
return '0.00';
}
return amount;
};
/**
* formatterDate
*
* @param {*} row 单元格数据
* @param {*} column 列数据
* @returns {string} val 解析后的结果
*/
const formatterDate = (row, column) => {
const property = column.property;
const time = row[property];
if(!time) return '';
let date = new Date(Number(time));
let Y = date.getFullYear() + '-';
let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
let D = panLeft(date.getDate()) + ' ';
let h = panLeft(date.getHours()) + ':';
let m = panLeft(date.getMinutes()) + ':';
let s = panLeft(date.getSeconds());
return Y+M+D+h+m+s;
};
/**
* formatterDateOnly
*
* @param {*} row 单元格数据
* @param {*} column 列数据
* @returns {string} val 解析后的结果
*/
const formatterDateOnly = (row, column) => {
const property = column.property;
const time = row[property];
if(!time) return '';
let date = new Date(Number(time));
let Y = date.getFullYear() + '-';
let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
let D = panLeft(date.getDate()) + ' ';
return Y+M+D;
};
function panLeft(num){
return num < 10 ? '0'+num : num;
}
/**
* 通过id从数组中查找
*
* @param {array} list 数组
* @param {string} key 需要查找的key
* @param {string} val 需要查找的val
* @returns {object} data 找到的数据
*/
const find = (list, key, val) => {
let index = -1;
let data = null;
list.forEach((item, i)=>{
if(item[key] === val){
index = i;
data = JSON.parse(JSON.stringify(item));
return;
}
})
return {
index,
data,
}
}
export {
formatter,
formatterAmount,
formatterDate,
formatterDateOnly,
find,
};
\ No newline at end of file
import Cache from './cache';
export class TreeCache extends Cache {
/**
*Creates an instance of TreeCache.
* @param {string} fecthUrl 远程加载数据的url
* @param {number} durtion 缓存有效时间(秒)
* @memberof TreeCache
*/
constructor(fecthUrl, durtion) {
super(fecthUrl, durtion);
this.pidCache = {};
this.nameCache = {};
}
// 每次修改tree缓存数据后,清空pid和name缓存
setData(data) {
super.setData(data);
this.pidCache = {};
this.nameCache = {};
}
async getData() {
const result = await super.getData();
const data = result.map(item=>{
//console.log(i)
if(!item.parentId) {
item.parentId = -1;
}
return item;
});
return this.cache.data = data;
}
async getTree() {
const data = await this.getData();
if(!data.length) return [];
return buildTree(-1, data);
}
// 通过省获取区域id
async getAreasByProvinceId(provinceList) {
const data = await this.getData();
const cities = data.filter(i=>provinceList.includes(i.parentId)).map(i=>i.id);
const areas = await this.getAreasByCityId(cities);
return areas
}
// 通过市获取区域id
async getAreasByCityId(cityList) {
const data = await this.getData();
return data.filter(i=>cityList.includes(i.parentId) && i.level === 3).map(i=>i.id);
}
getPname(id) {
if(!id) return '--';
if(!this.nameCache[id]) {
this.nameCache[id] = getParentName(id, this.cache.data, []).join('-');
}
return this.nameCache[id];
}
getPid(id) {
if(!id) return [];
if(!this.pidCache[id]) {
this.pidCache[id] = getParentId(id, this.cache.data, []);
}
return this.pidCache[id];
}
}
export const treeCache = new TreeCache('/area/list', 6000);
/**
* 获取父级节点的id列表
*
* @export
* @param {string} id 当前节点id
* @param {[]} list 全部节点列表
* @param {string[]} arr 初始列表
* @returns {string[]}
*/
export function getParentId(id, list, arr) {
if(id != -1){
arr.unshift(id);
}
let pid = '';
try {
pid = list.filter(i=>id == i.id)[0].parentId;
} catch (error) {
}
if(pid) {
return getParentId(pid, list, arr)
}else{
return arr;
}
}
/**
* 获取父级节点的name列表
*
* @export
* @param {string} id 当前节点id
* @param {[]} list 全部节点列表
* @param {string[]} arr 初始列表
* @param {string} name 获取到的name
* @returns {string[]}
*/
export function getParentName(id, list, arr, name) {
name && arr.unshift(name);
let parent = '';
let pid = '';
try {
parent = list.filter(i=>id == i.id)[0];
pid = parent.parentId;
} catch (error) {
pid = null;
}
if(pid !== null) {
return getParentName(pid, list, arr, parent.name)
}else{
return arr;
}
}
/**
* list to tree
*
* @export
* @param {string} pid
* @param {[]} list
* @returns {[]}
*/
export function buildTree(pid, list) {
const data = list.filter(i=>pid == i.parentId);
return data.length ? data.map(i=>{
return {
value: i.id,
label: i.name,
level: i.level,
children: buildTree(i.id, list),
}
}) : undefined
}
// 查找该条数据所处的层级深度
function getDeep(list, parentId, deep) {
try {
let pid = list.filter(i=>i.id == parentId)[0].parentId;
deep++;
if(pid != 0) {
return getDeep(list, pid, deep);
}else{
return deep
}
} catch (error) {
return deep;
}
}
// 分组排序
function sort(list) {
let array = [];
list.filter(i=>(i.parentId===-1)).forEach(item=>{
array = array.concat(child(list, item, []))
})
return array
}
function child(list, data, arr) {
arr.push(data);
if(data.hasChild) {
list.filter(i=>i.parentId==data.id).forEach(item=>{
return child(list, item, arr)
})
}
return arr;
}
let treeData = [];
export let render = function(result) {
return treeData = sort(result.map(i=>{
i.hasChild = result.filter(j=>j.parentId==i.id).length > 0; // 是否有下级
i.deep = getDeep(result, i.parentId, 0); // 缩进层级
i.open = false;
i.isShow = (i.parentId==-1);
return i;
}));
}
export let toggle = function(row) {
// 关闭的时候,需要递归关闭下面全部子级
let childId = []
// 打开下级
if(row.open) {
childId = child(treeData, row, []).map(i=>i.id)
childId.shift();
}
return treeData.map(i=>{
if(i.id == row.id) {
i.open = !i.open;
}
if(i.parentId == row.id) {
i.isShow = !i.isShow;
}
if(childId.indexOf(i.id) > -1) {
i.open = false;
i.isShow = childId.indexOf(i.id) === -1
}
return i;
})
.filter(i=>i.isShow)
}
\ No newline at end of file
// 前端正则验证方法
export default {
// 手机号码
phone(rule, value, callback) {
if (/^1[3456789][0-9]{9}$/.test(value)) {
callback();
} else {
callback(new Error('请输入正确的手机号码如 18800008888'));
}
},
// 金额
money(rule, value, callback) {
if(!value) return callback();
if (/^[0-9]+\.{0,1}[0-9]{0,2}$/.test(value)) {
callback();
} else {
callback(new Error('请输入正确的金额如 100.23'));
}
},
// 自然数
integer(rule, value, callback) {
if(!value) return callback();
if (/^[0-9]+$/.test(value)) {
callback();
} else {
callback(new Error('请输入一个整数如 5'));
}
},
// 数字
number(rule, value, callback) {
if(!value) return callback();
if (/^\d+(\.\d{1,2})?$/.test(value)) {
callback();
} else {
callback(new Error('请输入一个数字'));
}
},
// 经度
longitude(rule, value, callback) {
if (/^[\-\+]?(0?\d{1,2}\.\d{1,10}|1[0-7]?\d{1}\.\d{1,10}|180\.0{1,10})$/.test(value)) {
callback();
} else {
callback(new Error('请输入正确的经度如 103.012345'));
}
},
// 纬度
latitude(rule, value, callback) {
if (/^[\-\+]?([0-8]?\d{1}\.\d{1,10}|90\.0{1,10})$/.test(value)) {
callback();
} else {
callback(new Error('请输入正确的纬度如 30.012345'));
}
},
// 网址
url(rule, value, callback) {
if (/^https?:\/\/((.)+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?.(\?)?)*)*$/i.test(value)) {
callback();
} else {
callback(new Error('请输入正确的网址如 https://www.baidu.com'));
}
},
// ip地址组
ips(rule, value, callback) {
if (!value) {
// 允许不填写ip
callback();
}else if (!/^[0-9,\.]+$/.test(value)) {
callback(new Error('含有非法字符'));
}else {
let ipVals = value.split(',');
let noValiIps = [];
if(ipVals.some(ip=>{
let ipPattern = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
if(ipPattern.test(ip)){
return false;
}
noValiIps.push(ip || '空字符串');
return true;
})){
callback(new Error('错误的ip地址: '+noValiIps.join(',')));
}else{
callback();
}
}
},
}
let Socket = ''
let setIntervalWesocketPush = null
/**
* 建立websocket连接
* @param {string} url ws地址
*/
export const createSocket = url => {
Socket && Socket.close()
if (!Socket) {
console.log('建立websocket连接')
Socket = new WebSocket(url)
Socket.onopen = onopenWS
Socket.onmessage = onmessageWS
Socket.onerror = onerrorWS
Socket.onclose = oncloseWS
} else {
console.log('websocket已连接')
}
}
/**打开WS之后发送心跳 */
const onopenWS = () => {
sendPing()
}
/**连接失败重连 */
const onerrorWS = () => {
Socket.close()
clearInterval(setIntervalWesocketPush)
console.log('连接失败重连中')
if (Socket.readyState !== 3) {
Socket = null
createSocket()
}
}
/**WS数据接收统一处理 */
const onmessageWS = e => {
window.dispatchEvent(new CustomEvent('onmessageWS', {
detail: {
data: e.data
}
}))
}
/**
* 发送数据但连接未建立时进行处理等待重发
* @param {any} message 需要发送的数据
*/
const connecting = message => {
setTimeout(() => {
if (Socket.readyState === 0) {
connecting(message)
} else {
Socket.send(JSON.stringify(message))
}
}, 1000)
}
/**
* 发送数据
* @param {any} message 需要发送的数据
*/
export const sendWSPush = message => {
if (Socket !== null && Socket.readyState === 3) {
Socket.close()
createSocket()
} else if (Socket.readyState === 1) {
Socket.send(JSON.stringify(message))
} else if (Socket.readyState === 0) {
connecting(message)
}
}
/**断开重连 */
const oncloseWS = () => {
clearInterval(setIntervalWesocketPush)
console.log('websocket已断开....正在尝试重连')
if (Socket.readyState !== 2) {
Socket = null
createSocket()
}
}
/**发送心跳
* @param {number} time 心跳间隔毫秒 默认5000
* @param {string} ping 心跳名称 默认字符串ping
*/
export const sendPing = (time = 15000, ping = 'ping') => {
let heart={};
let body={};
heart.type="HEART_BEAT_REQUEST";
let msgId=new Date().getMilliseconds();
body.msgId=msgId;
heart.body=body;
clearInterval(setIntervalWesocketPush)
Socket.send(JSON.stringify(heart))
setIntervalWesocketPush = setInterval(() => {
Socket.send(JSON.stringify(heart))
}, time)
}
\ No newline at end of file
// 鼠标移入,查看大图
<template>
<el-popover
:placement="placement"
:title="alt"
:width="size"
trigger="hover">
<img :src='src' :alt="alt" :width='size' style="max-width: 100%"/>
<img slot="reference" :src='src' :alt="alt" width='30'/>
</el-popover>
</template>
<script>
export default {
props: {
placement: { // 方向
type: String,
default: 'right',
},
alt: { // 图片名
type: String,
default: '图片',
},
src: { // 图片地址
type: String,
default: '',
},
size: { // 大图宽度
type: Number,
default: 500,
},
},
}
</script>
<template>
<el-breadcrumb separator="/">
<el-breadcrumb-item
:to='item.path'
:key='index'
v-for="(item, index) in breadcrumb"
>
{{item.name}}
</el-breadcrumb-item>
</el-breadcrumb>
</template>
<script>
// 获取多级菜单
const types = {
list: '列表',
add: '新增',
edit: '编辑',
view: '查看',
importView: '导入',
resetPwdView:'重置密码',
};
const findEntity = (list, value, key) => {
let data = {};
list.forEach((item, i)=>{
if(item[key] === value) {
data = item;
return;
}
})
return data;
};
const find = (list, path, arr) => {
// 获取二级菜单
let newList = JSON.parse(JSON.stringify(list));
let data = findEntity(newList, path, 'path');
let parentId = data.parentId;
arr.push(data);
// 获取一级菜单
if(parentId){
let parent = findEntity(newList, parentId, 'id');
arr.unshift(parent);
}
return arr
}
export default {
props: {
list: {
type: Array,
default: () => []
}
},
watch: {
'$route'(route) {
this.query = route.query;
}
},
computed: {
breadcrumb() {
// 如果用户指定面包屑,则使用用户配置
if(this.list.length) {
return this.list;
}
const path = this.$route.path.replace(/\/(list|add|edit|importView|view|resetPwdView)$/, '/list');
const group = find(this.menu, path, []);
let urlArray = this.$route.path.split('/');
const type = urlArray.pop();
if(types[type]) {
group.push({
name: types[type]
})
}
return group
},
menu() {
return this.$store.state.userData.flat || [];
},
},
data() {
return {
}
}
}
</script>
<style lang="less">
.el-breadcrumb{
font-size: 12px;
}
</style>
<template>
<!-- 开启confirm时,操作之前会先调动确认窗口 -->
<el-popover
placement="top"
width="160"
v-model="visible">
<p>{{message}}</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="change">确定</el-button>
</div>
<label slot="reference">
<slot></slot>
</label>
</el-popover>
</template>
<script>
export default {
props: {
message: {
type: String,
default: '确认操作?',
}
},
methods: {
change() {
this.visible = false;
this.$emit("confirm");
}
},
data() {
return {
visible: false,
}
}
}
</script>
<template>
<el-table
size='small'
:data="tableData"
:span-method="handleSpanMethod"
@selection-change="handleSelectionChange"
@sort-change="handleSortChange"
@row-click="handleRowClick"
:row-class-name="tableRowClassName"
:empty-text='emptyText'
border
style="width: 100%">
<el-table-column
v-for='column in columns'
:key='column.prop'
:type="column.type"
:prop="column.prop"
:label="column.label"
:width="column.width"
:sortable="column.sortable"
:align="column.align || 'left'"
:formatter='column.formatter'
:subColumns='column.subColumns'
>
<el-table-column
v-for='sunColumn in column.subColumns'
:key='sunColumn.prop'
:type="sunColumn.type"
:prop="sunColumn.prop"
:label="sunColumn.label"
:width="sunColumn.width"
:sortable="sunColumn.sortable"
:align="sunColumn.align || 'left'"
:formatter='sunColumn.formatter'
/>
</el-table-column>
</el-table>
</template>
<script>
export default {
props: {
handleSpanMethod: {
type: Function,
required: false,
default: () => {}
},
handleSelectionChange: {
type: Function,
required: false,
default: () => {}
},
handleRowClick: {
type: Function,
required: false,
default: () => {}
},
handleSortChange: {
type: Function,
required: false,
default: () => {}
},
tableRowClassName: {
type: Function,
required: false,
default: () => {}
},
loading: {
type: Boolean,
required: false,
default: true
},
tableData: {
type: Array,
required: false,
default: () => []
},
columns: {
type: Array,
required: false,
default: ()=> [],
}
},
computed: {
emptyText() {
return (!this.loading && !this.tableData.length) ? '暂无数据' : '加载中...'
},
},
data() {
return {}
}
}
</script>
export default {
props: {
handleSelectionChange: {
type: Function,
required: false,
default: () => {}
},
handleRowClick: {
type: Function,
required: false,
default: () => {}
},
tableRowClassName: {
type: Function,
required: false,
default: () => {}
},
tableData: {
type: Array,
required: false,
default: () => []
},
columns: {
type: Array,
required: false,
default: ()=> [],
}
},
methods: {
cell(row, column, cellValue, index) {
column.property = column.prop;
if(column.formatter) return column.formatter(row, column, cellValue, index)
return false;
},
},
render() {
return (
<div>
{
this.tableData.map((item, index)=>{
return <div class="el-card mobile-table-card" key={index}>
{
this.columns.filter(i=>!i.type).map(column=>{
return <div class="cell flex flex-pack-justify mobile-table-cell" key={column.id}>
<div class="cell-title">{column.label}</div>
<div class="cell-content flex-1">{this.cell(item, column, item[column.prop], index) || item[column.prop]}</div>
</div>
})
}
</div>
})
}
</div>
)
}
}
<template>
<div class='page layout-form'>
<slot name='breadcrumb'>
<Breadcrumb />
</slot>
<slot></slot>
</div>
</template>
<style lang="less">
@media screen and (max-width: 800px){
.layout-form{
form{
width: 100%!important;
}
.el-col-12{
width: 100%;
}
}
}
.layout-form{
.el-breadcrumb{
padding-bottom: 12px;
margin-bottom: 12px;
border-bottom: 1px solid #ededed;
}
form{
width: 800px;
&[loading]{
pointer-events: none;
.el-button{
background: #eee;
color: transparent;
border-color: #eee;
}
input,
textarea{
background: #eee;
color: transparent;
border-color: #eee;
}
span, input, button, li, label{
color: #eee;
}
}
.el-input-group--append{
.el-select .el-input {
width: 80px;
}
}
// 自定义的field组件
.my-form-field{
.el-select{
width: 100%;
}
.el-date-editor.el-input{
width: 100%;
}
.form-el-radio-group{
label{
width: 160px;
}
.el-radio-button__inner{
border: 0;
}
}
}
}
}
</style>
// 表单节点封装,支持 input textarea select radio checkbox 及slot方式
<template>
<el-col :span='span'>
<el-form-item :label="label" :prop="prop" class='my-form-field'>
<slot>
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" @input="emit" v-if='type === "text"' :class="inputClass" :clearable='clearable'></el-input>
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" @input="emit" type='password' v-if='type === "password"'></el-input>
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" @input="emit" v-if='type === "textarea"' type='textarea' :autosize="textareaSize" :class="inputClass"></el-input>
<el-select :disabled='disabled' v-model="field" @change="emit" :multiple='multiple' :filterable='filterable' :clearable='clearable' v-if='type === "select"'>
<el-option
v-for="($label, $value) in enumData"
:key="$value"
:label="$label"
:value="$value"
></el-option>
</el-select>
<el-radio-group :disabled='disabled' v-model="field" @change="emit" v-if='type === "radio"'>
<el-radio
v-for='($label, $value) in enumData'
:key='$value'
:label="$value"
>{{$label}}</el-radio>
</el-radio-group>
<el-checkbox-group :disabled='disabled' v-model="field" @change="emit" v-if='type === "checkbox"'>
<el-checkbox
v-for='($label, $value) in enumData'
:key='$value'
:label="$value"
>{{$label}}</el-checkbox>
</el-checkbox-group>
<el-date-picker :disabled='disabled' type="date" value-format="yyyy-MM-dd HH:mm:ss" v-model="field" @change="emit" @input="emit" placeholder="选择日期" v-if='type === "date"'></el-date-picker>
<el-date-picker :disabled='disabled' type="datetime" value-format="yyyy-MM-dd HH:mm:ss" v-model="field" @change="emit" @input="emit" placeholder="选择日期" v-if='type === "datetime"'></el-date-picker>
</slot>
</el-form-item>
</el-col>
</template>
<script>
export default {
props: {
// 字段值
value: {
type: [String, Number, Array],
},
// 组件的el-col span宽度 1-24,默认12
span: {
type: Number,
default: 12,
},
// 字段类型: text,password,textarea,select,radio,checkbox,date,datetime
type: {
type: String,
default: 'text',
},
// 字段name
prop: {
type: String,
default: '',
},
// 字段中文标题
label: {
type: String,
default: '',
},
// 是否禁用
disabled: {
type: Boolean,
default: false,
},
// 是否提示
placeholder: {
type: String,
default: '',
},
// 字段所需的枚举类型
enumData: {
type: Object,
default: ()=>{},
},
// textarea专用-自适应内容高度
textareaSize: {
type: Object,
default: ()=>{},
},
// select专用-是否可搜索
filterable: {
type: Boolean,
default: false,
},
// select专用-是否多选
multiple: {
type: Boolean,
default: false,
},
// select专用-是否可取消
clearable: {
type: Boolean,
default: false,
},
// 字段所需的枚举类型
options: {
type: Array,
default: ()=>[],
},
children: {
type: Array,
default: ()=>[],
},
inputClass: {
type: String,
default: '',
}
},
methods: {
emit() {
this.$emit('input', this.newVal)
this.$emit('change', this.newVal)
}
},
computed: {
field: {
get() {
return this.value
},
set(val) {
this.newVal = val;
}
}
},
data() {
return {
newVal: this.value,
}
}
}
</script>
// 管理后台通用头部导航
<template>
<div class="layout-header">
<div class="layout-menu-wrapper flex">
<div class="layout-menu flex flex-1">
<!-- logo -->
<div class="layout-logo flex">
<i class="el-icon-menu" @click='showMobileMenu=!showMobileMenu'></i>
<router-link to="/">
<img src="../assets/images/logo.png" height="20" alt="">
</router-link>
</div>
<!-- 一级菜单 -->
<ul class="menu-list flex">
<li v-for='item in menu' :key='item.id'>
<router-link :to="item.path" :active='submenu.path === item.path' :title="item.name">
<i :class="'el-icon-'+item.icon"></i>
{{item.name}}
</router-link>
</li>
</ul>
</div>
<div class="layout-profile">
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{userData.currUserName}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="update">修改密码</el-dropdown-item>
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<!-- 一级菜单 -->
<ul class="mobile-menu-list flex flex-pack-justify" v-if='showMobileMenu'>
<li v-for='item in menu' :key='item.id'>
<router-link :to="item.path" :active='submenu.path === item.path' :title="item.name">
<i :class="'el-icon-'+item.icon"></i>
{{item.name}}
</router-link>
</li>
</ul>
<!-- 二级菜单 -->
<div class="layout-submenu-wrapper flex" v-if='submenu.children && submenu.children.length'>
<div class="layout-submenu">
<ul class="submenu-list flex">
<li v-for='item in submenu.children' :key='item.id'>
<a :href="item.path" target="blank" v-if='item.isOut'>{{item.name}}</a>
<router-link :to="item.path" :active='group === item.path' v-else>{{item.name}}</router-link>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
methods: {
handleCommand(key) {
if(key === 'update'){
this.$router.push('/login/updatePwd')
}
if(key === 'logout'){
this.logout()
}
},
// 退出登录
logout() {
this.$post('/login/logout').then(data=>{}).catch(error=>{}).then(()=>{
this.$message.success('已退出登录');
this.$store.commit('logout');
this.$router.replace('/login');
})
}
},
computed: {
group() {
const relativeGroup = this.$store.state.group;
if(relativeGroup) {
return relativeGroup;
}
let groupArray = this.$route.path.split('/');
let group = this.$route.path;
let type = groupArray.pop();
if(['add', 'edit', 'view', 'new','importView','resetPwdView'].indexOf(type) > -1){
groupArray.push('list');
group = groupArray.join('/')
}
return group;
},
relativeGroup() {
return this.$store.state.group
},
flat() {
return this.userData.flat
},
menu() {
if(!this.userData.barList) return [];
return this.userData.barList.map(item=>{
const url = item.url ? item.url : (item.childList[0] ? (item.childList[0].url || '') : '');
return {
name: item.name,
path: url,
id: item.id,
icon: item.imgPath,
children: item.childList.map(sub=>{
return {
name: sub.name,
path: sub.url ? sub.url : (sub.childList[0] ? (sub.childList[0].url || 0) : ''),
id: sub.id,
parentId: sub.parentId,
icon: sub.imgPath,
isOut: /^https?\:\/\//.test(sub.url)
}
})
}
})
},
submenu() {
if(!this.menu.length) return {};
let matchMenu = {};
this.menu.forEach(item=>{
const menu = item;
item.children.forEach(item=>{
if(item.path === this.group) {
matchMenu = menu;
return;
}
})
})
return matchMenu
},
userData() {
return this.$store.state.userData;
}
},
data() {
return {
showMobileMenu: false,
}
}
}
</script>
<style lang="less">
.layout-header{
.mobile-menu-list{display: none}
.layout-menu-wrapper{
height: 50px;
line-height: 50px;
font-size: 14px;
color: #eee;
background: #222333;
.layout-logo{
width: 80px;
height: 50px;
.el-icon-menu{display: none}
a{
margin: auto;
}
img{
vertical-align: middle;
}
}
.menu-list{
li{
a{
display: block;
padding: 0 12px;
height: 100%;
color: #eee;
overflow: hidden;
&.router-link-active,
&[active]{
background: #1890ff;
color: #fff;
}
}
}
}
.layout-profile{
padding-right: 30px;
}
}
.layout-submenu-wrapper{
padding-left: 20px;
background: #fff;
height: 42px;
border-bottom: 1px solid #ededed;
.layout-title{
font-size: 18px;
height: 40px;
line-height: 40px;
color: #333;
}
.layout-submenu{
margin-left: 15px;
white-space: nowrap;
overflow: auto;
li{
a{
display: block;
padding: 0 10px;
height: 40px;
line-height: 40px;
font-size: 14px;
color: #666;
&.router-link-active,
&[active]{
color: #1890ff;
border-bottom: 2px solid #1890ff;
}
}
}
}
}
}
@media screen and (max-width: 800px){
.layout-header {
.mobile-menu-list{
display: flex;
background: #222333;
padding: 0 10px;
li{
padding: 8px 5px;
a{
width: 1em;
display: block;
color: #eee;
font-size: 14px;
word-break: break-all;
&.router-link-active,
&[active]{
color: #1890ff;
}
}
}
}
.layout-submenu-wrapper{
padding-left: 0;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.layout-menu-wrapper {
width: 100%;
.layout-logo{
width: 40px;
.el-icon-menu{
margin: auto;
display: inline-block;
}
a{
display: none;
}
}
.menu-list{
display: none;
}
li{
width: 100%;
}
}
}
}
</style>
<template>
<div>
<div class="profile" :class="{close: isOpen}">
<p class="menu-switch">
<i @click="toogle" :class="`el-icon-s-${isOpen?'unfold':'fold'}`" />
</p>
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{currentUserName}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="update">修改密码</el-dropdown-item>
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div class="sidebar" :class="{close: isOpen}">
<div class="logo">
<router-link to="/">
<img src="../assets/images/logo.png" height="20" alt />
{{isOpen ? '' : 'xxx系统' }}
</router-link>
</div>
<el-menu :default-active="defaultActive" background-color="#222333" text-color="#fff" active-text-color="#409eff" :collapse="isOpen" :collapse-transition="false" router unique-opened>
<el-menu-item index="/index" key="home">
<i class="el-icon-s-home"></i>
<span>首页</span>
</el-menu-item>
<el-submenu v-for="item in menu" :key="item.id" :index="item.name">
<template slot="title">
<i :class="`el-icon-${item.icon}`"></i>
<span slot="title">{{item.name}}</span>
</template>
<el-menu-item v-for="val in item.children" :index="val.path" :key="val.id">
<i :class="`el-icon-${val.icon}`"></i>
<span>{{val.name}}</span>
</el-menu-item>
</el-submenu>
</el-menu>
</div>
</div>
</template>
<script>
export default {
props: {
isOpen: {
type: Boolean,
default: false,
},
},
methods: {
handleCommand(key) {
if (key === "update") {
this.$router.push("/login/updatePwd");
}
if (key === "logout") {
this.logout();
}
},
toogle() {
this.$emit("toggle");
},
// 退出登录
logout() {
this.$post("/login/logout")
.then((data) => {})
.catch((error) => {})
.then(() => {
this.$message.success("已退出登录");
this.$store.commit("logout");
this.$router.replace("/login");
});
},
},
computed: {
currentUserName() {
const { currUserName } = this.$store.state.userData;
return currUserName;
},
group() {
const relativeGroup = this.$store.state.group;
if (relativeGroup) {
return relativeGroup;
}
let groupArray = this.$route.path.split("/");
let group = this.$route.path;
let type = groupArray.pop();
if (["add", "edit", "view", "new"].indexOf(type) > -1) {
groupArray.push("list");
group = groupArray.join("/");
}
return group;
},
relativeGroup() {
return this.$store.state.group;
},
flat() {
return this.userData.flat;
},
menu() {
if (!this.userData.barList) return [];
return this.userData.barList.map((item) => {
const url = item.url
? item.url
: item.childList[0]
? item.childList[0].url || ""
: "";
return {
name: item.name,
path: url,
id: item.id,
icon: item.imgPath,
children: item.childList.map((sub) => {
return {
name: sub.name,
path: sub.url
? sub.url
: sub.childList[0]
? sub.childList[0].url || 0
: "",
id: sub.id,
parentId: sub.parentId,
icon: sub.imgPath,
isOut: /^https?\:\/\//.test(sub.url),
};
}),
};
});
},
defaultActive() {
this.search = "";
// this.$route.path;
return this.group;
},
submenu() {
if (!this.menu.length) return {};
let matchMenu = {};
this.menu.forEach((item) => {
const menu = item;
item.children.forEach((item) => {
if (item.path === this.group) {
matchMenu = menu;
return;
}
});
});
return matchMenu;
},
userData() {
return this.$store.state.userData;
},
},
data() {
return {};
},
};
</script>
<style lang="less">
.profile {
height: 50px;
background-color: #222333;
text-align: right;
position: fixed;
right: 0;
width: calc(100% - 200px);
z-index: 999;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
&.close {
width: calc(100% - 64px);
}
.menu-switch {
cursor: pointer;
i {
font-size: 20px;
color: #999;
font-weight: normal;
}
}
}
.sidebar {
width: 200px;
height: 100%;
background-color: #222333;
position: fixed;
top: 0;
z-index: 1000;
.el-menu {
border-right: 0 none;
height: calc(100% - 50px);
overflow-y: auto;
overflow-x: hidden;
&::-webkit-scrollbar {
width: 17px;
height: 17px;
background-color: transparent;
border-radius: 9px;
}
&::-webkit-scrollbar-thumb {
background-color: #40425a;
border-radius: 9px;
background-clip: content-box;
border: 5px solid transparent;
}
i {
&.el-icon-folder {
font-size: 18px;
margin-right: 3px;
}
&.el-icon-tickets {
font-size: 16px;
margin-right: 0;
}
}
}
&.close {
width: 64px;
.logo {
img {
margin-right: 0;
}
a {
padding: 0;
}
}
}
.logo {
height: 50px;
line-height: 50px;
text-align: center;
background-color: #222333;
display: flex;
align-items: center;
justify-content: center;
.el-icon-menu {
display: none;
}
a {
margin: auto;
color: #fff;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
padding-left: 20px;
}
img {
margin-right: 5px;
}
}
}
</style>
\ No newline at end of file
// end组件
<template>
<div>
<el-form-item>
<div style="text-align:center; width: 750px;">
<el-button size="small" type="primary" style="margin-right: 50px;" @click="submitAns">确定</el-button>
<el-button size="small">取消</el-button>
</div>
</el-form-item>
</div>
</template>
<script>
export default {
name: 'limitEnd',
data() {
return {}
},
props: {
rule: {
type: Object,
required: true,
default: null
}
},
methods: {
submitAns() {
let ans = null;
let label = '';
this.$emit('submitAns', ans, label, null, null);
}
}
}
\ No newline at end of file
// level组件:
<template>
{{data}}
<div v-if="data">
<template v-for="(item, index) in data">
// 通过type不同选择不同的代码。。。不全部展示
<div v-if="item.type == 'end'" :key="item.label">
<limitEnd :rule="item" @submitAns="submitAns"></limitEnd>
</div>
<div v-if="item.type == 'select'" :key="item.label">
<el-form-item
:label="item.label ? item.label: ''"
:rules="[
{ required: true, message: '请选择', trigger: 'change' }
]">
<el-select v-model="item.ans" placeholder="请选择" @change="changeSelect(index)">
<el-option v-for="(option, option_index) in item.content" :key="option.label" :label="option.label" :value="option_index"></el-option>
</el-select>
</el-form-item>
<template v-if="item.child">
<limitLevel :rule="item.child" :moIndex="item.index" @submitAns="submitAns"></limitLevel>
</template>
</div>
</template>
</div>
</template>
<script>
import limitEnd from './LimitEnd'
export default {
name: 'limitLevel',
components: {
limitEnd
},
data() {
return {
data: null,
value_index: null,
value: null,
child: null,
}
},
props: {
rule: {
type: Array,
required: true,
default: null
},
moIndex: {
type: Number,
required: true,
default: null
},
},
created() {
this.data = deepClone(this.rule);
},
methods: {
changeSelect(index) {
this.$set(this.data[index], 'child', null);
this.$nextTick(() => {
let ans = this.data[index].ans;
let option = this.data[index].content[ans];
this.$set(this.data[index], 'child', option.children);
this.$set(this.data[index], 'index', index);
})
},
judgeAnsIsNull(item, label) {
if (!item && item != 0) {
this.$message({
type: 'error',
message: '请填写' + label
})
return false;
}
return true;
},
submitAns(data, des, all_data, mo_index) {
let ans = null;
let label = '';
if (mo_index || mo_index == 0) {
this.$set(this.data[mo_index], 'child', all_data);
}
if (data) {
ans = deepClone(data);
} else {
ans = {};
}
for(let i = 0; i < this.data.length; i++) {
// 没有答案,提醒填写
if (this.data[i].type == 'end') {
continue;
}
switch(this.data[i].type) {
case 'end':
break;
case 'select':
this.judgeAnsIsNull(this.data[i].ans, this.data[i].label);
let index = this.data[i].ans;
let option = this.data[i].content[index];
ans[this.data[i].name] = option.value;
label += ' ' + option.label;
break;
default:
break;
}
}
this.$emit('submitAns', ans, label + ' ' +des, this.data, this.moIndex);
}
}
}
\ No newline at end of file
// 地图组件
<template>
<div class="my-map">
<el-dialog title="仓库地址" :visible.sync="visible">
<el-amap
ref="map"
vid="amapDemo"
:amap-manager="amapManager"
:center="center"
:zoom="zoom"
:plugin="plugin"
:events="events"
class="amap-demo"
>
<el-amap-search-box :on-search-result="onSearchResult" :events='searchEvents'/>
<el-amap-marker :position="marker.position" :vid='1' v-if='marker.position'>
<div class='map-marker'>
<img src="../assets/images/ego_box_img_normal.png" alt="">
<p>
<el-tag type='danger'>{{mapData.address}}</el-tag>
</p>
</div>
</el-amap-marker>
</el-amap>
<div slot="footer" class="dialog-footer">
<el-button size='mini' @click="$emit('input', false)">取 消</el-button>
<el-button size='mini' type="primary" @click="choose">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { AMapManager } from 'vue-amap';
let amapManager = new AMapManager();
export default {
props: {
value: {
type: Boolean,
},
originData: {
type: Object,
default: () => {}
},
},
computed: {
visible: {
get() {
return this.value
},
set() {
this.$emit('input', false);
}
}
},
methods: {
setMarker(lng, lat, address) {
if(!lng && !lat) return;
const size = (address || '').length * 5;
this.marker = {
position: [lng, lat],
};
this.mapData = {
lng,
lat,
address,
};
},
// 处理搜索结果,定位到中心点
onSearchResult(pois) {
let latSum = 0;
let lngSum = 0;
if(!pois.length) return;
pois.forEach(poi => {
let {lng, lat} = poi;
lngSum += lng;
latSum += lat;
});
let center = {
lng: lngSum / pois.length,
lat: latSum / pois.length
};
this.setMarker(center.lng, center.lat, pois[0].name);
this.center = [center.lng, center.lat];
},
choose() {
this.$emit('input', false);
this.$emit('choose', JSON.parse(JSON.stringify(this.mapData)));
},
},
data() {
return {
searchEvents: {
init: e=>{}
},
mapData: {},
geocoder: null,
amapManager,
zoom: 12,
center: [104.007767, 30.568308],
marker: {},
events: {
init: e => {
this.geocoder = new AMap.Geocoder();
const {lng, lat, address} = this.originData;
this.setMarker(lng, lat, address);
if(lng) {
this.center = [lng, lat]
}
},
click: e => {
const {lat, lng} = e.lnglat;
this.geocoder.getAddress([lng, lat], (status, result)=>{
if (status === 'complete' && result.info === 'OK') {
const address = result.regeocode.formattedAddress;
this.setMarker(lng, lat, address);
this.center = [lng, lat];
}
});
}
},
plugin: [],
}
}
}
</script>
<style lang="less">
.my-map{
.amap-demo{
position: relative;
width: 100%;
height: 400px;
.map-marker{
position: relative;
width: 30px;
height: 30px;
img{
position: absolute;
left: 50%;
transform: translate3d(-50%,-50%,0);
}
.el-tag{
position: absolute;
color: #fff;
top: 30px;
transform: translateX(-50%);
background: #f56c6c;
}
}
.el-vue-search-box-container{
position: absolute;
top: -28px;
width: 100%;
box-shadow: 0 0 3px #ccc;
.search-tips{
width: 100%;
max-height: 300px;
}
}
}
}
</style>
// 列表-分页
<template>
<div class="pagination-wapper flex">
<el-pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page="currPage"
:page-size="currSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, total, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</template>
<script>
export default {
props: {
total: {
type: Number,
default: 0,
},
prePageResult: {
type: Number,
default: 10,
},
},
watch: {
'$route'(route) {
this.initPage(route.query);
}
},
created() {
this.initPage(this.$route.query);
},
methods: {
initPage(query) {
this.currPage = parseInt(query['pageInfo.currPage']) || 1;
this.currSize = parseInt(query['pageInfo.prePageResult']) || this.prePageResult;
},
changeHash(key, val) {
let {path, query} = this.$route;
this.$router.push({
path: path,
query: Object.assign({}, query, {[`pageInfo.${key}`]: val})
})
},
handleSizeChange(currSize) {
this.changeHash('prePageResult', currSize);
},
handleCurrentChange(currPage) {
this.changeHash('currPage', currPage);
},
},
data() {
return {
currPage: 1,
currSize: 10,
}
}
}
</script>
<style lang="less">
.pagination-wapper{
background: #fff;
margin-top: 10px;
.el-pagination{
margin-left: auto;
}
}
</style>
// 列表-条件查询
<template>
<div class="search-form-wapper">
<el-form :inline="true" :model="form" ref="search-form" size='small'>
<!-- 省市区选择器 -->
<template v-if='areaSelect.enable'>
<el-form-item label="区域">
<el-cascader
v-model="area"
clearable= 'true'
filterable
change-on-select
@change='treeSelected'
:options="treeData"
></el-cascader>
</el-form-item>
</template>
<el-form-item :label="item.label" v-for='(item, i) in search' :key='i' v-bind:class="{search_new_line: item.newLine}">
<el-input v-model="form[item.name]" v-if='item.type === "text"' :placeholder="item.placeholder ? item.placeholder : (item.fuzzy !==true ? '请输入' +item.label : '支持模糊查询' )"></el-input>
<el-checkbox-group v-model="form[item.name]" v-if='item.type === "checkbox"'>
<el-checkbox v-for='(label, value) in table.dict[item.name]' :label="value" :key='value'>{{label}}</el-checkbox>
</el-checkbox-group>
<el-select v-model="form[item.name]"
:filterable='item.filterable'
:multiple='item.multiple'
clearable= 'true'
@change= 'item.change'
@clear= 'item.clear'
v-if='item.type === "select"'>
<el-option label='全部' value='' v-if='!item.multiple && !item.notShowAll'></el-option>
<el-option :label="label" :value="value" v-for='(label, value) in table.dict[item.name]' :key='value'></el-option>
</el-select>
<el-select
v-model="form[item.name]"
clearable
:multiple='item.multiple'
filterable
remote
v-if='item.type === "remoteSelect"'
placeholder="请输入关键词"
searchType ="item.searchType"
:remote-method="(query)=>{remoteMethod(query,item.searchType)}">
<el-option :label="label" :value="value" v-for='(label, value) in remoteOptions[item.searchType]' :key='value'></el-option>
</el-select>
<el-cascader
placeholder="选择区域"
v-if='item.type === "cascader"'
v-model="selectedTreeID"
:filterable='item.filterable'
clearable= 'true'
change-on-select
@change='treeSelecteds'
:options="treeDatas"
></el-cascader>
<el-select v-model="form[item.name]"
:multiple='item.multiple'
:remote-method="userRemoteMethod"
:loading="loading"
@focus="userRemoteMethod"
:reserve-keyword="item.reserve-keyword"
:clearable='item.clearable'
:placeholder='item.placeholder? item.placeholder : "请输入用户"'
filterable
remote
v-if='item.type === "userLoginNameRemoteSelect"'>
<el-option v-for="i in userData" :key="i.loginName" :label="i.realName" :value="i.loginName"></el-option>
</el-select>
<el-date-picker
v-model="form[item.name]"
v-if='item.type === "date" && !item.valueFormat'
type="date"
value-format='yyyy-MM-dd'
placeholder="选择日期">
</el-date-picker>
<el-date-picker
v-model="form[item.name]"
v-if='item.type === "date" && item.valueFormat'
type="date"
:value-format='item.valueFormat'
placeholder="选择日期">
</el-date-picker>
<el-date-picker
v-model="form[item.name]"
v-if='item.type === "month" && !item.valueFormat'
type="month"
value-format='yyyy-MM'
placeholder="选择月份">
</el-date-picker>
<el-date-picker
v-model="form[item.name]"
v-if='item.type === "month" && item.valueFormat'
type="month"
:value-format='item.valueFormat'
placeholder="选择月份">
</el-date-picker>
<el-date-picker
v-model="form[item.name]"
v-if='item.type === "datetime"'
type="datetime"
value-format='yyyy-MM-dd HH:mm:ss'
placeholder="选择日期时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon='el-icon-search' @click="onSubmit" circle title="查询"></el-button>
<el-button icon="el-icon-download" @click='downloadFile' :loading='isDownload' v-if='downloadUrl'>下载</el-button>
<el-button icon='el-icon-refresh-left' @click="cleanForm" circle title="清空"></el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import Qs from 'qs';
import { type, download, downloadWithCustName,getUserListByQuery } from '@/assets/utils';
import { treeCache } from "@/assets/utils/tree";
import { isArray } from 'util';
export default {
props: {
search: {
type: Array,
default: ()=>[]
},
table: {
type: Object,
default: ()=>{}
},
downloadUrl: {
type: String,
default: '',
},
areaSelect: {
type: Object,
default: () => {
return {
enable: false,
level:1, // 1,仅区域
}
},
},
},
watch: {
'$route'(route) {
this.initForm(route.query);
}
},
async created() {
this.treeDatas = await treeCache.getTree();
if(this.areaSelect.enable) {
this.treeData = await treeCache.getTree();
}
let tempAreaId = this.$route.query["query.areaId"];
if(tempAreaId){
this.selectedTreeID = treeCache.getPid(Number(tempAreaId));
}
this.initForm(this.$route.query);
},
methods: {
afterRender() {
this.selectedTreeID = treeCache.getPid(this.form.areaId);
},
beforeSubmit(form) {
form.areaId = this.selectedTreeID.slice().pop();
return form;
},
treeSelecteds(val) {
this.form.areaId = val.slice().pop();
},
remoteMethod(query,searchType) {
if (query == '') {
return;
}
this.loading = true;
var param={
"query.name": query,
"query.searchType":searchType
}
try{
this.$post('/common/autoComplete/list', param).then(({data})=>{
this.loading = false;
var tempOptions={};
data.result.forEach(({ id, name }) => {
tempOptions[id] = name;
});
this.remoteOptions[searchType] = Object.assign({}, tempOptions);
sessionStorage.setItem(searchType+"OptionsDict",JSON.stringify(this.remoteOptions[searchType]));
})
}catch(error){
};  
},
async initForm(data) {
let newFormData = {};
this.form = this.encode(data,this.form);
this.search.forEach(item=>{
if (item.type === 'checkbox') {
if(this.form[item.name] == undefined){
newFormData[item.name] =[]
}else if(Array.prototype.isPrototypeOf(this.form[item.name])){
newFormData[item.name]=this.form[item.name];
}else{
newFormData[item.name] =[this.form[item.name]];
}
}else if(item.multiple===true){
if(this.form[item.name] == undefined){
this.form[item.name]=[];
newFormData[item.name] =[];
}else{
if(!isArray(this.form[item.name])){
var temp = this.form[item.name];
this.form[item.name] = [temp];
newFormData[item.name] =[temp];
}
}
}
if(item.type === 'remoteSelect'){
if(this.form[item.name] == undefined || (item.multiple===true&&this.form[item.name].length==0)){
this.remoteOptions[item.searchType]= {};
}else{
this.remoteOptions[item.searchType]= JSON.parse(sessionStorage.getItem(item.searchType+"OptionsDict"));
}
}
})
this.form = Object.assign({}, this.form, newFormData);
//this.form = Object.assign({}, this.form, this.encode(data));
// 区域选择器
if(this.areaSelect.enable){
this.form.areaId = this.form.areaId ? this.form.areaId : 510100;
this.area = treeCache.getPid(this.form.areaId).map(Number);
this.treeSelected(this.area, 'man');
}
},
cleanForm() {
this.clean();
this.onSubmit();
},
// 清空表单值
clean() {
let newData = {};
this.search.forEach(item=>{
if (item.name === 'groupList') {
newData[item.name] = [];
} else {
newData[item.name] = item.multiple ? [] : undefined;
}
})
if(this.areaSelect.enable) {
newData.areaId = '';
this.area = [510000, 510100];
}
this.form = Object.assign({}, this.form, newData);
this.selectedTreeID = [];
},
onSubmit() {
let {path, query} = this.$route;
let data = this.decode(this.form);
this.$router.push({
path: path,
query: Object.assign({}, query, data)
})
},
// 解析url字符串,去除query字段
encode(data,formTemp) {
let newData = {};
Object.keys(Qs.parse(data)).forEach(item=>{
if(/^query\./.test(item)){
let val = data[item];
let key = item.replace(/^query\./,'');
this.search.forEach(obj=>{
if(obj.name === key && obj.fuzzy === true && val && val.length > 0){ //支持模糊查询,首尾去掉百分号
val = val.substring(1, val.length-1);
}
});
let isAreaTemp = ['areaId'];
let isAreaParam = isAreaTemp.includes(key);
newData[key] = type(val) === 'Array' ? val.map(isAreaParam ? Number : String) : val;
}
})
return newData;
},
decodeVal(val) {
let valType = type(val);
if(['Number', 'Boolean'].indexOf(valType) >-1 ) {
return val;
}
if(valType == 'Undefined' || valType == 'Null') {
return undefined;
}
if(valType == 'String') {
let str = val.trim();
return str.length ? str : undefined;
}
return val
},
// 解析url字符串,加入query字段
decode(data) {
let newData = {'pageInfo.currPage': 1};
Object.keys(data).forEach(item=>{
let val = data[item];
this.search.forEach(obj=>{
if(obj.name === item && obj.fuzzy === true && val && val.length > 0){ //支持模糊查询,收尾增加百分号
val = val.trim();
val = '%' + val +'%';
}
});
newData['query.' + item] = this.decodeVal(val);
})
return newData;
},
// 下载文件
async downloadFile() {
let data = this.decode(this.form);
let searchString = Object.assign({}, this.$route.query, data);
this.isDownload = true;
try {
// await download(this.downloadUrl, searchString )
await downloadWithCustName(this.downloadUrl, searchString )
} catch (error) {
this.$message.error(error);
}
this.isDownload = false;
},
// 区域选择
async treeSelected(val, type) {
let areas = [];
const [province, city, area] = val;
if(!type) {
this.form.areaId = val.slice().pop();
}
// 查找省市关联的区域
switch (val.length) {
case 1:
areas = await treeCache.getAreasByProvinceId([province]);
break;
case 2:
areas = await treeCache.getAreasByCityId([city]);
break;
case 3:
areas = [val[2]];
break;
default:
break;
}
},
//用户远程搜索
async userRemoteMethod(name){
if(name !== ''){
this.loading = true;
const userQuery = {'pageInfo.prePageResult': 50, 'query.realName': name};
this.userData = await getUserListByQuery(userQuery);
this.loading = false;
}else{
this.userData = [];
}
},
listChange() {
}
},
computed: {
},
data() {
return {
form: {
groupList:[],
},
remoteOptions:{
},
treeData: [],
userData:[],
area: [],
isDownload: false,
treeDatas: [],
selectedTreeID: []
}
}
}
</script>
<style lang="less">
.search_new_line {
width: 100%;
}
.search-form-wapper{
.el-input{
width: 170px;
}
.el-select .el-input{
width: 140px;
}
}
@media screen and (max-width: 800px){
.search-form-wapper{
.el-form-item{
width: 100%;
.el-form-item__label{
min-width: 70px;
}
.el-input{
width: 200px;
}
.el-select .el-input{
width: 200px;
}
}
}
}
</style>
<template>
<span>
<!-- 开启confirm时,操作之前会先调动确认窗口 -->
<el-popover
v-if='confirm'
placement="top"
width="160"
v-model="visible">
<p>确认操作?</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="statusClick">确定</el-button>
</div>
<label slot="reference" class="my-compontent-switch"
:checked='checked'>
<span>{{text}}</span>
</label>
</el-popover>
<!-- 直接操作 -->
<label
v-else
class="my-compontent-switch"
:checked='checked'
@click='statusClick'
>
<span>{{text}}</span>
</label>
</span>
</template>
<script>
export default {
props: {
value: Array,
row: Object,
confirm: Boolean,
on: {
type: Object,
default: ()=> {return {value: 1, text: ''}}
},
off: {
type: Object,
default: ()=> {return {value: 0, text: ''}}
},
url: String,
},
methods: {
async statusClick() {
const status = this.row.status === this.on.value ? this.off.value : this.on.value;
const id = this.row.id;
const getTokenUrl = this.url.replace('/save', '/edit');
await this.$post(getTokenUrl, {id});
this.$post(this.url, {
entity: {
status,
id,
}
})
.then(res=>{
// 更新数据
let table = JSON.parse(JSON.stringify(this.value))
let {index, data} = this.find(table, id);
data.status = status;
table.splice(index, 1, data);
this.$emit("input", table);
this.$emit("change");
})
.catch(error=>{
this.$message.error(error.message);
})
.then(data=>{
this.visible = false;
})
},
find(list, id) {
let index = -1;
let data = null;
list.forEach((item, i)=>{
if(item.id === id){
index = i;
data = Object.assign({}, item);
return;
}
})
return {
index,
data,
}
},
},
computed: {
text() {
return this.row.status === this.on.value ? this.on.text : this.off.text;
},
checked() {
return this.row.status === this.on.value;
},
},
data() {
return {
visible: false,
}
}
}
</script>
<style lang="less">
.my-compontent-switch{
display: inline-flex;
align-items: center;
position: relative;
font-size: 12px;
line-height: 19px;
height: 20px;
vertical-align: middle;
&[checked] span{
border-color: #409eff;
background-color: #409eff;
padding:0 23px 0 10px;
&::after{
left: 100%;
margin-left: -17px;
}
}
span{
margin: 0;
display: inline-block;
position: relative;
height: 20px;
border: 1px solid #dcdfe6;
outline: none;
color: #fff;
padding:0 10px 0 23px;
border-radius: 10px;
box-sizing: border-box;
background: #dcdfe6;
cursor: pointer;
transition: border-color .3s,background-color .3s;
vertical-align: middle;
&::after{
content: "";
position: absolute;
top: 1px;
left: 1px;
border-radius: 100%;
transition: all .3s;
width: 16px;
height: 16px;
background-color: #fff;
}
}
}
</style>
// 管理后台通用表格,含:搜索,分页,表格
<template>
<div class="layout-table" :loading='data.loading'>
<div class="table-head flex flex-pack-justify">
<div class="table-head-left flex flex-align-center">
<slot name='breadcrumb'>
<Breadcrumb />
</slot>
<div class="buttons">
<slot name='table-head-left'></slot>
<el-button v-if='isShowButton("notAdd")' type='primary' icon="el-icon-plus" size='mini' @click='config.methods.add' circle title="新增"></el-button>
<el-button v-if='isShowBtn("import")' size='mini' @click='config.methods.importView' class="el-icon-upload2" circle title="导入"></el-button>
<Confirm v-if='isShowButton("notDel")' @confirm='config.methods.del' message='确定要删除选中的多条记录吗?'>
<el-button icon="el-icon-delete" type="danger" size='mini' circle title="删除"></el-button>
</Confirm>
<el-button @click='item.method' size='mini' :key="item.label" :icon='item.icon' :type ='item.type' :loading="item.loading" v-if="item.isShow" v-for='(item) in config.buttons' circle :title="item.label"></el-button>
<el-button v-if='isShowBtn("back")' @click='config.methods.back' size='mini' icon='el-icon-back' circle title="返回"></el-button>
<slot name='table-head-left2'></slot>
</div>
</div>
<div class="table-head-right">
<div class="extend flex flex-pack-justify">
<slot name='table-head-right'></slot>
<div>
<el-tooltip content="查询" placement="top" v-if='isShowButton("notSearch")'>
<el-button icon="el-icon-search" circle size='mini' @click='showSearch = !showSearch'></el-button>
</el-tooltip>
<el-tooltip content="刷新" placement="top" v-if='isShowButton("notFresh")'>
<el-button icon="el-icon-refresh" circle size='mini' @click='config.methods.refresh'></el-button>
</el-tooltip>
</div>
<el-radio-group v-model="showType" size='mini' v-if='isMobile'>
<el-radio-button label="card"><i class="el-icon-menu"></i></el-radio-button>
<el-radio-button label="table"><i class="el-icon-tickets"></i></el-radio-button>
</el-radio-group>
</div>
</div>
</div>
<!-- 表格查询条件-->
<div class="table-form" v-if='!isShowButton("notSearch") ? false : showSearch'>
<SearchForm :search='config.search' :table='data'
:downloadUrl='config.downloadUrl'
:areaSelect='config.areaSelect'
/>
</div>
<!-- 表格主体 -->
<div class="table-body">
<slot name='table-body-head'></slot>
<slot>
<DataTableMobile
v-if='showType == "card"'
:tableData='data.result'
:columns='config.columns'
:tableRowClassName='config.methods.tableRowClassName'
:handleSelectionChange='config.methods.handleSelectionChange'
:handleRowClick='config.methods.handleRowClick'/>
<DataTable
v-if='showType == "table"'
:tableData='data.result'
:columns='config.columns'
:loading='data.loading'
:tableRowClassName='config.methods.tableRowClassName'
:handleSpanMethod='config.methods.handleSpanMethod'
:handleSortChange='config.methods.handleSortChange'
:handleSelectionChange='config.methods.handleSelectionChange'
:handleRowClick='config.methods.handleRowClick'/>
</slot>
</div>
<!-- 分页器 -->
<div class="table-foot" v-if='!isShowButton("notPagination") ? false : data.pageInfo.totalResult'>
<Pagination :total='data.pageInfo.totalResult' :prePageResult='data.pageInfo.prePageResult'/>
</div>
</div>
</template>
<script>
import Pagination from '@/components/Pagination.vue';
import SearchForm from '@/components/SearchForm.vue';
import Confirm from '@/components/Confirm.vue';
import DataTable from '@/components/DataTable.vue';
import DataTableMobile from './DataTableMobile.js';
export default {
props: {
data: {
type: Object,
required: true,
default: () => {}
},
config: {
type: Object,
required: true,
default: () => {}
},
},
components: {
SearchForm,
Pagination,
Confirm,
DataTable,
DataTableMobile,
},
methods: {
// 根据url的query参数判断是否展示查询条件
isShowSearch(query) {
let showSearch = false;
Object.keys(query).forEach(item=>{
if(/^query\./.test(item)){
showSearch = true;
return;
}
});
if (this.config.showSearch) {
showSearch = true;
}
return showSearch;
},
isShowButton(name) {
return this.canShow.indexOf(name) === -1;
},
isShowBtn(name) {
return this.canShow.indexOf(name) !== -1;
},
},
watch: {
'$route'(route) {
this.showSearch = this.isShowSearch(route.query)
},
},
computed: {
isMobile() {
return this.$store.state.isMobile
},
canShow() {
return Object.keys(this.$attrs) || [];
}
},
data() {
return {
loading: this.config.loading,
showSearch: this.isShowSearch(this.$route.query),
showType: 'table',
}
}
}
</script>
<style lang="less">
@media screen and (max-width: 800px){
.layout-table{
.table-head{
display: block;
width: 100%;
.el-button{
margin-bottom: 5px;
}
.table-head-left{
margin-bottom: 10px;
display: block;
width: 100%;
}
.el-breadcrumb{
margin-bottom: 10px;
display: block;
width: 100%;
}
}
}
}
.layout-table{
.table-head{
margin-bottom: 10px;
padding-bottom: 12px;
border-bottom: 1px solid #ededed;
.el-breadcrumb{
margin-right: 30px;
}
.table-head-left .buttons{
button + button{ margin-left: 10px}
button + span{ margin-left: 10px}
span + span{ margin-left: 10px}
span + button{ margin-left: 10px}
}
}
.table-form{
padding-top: 10px;
margin-top: 10px;
}
.table-foot{
width: 100%;
overflow: auto;
}
&[loading]{
pointer-events: none;
.my-compontent-switch span,
.el-button,
.el-input,
.el-tag,
input{
background: #eee;
color: transparent;
border-color: #eee;
}
input{color: #ccc}
td, th{
color: #eee;
}
.el-pagination{
color: #eee;
span, input, button, li{
color: #eee;
}
}
}
}
</style>
\ No newline at end of file
//新增编辑主题包
<template>
</template>
<script>
export default {
methods: {
},
watch: {
},
data() {
return {
}
},
props: {
title: { // 方向
type: String,
default: '添加主题',
},
},
}
</script>
// 单文件上传及展示
<template>
<div class="my-upload">
<label>
<el-button icon='el-icon-upload' size='mini' :loading='loading'>{{loading ? '上传中...' : tip}}</el-button>
<input type="file" @change='chooseFile' :disabled="loading" ref="referenceUpload">
</label>
<div v-if='value' class='flex'>
<div style="margin-right: 20px">
<div v-if='type === "thumb"' class='thumb' :style="imgCover"></div>
<div v-else>文件名: {{value}}</div>
</div>
<!-- <div>
<el-button icon="el-icon-delete" size='mini' plain @click='del'>删除</el-button>
</div>-->
</div>
</div>
</template>
<script>
export default {
props: {
value: {
type: String,
default: '',
},
type: { // 展示类型,文件名或缩略图 filename | thumb
type: String,
default: 'filename',
},
tip: { // 按钮文字
type: String,
default: '上传文件',
},
prePath: {
type: String,
default: '',
}
},
methods: {
del() {
this.$emit("input", "")
},
async chooseFile(e) {
this.loading = true;
console.log(e);
try {
const {code, url} = await this.$upload('file/upload', {
uploadFile: e.target.files[0],
prePath: this.prePath
});
if(code === 1) {
this.$emit('input', url)
}else{
this.$message.error('上传文件失败');
}
} catch (error) {
this.$message.error(error.message);
}
this.loading = false;
this.$refs.referenceUpload.value = null;
},
},
computed: {
imgCover() {
return `background-image: url(${this.value})`;
}
},
data() {
return {
loading: false,
}
}
}
</script>
<style lang="less">
.my-upload{
label{
position: relative;
input{
display: block;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
opacity: 0;
}
}
.thumb{
width: 80px;
height: 80px;
background-size: contain;
background-position: center center;
background-repeat: no-repeat;
border: 1px solid #ccc;
border-radius: 5px;
overflow: hidden;
}
p{
color: #666;
font-size: 14px;
}
}
</style>
<template>
<div id="dropMenu"
:style="style"
style="display: block;"
v-show="show"
@mousedown.stop
@contextmenu.prevent><!--阻止冒泡事件 阻止右键的默认事件-->
<slot></slot>
</div>
</template>
<script>
export default {
data() {
return {
triggerShowFn: () => {},
triggerHideFn: () => {},
x: null,
y: null,
style: {},
binded: false
}
},
props: {
target: null,
show: Boolean
},
mounted() {
this.bindEvents()
},
watch: {
show(show) {
if (show) {
this.bindHideEvents()
} else {
this.unbindHideEvents()
}
},
target(target) {
this.bindEvents()
}
},
methods: {
// 初始化事件
bindEvents() {
this.$nextTick(() => {
var that = this
if (!this.target || this.binded) return
console.log(this);
this.triggerShowFn = this.contextMenuHandler.bind(this)
this.target.addEventListener('contextmenu', this.triggerShowFn)
//this.binded = true
})
},
// 取消绑定事件
unbindEvents() {
if (!this.target) return
this.target.removeEventListener('contextmenu', this.triggerShowFn)
},
// 绑定隐藏菜单事件
bindHideEvents() {
this.triggerHideFn = this.clickDocumentHandler.bind(this)
document.addEventListener('mousedown', this.triggerHideFn)
document.addEventListener('mousewheel', this.triggerHideFn)
},
// 取消绑定隐藏菜单事件
unbindHideEvents() {
document.removeEventListener('mousedown', this.triggerHideFn)
document.removeEventListener('mousewheel', this.triggerHideFn)
},
// 鼠标按压事件处理器
clickDocumentHandler(e) {
this.$emit('update:show', false) //隐藏
},
// 右键事件事件处理
contextMenuHandler(e) {
e.target.click()//这个是因为我需要获取tree节点的数据,所以我通过点击事件去获取数据
this.x = e.clientX
this.y = e.clientY - 110
this.layout()
this.$emit('update:show', true) //显示
e.preventDefault()
e.stopPropagation()
this.$emit('targetElement', e.target) //我还要获取右键的DOM元素进行操作
},
// 布局
layout() {
this.style = {
left: this.x + 'px',
top: this.y + 'px'
}
}
}
}
</script>
<style lang="scss">
#dropMenu {
position: absolute;
margin: 0;
padding: 0;
width: 120px;
height: auto;
border: 1px solid #ccc;
border-radius: 4px;
ul {
list-style: none;
margin: 0;
padding: 0;
li {
width: 100%;
text-align: center;
height: 30px;
line-height: 30px;
background: #fff;
margin-bottom: 1px;
font-size:16px;
cursor: pointer;
li:hover {
color: deeppink;
text-decoration: underline;
}
}
}
}
</style>
\ No newline at end of file
// 表单通用的保存和取消按钮,可以通过默认slot方式替换
<template>
<el-form-item>
<slot name="prepend"></slot>
<slot>
<el-button v-if="!noSaveBtn" type="primary" @click='$emit("submit")' size='small' icon='el-icon-circle-check-outline'>保存</el-button>
<el-button v-if="!noCancelBtn" @click="$router.go(-1)" size='small' icon='el-icon-circle-close-outline'>取消</el-button>
</slot>
<slot name="append"></slot>
</el-form-item>
</template>
<script>
export default {
props: {
noSaveBtn: {
type: Boolean,
default: false,
},
noCancelBtn: {
type: Boolean,
default: false,
},
},
methods: {},
data() {
return {};
},
};
</script>
<template>
<span>
<el-button v-if='!noEdit' type="primary" icon="el-icon-edit" round size='mini' @click='$emit("edit", row)' circle title="编辑"></el-button>
<span>&nbsp;</span>
<el-button v-if='!noView' type="info" icon="el-icon-view" round size='mini' @click='$emit("view", row)' circle title="查看"></el-button>
<span>&nbsp;</span>
<Confirm @confirm='$emit("del", row.id)' message='确定要删除该条记录吗?'>
<el-button v-if='!noDel' type="danger" icon="el-icon-delete" size='mini' circle title="删除"></el-button>
</Confirm>
</span>
</template>
<script>
import Confirm from '@/components/Confirm.vue';
export default {
props: {
noEdit: {
type: Boolean,
default: false
},
noDel: {
type: Boolean,
default: false
},
noView: {
type: Boolean,
default: false
},
row: {
type: Object,
required: true,
default: () => {}
},
},
components: {
Confirm,
},
methods: {
},
data() {
return {
}
}
}
</script>
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import './assets/less/base.less'
import './assets/less/org-tree.less'
import App from './App.vue'
import router from './router'
import store from './store'
import Prototype from './assets/utils/prototype'
import Filter from './assets/utils/filter.js'
import GlobalComponents from './assets/utils/globalComponents.js'
import MuseUI from 'muse-ui';
import 'muse-ui/dist/muse-ui.css';
Vue.config.productionTip = false
Vue.use(ElementUI);
Vue.use(MuseUI);
Vue.use(Prototype);
Vue.use(Filter);
Vue.use(GlobalComponents); // 全局组件
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
import Vue from 'vue'
import Router from 'vue-router'
import Store from './store'
import fileNotFound from './views/errors/fileNotFound.vue'
Vue.use(Router);
const router = new Router({
routes: [
builder('/authentication', 'login/authentication'),
builder('/login', 'login/login'),
builder('/go', 'codeGen/index'),
builder('/index', 'home/index'),
builder('/question', 'home/question'),
]
})
/**
* rest路由生成器
*
* @param {string} path 路径
* @param {string} [component=path] 文件地址
* @returns {array} [] reset路由数组,包含list/edit/add/view
*/
function restBuilder(path, component = path) {
let arr = [];
arr.push(builder(`${path}/list`, `${component}/list`));
arr.push(builder(`${path}/edit`, `${component}/show`));
arr.push(builder(`${path}/add`, `${component}/show`));
arr.push(builder(`${path}/view`, `${component}/show`));
return arr;
}
/**
* 路由生成器
*
* @param {string} path 路径
* @param {string} [component=path] 文件地址
* @param {boolean} [requiresAuth=false] 是否登录后才能访问
* @returns {any} {} 路由对象
*/
function builder(path, component = path, requiresAuth = false) {
return {
path: path,
name: path || 'homepage',
component: getComponent(component),
meta: {
requiresAuth: requiresAuth
}
}
}
function getComponent(fileName) {
try {
return require('./views/' + fileName).default
} catch (error) {
return fileNotFound;
}
}
//检查是否跳转到sso地址
function ssoCheck (to, from, next) {
let redirect = (to.path === '/login/updatePwd') ? '/#/updatePwd' : ''
redirect = (redirect === '' && to.path === '/login') ? (location.protocol + '//' + location.host + '/#' + from.fullPath) : redirect
if (redirect != '') {
next(false)
window.location.href = '//' + location.host + '/m/login/logout?redirect=' + encodeURIComponent(redirect)
return true;
}
return false;
}
router.afterEach(() => {
document.body.scrollTop = 0
document.documentElement.scrollTop = 0
})
// 路由鉴权
router.beforeEach((to, from, next) => {
// if (ssoCheck(to, from, next)) { //sso鉴权检查
// return
// }
if (to.matched.some(record => record.meta.requiresAuth)) {
if (Store.state.isLogin) {
next();
} else {
next({
path: '/authentication',
query: {
redirect: to.fullPath
}
})
}
} else {
next();
}
})
export default router;
\ No newline at end of file
import Vue from 'vue'
import Vuex from 'vuex'
import { normalCallPost } from './assets/utils';
Vue.use(Vuex)
let userData = {};
try {
userData = JSON.parse(window.sessionStorage.userData || '{}');
} catch (error) {
console.log('未从session中获取到userData')
}
function convertTreeToList(root, array) {
if(!root || !root.length) return array;
root.forEach(item=>{
let data = JSON.parse(JSON.stringify(item));
const url = data.url ? data.url : (item.childList[0] ? (item.childList[0].url || '') : '');
delete data.childList;
array.push({
name: data.name,
path: data.url,
id: data.id,
parentId: data.parentId,
icon: data.imgPath,
});
if(item.childList){
convertTreeToList(item.childList, array);
}
})
return array;
}
function isPc() {
var userAgentInfo = navigator.userAgent;
var Agents = new Array("Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod");
var flag = true;
for (var v = 0; v < Agents.length; v++) {
if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; }
}
return flag;
}
export default new Vuex.Store({
state: {
isLogin: false,
isMobile: !isPc(),
userData,
group: '',
},
mutations: {
setUserData(state, data) {
data.flat = convertTreeToList(data.barList, []);
state.userData = Object.assign({}, state.userData, data);
state.isLogin = true;
window.sessionStorage.userData = JSON.stringify(data);
},
logout(state) {
state.userData = {};
state.isLogin = false;
window.sessionStorage.userData = '';
},
setGroup(state, data) {
state.group = data;
},
},
actions: {
login({commit}) {
normalCallPost('/login/index').then(({data})=>{
commit('setUserData', data)
}).catch(error=>{
})
},
logout({commit}) {
normalCallPost('/login/logout').then(data=>{}).catch(error=>{}).then(()=>{
commit('logout')
})
},
}
})
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' />
</div>
</template>
<script>
import table from '@/assets/mixins/table';
export default {
mixins: [table],
data() {
return {
config: {
search: [
{
name: 'name',
type: 'text',
label: '名称',
},
],
columns: [
{
type: 'selection',
width: 60,
},
{
prop: 'id',
label: 'ID',
width: 60,
},
{
prop: 'name',
label: '名称',
},
{
label: '操作',
formatter: (row)=> {
return (
<table-buttons row={row} onEdit={this.toEdit} onDel={this.toDel} />
)
},
},
],
},
}
}
}
</script>
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='100px'
ref="form"
>
<el-row>
<Field label="名称" prop="name" v-model="form.name"/>
<Field label="权限类型" prop="authType" v-model="form.authType" :enumData='dict.authType' type='select' />
<Field label="状态" prop="status" v-model="form.status" :enumData='dict.status' type='select' />
</el-row>
<form-buttons @submit='submitForm'/>
</el-form>
</layout-form>
</template>
<script>
import form from '@/assets/mixins/form';
export default {
mixins: [form],
data() {
return {
toString: ['status'],
rules: {
name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
],
},
}
}
}
</script>
<template>
<div class="page page-home" style="min-height: 100vh;">
欢迎你,{{userData}}
</div>
</template>
<script>
export default {
computed: {
userData() {
return this.$store.state.userData.currUserName;
},
},
};
</script>
\ No newline at end of file
<template>
<div :style="menuPageCss" class="pages page-layout">
<LayoutHeader v-if="menuPage!=='left'"></LayoutHeader>
<LayoutHeaderLeft @toggle="toggle" :isOpen="isOpen" v-if="menuPage==='left'" />
<router-view :class="{'active': !isOpen}" />
</div>
</template>
<script>
import LayoutHeader from "../components/Header";
import LayoutHeaderLeft from "../components/HeaderLeft";
const isPC = /(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent);
//菜单位置:取值: left :菜单在左面, top :菜单在上面
const MenuPage = "top";
export default {
components: {
LayoutHeader,
LayoutHeaderLeft,
},
data() {
return {
isOpen: isPC,
menuPage: MenuPage,
};
},
computed: {
menuPageCss() {
//左面和顶面菜单切换时,动态计划相关css参数
return {
"--padding-top": this.menuPage === "left" ? "60px" : "10px",
"--margin-left": this.menuPage === "left" ? "200px" : "0px",
};
},
},
methods: {
toggle() {
this.isOpen = !this.isOpen;
},
},
};
</script>
<style lang="less">
.page {
position: relative;
background: #fff;
padding: var(--padding-top) 5px 5px 5px;
margin-left: 60px;
&.active {
margin-left: var(--margin-left);
}
}
.page-layout {
background: #eee;
}
</style>
// 通过解析后的文本生成form表单页面
export default function f(list) {
return `
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='100px'
ref="form"
>
<el-row>
${fields(list)}
</el-row>
<form-buttons @submit='submitForm'/>
</el-form>
</layout-form>
</template>
<script>
import form from '@/assets/mixins/form';
export default {
mixins: [form],
data() {
return {
${toString(list)},
${rules(list)},
}
}
}
</script>
`
}
// 生成fields
function fields(list) {
return list.map(field).join('\n')
}
function field({name, label, type, size}) {
if(type === 'tinyint'){ // 枚举类型
return `<Field label="${label}" prop="${name}" v-model="form.${name}" :enumData='dict.${name}' type='select' :disabled="pageInfo.type === 'view'"/>`
}
if(size > 100 && size < 500) { // 长单行文本框
return `<Field label="${label}" prop="${name}" v-model="form.${name}" :span='24' :disabled="pageInfo.type === 'view'"/>`
}
if(size > 500) { // 多行文本框
return `<Field label="${label}" prop="${name}" v-model="form.${name}" type='textarea' :span='24' :disabled="pageInfo.type === 'view'"/>`
}
// 默认为单行文本框
return `<Field label="${label}" prop="${name}" v-model="form.${name}" :disabled="pageInfo.type === 'view'"/>`
}
// 生成rules
function rules(list) {
const rules = list.filter(item=>item.required).map(item=>{
const {name, type, label} = item;
const message = `请${type === "tinyint" ? "选择" : "输入"}${label}`;
return `${name}: [{ required: true, message: '${message}', trigger: 'blur' },]`
}).join(',\n');
return `rules: {${rules}}`
}
// 对枚举类型字段生成toString
function toString(list) {
const strings = list.filter(item=>item.type === 'tinyint').map(item=>{
return `"${item.name}"`
}).join(',');
return `toString: [${strings}]`
}
<template>
<div class='page flex flex-1 page-go'>
<div class="flex flex-1">
<div>
<textarea v-model='text' @change='build'></textarea>
</div>
<div>
<textarea :value='table'></textarea>
</div>
<div>
<textarea :value='form'></textarea>
</div>
</div>
</div>
</template>
<script>
import parser from './parser';
import form from './form';
import table from './table';
export default {
methods: {
build() {
const data = parser(this.text);
this.form = form(data)
this.table = table(data)
},
},
data() {
return {
text: '',
form: '',
table: '',
}
}
}
</script>
<style lang="less">
.page-go{
.flex>div{
width: 33.33%;
height: 100%;
overflow: auto;
}
textarea{
display: block;
height: 100%;
width: 100%;
border: 1px solid #ccc;
}
}
</style>
// 解析文本内容
export default function parser(string) {
try {
return string.split('\n').map(item=>{ // 多行分割为单行文本
let [name, label, originType, required] = item.split(/\s+/); // 按照空格切分单行文本,分别对应
let [type, size] = originType.split('('); // 从type中获取类型和限制长度
size = parseInt(size, 10);
required = required === '' || false;
return {name, label, type, size, required}
});
} catch (error) {
console.error(error)
return [];
}
}
\ No newline at end of file
// 通过解析后的文本生成form表单页面
export default function f(list) {
return `
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' />
</div>
</template>
<script>
import table from '@/assets/mixins/table';
export default {
mixins: [table],
data() {
return {
config: {
search: [
{
name: 'name',
type: 'text',
label: '名称',
},
],
columns: [
{
type: 'selection',
width: 60,
},
${columns(list)}
{
label: '操作',
width: 180,
formatter: (row)=> {
return (
<table-buttons row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
)
},
},
],
},
}
}
}
</script>
`
}
// 生成fields
function columns(list) {
return list.map(column).join('\n')
}
function column({name, label, type, size}) {
if(type === 'tinyint') { // 枚举类型
return `
{
prop: '${name}',
label: '${label}',
width: 70,
formatter: this.formatter
},
`
}
if(type === 'datetime') { // 时间戳类型
return `
{
prop: '${name}',
label: '${label}',
width: 140,
formatter: this.formatterDate
},
`
}
return `
{
prop: '${name}',
label: '${label}',
},
`
}
<template>
<div class="page page-not-login">
<h1>没有访问权限,或是账号过期。</h1>
<div>
<el-button>重新登录</el-button>
<el-button @click='goHome'>回首页</el-button>
</div>
</div>
</template>
<script>
export default {
methods: {
goHome() {
this.$router.replace('/')
}
},
}
</script>
<style lang="less">
.page-not-login{
h1{
font-size: 20px;
margin-bottom: 30px;
}
}
</style>
<template>
<div class="page page-notfound">
404-(页面不存在,或功能规划中)
</div>
</template>
\ No newline at end of file
<template>
<div class="page page-notfound">
该文件不存在或解析错误:/pages/{{$route.fullPath}}.vue
</div>
</template>
\ No newline at end of file
<template>
<mu-container class="demo-container is-stripe">
<mu-appbar style="width: 100%" color="primary">
<mu-button icon slot="left">
<mu-icon value="menu"></mu-icon>
</mu-button>
一件事一次办
<!-- <mu-button flat slot="right">LOGIN</mu-button> -->
</mu-appbar>
<mu-list toggle-nested>
<mu-list-item
v-for="item in topiclist"
button
:key="item.id"
:ripple="false"
nested
:open="open === true"
@toggle-nested="open = true"
>
<mu-list-item-action>
<mu-icon value="drafts"></mu-icon>
</mu-list-item-action>
<mu-list-item-title>{{ item.name }}</mu-list-item-title>
<mu-list-item-action v-if="item.children">
<mu-icon
class="toggle-icon"
size="24"
value="keyboard_arrow_down"
></mu-icon>
</mu-list-item-action>
<mu-list-item
v-for="pack in item.children"
:key="pack.id"
button
@click="handlePack(pack)"
slot="nested"
>
<mu-list-item-title>{{ pack.name }}</mu-list-item-title>
</mu-list-item>
</mu-list-item>
</mu-list>
<!-- 底部导航栏 -->
<div id="nav">
<mu-divider></mu-divider>
<mu-bottom-nav>
<mu-bottom-nav-item title="个人服务" icon="person"></mu-bottom-nav-item>
<mu-bottom-nav-item title="企业服务" icon="group"></mu-bottom-nav-item>
<mu-bottom-nav-item
title="我的办理"
icon="location_on"
></mu-bottom-nav-item> </mu-bottom-nav
>'
</div>
</mu-container>
</template>
<script>
import LimitIndex from "@/components/LimitIndex.vue";
export default {
components: {
LimitIndex,
},
created() {
this.$post("/zwfw/proced/thing/oneTopiclist", {
type: "1",
})
.then((res) => {
if (res && res.code && res.code == 1) {
console.log(res);
res.data.map((item) => this.topiclist.push(item));
}
})
.catch((error) => {
this.$message.error(error.message);
});
},
methods: {
handlePack(data) {
console.log("主题包点击", data);
this.$router.push("/question")
},
build() {
const data = parser(this.text);
this.form = form(data);
this.table = table(data);
},
},
data() {
return {
topiclist: [],
text: "",
form: "",
table: "",
};
},
};
</script>
<style lang="less">
// 固定底部导航栏位置
#nav {
position: fixed;
width: 100%;
left: 0;
bottom: 0;
}
</style>
\ No newline at end of file
<template>
<mu-container class="demo-container is-stripe">
<el-form :label-width="'150px'" label-position="right">
<template v-for="(item, index) in rule">
<el-form-item
:key="index"
:label="item.label ? item.label : ''"
style="width: 100%"
>
<el-select v-model="item.ans" placeholder="请选择">
<el-option
v-for="(option, option_index) in item.content"
:key="option.label"
:label="option.label"
:value="option_index"
></el-option>
</el-select>
</el-form-item>
</template>
<el-form-item>
<div style="text-align: center; width: 500px">
<el-button
size="small"
type="primary"
style="margin-right: 50px"
@click="submitAns"
>确定</el-button
>
<el-button size="small">取消</el-button>
</div>
</el-form-item>
</el-form>
</mu-container>
</template>
<script>
let self = null;
export default {
components: {},
created() {
self = this;
},
methods: {
submitAns() {
console.log(this.rule)
let ans = {};
for (let i = 0; i < this.rule.length; i++) {
let item = this.rule[i];
if ((!item.fa && item.fa != 0) || this.rule[item.fa].ans == item.faV) {
if (!item.ans && item.ans != 0) {
this.$message({
type: "warning",
message: "请检查您的" + item.label + "是否填写",
});
return false;
}
ans[item.name] = item.ans;
}
}
console.log(ans);
},
},
data() {
return {
rule: [
{
type: "select",
name: "w1",
label: "问题1",
ans: null,
fa: null,
content: [
{
value: "w11",
label: "问题1-答案1",
},
{
value: "w12",
label: "问题1-答案2",
},
],
},
{
type: "select",
name: "w2",
label: "问题2",
ans: null,
fa: 0,
faV: 0,
content: [
{
value: "w21",
label: "问题2-答案1",
},
{
value: "w22",
label: "问题2-答案2",
},
],
},
],
text: "11",
form: "22",
table: "",
};
},
};
</script>
<style lang="less">
</style>
\ No newline at end of file
<template>
<div class="page-authentication">
<!-- 自动登录页面 -->
</div>
</template>
<script>
export default {
name: 'authentication',
created () {
this.login();
},
methods: {
login() {
this.$post('/login/index').then(this.loginSuccess).catch(this.loginFail)
},
loginSuccess({data}) {
this.$store.commit('setUserData', data);
this.$router.replace({
path: this.redirect,
});
},
loginFail(error) {
this.$message.error(error.message || '请登录');
this.$router.replace({
path: '/login',
query: {
redirect: this.redirect,
}
});
}
},
computed: {
isLogin() {
return this.$store.state.isLogin
}
},
data() {
return {
redirect: this.$route.query.redirect,
loading: true,
}
}
}
</script>
<!-- 登录页面 -->
<template>
<div class="page page-login flex flex-v">
<div class="form-wrap flex flex-1">
<el-form @submit.prevent='onSubmit' ref="form" :model="form" label-width="80px" size="small">
<h1>工作流管理平台</h1>
<el-form-item label="用户名">
<el-input v-model="form.loginName"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type='password'></el-input>
</el-form-item>
<el-form-item label="验证码">
<el-input v-model="form.securityCode">
<img slot="append" width='60' height="30" :src='securityCodeUrl' @click='refreshCode'/>
</el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" native-type='submit' :loading='loading' @click='onSubmit'>登录</el-button>
</el-form-item>
</el-form>
</div>
<div class="footer">
登陆 &copy; <a href="">信宏翔网络科技有限公司</a> 出品
</div>
</div>
</template>
<script>
import { createSocket } from '@/assets/utils/websocket'
const securityCodeUrl = '/m/securitycode/createCode?v=';
export default {
name: 'login',
created() {},
methods: {
login() {
this.loading = true;
this.$post('/login/login', this.form).then(this.loginSuccess).catch(this.loginFail)
},
loginSuccess({data}) {
this.$store.commit('setUserData', data);
this.$router.replace({
path: this.redirect,
});
//成功 创建websocket连接
createSocket('ws://127.0.0.1:17011/m/ws?accessToken='+data.id)
},
loginFail(error) {
this.loading = false;
this.refreshCode();
this.$message.error(error.message);
},
refreshCode() {
this.form.securityCode = '';
this.securityCodeUrl = securityCodeUrl + Math.random();
},
onSubmit(e) {
e.preventDefault();
if(!this.form.loginName.length){
return this.$message.warning('请输入用户名')
}
if(!this.form.password.length){
return this.$message.warning('请输入密码')
}
if(!this.form.securityCode.length){
return this.$message.warning('请输入验证码')
}
this.login();
},
},
data() {
return {
loading: false,
redirect: this.$route.query.redirect || '/',
securityCodeUrl: securityCodeUrl,
form: {
loginName: '',
password: '',
securityCode: '',
}
}
}
}
</script>
<style lang="less">
.page-login {
background-image: linear-gradient(45deg, #333, #111);
background-size: 40px 40px;
margin: 0;
height: 100%;
.el-form{
margin: auto;
width: 400px;
padding: 25px 25px 0 0;
background: #fff;
h1{
text-align: center;
font-size: 20px;
font-weight: 500;
margin-bottom: 20px;
}
button{
margin-top: 10px;
width: 240px;
}
.el-input-group__append{
padding: 0;
font-size: 0;
}
}
.footer{
height: 80px;
font-size: 12px;
color: #999;
text-align: center;
line-height: 80px;
a{
color: #999;
}
}
}
</style>
<template>
<layout-form>
<Breadcrumb slot='breadcrumb' :list='breadcrumbList'></Breadcrumb>
<el-form :model="extendFormData" :rules="rules" ref="form" label-width="100px" size='small'>
<el-row><Field label="旧密码" prop="oldPwd" v-model="extendFormData.oldPwd" type='password'/></el-row>
<el-row>
<el-tooltip class="item" effect="dark" content="要求:长度不少于8位,可由大小写字母、数字、特殊字符组成,最近三次内密码不能重复" placement="top">
<Field label="新密码" prop="newPwd" v-model="extendFormData.newPwd" type='password'/>
</el-tooltip>
</el-row>
<el-row>
<el-tooltip class="item" effect="dark" content="要求:长度不少于8位,可由大小写字母、数字、特殊字符组成,最近三次内密码不能重复" placement="top">
<Field label="重复密码" prop="reNewPwd" v-model="extendFormData.reNewPwd" type='password'/>
</el-tooltip>
</el-row>
<form-buttons @submit='submitForm'/>
</el-form>
</layout-form>
</template>
<script>
import form from '@/assets/mixins/form';
export default {
mixins: [form],
methods: {
afterSubmit() {
this.$message.success('修改密码成功,请重新登录');
this.$store.dispatch('logout');
this.$router.replace('/login');
},
// 替换原始的请求方法
getData() {},
},
data() {
return {
extendFormData: {
oldPwd: '',
newPwd: '',
reNewPwd: '',
},
urls: {
saveUrl: '/login/updatePwd',
},
breadcrumbList: [
{name: '系统管理',},
{name: '修改密码',},
],
rules: {
oldPwd: [
{ required: true, message: '请输入旧密码', trigger: 'blur' },
],
newPwd: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
],
reNewPwd: [
{ required: true, message: '请再次输入新密码!', trigger: 'blur' },
{ required: true, validator: (rule, val, cb)=>{
if(this.extendFormData.newPwd !== val){
return cb(new Error('重复密码与新密码不一致'))
}
cb();
}, trigger: 'blur' },
],
},
}
}
}
</script>
import Vue from 'vue'
import Router from 'vue-router'
import Store from './store'
import Layout from './views/Layout.vue'
import fileNotFound from './views/errors/fileNotFound.vue'
Vue.use(Router);
const router = new Router({
routes: [
builder('/authentication', 'login/authentication'),
builder('/login', 'login/login'),
builder('/go', 'codeGen/index'),
{
path: '/',
name: 'layout',
component: Layout,
meta: {
requiresAuth: true
},
children: [
...restBuilder('oper/log', 'system/log'), // 系统管理-操作日志
...restBuilder('validcode', 'system/validcode'), // 接入管理-接入信息
...restBuilder('menu', 'system/menu'), // 系统管理--菜单管理
...restBuilder('resource', 'system/resource'), // 系统管理--资源管理
...restBuilder('role', 'system/role'), // 系统管理--角色管理
...restBuilder('user', 'system/user'), // 用户管理 -- 管理用户
...restBuilder('param', 'system/param'), // 系统管理--参数管理
...restBuilder('task', 'system/task'), // 系统管理--任务管理
...restBuilder('area', 'system/area'), // 系统管理-区域管理
...restBuilder('device/connhistory', 'device/connhistory'), // 设备管理-连接历史
...restBuilder('device', 'device'), // 系统管理-区域管理
//在此添加业务模块
//以下为基础路由配置
builder('', 'Home'),
builder('index', 'Home'),
builder('login/updatePwd', 'login/updatePwd'),
builder('403', 'errors/403'),
builder('*', 'errors/404'),
]
},
]
})
/**
* rest路由生成器
*
* @param {string} path 路径
* @param {string} [component=path] 文件地址
* @returns {array} [] reset路由数组,包含list/edit/add/view
*/
function restBuilder(path, component = path) {
let arr = [];
arr.push(builder(`${path}/list`, `${component}/list`));
arr.push(builder(`${path}/edit`, `${component}/show`));
arr.push(builder(`${path}/add`, `${component}/show`));
arr.push(builder(`${path}/view`, `${component}/show`));
return arr;
}
/**
* 路由生成器
*
* @param {string} path 路径
* @param {string} [component=path] 文件地址
* @param {boolean} [requiresAuth=false] 是否登录后才能访问
* @returns {any} {} 路由对象
*/
function builder(path, component = path, requiresAuth = false) {
return {
path: path,
name: path || 'homepage',
component: getComponent(component),
meta: {
requiresAuth: requiresAuth
}
}
}
function getComponent(fileName) {
try {
return require('./views/' + fileName).default
} catch (error) {
return fileNotFound;
}
}
//检查是否跳转到sso地址
function ssoCheck (to, from, next) {
let redirect = (to.path === '/login/updatePwd') ? '/#/updatePwd' : ''
redirect = (redirect === '' && to.path === '/login') ? (location.protocol + '//' + location.host + '/#' + from.fullPath) : redirect
if (redirect != '') {
next(false)
window.location.href = '//' + location.host + '/m/login/logout?redirect=' + encodeURIComponent(redirect)
return true;
}
return false;
}
router.afterEach(() => {
document.body.scrollTop = 0
document.documentElement.scrollTop = 0
})
// 路由鉴权
router.beforeEach((to, from, next) => {
// if (ssoCheck(to, from, next)) { //sso鉴权检查
// return
// }
if (to.matched.some(record => record.meta.requiresAuth)) {
if (Store.state.isLogin) {
next();
} else {
next({
path: '/authentication',
query: {
redirect: to.fullPath
}
})
}
} else {
next();
}
})
export default router;
\ No newline at end of file
module.exports = {
productionSourceMap: false,
assetsDir: 's',
configureWebpack: {
externals: {
vue: "Vue",
vuex: "Vuex",
"vue-router": "VueRouter",
"element-ui": "ELEMENT"
},
},
lintOnSave:false,
devServer: {
inline: true,
disableHostCheck: true,
port: 8083,
hot: true,//自动保存
proxy: {
'/m': {
target: 'http://127.0.0.1:17011',
changeOrigin: true,
secure: false,
cookieDomainRewrite: 'plm.testnew.com',
}
}
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -8,6 +8,8 @@ import com.mortals.xhx.base.system.param.service.ParamService; ...@@ -8,6 +8,8 @@ import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.base.system.upload.service.UploadService; import com.mortals.xhx.base.system.upload.service.UploadService;
import com.mortals.xhx.busiz.login.DatumDataReq; import com.mortals.xhx.busiz.login.DatumDataReq;
import com.mortals.xhx.busiz.matters.MyMattersReq; import com.mortals.xhx.busiz.matters.MyMattersReq;
import com.mortals.xhx.busiz.oneProblemlist.OneProblemInfo;
import com.mortals.xhx.busiz.oneProblemlist.OneProblemReq;
import com.mortals.xhx.busiz.onethinglist.OneThingReq; import com.mortals.xhx.busiz.onethinglist.OneThingReq;
import com.mortals.xhx.busiz.question.QuestionInfo; import com.mortals.xhx.busiz.question.QuestionInfo;
import com.mortals.xhx.busiz.question.AnswerReq; import com.mortals.xhx.busiz.question.AnswerReq;
...@@ -67,6 +69,8 @@ public class WxOneThingApiController { ...@@ -67,6 +69,8 @@ public class WxOneThingApiController {
private OneTopicalService oneTopicalService; private OneTopicalService oneTopicalService;
@Autowired @Autowired
private OneClassifyService oneClassifyService; private OneClassifyService oneClassifyService;
@Autowired @Autowired
private OneClassifyTopicalService oneClassifyTopicalService; private OneClassifyTopicalService oneClassifyTopicalService;
...@@ -96,49 +100,47 @@ public class WxOneThingApiController { ...@@ -96,49 +100,47 @@ public class WxOneThingApiController {
return rsp; return rsp;
} }
/** /**
* 问答答案提交后返回的详细结果 * 问题详细
* *
* @param req * @param req
* @return * @return
*/ */
@PostMapping("thing/ansResults") @PostMapping("thing/oneProblem")
public ApiResp<QuestionInfo> ansResults(AnswerReq req) { public ApiResp<OneProblemInfo> oneProblem(OneProblemReq req) {
ApiResp<QuestionInfo> rsp = new ApiResp<>(); ApiResp<OneProblemInfo> rsp = new ApiResp<>();
rsp.setMsg(OneThingRespCodeEnum.SUCCESS.getLabel()); rsp.setCode(ApiRespCodeEnum.SUCCESS.getValue());
rsp.setCode(OneThingRespCodeEnum.SUCCESS.getValue()); rsp.setMsg(ApiRespCodeEnum.SUCCESS.getLabel());
try { try {
OneProblemInfo allQuestion = oneClassifyTopicalService.findAllQuestion(req.getId());
QuestionInfo mattersByAnswers = oneClassifyTopicalService.getMattersByAnswers(req); rsp.setData(allQuestion);
rsp.setData(mattersByAnswers);
} catch (Exception e) { } catch (Exception e) {
log.error("问答基础信息失败", e); log.error("一件事问答失败", e);
rsp.setCode(ApiRespCodeEnum.FAILED.getValue()); rsp.setCode(ApiRespCodeEnum.FAILED.getValue());
rsp.setMsg(e.getMessage()); rsp.setMsg(e.getMessage());
return rsp; return rsp;
} }
log.info("响应【问答基础信息】【响应体】--> " + JSONObject.toJSONString(rsp)); log.info("响应【一件事详细】【响应体】--> " + JSONObject.toJSONString(rsp));
return rsp; return rsp;
} }
/** /**
* 提交后请求返回数据 * 问答答案提交后返回的详细结果
* *
* @param req * @param req
* @return * @return
*/ */
@PostMapping("thing/datum_data") @PostMapping("thing/ansResults")
public ApiResp<QuestionInfo> datumData(DatumDataReq req) { public ApiResp<QuestionInfo> ansResults(AnswerReq req) {
ApiResp<QuestionInfo> rsp = new ApiResp<>(); ApiResp<QuestionInfo> rsp = new ApiResp<>();
rsp.setMsg(OneThingRespCodeEnum.SUCCESS.getLabel()); rsp.setMsg(OneThingRespCodeEnum.SUCCESS.getLabel());
rsp.setCode(OneThingRespCodeEnum.SUCCESS.getValue()); rsp.setCode(OneThingRespCodeEnum.SUCCESS.getValue());
try { try {
//todo 改用户需要的材料 QuestionInfo mattersByAnswers = oneClassifyTopicalService.getMattersByAnswers(req);
// QuestionInfo questionInfo = classifyOptionService.conditionQuestion(req.getOption_id(), req.getKey()); rsp.setData(mattersByAnswers);
//rsp.setData(questionInfo);
} catch (Exception e) { } catch (Exception e) {
log.error("问答基础信息失败", e); log.error("问答基础信息失败", e);
rsp.setCode(ApiRespCodeEnum.FAILED.getValue()); rsp.setCode(ApiRespCodeEnum.FAILED.getValue());
...@@ -146,10 +148,37 @@ public class WxOneThingApiController { ...@@ -146,10 +148,37 @@ public class WxOneThingApiController {
return rsp; return rsp;
} }
log.info("响应【登录后返回数据】【响应体】--> " + JSONObject.toJSONString(rsp)); log.info("响应【问答基础信息】【响应体】--> " + JSONObject.toJSONString(rsp));
return rsp; return rsp;
} }
// /**
// * 提交后请求返回数据
// *
// * @param req
// * @return
// */
// @PostMapping("thing/datum_data")
// public ApiResp<QuestionInfo> datumData(DatumDataReq req) {
// ApiResp<QuestionInfo> rsp = new ApiResp<>();
// rsp.setMsg(OneThingRespCodeEnum.SUCCESS.getLabel());
// rsp.setCode(OneThingRespCodeEnum.SUCCESS.getValue());
// try {
//
// //todo 改用户需要的材料
// // QuestionInfo questionInfo = classifyOptionService.conditionQuestion(req.getOption_id(), req.getKey());
// //rsp.setData(questionInfo);
// } catch (Exception e) {
// log.error("问答基础信息失败", e);
// rsp.setCode(ApiRespCodeEnum.FAILED.getValue());
// rsp.setMsg(e.getMessage());
// return rsp;
// }
//
// log.info("响应【登录后返回数据】【响应体】--> " + JSONObject.toJSONString(rsp));
// return rsp;
// }
/** /**
* 上传附件 * 上传附件
* *
......
...@@ -82,3 +82,18 @@ POST {{baseUrl}}/m/test/token ...@@ -82,3 +82,18 @@ POST {{baseUrl}}/m/test/token
Content-Type: application/json Content-Type: application/json
{} {}
###测试抓包提交
POST {{baseUrl}}/m/test/getHcpSin
Content-Type: application/json
{"affairCode":"510184-20200624-000003","name":"11111","systemCode":"dadfasdf"}
###测试抓包提交
POST {{baseUrl}}/m/member/test
Content-Type: application/json
{"affairCode":"510184-20200624-000003","name":"11111","systemCode":"dadfasdf"}
...@@ -306,22 +306,20 @@ public class RequestDispatchController { ...@@ -306,22 +306,20 @@ public class RequestDispatchController {
public ApiRespPdu list(@RequestBody ApiReqPdu<RequestTaskReq> req) { public ApiRespPdu list(@RequestBody ApiReqPdu<RequestTaskReq> req) {
ApiRespPdu<String> respPdu = new ApiRespPdu<>(); ApiRespPdu<String> respPdu = new ApiRespPdu<>();
Map<String, Object> model=new HashMap<String,Object>(); Map<String, Object> model = new HashMap<String, Object>();
Map<String, String> materialPropertyMap = paramService.getParamByFirstOrganize(Constant.Param_materialProperty); Map<String, String> materialPropertyMap = paramService.getParamByFirstOrganize(Constant.Param_materialProperty);
model.put( "isMust", YesNoEnum.getEnumMap()); model.put("isMust", YesNoEnum.getEnumMap());
model.put( "iszzsb", YesNoEnum.getEnumMap()); model.put("iszzsb", YesNoEnum.getEnumMap());
model.put( "materialProperty", paramService.getParamByFirstOrganize(Constant.Param_materialProperty)); model.put("materialProperty", paramService.getParamByFirstOrganize(Constant.Param_materialProperty));
model.put( "materialType", paramService.getParamByFirstOrganize(Constant.Param_materialType)); model.put("materialType", paramService.getParamByFirstOrganize(Constant.Param_materialType));
model.put( "electronicgs", paramService.getParamByFirstOrganize(Constant.Param_electronicgs)); model.put("electronicgs", paramService.getParamByFirstOrganize(Constant.Param_electronicgs));
model.put( "materialSource", paramService.getParamByFirstOrganize(Constant.Param_materialSource)); model.put("materialSource", paramService.getParamByFirstOrganize(Constant.Param_materialSource));
model.put( "paperGg", paramService.getParamByFirstOrganize(Constant.Param_paperGg)); model.put("paperGg", paramService.getParamByFirstOrganize(Constant.Param_paperGg));
model.put( "jianmMs", paramService.getParamByFirstOrganize(Constant.Param_jianmMs)); model.put("jianmMs", paramService.getParamByFirstOrganize(Constant.Param_jianmMs));
model.put( "sealWay", paramService.getParamByFirstOrganize(Constant.Param_sealWay)); model.put("sealWay", paramService.getParamByFirstOrganize(Constant.Param_sealWay));
try { try {
...@@ -329,7 +327,7 @@ public class RequestDispatchController { ...@@ -329,7 +327,7 @@ public class RequestDispatchController {
matterDetailService.find(new MatterDetailQuery()).stream().peek(item -> { matterDetailService.find(new MatterDetailQuery()).stream().peek(item -> {
String json = item.getMaterialsSqcl(); String json = item.getMaterialsSqcl();
buildJson(json,model); buildJson(json, model);
}).count(); }).count();
...@@ -340,7 +338,7 @@ public class RequestDispatchController { ...@@ -340,7 +338,7 @@ public class RequestDispatchController {
return respPdu; return respPdu;
} }
public void buildJson(String json,Map<String, Object> model) { public void buildJson(String json, Map<String, Object> model) {
JSONObject root = JSON.parseObject(json); JSONObject root = JSON.parseObject(json);
JSONArray jsonArray = root.getJSONArray("申请材料"); JSONArray jsonArray = root.getJSONArray("申请材料");
...@@ -387,11 +385,11 @@ public class RequestDispatchController { ...@@ -387,11 +385,11 @@ public class RequestDispatchController {
for (int j = 0; j < jsonArrayThree.size(); j++) { for (int j = 0; j < jsonArrayThree.size(); j++) {
jsonArrayThree.getJSONObject(j).entrySet().stream().peek(m -> { jsonArrayThree.getJSONObject(j).entrySet().stream().peek(m -> {
if("材料名称".equals(m.getKey().trim())){ if ("材料名称".equals(m.getKey().trim())) {
datumEntity.setMaterialName(m.getValue().toString()); datumEntity.setMaterialName(m.getValue().toString());
} }
if("材料形式".equals(m.getKey().trim())){ if ("材料形式".equals(m.getKey().trim())) {
//查找 //查找
//materialPropertyMap //materialPropertyMap
Map<String, String> map = (Map<String, String>) model.get("materialProperty"); Map<String, String> map = (Map<String, String>) model.get("materialProperty");
...@@ -403,7 +401,6 @@ public class RequestDispatchController { ...@@ -403,7 +401,6 @@ public class RequestDispatchController {
} }
System.out.println("name:" + m.getKey()); System.out.println("name:" + m.getKey());
System.out.print(" value:" + m.getValue()); System.out.print(" value:" + m.getValue());
}).count(); }).count();
...@@ -627,6 +624,34 @@ public class RequestDispatchController { ...@@ -627,6 +624,34 @@ public class RequestDispatchController {
} }
/**
* json提交
*
* @param info
* @return
*/
@PostMapping("/getHcpSin")
public ApiRespPdu getHcpSin(@RequestBody TestInfo info) {
ApiRespPdu<String> respPdu = new ApiRespPdu<>();
respPdu.setCode(200);
return respPdu;
}
/**
* json提交
*
* @param
* @return
*/
@PostMapping("/other")
public String other() {
return "200";
}
public static void main(String[] args) { public static void main(String[] args) {
......
{ {
"local": { "local": {
"baseUrl": "http://127.0.0.1:17011" "baseUrl": "http://192.168.0.217:17011"
}, },
"dev": { "dev": {
"baseUrl": "http://192.168.100.200:17011" "baseUrl": "http://192.168.100.200:17011"
},
"other": {
"baseUrl": "http://192.168.0.30:17011"
} }
} }
\ No newline at end of file
...@@ -259,6 +259,7 @@ ...@@ -259,6 +259,7 @@
} }
return data return data
}, },
<#elseif table.tplCategory=="subone" >
</#if> </#if>
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment