作者 zhangFan

init

正在显示 100 个修改的文件 包含 2565 行增加0 行删除

要显示太多修改。

为保证性能只显示 100 of 100+ 个文件。

  1 +# http://editorconfig.org
  2 +root = true
  3 +
  4 +[*]
  5 +charset = utf-8
  6 +indent_style = space
  7 +indent_size = 2
  8 +end_of_line = lf
  9 +insert_final_newline = true
  10 +trim_trailing_whitespace = true
  11 +
  12 +[*.md]
  13 +insert_final_newline = false
  14 +trim_trailing_whitespace = false
  1 +# just a flag
  2 +ENV = 'development'
  3 +
  4 +# base api
  5 +VUE_APP_BASE_API = '/dev-api'
  6 +
  7 +# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
  8 +# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
  9 +# It only does one thing by converting all import() to require().
  10 +# This configuration can significantly increase the speed of hot updates,
  11 +# when you have a large number of pages.
  12 +# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
  13 +
  14 +VUE_CLI_BABEL_TRANSPILE_MODULES = true
  1 +NODE_ENV = production
  2 +
  3 +# just a flag
  4 +ENV = 'staging'
  5 +
  6 +# base api
  7 +VUE_APP_BASE_API = '/stage-api'
  8 +
  1 +module.exports = {
  2 + root: true,
  3 + parserOptions: {
  4 + parser: 'babel-eslint',
  5 + sourceType: 'module'
  6 + },
  7 + env: {
  8 + browser: true,
  9 + node: true,
  10 + es6: true,
  11 + },
  12 + extends: ['plugin:vue/recommended', 'eslint:recommended'],
  13 +
  14 + // add your custom rules here
  15 + //it is base on https://github.com/vuejs/eslint-config-vue
  16 + rules: {
  17 + "vue/max-attributes-per-line": [2, {
  18 + "singleline": 10,
  19 + "multiline": {
  20 + "max": 1,
  21 + "allowFirstLine": false
  22 + }
  23 + }],
  24 + "vue/singleline-html-element-content-newline": "off",
  25 + "vue/multiline-html-element-content-newline":"off",
  26 + "vue/name-property-casing": ["error", "PascalCase"],
  27 + "vue/no-v-html": "off",
  28 + 'accessor-pairs': 2,
  29 + 'arrow-spacing': [2, {
  30 + 'before': true,
  31 + 'after': true
  32 + }],
  33 + 'block-spacing': [2, 'always'],
  34 + 'brace-style': [2, '1tbs', {
  35 + 'allowSingleLine': true
  36 + }],
  37 + 'camelcase': [0, {
  38 + 'properties': 'always'
  39 + }],
  40 + 'comma-dangle': [2, 'never'],
  41 + 'comma-spacing': [2, {
  42 + 'before': false,
  43 + 'after': true
  44 + }],
  45 + 'comma-style': [2, 'last'],
  46 + 'constructor-super': 2,
  47 + 'curly': [2, 'multi-line'],
  48 + 'dot-location': [2, 'property'],
  49 + 'eol-last': 2,
  50 + 'eqeqeq': ["error", "always", {"null": "ignore"}],
  51 + 'generator-star-spacing': [2, {
  52 + 'before': true,
  53 + 'after': true
  54 + }],
  55 + 'handle-callback-err': [2, '^(err|error)$'],
  56 + 'indent': [2, 2, {
  57 + 'SwitchCase': 1
  58 + }],
  59 + 'jsx-quotes': [2, 'prefer-single'],
  60 + 'key-spacing': [2, {
  61 + 'beforeColon': false,
  62 + 'afterColon': true
  63 + }],
  64 + 'keyword-spacing': [2, {
  65 + 'before': true,
  66 + 'after': true
  67 + }],
  68 + 'new-cap': [2, {
  69 + 'newIsCap': true,
  70 + 'capIsNew': false
  71 + }],
  72 + 'new-parens': 2,
  73 + 'no-array-constructor': 2,
  74 + 'no-caller': 2,
  75 + 'no-console': 'off',
  76 + 'no-class-assign': 2,
  77 + 'no-cond-assign': 2,
  78 + 'no-const-assign': 2,
  79 + 'no-control-regex': 0,
  80 + 'no-delete-var': 2,
  81 + 'no-dupe-args': 2,
  82 + 'no-dupe-class-members': 2,
  83 + 'no-dupe-keys': 2,
  84 + 'no-duplicate-case': 2,
  85 + 'no-empty-character-class': 2,
  86 + 'no-empty-pattern': 2,
  87 + 'no-eval': 2,
  88 + 'no-ex-assign': 2,
  89 + 'no-extend-native': 2,
  90 + 'no-extra-bind': 2,
  91 + 'no-extra-boolean-cast': 2,
  92 + 'no-extra-parens': [2, 'functions'],
  93 + 'no-fallthrough': 2,
  94 + 'no-floating-decimal': 2,
  95 + 'no-func-assign': 2,
  96 + 'no-implied-eval': 2,
  97 + 'no-inner-declarations': [2, 'functions'],
  98 + 'no-invalid-regexp': 2,
  99 + 'no-irregular-whitespace': 2,
  100 + 'no-iterator': 2,
  101 + 'no-label-var': 2,
  102 + 'no-labels': [2, {
  103 + 'allowLoop': false,
  104 + 'allowSwitch': false
  105 + }],
  106 + 'no-lone-blocks': 2,
  107 + 'no-mixed-spaces-and-tabs': 2,
  108 + 'no-multi-spaces': 2,
  109 + 'no-multi-str': 2,
  110 + 'no-multiple-empty-lines': [2, {
  111 + 'max': 1
  112 + }],
  113 + 'no-native-reassign': 2,
  114 + 'no-negated-in-lhs': 2,
  115 + 'no-new-object': 2,
  116 + 'no-new-require': 2,
  117 + 'no-new-symbol': 2,
  118 + 'no-new-wrappers': 2,
  119 + 'no-obj-calls': 2,
  120 + 'no-octal': 2,
  121 + 'no-octal-escape': 2,
  122 + 'no-path-concat': 2,
  123 + 'no-proto': 2,
  124 + 'no-redeclare': 2,
  125 + 'no-regex-spaces': 2,
  126 + 'no-return-assign': [2, 'except-parens'],
  127 + 'no-self-assign': 2,
  128 + 'no-self-compare': 2,
  129 + 'no-sequences': 2,
  130 + 'no-shadow-restricted-names': 2,
  131 + 'no-spaced-func': 2,
  132 + 'no-sparse-arrays': 2,
  133 + 'no-this-before-super': 2,
  134 + 'no-throw-literal': 2,
  135 + 'no-trailing-spaces': 2,
  136 + 'no-undef': 2,
  137 + 'no-undef-init': 2,
  138 + 'no-unexpected-multiline': 2,
  139 + 'no-unmodified-loop-condition': 2,
  140 + 'no-unneeded-ternary': [2, {
  141 + 'defaultAssignment': false
  142 + }],
  143 + 'no-unreachable': 2,
  144 + 'no-unsafe-finally': 2,
  145 + 'no-unused-vars': [2, {
  146 + 'vars': 'all',
  147 + 'args': 'none'
  148 + }],
  149 + 'no-useless-call': 2,
  150 + 'no-useless-computed-key': 2,
  151 + 'no-useless-constructor': 2,
  152 + 'no-useless-escape': 0,
  153 + 'no-whitespace-before-property': 2,
  154 + 'no-with': 2,
  155 + 'one-var': [2, {
  156 + 'initialized': 'never'
  157 + }],
  158 + 'operator-linebreak': [2, 'after', {
  159 + 'overrides': {
  160 + '?': 'before',
  161 + ':': 'before'
  162 + }
  163 + }],
  164 + 'padded-blocks': [2, 'never'],
  165 + 'quotes': [2, 'single', {
  166 + 'avoidEscape': true,
  167 + 'allowTemplateLiterals': true
  168 + }],
  169 + 'semi': [2, 'never'],
  170 + 'semi-spacing': [2, {
  171 + 'before': false,
  172 + 'after': true
  173 + }],
  174 + 'space-before-blocks': [2, 'always'],
  175 + 'space-before-function-paren': [2, 'never'],
  176 + 'space-in-parens': [2, 'never'],
  177 + 'space-infix-ops': 2,
  178 + 'space-unary-ops': [2, {
  179 + 'words': true,
  180 + 'nonwords': false
  181 + }],
  182 + 'spaced-comment': [2, 'always', {
  183 + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
  184 + }],
  185 + 'template-curly-spacing': [2, 'never'],
  186 + 'use-isnan': 2,
  187 + 'valid-typeof': 2,
  188 + 'wrap-iife': [2, 'any'],
  189 + 'yield-star-spacing': [2, 'both'],
  190 + 'yoda': [2, 'never'],
  191 + 'prefer-const': 2,
  192 + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
  193 + 'object-curly-spacing': [2, 'always', {
  194 + objectsInObjects: false
  195 + }],
  196 + 'array-bracket-spacing': [2, 'never']
  197 + }
  198 +}
  1 +.DS_Store
  2 +node_modules/
  3 +dist/
  4 +npm-debug.log*
  5 +yarn-debug.log*
  6 +yarn-error.log*
  7 +package-lock.json
  8 +tests/**/coverage/
  9 +
  10 +# Editor directories and files
  11 +.idea
  12 +.vscode
  13 +*.suo
  14 +*.ntvs*
  15 +*.njsproj
  16 +*.sln
  1 +language: node_js
  2 +node_js: 10
  3 +script: npm run test
  4 +notifications:
  5 + email: false
  1 +MIT License
  2 +
  3 +Copyright (c) 2017-present PanJiaChen
  4 +
  5 +Permission is hereby granted, free of charge, to any person obtaining a copy
  6 +of this software and associated documentation files (the "Software"), to deal
  7 +in the Software without restriction, including without limitation the rights
  8 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9 +copies of the Software, and to permit persons to whom the Software is
  10 +furnished to do so, subject to the following conditions:
  11 +
  12 +The above copyright notice and this permission notice shall be included in all
  13 +copies or substantial portions of the Software.
  14 +
  15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21 +SOFTWARE.
  1 +# vue-admin-template
  2 +
  3 +> 这是一个极简的 vue admin 管理后台。它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。
  4 +
  5 +[线上地址](http://panjiachen.github.io/vue-admin-template)
  6 +
  7 +[国内访问](https://panjiachen.gitee.io/vue-admin-template)
  8 +
  9 +目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`
  10 +
  11 +## Extra
  12 +
  13 +如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
  14 +
  15 +## 相关项目
  16 +
  17 +- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
  18 +
  19 +- [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
  20 +
  21 +- [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
  22 +
  23 +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)
  24 +
  25 +写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目:
  26 +
  27 +- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
  28 +- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
  29 +- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
  30 +- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
  31 +- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
  32 +
  33 +## Build Setup
  34 +
  35 +```bash
  36 +# 克隆项目
  37 +git clone https://github.com/PanJiaChen/vue-admin-template.git
  38 +
  39 +# 进入项目目录
  40 +cd vue-admin-template
  41 +
  42 +# 安装依赖
  43 +npm install
  44 +
  45 +# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
  46 +npm install --registry=https://registry.npm.taobao.org
  47 +
  48 +# 启动服务
  49 +npm run dev
  50 +```
  51 +
  52 +浏览器访问 [http://localhost:9528](http://localhost:9528)
  53 +
  54 +## 发布
  55 +
  56 +```bash
  57 +# 构建测试环境
  58 +npm run build:stage
  59 +
  60 +# 构建生产环境
  61 +npm run build:prod
  62 +```
  63 +
  64 +## 其它
  65 +
  66 +```bash
  67 +# 预览发布环境效果
  68 +npm run preview
  69 +
  70 +# 预览发布环境效果 + 静态资源分析
  71 +npm run preview -- --report
  72 +
  73 +# 代码格式检查
  74 +npm run lint
  75 +
  76 +# 代码格式检查并自动修复
  77 +npm run lint -- --fix
  78 +```
  79 +
  80 +更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
  81 +
  82 +## Demo
  83 +
  84 +![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
  85 +
  86 +## Browsers support
  87 +
  88 +Modern browsers and Internet Explorer 10+.
  89 +
  90 +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
  91 +| --------- | --------- | --------- | --------- |
  92 +| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
  93 +
  94 +## License
  95 +
  96 +[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
  97 +
  98 +Copyright (c) 2017-present PanJiaChen
  1 +# vue-admin-template
  2 +
  3 +English | [简体中文](./README-zh.md)
  4 +
  5 +> A minimal vue admin template with Element UI & axios & iconfont & permission control & lint
  6 +
  7 +**Live demo:** http://panjiachen.github.io/vue-admin-template
  8 +
  9 +
  10 +**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`**
  11 +
  12 +## Build Setup
  13 +
  14 +
  15 +```bash
  16 +# clone the project
  17 +git clone https://github.com/PanJiaChen/vue-admin-template.git
  18 +
  19 +# enter the project directory
  20 +cd vue-admin-template
  21 +
  22 +# install dependency
  23 +npm install
  24 +
  25 +# develop
  26 +npm run dev
  27 +```
  28 +
  29 +This will automatically open http://localhost:9528
  30 +
  31 +## Build
  32 +
  33 +```bash
  34 +# build for test environment
  35 +npm run build:stage
  36 +
  37 +# build for production environment
  38 +npm run build:prod
  39 +```
  40 +
  41 +## Advanced
  42 +
  43 +```bash
  44 +# preview the release environment effect
  45 +npm run preview
  46 +
  47 +# preview the release environment effect + static resource analysis
  48 +npm run preview -- --report
  49 +
  50 +# code format check
  51 +npm run lint
  52 +
  53 +# code format check and auto fix
  54 +npm run lint -- --fix
  55 +```
  56 +
  57 +Refer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information
  58 +
  59 +## Demo
  60 +
  61 +![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
  62 +
  63 +## Extra
  64 +
  65 +If you want router permission && generate menu by user roles , you can use this branch [permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
  66 +
  67 +For `typescript` version, you can use [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour))
  68 +
  69 +## Related Project
  70 +
  71 +- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
  72 +
  73 +- [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
  74 +
  75 +- [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
  76 +
  77 +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)
  78 +
  79 +## Browsers support
  80 +
  81 +Modern browsers and Internet Explorer 10+.
  82 +
  83 +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
  84 +| --------- | --------- | --------- | --------- |
  85 +| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
  86 +
  87 +## License
  88 +
  89 +[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
  90 +
  91 +Copyright (c) 2017-present PanJiaChen
  1 +module.exports = {
  2 + presets: [
  3 + '@vue/app'
  4 + ]
  5 +}
  1 +module.exports = {
  2 + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
  3 + transform: {
  4 + '^.+\\.vue$': 'vue-jest',
  5 + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
  6 + 'jest-transform-stub',
  7 + '^.+\\.jsx?$': 'babel-jest'
  8 + },
  9 + moduleNameMapper: {
  10 + '^@/(.*)$': '<rootDir>/src/$1'
  11 + },
  12 + snapshotSerializers: ['jest-serializer-vue'],
  13 + testMatch: [
  14 + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
  15 + ],
  16 + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
  17 + coverageDirectory: '<rootDir>/tests/unit/coverage',
  18 + // 'collectCoverage': true,
  19 + 'coverageReporters': [
  20 + 'lcov',
  21 + 'text-summary'
  22 + ],
  23 + testURL: 'http://localhost/'
  24 +}
  1 +{
  2 + "compilerOptions": {
  3 + "baseUrl": "./",
  4 + "paths": {
  5 + "@/*": ["src/*"]
  6 + }
  7 + },
  8 + "exclude": ["node_modules", "dist"]
  9 +}
  1 +import Mock from 'mockjs'
  2 +import { param2Obj } from '../src/utils'
  3 +
  4 +import user from './user'
  5 +import table from './table'
  6 +
  7 +const mocks = [
  8 + ...user,
  9 + ...table
  10 +]
  11 +
  12 +// for front mock
  13 +// please use it cautiously, it will redefine XMLHttpRequest,
  14 +// which will cause many of your third-party libraries to be invalidated(like progress event).
  15 +export function mockXHR() {
  16 + // mock patch
  17 + // https://github.com/nuysoft/Mock/issues/300
  18 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  19 + Mock.XHR.prototype.send = function() {
  20 + if (this.custom.xhr) {
  21 + this.custom.xhr.withCredentials = this.withCredentials || false
  22 +
  23 + if (this.responseType) {
  24 + this.custom.xhr.responseType = this.responseType
  25 + }
  26 + }
  27 + this.proxy_send(...arguments)
  28 + }
  29 +
  30 + function XHR2ExpressReqWrap(respond) {
  31 + return function(options) {
  32 + let result = null
  33 + if (respond instanceof Function) {
  34 + const { body, type, url } = options
  35 + // https://expressjs.com/en/4x/api.html#req
  36 + result = respond({
  37 + method: type,
  38 + body: JSON.parse(body),
  39 + query: param2Obj(url)
  40 + })
  41 + } else {
  42 + result = respond
  43 + }
  44 + return Mock.mock(result)
  45 + }
  46 + }
  47 +
  48 + for (const i of mocks) {
  49 + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
  50 + }
  51 +}
  52 +
  53 +// for mock server
  54 +const responseFake = (url, type, respond) => {
  55 + return {
  56 + url: new RegExp(`/mock${url}`),
  57 + type: type || 'get',
  58 + response(req, res) {
  59 + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
  60 + }
  61 + }
  62 +}
  63 +
  64 +export default mocks.map(route => {
  65 + return responseFake(route.url, route.type, route.response)
  66 +})
  1 +const chokidar = require('chokidar')
  2 +const bodyParser = require('body-parser')
  3 +const chalk = require('chalk')
  4 +const path = require('path')
  5 +
  6 +const mockDir = path.join(process.cwd(), 'mock')
  7 +
  8 +function registerRoutes(app) {
  9 + let mockLastIndex
  10 + const { default: mocks } = require('./index.js')
  11 + for (const mock of mocks) {
  12 + app[mock.type](mock.url, mock.response)
  13 + mockLastIndex = app._router.stack.length
  14 + }
  15 + const mockRoutesLength = Object.keys(mocks).length
  16 + return {
  17 + mockRoutesLength: mockRoutesLength,
  18 + mockStartIndex: mockLastIndex - mockRoutesLength
  19 + }
  20 +}
  21 +
  22 +function unregisterRoutes() {
  23 + Object.keys(require.cache).forEach(i => {
  24 + if (i.includes(mockDir)) {
  25 + delete require.cache[require.resolve(i)]
  26 + }
  27 + })
  28 +}
  29 +
  30 +module.exports = app => {
  31 + // es6 polyfill
  32 + require('@babel/register')
  33 +
  34 + // parse app.body
  35 + // https://expressjs.com/en/4x/api.html#req.body
  36 + app.use(bodyParser.json())
  37 + app.use(bodyParser.urlencoded({
  38 + extended: true
  39 + }))
  40 +
  41 + const mockRoutes = registerRoutes(app)
  42 + var mockRoutesLength = mockRoutes.mockRoutesLength
  43 + var mockStartIndex = mockRoutes.mockStartIndex
  44 +
  45 + // watch files, hot reload mock server
  46 + chokidar.watch(mockDir, {
  47 + ignored: /mock-server/,
  48 + ignoreInitial: true
  49 + }).on('all', (event, path) => {
  50 + if (event === 'change' || event === 'add') {
  51 + try {
  52 + // remove mock routes stack
  53 + app._router.stack.splice(mockStartIndex, mockRoutesLength)
  54 +
  55 + // clear routes cache
  56 + unregisterRoutes()
  57 +
  58 + const mockRoutes = registerRoutes(app)
  59 + mockRoutesLength = mockRoutes.mockRoutesLength
  60 + mockStartIndex = mockRoutes.mockStartIndex
  61 +
  62 + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  63 + } catch (error) {
  64 + console.log(chalk.redBright(error))
  65 + }
  66 + }
  67 + })
  68 +}
  1 +import Mock from 'mockjs'
  2 +
  3 +const data = Mock.mock({
  4 + 'items|30': [{
  5 + id: '@id',
  6 + title: '@sentence(10, 20)',
  7 + 'status|1': ['published', 'draft', 'deleted'],
  8 + author: 'name',
  9 + display_time: '@datetime',
  10 + pageviews: '@integer(300, 5000)'
  11 + }]
  12 +})
  13 +
  14 +export default [
  15 + {
  16 + url: '/table/list',
  17 + type: 'get',
  18 + response: config => {
  19 + const items = data.items
  20 + return {
  21 + code: 20000,
  22 + data: {
  23 + total: items.length,
  24 + items: items
  25 + }
  26 + }
  27 + }
  28 + }
  29 +]
  1 +
  2 +const tokens = {
  3 + admin: {
  4 + token: 'admin-token'
  5 + },
  6 + editor: {
  7 + token: 'editor-token'
  8 + }
  9 +}
  10 +
  11 +const users = {
  12 + 'admin-token': {
  13 + roles: ['admin'],
  14 + introduction: 'I am a super administrator',
  15 + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
  16 + name: 'Super Admin'
  17 + },
  18 + 'editor-token': {
  19 + roles: ['editor'],
  20 + introduction: 'I am an editor',
  21 + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
  22 + name: 'Normal Editor'
  23 + }
  24 +}
  25 +
  26 +export default [
  27 + // user login
  28 + {
  29 + url: '/user/login',
  30 + type: 'post',
  31 + response: config => {
  32 + const { username } = config.body
  33 + const token = tokens[username]
  34 +
  35 + // mock error
  36 + if (!token) {
  37 + return {
  38 + code: 60204,
  39 + message: 'Account and password are incorrect.'
  40 + }
  41 + }
  42 +
  43 + return {
  44 + code: 20000,
  45 + data: token
  46 + }
  47 + }
  48 + },
  49 +
  50 + // get user info
  51 + {
  52 + url: '/user/info\.*',
  53 + type: 'get',
  54 + response: config => {
  55 + const { token } = config.query
  56 + const info = users[token]
  57 +
  58 + // mock error
  59 + if (!info) {
  60 + return {
  61 + code: 50008,
  62 + message: 'Login failed, unable to get user details.'
  63 + }
  64 + }
  65 +
  66 + return {
  67 + code: 20000,
  68 + data: info
  69 + }
  70 + }
  71 + },
  72 +
  73 + // user logout
  74 + {
  75 + url: '/user/logout',
  76 + type: 'post',
  77 + response: _ => {
  78 + return {
  79 + code: 20000,
  80 + data: 'success'
  81 + }
  82 + }
  83 + }
  84 +]
  1 +{
  2 + "name": "custom-unified-declaration-web ",
  3 + "version": "4.2.1",
  4 + "description": "custom-unified-declaration-web ",
  5 + "author": "",
  6 + "license": "MIT",
  7 + "scripts": {
  8 + "dev": "vue-cli-service serve",
  9 + "build:prod": "vue-cli-service build",
  10 + "build:stage": "vue-cli-service build --mode staging",
  11 + "preview": "node build/index.js --preview",
  12 + "lint": "eslint --ext .js,.vue src",
  13 + "test:unit": "jest --clearCache && vue-cli-service test:unit",
  14 + "test:ci": "npm run lint && npm run test:unit",
  15 + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
  16 + },
  17 + "dependencies": {
  18 + "axios": "0.18.1",
  19 + "element-ui": "2.7.2",
  20 + "js-cookie": "2.2.0",
  21 + "normalize.css": "7.0.0",
  22 + "nprogress": "0.2.0",
  23 + "path-to-regexp": "2.4.0",
  24 + "vue": "2.6.10",
  25 + "vue-router": "3.0.6",
  26 + "vuex": "3.1.0"
  27 + },
  28 + "devDependencies": {
  29 + "@babel/core": "7.0.0",
  30 + "@babel/register": "7.0.0",
  31 + "@vue/cli-plugin-babel": "3.6.0",
  32 + "@vue/cli-plugin-eslint": "^3.9.1",
  33 + "@vue/cli-plugin-unit-jest": "3.6.3",
  34 + "@vue/cli-service": "3.6.0",
  35 + "@vue/test-utils": "1.0.0-beta.29",
  36 + "autoprefixer": "^9.5.1",
  37 + "babel-core": "7.0.0-bridge.0",
  38 + "babel-eslint": "10.0.1",
  39 + "babel-jest": "23.6.0",
  40 + "chalk": "2.4.2",
  41 + "connect": "3.6.6",
  42 + "eslint": "5.15.3",
  43 + "eslint-plugin-vue": "5.2.2",
  44 + "html-webpack-plugin": "3.2.0",
  45 + "mockjs": "1.0.1-beta3",
  46 + "node-sass": "^4.9.0",
  47 + "runjs": "^4.3.2",
  48 + "sass-loader": "^7.1.0",
  49 + "script-ext-html-webpack-plugin": "2.1.3",
  50 + "script-loader": "0.7.2",
  51 + "serve-static": "^1.13.2",
  52 + "svg-sprite-loader": "4.1.3",
  53 + "svgo": "1.2.2",
  54 + "vue-template-compiler": "2.6.10"
  55 + },
  56 + "engines": {
  57 + "node": ">=8.9",
  58 + "npm": ">= 3.0.0"
  59 + },
  60 + "browserslist": [
  61 + "> 1%",
  62 + "last 2 versions"
  63 + ]
  64 +}
  1 +// https://github.com/michael-ciniawsky/postcss-load-config
  2 +
  3 +module.exports = {
  4 + 'plugins': {
  5 + // to edit target browsers: use "browserslist" field in package.json
  6 + 'autoprefixer': {}
  7 + }
  8 +}
不能预览此文件类型
  1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <meta charset="utf-8">
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6 + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  7 + <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  8 + <title><%= webpackConfig.name %></title>
  9 + </head>
  10 + <body>
  11 + <noscript>
  12 + <strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  13 + </noscript>
  14 + <div id="app"></div>
  15 + <!-- built files will be auto injected -->
  16 + </body>
  17 +</html>
  1 +<template>
  2 + <div id="app">
  3 + <router-view />
  4 + </div>
  5 +</template>
  6 +
  7 +<script>
  8 +export default {
  9 + name: 'App'
  10 +}
  11 +</script>
  1 +import request from '@/utils/request'
  2 +
  3 +export function getList(params) {
  4 + return request({
  5 + url: '/table/list',
  6 + method: 'get',
  7 + params
  8 + })
  9 +}
  1 +import request from '@/utils/request'
  2 +
  3 +export function login(data) {
  4 + return request({
  5 + url: '/user/login',
  6 + method: 'post',
  7 + data
  8 + })
  9 +}
  10 +
  11 +export function getInfo(token) {
  12 + return request({
  13 + url: '/user/info',
  14 + method: 'get',
  15 + params: { token }
  16 + })
  17 +}
  18 +
  19 +export function logout() {
  20 + return request({
  21 + url: '/user/logout',
  22 + method: 'post'
  23 + })
  24 +}
  1 +<template>
  2 + <el-breadcrumb class="app-breadcrumb" separator="/">
  3 + <transition-group name="breadcrumb">
  4 + <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
  5 + <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
  6 + <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
  7 + </el-breadcrumb-item>
  8 + </transition-group>
  9 + </el-breadcrumb>
  10 +</template>
  11 +
  12 +<script>
  13 +import pathToRegexp from 'path-to-regexp'
  14 +
  15 +export default {
  16 + data() {
  17 + return {
  18 + levelList: null
  19 + }
  20 + },
  21 + watch: {
  22 + $route() {
  23 + this.getBreadcrumb()
  24 + }
  25 + },
  26 + created() {
  27 + this.getBreadcrumb()
  28 + },
  29 + methods: {
  30 + getBreadcrumb() {
  31 + // only show routes with meta.title
  32 + let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
  33 + const first = matched[0]
  34 +
  35 + if (!this.isDashboard(first)) {
  36 + matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
  37 + }
  38 +
  39 + this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
  40 + },
  41 + isDashboard(route) {
  42 + const name = route && route.name
  43 + if (!name) {
  44 + return false
  45 + }
  46 + return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
  47 + },
  48 + pathCompile(path) {
  49 + // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
  50 + const { params } = this.$route
  51 + var toPath = pathToRegexp.compile(path)
  52 + return toPath(params)
  53 + },
  54 + handleLink(item) {
  55 + const { redirect, path } = item
  56 + if (redirect) {
  57 + this.$router.push(redirect)
  58 + return
  59 + }
  60 + this.$router.push(this.pathCompile(path))
  61 + }
  62 + }
  63 +}
  64 +</script>
  65 +
  66 +<style lang="scss" scoped>
  67 +.app-breadcrumb.el-breadcrumb {
  68 + display: inline-block;
  69 + font-size: 14px;
  70 + line-height: 50px;
  71 + margin-left: 8px;
  72 +
  73 + .no-redirect {
  74 + color: #97a8be;
  75 + cursor: text;
  76 + }
  77 +}
  78 +</style>
  1 +<template>
  2 + <div style="padding: 0 15px;" @click="toggleClick">
  3 + <svg
  4 + :class="{'is-active':isActive}"
  5 + class="hamburger"
  6 + viewBox="0 0 1024 1024"
  7 + xmlns="http://www.w3.org/2000/svg"
  8 + width="64"
  9 + height="64"
  10 + >
  11 + <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
  12 + </svg>
  13 + </div>
  14 +</template>
  15 +
  16 +<script>
  17 +export default {
  18 + name: 'Hamburger',
  19 + props: {
  20 + isActive: {
  21 + type: Boolean,
  22 + default: false
  23 + }
  24 + },
  25 + methods: {
  26 + toggleClick() {
  27 + this.$emit('toggleClick')
  28 + }
  29 + }
  30 +}
  31 +</script>
  32 +
  33 +<style scoped>
  34 +.hamburger {
  35 + display: inline-block;
  36 + vertical-align: middle;
  37 + width: 20px;
  38 + height: 20px;
  39 +}
  40 +
  41 +.hamburger.is-active {
  42 + transform: rotate(180deg);
  43 +}
  44 +</style>
  1 +<template>
  2 + <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
  3 + <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
  4 + <use :href="iconName" />
  5 + </svg>
  6 +</template>
  7 +
  8 +<script>
  9 +// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
  10 +import { isExternal } from '@/utils/validate'
  11 +
  12 +export default {
  13 + name: 'SvgIcon',
  14 + props: {
  15 + iconClass: {
  16 + type: String,
  17 + required: true
  18 + },
  19 + className: {
  20 + type: String,
  21 + default: ''
  22 + }
  23 + },
  24 + computed: {
  25 + isExternal() {
  26 + return isExternal(this.iconClass)
  27 + },
  28 + iconName() {
  29 + return `#icon-${this.iconClass}`
  30 + },
  31 + svgClass() {
  32 + if (this.className) {
  33 + return 'svg-icon ' + this.className
  34 + } else {
  35 + return 'svg-icon'
  36 + }
  37 + },
  38 + styleExternalIcon() {
  39 + return {
  40 + mask: `url(${this.iconClass}) no-repeat 50% 50%`,
  41 + '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
  42 + }
  43 + }
  44 + }
  45 +}
  46 +</script>
  47 +
  48 +<style scoped>
  49 +.svg-icon {
  50 + width: 1em;
  51 + height: 1em;
  52 + vertical-align: -0.15em;
  53 + fill: currentColor;
  54 + overflow: hidden;
  55 +}
  56 +
  57 +.svg-external-icon {
  58 + background-color: currentColor;
  59 + mask-size: cover!important;
  60 + display: inline-block;
  61 +}
  62 +</style>
  1 +import Vue from 'vue'
  2 +import SvgIcon from '@/components/SvgIcon'// svg component
  3 +
  4 +// register globally
  5 +Vue.component('svg-icon', SvgIcon)
  6 +
  7 +const req = require.context('./svg', false, /\.svg$/)
  8 +const requireAll = requireContext => requireContext.keys().map(requireContext)
  9 +requireAll(req)
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"/></svg>
  1 +<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
  1 +<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
  1 +<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
  1 +<svg width="1000" height="1000" xmlns="http://www.w3.org/2000/svg"><path d="M11.576 547.9l282.848 126.404 409.285-383.26 137.057-128.341L361.234 714.22l362.77 146.362c8.742 3.327 18.733-1.33 21.855-10.644v-.666L999.985.374 10.327 514.636c-8.742 4.657-11.864 15.302-8.117 24.616 2.497 3.991 5.62 7.318 9.366 8.648zM360.61 999.626l141.112-161.663-141.112-61.206v222.869z"/></svg>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>
  1 +<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>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
  1 +<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>
  1 +<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
  1 +<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
  1 +<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>
  1 +<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>
  1 +# replace default config
  2 +
  3 +# multipass: true
  4 +# full: true
  5 +
  6 +plugins:
  7 +
  8 + # - name
  9 + #
  10 + # or:
  11 + # - name: false
  12 + # - name: true
  13 + #
  14 + # or:
  15 + # - name:
  16 + # param1: 1
  17 + # param2: 2
  18 +
  19 +- removeAttrs:
  20 + attrs:
  21 + - 'fill'
  22 + - 'fill-rule'
  1 +<template>
  2 + <section class="app-main">
  3 + <transition name="fade-transform" mode="out-in">
  4 + <router-view :key="key" />
  5 + </transition>
  6 + </section>
  7 +</template>
  8 +
  9 +<script>
  10 +export default {
  11 + name: 'AppMain',
  12 + computed: {
  13 + key() {
  14 + return this.$route.path
  15 + }
  16 + }
  17 +}
  18 +</script>
  19 +
  20 +<style scoped>
  21 +.app-main {
  22 + /*50 = navbar */
  23 + min-height: calc(100vh - 50px);
  24 + width: 100%;
  25 + position: relative;
  26 + overflow: hidden;
  27 +}
  28 +.fixed-header+.app-main {
  29 + padding-top: 50px;
  30 +}
  31 +</style>
  32 +
  33 +<style lang="scss">
  34 +// fix css style bug in open el-dialog
  35 +.el-popup-parent--hidden {
  36 + .fixed-header {
  37 + padding-right: 15px;
  38 + }
  39 +}
  40 +</style>
  1 +<template>
  2 + <div class="navbar">
  3 + <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
  4 +
  5 + <breadcrumb class="breadcrumb-container" />
  6 +
  7 + <div class="right-menu">
  8 + <el-dropdown class="avatar-container" trigger="click">
  9 + <div class="avatar-wrapper">
  10 + <img :src="imgUrl+'?imageView2/1/w/80/h/80'" class="user-avatar">
  11 + <i class="el-icon-caret-bottom" />
  12 + </div>
  13 + <el-dropdown-menu slot="dropdown" class="user-dropdown">
  14 + <router-link to="/">
  15 + <el-dropdown-item>
  16 + Home
  17 + </el-dropdown-item>
  18 + </router-link>
  19 + <el-dropdown-item divided>
  20 + <span style="display:block;" @click="logout">Log Out</span>
  21 + </el-dropdown-item>
  22 + </el-dropdown-menu>
  23 + </el-dropdown>
  24 + </div>
  25 + </div>
  26 +</template>
  27 +
  28 +<script>
  29 +import { mapGetters } from 'vuex'
  30 +import Breadcrumb from '@/components/Breadcrumb'
  31 +import Hamburger from '@/components/Hamburger'
  32 +import imgUrl from '@/assets/avatar.gif'
  33 +
  34 +export default {
  35 + data(){
  36 + return{
  37 + imgUrl:imgUrl,
  38 + }
  39 + },
  40 + components: {
  41 + Breadcrumb,
  42 + Hamburger
  43 + },
  44 + computed: {
  45 + ...mapGetters([
  46 + 'sidebar',
  47 + 'avatar'
  48 + ])
  49 + },
  50 + methods: {
  51 + toggleSideBar() {
  52 + this.$store.dispatch('app/toggleSideBar')
  53 + },
  54 + async logout() {
  55 + await this.$store.dispatch('user/logout')
  56 + this.$router.push(`/login?redirect=${this.$route.fullPath}`)
  57 + }
  58 + }
  59 +}
  60 +</script>
  61 +
  62 +<style lang="scss" scoped>
  63 +.navbar {
  64 + height: 50px;
  65 + overflow: hidden;
  66 + position: relative;
  67 + background: #fff;
  68 + box-shadow: 0 1px 4px rgba(0,21,41,.08);
  69 +
  70 + .hamburger-container {
  71 + line-height: 46px;
  72 + height: 100%;
  73 + float: left;
  74 + cursor: pointer;
  75 + transition: background .3s;
  76 + -webkit-tap-highlight-color:transparent;
  77 +
  78 + &:hover {
  79 + background: rgba(0, 0, 0, .025)
  80 + }
  81 + }
  82 +
  83 + .breadcrumb-container {
  84 + float: left;
  85 + }
  86 +
  87 + .right-menu {
  88 + float: right;
  89 + height: 100%;
  90 + line-height: 50px;
  91 +
  92 + &:focus {
  93 + outline: none;
  94 + }
  95 +
  96 + .right-menu-item {
  97 + display: inline-block;
  98 + padding: 0 8px;
  99 + height: 100%;
  100 + font-size: 18px;
  101 + color: #5a5e66;
  102 + vertical-align: text-bottom;
  103 +
  104 + &.hover-effect {
  105 + cursor: pointer;
  106 + transition: background .3s;
  107 +
  108 + &:hover {
  109 + background: rgba(0, 0, 0, .025)
  110 + }
  111 + }
  112 + }
  113 +
  114 + .avatar-container {
  115 + margin-right: 30px;
  116 +
  117 + .avatar-wrapper {
  118 + margin-top: 5px;
  119 + position: relative;
  120 +
  121 + .user-avatar {
  122 + cursor: pointer;
  123 + width: 40px;
  124 + height: 40px;
  125 + border-radius: 10px;
  126 + }
  127 +
  128 + .el-icon-caret-bottom {
  129 + cursor: pointer;
  130 + position: absolute;
  131 + right: -20px;
  132 + top: 25px;
  133 + font-size: 12px;
  134 + }
  135 + }
  136 + }
  137 + }
  138 +}
  139 +</style>
  1 +export default {
  2 + computed: {
  3 + device() {
  4 + return this.$store.state.app.device
  5 + }
  6 + },
  7 + mounted() {
  8 + // In order to fix the click on menu on the ios device will trigger the mouseleave bug
  9 + // https://github.com/PanJiaChen/vue-element-admin/issues/1135
  10 + this.fixBugIniOS()
  11 + },
  12 + methods: {
  13 + fixBugIniOS() {
  14 + const $subMenu = this.$refs.subMenu
  15 + if ($subMenu) {
  16 + const handleMouseleave = $subMenu.handleMouseleave
  17 + $subMenu.handleMouseleave = (e) => {
  18 + if (this.device === 'mobile') {
  19 + return
  20 + }
  21 + handleMouseleave(e)
  22 + }
  23 + }
  24 + }
  25 + }
  26 +}
  1 +<script>
  2 +export default {
  3 + name: 'MenuItem',
  4 + functional: true,
  5 + props: {
  6 + icon: {
  7 + type: String,
  8 + default: ''
  9 + },
  10 + title: {
  11 + type: String,
  12 + default: ''
  13 + }
  14 + },
  15 + render(h, context) {
  16 + const { icon, title } = context.props
  17 + const vnodes = []
  18 +
  19 + if (icon) {
  20 + vnodes.push(<svg-icon icon-class={icon}/>)
  21 + }
  22 +
  23 + if (title) {
  24 + vnodes.push(<span slot='title'>{(title)}</span>)
  25 + }
  26 + return vnodes
  27 + }
  28 +}
  29 +</script>
  1 +
  2 +<template>
  3 + <!-- eslint-disable vue/require-component-is -->
  4 + <component v-bind="linkProps(to)">
  5 + <slot />
  6 + </component>
  7 +</template>
  8 +
  9 +<script>
  10 +import { isExternal } from '@/utils/validate'
  11 +
  12 +export default {
  13 + props: {
  14 + to: {
  15 + type: String,
  16 + required: true
  17 + }
  18 + },
  19 + methods: {
  20 + linkProps(url) {
  21 + if (isExternal(url)) {
  22 + return {
  23 + is: 'a',
  24 + href: url,
  25 + target: '_blank',
  26 + rel: 'noopener'
  27 + }
  28 + }
  29 + return {
  30 + is: 'router-link',
  31 + to: url
  32 + }
  33 + }
  34 + }
  35 +}
  36 +</script>
  1 +<template>
  2 + <div class="sidebar-logo-container" :class="{'collapse':collapse}">
  3 + <transition name="sidebarLogoFade">
  4 + <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
  5 + <img v-if="logo" :src="logo" class="sidebar-logo">
  6 + <h1 v-else class="sidebar-title">{{ title }} </h1>
  7 + </router-link>
  8 + <router-link v-else key="expand" class="sidebar-logo-link" to="/">
  9 + <img v-if="logo" :src="logo" class="sidebar-logo">
  10 + <h1 class="sidebar-title">{{ title }} </h1>
  11 + </router-link>
  12 + </transition>
  13 + </div>
  14 +</template>
  15 +
  16 +<script>
  17 +export default {
  18 + name: 'SidebarLogo',
  19 + props: {
  20 + collapse: {
  21 + type: Boolean,
  22 + required: true
  23 + }
  24 + },
  25 + data() {
  26 + return {
  27 + title: 'Vue Admin Template',
  28 + logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
  29 + }
  30 + }
  31 +}
  32 +</script>
  33 +
  34 +<style lang="scss" scoped>
  35 +.sidebarLogoFade-enter-active {
  36 + transition: opacity 1.5s;
  37 +}
  38 +
  39 +.sidebarLogoFade-enter,
  40 +.sidebarLogoFade-leave-to {
  41 + opacity: 0;
  42 +}
  43 +
  44 +.sidebar-logo-container {
  45 + position: relative;
  46 + width: 100%;
  47 + height: 50px;
  48 + line-height: 50px;
  49 + background: #2b2f3a;
  50 + text-align: center;
  51 + overflow: hidden;
  52 +
  53 + & .sidebar-logo-link {
  54 + height: 100%;
  55 + width: 100%;
  56 +
  57 + & .sidebar-logo {
  58 + width: 32px;
  59 + height: 32px;
  60 + vertical-align: middle;
  61 + margin-right: 12px;
  62 + }
  63 +
  64 + & .sidebar-title {
  65 + display: inline-block;
  66 + margin: 0;
  67 + color: #fff;
  68 + font-weight: 600;
  69 + line-height: 50px;
  70 + font-size: 14px;
  71 + font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
  72 + vertical-align: middle;
  73 + }
  74 + }
  75 +
  76 + &.collapse {
  77 + .sidebar-logo {
  78 + margin-right: 0px;
  79 + }
  80 + }
  81 +}
  82 +</style>
  1 +<template>
  2 + <div v-if="!item.hidden" class="menu-wrapper">
  3 + <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
  4 + <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
  5 + <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
  6 + <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
  7 + </el-menu-item>
  8 + </app-link>
  9 + </template>
  10 +
  11 + <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
  12 + <template slot="title">
  13 + <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
  14 + </template>
  15 + <sidebar-item
  16 + v-for="child in item.children"
  17 + :key="child.path"
  18 + :is-nest="true"
  19 + :item="child"
  20 + :base-path="resolvePath(child.path)"
  21 + class="nest-menu"
  22 + />
  23 + </el-submenu>
  24 + </div>
  25 +</template>
  26 +
  27 +<script>
  28 +import path from 'path'
  29 +import { isExternal } from '@/utils/validate'
  30 +import Item from './Item'
  31 +import AppLink from './Link'
  32 +import FixiOSBug from './FixiOSBug'
  33 +
  34 +export default {
  35 + name: 'SidebarItem',
  36 + components: { Item, AppLink },
  37 + mixins: [FixiOSBug],
  38 + props: {
  39 + // route object
  40 + item: {
  41 + type: Object,
  42 + required: true
  43 + },
  44 + isNest: {
  45 + type: Boolean,
  46 + default: false
  47 + },
  48 + basePath: {
  49 + type: String,
  50 + default: ''
  51 + }
  52 + },
  53 + data() {
  54 + // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
  55 + // TODO: refactor with render function
  56 + this.onlyOneChild = null
  57 + return {}
  58 + },
  59 + methods: {
  60 + hasOneShowingChild(children = [], parent) {
  61 + const showingChildren = children.filter(item => {
  62 + if (item.hidden) {
  63 + return false
  64 + } else {
  65 + // Temp set(will be used if only has one showing child)
  66 + this.onlyOneChild = item
  67 + return true
  68 + }
  69 + })
  70 +
  71 + // When there is only one child router, the child router is displayed by default
  72 + if (showingChildren.length === 1) {
  73 + return true
  74 + }
  75 +
  76 + // Show parent if there are no child router to display
  77 + if (showingChildren.length === 0) {
  78 + this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
  79 + return true
  80 + }
  81 +
  82 + return false
  83 + },
  84 + resolvePath(routePath) {
  85 + if (isExternal(routePath)) {
  86 + return routePath
  87 + }
  88 + if (isExternal(this.basePath)) {
  89 + return this.basePath
  90 + }
  91 + return path.resolve(this.basePath, routePath)
  92 + }
  93 + }
  94 +}
  95 +</script>
  1 +<template>
  2 + <div :class="{'has-logo':showLogo}">
  3 + <logo v-if="showLogo" :collapse="isCollapse" />
  4 + <el-scrollbar wrap-class="scrollbar-wrapper">
  5 + <el-menu
  6 + :default-active="activeMenu"
  7 + :collapse="isCollapse"
  8 + :background-color="variables.menuBg"
  9 + :text-color="variables.menuText"
  10 + :unique-opened="false"
  11 + :active-text-color="variables.menuActiveText"
  12 + :collapse-transition="false"
  13 + mode="vertical"
  14 + >
  15 + <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" />
  16 + </el-menu>
  17 + </el-scrollbar>
  18 + </div>
  19 +</template>
  20 +
  21 +<script>
  22 +import { mapGetters } from 'vuex'
  23 +import Logo from './Logo'
  24 +import SidebarItem from './SidebarItem'
  25 +import variables from '@/styles/variables.scss'
  26 +
  27 +export default {
  28 + components: { SidebarItem, Logo },
  29 + computed: {
  30 + ...mapGetters([
  31 + 'sidebar'
  32 + ]),
  33 + routes() {
  34 + return this.$router.options.routes
  35 + },
  36 + activeMenu() {
  37 + const route = this.$route
  38 + const { meta, path } = route
  39 + // if set path, the sidebar will highlight the path you set
  40 + if (meta.activeMenu) {
  41 + return meta.activeMenu
  42 + }
  43 + return path
  44 + },
  45 + showLogo() {
  46 + return this.$store.state.settings.sidebarLogo
  47 + },
  48 + variables() {
  49 + return variables
  50 + },
  51 + isCollapse() {
  52 + return !this.sidebar.opened
  53 + }
  54 + }
  55 +}
  56 +</script>
  1 +export { default as Navbar } from './Navbar'
  2 +export { default as Sidebar } from './Sidebar'
  3 +export { default as AppMain } from './AppMain'
  1 +<template>
  2 + <div :class="classObj" class="app-wrapper">
  3 + <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
  4 + <sidebar class="sidebar-container" />
  5 + <div class="main-container">
  6 + <div :class="{'fixed-header':fixedHeader}">
  7 + <navbar />
  8 + </div>
  9 + <app-main />
  10 + </div>
  11 + </div>
  12 +</template>
  13 +
  14 +<script>
  15 +import { Navbar, Sidebar, AppMain } from './components'
  16 +import ResizeMixin from './mixin/ResizeHandler'
  17 +
  18 +export default {
  19 + name: 'Layout',
  20 + components: {
  21 + Navbar,
  22 + Sidebar,
  23 + AppMain
  24 + },
  25 + mixins: [ResizeMixin],
  26 + computed: {
  27 + sidebar() {
  28 + return this.$store.state.app.sidebar
  29 + },
  30 + device() {
  31 + return this.$store.state.app.device
  32 + },
  33 + fixedHeader() {
  34 + return this.$store.state.settings.fixedHeader
  35 + },
  36 + classObj() {
  37 + return {
  38 + hideSidebar: !this.sidebar.opened,
  39 + openSidebar: this.sidebar.opened,
  40 + withoutAnimation: this.sidebar.withoutAnimation,
  41 + mobile: this.device === 'mobile'
  42 + }
  43 + }
  44 + },
  45 + methods: {
  46 + handleClickOutside() {
  47 + this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
  48 + }
  49 + }
  50 +}
  51 +</script>
  52 +
  53 +<style lang="scss" scoped>
  54 + @import "~@/styles/mixin.scss";
  55 + @import "~@/styles/variables.scss";
  56 +
  57 + .app-wrapper {
  58 + @include clearfix;
  59 + position: relative;
  60 + height: 100%;
  61 + width: 100%;
  62 + &.mobile.openSidebar{
  63 + position: fixed;
  64 + top: 0;
  65 + }
  66 + }
  67 + .drawer-bg {
  68 + background: #000;
  69 + opacity: 0.3;
  70 + width: 100%;
  71 + top: 0;
  72 + height: 100%;
  73 + position: absolute;
  74 + z-index: 999;
  75 + }
  76 +
  77 + .fixed-header {
  78 + position: fixed;
  79 + top: 0;
  80 + right: 0;
  81 + z-index: 9;
  82 + width: calc(100% - #{$sideBarWidth});
  83 + transition: width 0.28s;
  84 + }
  85 +
  86 + .hideSidebar .fixed-header {
  87 + width: calc(100% - 54px)
  88 + }
  89 +
  90 + .mobile .fixed-header {
  91 + width: 100%;
  92 + }
  93 +</style>
  1 +import store from '@/store'
  2 +
  3 +const { body } = document
  4 +const WIDTH = 992 // refer to Bootstrap's responsive design
  5 +
  6 +export default {
  7 + watch: {
  8 + $route(route) {
  9 + if (this.device === 'mobile' && this.sidebar.opened) {
  10 + store.dispatch('app/closeSideBar', { withoutAnimation: false })
  11 + }
  12 + }
  13 + },
  14 + beforeMount() {
  15 + window.addEventListener('resize', this.$_resizeHandler)
  16 + },
  17 + beforeDestroy() {
  18 + window.removeEventListener('resize', this.$_resizeHandler)
  19 + },
  20 + mounted() {
  21 + const isMobile = this.$_isMobile()
  22 + if (isMobile) {
  23 + store.dispatch('app/toggleDevice', 'mobile')
  24 + store.dispatch('app/closeSideBar', { withoutAnimation: true })
  25 + }
  26 + },
  27 + methods: {
  28 + // use $_ for mixins properties
  29 + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
  30 + $_isMobile() {
  31 + const rect = body.getBoundingClientRect()
  32 + return rect.width - 1 < WIDTH
  33 + },
  34 + $_resizeHandler() {
  35 + if (!document.hidden) {
  36 + const isMobile = this.$_isMobile()
  37 + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
  38 +
  39 + if (isMobile) {
  40 + store.dispatch('app/closeSideBar', { withoutAnimation: true })
  41 + }
  42 + }
  43 + }
  44 + }
  45 +}
  1 +import Vue from 'vue'
  2 +
  3 +import 'normalize.css/normalize.css' // A modern alternative to CSS resets
  4 +
  5 +import ElementUI from 'element-ui'
  6 +import 'element-ui/lib/theme-chalk/index.css'
  7 +import locale from 'element-ui/lib/locale/lang/en' // lang i18n
  8 +
  9 +import '@/styles/index.scss' // global css
  10 +
  11 +import App from './App'
  12 +import store from './store'
  13 +import router from './router'
  14 +
  15 +import '@/icons' // icon
  16 +import '@/permission' // permission control
  17 +
  18 +/**
  19 + * If you don't want to use mock-server
  20 + * you want to use MockJs for mock api
  21 + * you can execute: mockXHR()
  22 + *
  23 + * Currently MockJs will be used in the production environment,
  24 + * please remove it before going online! ! !
  25 + */
  26 +import { mockXHR } from '../mock'
  27 +if (process.env.NODE_ENV === 'production') {
  28 + mockXHR()
  29 +}
  30 +
  31 +// set ElementUI lang to EN
  32 +Vue.use(ElementUI, { locale })
  33 +// 如果想要中文版 element-ui,按如下方式声明
  34 +// Vue.use(ElementUI)
  35 +
  36 +Vue.config.productionTip = false
  37 +
  38 +new Vue({
  39 + el: '#app',
  40 + router,
  41 + store,
  42 + render: h => h(App)
  43 +})
  1 +import router from './router'
  2 +import store from './store'
  3 +import { Message } from 'element-ui'
  4 +import NProgress from 'nprogress' // progress bar
  5 +import 'nprogress/nprogress.css' // progress bar style
  6 +import { getToken } from '@/utils/auth' // get token from cookie
  7 +import getPageTitle from '@/utils/get-page-title'
  8 +
  9 +NProgress.configure({ showSpinner: false }) // NProgress Configuration
  10 +
  11 +const whiteList = ['/login'] // no redirect whitelist
  12 +
  13 +router.beforeEach(async(to, from, next) => {
  14 + // start progress bar
  15 + NProgress.start()
  16 + next()
  17 + NProgress.done()
  18 +
  19 + // set page title
  20 + document.title = getPageTitle(to.meta.title)
  21 +
  22 + // determine whether the user has logged in
  23 + // const hasToken = getToken()
  24 +
  25 + // if (hasToken) {
  26 + // if (to.path === '/login') {
  27 + // // if is logged in, redirect to the home page
  28 + // next()
  29 + // NProgress.done()
  30 + // } else {
  31 + // next()
  32 + // }
  33 + // } else {
  34 + // next()
  35 + // }
  36 +})
  37 +
  38 +router.afterEach(() => {
  39 + // finish progress bar
  40 + NProgress.done()
  41 +})
  1 +import Vue from 'vue'
  2 +import Router from 'vue-router'
  3 +
  4 +Vue.use(Router)
  5 +
  6 +/* Layout */
  7 +import Layout from '@/layout'
  8 +
  9 +/**
  10 + * Note: sub-menu only appear when route children.length >= 1
  11 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
  12 + *
  13 + * hidden: true if set true, item will not show in the sidebar(default is false)
  14 + * alwaysShow: true if set true, will always show the root menu
  15 + * if not set alwaysShow, when item has more than one children route,
  16 + * it will becomes nested mode, otherwise not show the root menu
  17 + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb
  18 + * name:'router-name' the name is used by <keep-alive> (must set!!!)
  19 + * meta : {
  20 + roles: ['admin','editor'] control the page roles (you can set multiple roles)
  21 + title: 'title' the name show in sidebar and breadcrumb (recommend set)
  22 + icon: 'svg-name' the icon show in the sidebar
  23 + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true)
  24 + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set
  25 + }
  26 + */
  27 +
  28 +/**
  29 + * constantRoutes
  30 + * a base page that does not have permission requirements
  31 + * all roles can be accessed
  32 + */
  33 +export const constantRoutes = [
  34 + {
  35 + path: '/',
  36 + component: Layout,
  37 + redirect: '/dashboard',
  38 + children: [{
  39 + path: 'dashboard',
  40 + name: 'Dashboard',
  41 + component: () => import('@/views/dashboard/index'),
  42 + meta: { title: '首页', icon: 'dashboard' }
  43 + }]
  44 + },
  45 + {
  46 + path: '/declaration',
  47 + component: Layout,
  48 + name: 'declaration',
  49 + meta: {
  50 + title: '货物申报',
  51 + icon: 'example',
  52 + },
  53 + children: [
  54 + {
  55 + path: '/onceDeclaration',
  56 + component: () => import('@/views/declaration/OnceDeclaration'),
  57 + name: 'OnceDeclaration',
  58 + meta: { title: '概要申报', icon: 'guide' }
  59 + },
  60 + {
  61 + path: '/moreDeclaration',
  62 + component: () => import('@/views/declaration/MoreDeclaration'),
  63 + name: 'MoreDeclaration',
  64 + meta: { title: '完整申报', icon: 'clipboard' }
  65 + }
  66 + ]
  67 + }
  68 +]
  69 +
  70 +const createRouter = () => new Router({
  71 + // mode: 'history', // require service support
  72 + scrollBehavior: () => ({ y: 0 }),
  73 + routes: constantRoutes
  74 +})
  75 +
  76 +const router = createRouter()
  77 +
  78 +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
  79 +export function resetRouter() {
  80 + const newRouter = createRouter()
  81 + router.matcher = newRouter.matcher // reset router
  82 +}
  83 +
  84 +export default router
  1 +module.exports = {
  2 +
  3 + title: 'Vue Admin Template',
  4 +
  5 + /**
  6 + * @type {boolean} true | false
  7 + * @description Whether fix the header
  8 + */
  9 + fixedHeader: false,
  10 +
  11 + /**
  12 + * @type {boolean} true | false
  13 + * @description Whether show the logo in sidebar
  14 + */
  15 + sidebarLogo: false
  16 +}
  1 +const getters = {
  2 + sidebar: state => state.app.sidebar,
  3 + device: state => state.app.device,
  4 + token: state => state.user.token,
  5 + avatar: state => state.user.avatar,
  6 + name: state => state.user.name
  7 +}
  8 +export default getters
  1 +import Vue from 'vue'
  2 +import Vuex from 'vuex'
  3 +import getters from './getters'
  4 +import app from './modules/app'
  5 +import settings from './modules/settings'
  6 +import user from './modules/user'
  7 +
  8 +Vue.use(Vuex)
  9 +
  10 +const store = new Vuex.Store({
  11 + modules: {
  12 + app,
  13 + settings,
  14 + user
  15 + },
  16 + getters
  17 +})
  18 +
  19 +export default store
  1 +import Cookies from 'js-cookie'
  2 +
  3 +const state = {
  4 + sidebar: {
  5 + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
  6 + withoutAnimation: false
  7 + },
  8 + device: 'desktop'
  9 +}
  10 +
  11 +const mutations = {
  12 + TOGGLE_SIDEBAR: state => {
  13 + state.sidebar.opened = !state.sidebar.opened
  14 + state.sidebar.withoutAnimation = false
  15 + if (state.sidebar.opened) {
  16 + Cookies.set('sidebarStatus', 1)
  17 + } else {
  18 + Cookies.set('sidebarStatus', 0)
  19 + }
  20 + },
  21 + CLOSE_SIDEBAR: (state, withoutAnimation) => {
  22 + Cookies.set('sidebarStatus', 0)
  23 + state.sidebar.opened = false
  24 + state.sidebar.withoutAnimation = withoutAnimation
  25 + },
  26 + TOGGLE_DEVICE: (state, device) => {
  27 + state.device = device
  28 + }
  29 +}
  30 +
  31 +const actions = {
  32 + toggleSideBar({ commit }) {
  33 + commit('TOGGLE_SIDEBAR')
  34 + },
  35 + closeSideBar({ commit }, { withoutAnimation }) {
  36 + commit('CLOSE_SIDEBAR', withoutAnimation)
  37 + },
  38 + toggleDevice({ commit }, device) {
  39 + commit('TOGGLE_DEVICE', device)
  40 + }
  41 +}
  42 +
  43 +export default {
  44 + namespaced: true,
  45 + state,
  46 + mutations,
  47 + actions
  48 +}
  1 +import defaultSettings from '@/settings'
  2 +
  3 +const { showSettings, fixedHeader, sidebarLogo } = defaultSettings
  4 +
  5 +const state = {
  6 + showSettings: showSettings,
  7 + fixedHeader: fixedHeader,
  8 + sidebarLogo: sidebarLogo
  9 +}
  10 +
  11 +const mutations = {
  12 + CHANGE_SETTING: (state, { key, value }) => {
  13 + if (state.hasOwnProperty(key)) {
  14 + state[key] = value
  15 + }
  16 + }
  17 +}
  18 +
  19 +const actions = {
  20 + changeSetting({ commit }, data) {
  21 + commit('CHANGE_SETTING', data)
  22 + }
  23 +}
  24 +
  25 +export default {
  26 + namespaced: true,
  27 + state,
  28 + mutations,
  29 + actions
  30 +}
  31 +
  1 +import { login, logout, getInfo } from '@/api/user'
  2 +import { getToken, setToken, removeToken } from '@/utils/auth'
  3 +import { resetRouter } from '@/router'
  4 +
  5 +const state = {
  6 + token: getToken(),
  7 + name: '',
  8 + avatar: ''
  9 +}
  10 +
  11 +const mutations = {
  12 + SET_TOKEN: (state, token) => {
  13 + state.token = token
  14 + },
  15 + SET_NAME: (state, name) => {
  16 + state.name = name
  17 + },
  18 + SET_AVATAR: (state, avatar) => {
  19 + state.avatar = avatar
  20 + }
  21 +}
  22 +
  23 +const actions = {
  24 + // user login
  25 + login({ commit }, userInfo) {
  26 + const { username, password } = userInfo
  27 + return new Promise((resolve, reject) => {
  28 + login({ username: username.trim(), password: password }).then(response => {
  29 + const { data } = response
  30 + commit('SET_TOKEN', data.token)
  31 + setToken(data.token)
  32 + resolve()
  33 + }).catch(error => {
  34 + reject(error)
  35 + })
  36 + })
  37 + },
  38 +
  39 + // get user info
  40 + getInfo({ commit, state }) {
  41 + return new Promise((resolve, reject) => {
  42 + getInfo(state.token).then(response => {
  43 + const { data } = response
  44 +
  45 + if (!data) {
  46 + reject('Verification failed, please Login again.')
  47 + }
  48 +
  49 + const { name, avatar } = data
  50 +
  51 + commit('SET_NAME', name)
  52 + commit('SET_AVATAR', avatar)
  53 + resolve(data)
  54 + }).catch(error => {
  55 + reject(error)
  56 + })
  57 + })
  58 + },
  59 +
  60 + // user logout
  61 + logout({ commit, state }) {
  62 + return new Promise((resolve, reject) => {
  63 + logout(state.token).then(() => {
  64 + commit('SET_TOKEN', '')
  65 + removeToken()
  66 + resetRouter()
  67 + resolve()
  68 + }).catch(error => {
  69 + reject(error)
  70 + })
  71 + })
  72 + },
  73 +
  74 + // remove token
  75 + resetToken({ commit }) {
  76 + return new Promise(resolve => {
  77 + commit('SET_TOKEN', '')
  78 + removeToken()
  79 + resolve()
  80 + })
  81 + }
  82 +}
  83 +
  84 +export default {
  85 + namespaced: true,
  86 + state,
  87 + mutations,
  88 + actions
  89 +}
  90 +
  1 +// cover some element-ui styles
  2 +
  3 +.el-breadcrumb__inner,
  4 +.el-breadcrumb__inner a {
  5 + font-weight: 400 !important;
  6 +}
  7 +
  8 +.el-upload {
  9 + input[type="file"] {
  10 + display: none !important;
  11 + }
  12 +}
  13 +
  14 +.el-upload__input {
  15 + display: none;
  16 +}
  17 +
  18 +
  19 +// to fixed https://github.com/ElemeFE/element/issues/2461
  20 +.el-dialog {
  21 + transform: none;
  22 + left: 0;
  23 + position: relative;
  24 + margin: 0 auto;
  25 +}
  26 +
  27 +// refine element ui upload
  28 +.upload-container {
  29 + .el-upload {
  30 + width: 100%;
  31 +
  32 + .el-upload-dragger {
  33 + width: 100%;
  34 + height: 200px;
  35 + }
  36 + }
  37 +}
  38 +
  39 +// dropdown
  40 +.el-dropdown-menu {
  41 + a {
  42 + display: block
  43 + }
  44 +}
  45 +
  46 +// to fix el-date-picker css style
  47 +.el-range-separator {
  48 + box-sizing: content-box;
  49 +}
  1 +@import './variables.scss';
  2 +@import './mixin.scss';
  3 +@import './transition.scss';
  4 +@import './element-ui.scss';
  5 +@import './sidebar.scss';
  6 +
  7 +body {
  8 + height: 100%;
  9 + -moz-osx-font-smoothing: grayscale;
  10 + -webkit-font-smoothing: antialiased;
  11 + text-rendering: optimizeLegibility;
  12 + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
  13 +}
  14 +
  15 +label {
  16 + font-weight: 700;
  17 +}
  18 +
  19 +html {
  20 + height: 100%;
  21 + box-sizing: border-box;
  22 +}
  23 +
  24 +#app {
  25 + height: 100%;
  26 +}
  27 +
  28 +*,
  29 +*:before,
  30 +*:after {
  31 + box-sizing: inherit;
  32 +}
  33 +
  34 +a:focus,
  35 +a:active {
  36 + outline: none;
  37 +}
  38 +
  39 +a,
  40 +a:focus,
  41 +a:hover {
  42 + cursor: pointer;
  43 + color: inherit;
  44 + text-decoration: none;
  45 +}
  46 +
  47 +div:focus {
  48 + outline: none;
  49 +}
  50 +
  51 +.clearfix {
  52 + &:after {
  53 + visibility: hidden;
  54 + display: block;
  55 + font-size: 0;
  56 + content: " ";
  57 + clear: both;
  58 + height: 0;
  59 + }
  60 +}
  61 +
  62 +// main-container global css
  63 +.app-container {
  64 + padding: 20px;
  65 +}
  1 +@mixin clearfix {
  2 + &:after {
  3 + content: "";
  4 + display: table;
  5 + clear: both;
  6 + }
  7 +}
  8 +
  9 +@mixin scrollBar {
  10 + &::-webkit-scrollbar-track-piece {
  11 + background: #d3dce6;
  12 + }
  13 +
  14 + &::-webkit-scrollbar {
  15 + width: 6px;
  16 + }
  17 +
  18 + &::-webkit-scrollbar-thumb {
  19 + background: #99a9bf;
  20 + border-radius: 20px;
  21 + }
  22 +}
  23 +
  24 +@mixin relative {
  25 + position: relative;
  26 + width: 100%;
  27 + height: 100%;
  28 +}
  1 +#app {
  2 +
  3 + .main-container {
  4 + min-height: 100%;
  5 + transition: margin-left .28s;
  6 + margin-left: $sideBarWidth;
  7 + position: relative;
  8 + }
  9 +
  10 + .sidebar-container {
  11 + transition: width 0.28s;
  12 + width: $sideBarWidth !important;
  13 + background-color: $menuBg;
  14 + height: 100%;
  15 + position: fixed;
  16 + font-size: 0px;
  17 + top: 0;
  18 + bottom: 0;
  19 + left: 0;
  20 + z-index: 1001;
  21 + overflow: hidden;
  22 +
  23 + // reset element-ui css
  24 + .horizontal-collapse-transition {
  25 + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
  26 + }
  27 +
  28 + .scrollbar-wrapper {
  29 + overflow-x: hidden !important;
  30 + }
  31 +
  32 + .el-scrollbar__bar.is-vertical {
  33 + right: 0px;
  34 + }
  35 +
  36 + .el-scrollbar {
  37 + height: 100%;
  38 + }
  39 +
  40 + &.has-logo {
  41 + .el-scrollbar {
  42 + height: calc(100% - 50px);
  43 + }
  44 + }
  45 +
  46 + .is-horizontal {
  47 + display: none;
  48 + }
  49 +
  50 + a {
  51 + display: inline-block;
  52 + width: 100%;
  53 + overflow: hidden;
  54 + }
  55 +
  56 + .svg-icon {
  57 + margin-right: 16px;
  58 + }
  59 +
  60 + .el-menu {
  61 + border: none;
  62 + height: 100%;
  63 + width: 100% !important;
  64 + }
  65 +
  66 + // menu hover
  67 + .submenu-title-noDropdown,
  68 + .el-submenu__title {
  69 + &:hover {
  70 + background-color: $menuHover !important;
  71 + }
  72 + }
  73 +
  74 + .is-active>.el-submenu__title {
  75 + color: $subMenuActiveText !important;
  76 + }
  77 +
  78 + & .nest-menu .el-submenu>.el-submenu__title,
  79 + & .el-submenu .el-menu-item {
  80 + min-width: $sideBarWidth !important;
  81 + background-color: $subMenuBg !important;
  82 +
  83 + &:hover {
  84 + background-color: $subMenuHover !important;
  85 + }
  86 + }
  87 + }
  88 +
  89 + .hideSidebar {
  90 + .sidebar-container {
  91 + width: 54px !important;
  92 + }
  93 +
  94 + .main-container {
  95 + margin-left: 54px;
  96 + }
  97 +
  98 + .submenu-title-noDropdown {
  99 + padding: 0 !important;
  100 + position: relative;
  101 +
  102 + .el-tooltip {
  103 + padding: 0 !important;
  104 +
  105 + .svg-icon {
  106 + margin-left: 20px;
  107 + }
  108 + }
  109 + }
  110 +
  111 + .el-submenu {
  112 + overflow: hidden;
  113 +
  114 + &>.el-submenu__title {
  115 + padding: 0 !important;
  116 +
  117 + .svg-icon {
  118 + margin-left: 20px;
  119 + }
  120 +
  121 + .el-submenu__icon-arrow {
  122 + display: none;
  123 + }
  124 + }
  125 + }
  126 +
  127 + .el-menu--collapse {
  128 + .el-submenu {
  129 + &>.el-submenu__title {
  130 + &>span {
  131 + height: 0;
  132 + width: 0;
  133 + overflow: hidden;
  134 + visibility: hidden;
  135 + display: inline-block;
  136 + }
  137 + }
  138 + }
  139 + }
  140 + }
  141 +
  142 + .el-menu--collapse .el-menu .el-submenu {
  143 + min-width: $sideBarWidth !important;
  144 + }
  145 +
  146 + // mobile responsive
  147 + .mobile {
  148 + .main-container {
  149 + margin-left: 0px;
  150 + }
  151 +
  152 + .sidebar-container {
  153 + transition: transform .28s;
  154 + width: $sideBarWidth !important;
  155 + }
  156 +
  157 + &.hideSidebar {
  158 + .sidebar-container {
  159 + pointer-events: none;
  160 + transition-duration: 0.3s;
  161 + transform: translate3d(-$sideBarWidth, 0, 0);
  162 + }
  163 + }
  164 + }
  165 +
  166 + .withoutAnimation {
  167 +
  168 + .main-container,
  169 + .sidebar-container {
  170 + transition: none;
  171 + }
  172 + }
  173 +}
  174 +
  175 +// when menu collapsed
  176 +.el-menu--vertical {
  177 + &>.el-menu {
  178 + .svg-icon {
  179 + margin-right: 16px;
  180 + }
  181 + }
  182 +
  183 + .nest-menu .el-submenu>.el-submenu__title,
  184 + .el-menu-item {
  185 + &:hover {
  186 + // you can use $subMenuHover
  187 + background-color: $menuHover !important;
  188 + }
  189 + }
  190 +
  191 + // the scroll bar appears when the subMenu is too long
  192 + >.el-menu--popup {
  193 + max-height: 100vh;
  194 + overflow-y: auto;
  195 +
  196 + &::-webkit-scrollbar-track-piece {
  197 + background: #d3dce6;
  198 + }
  199 +
  200 + &::-webkit-scrollbar {
  201 + width: 6px;
  202 + }
  203 +
  204 + &::-webkit-scrollbar-thumb {
  205 + background: #99a9bf;
  206 + border-radius: 20px;
  207 + }
  208 + }
  209 +}
  1 +// global transition css
  2 +
  3 +/* fade */
  4 +.fade-enter-active,
  5 +.fade-leave-active {
  6 + transition: opacity 0.28s;
  7 +}
  8 +
  9 +.fade-enter,
  10 +.fade-leave-active {
  11 + opacity: 0;
  12 +}
  13 +
  14 +/* fade-transform */
  15 +.fade-transform-leave-active,
  16 +.fade-transform-enter-active {
  17 + transition: all .5s;
  18 +}
  19 +
  20 +.fade-transform-enter {
  21 + opacity: 0;
  22 + transform: translateX(-30px);
  23 +}
  24 +
  25 +.fade-transform-leave-to {
  26 + opacity: 0;
  27 + transform: translateX(30px);
  28 +}
  29 +
  30 +/* breadcrumb transition */
  31 +.breadcrumb-enter-active,
  32 +.breadcrumb-leave-active {
  33 + transition: all .5s;
  34 +}
  35 +
  36 +.breadcrumb-enter,
  37 +.breadcrumb-leave-active {
  38 + opacity: 0;
  39 + transform: translateX(20px);
  40 +}
  41 +
  42 +.breadcrumb-move {
  43 + transition: all .5s;
  44 +}
  45 +
  46 +.breadcrumb-leave-active {
  47 + position: absolute;
  48 +}