[
  {
    "path": ".editorconfig",
    "content": "# https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\ninsert_final_newline = false\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".eslintignore",
    "content": "build/*.js\nsrc/assets\npublic\ndist\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  parserOptions: {\n    parser: 'babel-eslint',\n    sourceType: 'module'\n  },\n  env: {\n    browser: true,\n    node: true,\n    es6: true,\n  },\n  extends: ['plugin:vue/recommended', 'eslint:recommended'],\n\n  // add your custom rules here\n  //it is base on https://github.com/vuejs/eslint-config-vue\n  rules: {\n    \"vue/max-attributes-per-line\": [2, {\n      \"singleline\": 10,\n      \"multiline\": {\n        \"max\": 1,\n        \"allowFirstLine\": false\n      }\n    }],\n    \"vue/singleline-html-element-content-newline\": \"off\",\n    \"vue/multiline-html-element-content-newline\":\"off\",\n    \"vue/name-property-casing\": [\"error\", \"PascalCase\"],\n    \"vue/no-v-html\": \"off\",\n    'accessor-pairs': 2,\n    'arrow-spacing': [2, {\n      'before': true,\n      'after': true\n    }],\n    'block-spacing': [2, 'always'],\n    'brace-style': [2, '1tbs', {\n      'allowSingleLine': true\n    }],\n    'camelcase': [0, {\n      'properties': 'always'\n    }],\n    'comma-dangle': [2, 'never'],\n    'comma-spacing': [2, {\n      'before': false,\n      'after': true\n    }],\n    'comma-style': [2, 'last'],\n    'constructor-super': 2,\n    'curly': [2, 'multi-line'],\n    'dot-location': [2, 'property'],\n    'eol-last': 2,\n    'eqeqeq': [\"error\", \"always\", {\"null\": \"ignore\"}],\n    'generator-star-spacing': [2, {\n      'before': true,\n      'after': true\n    }],\n    'handle-callback-err': [2, '^(err|error)$'],\n    'indent': [2, 2, {\n      'SwitchCase': 1\n    }],\n    'jsx-quotes': [2, 'prefer-single'],\n    'key-spacing': [2, {\n      'beforeColon': false,\n      'afterColon': true\n    }],\n    'keyword-spacing': [2, {\n      'before': true,\n      'after': true\n    }],\n    'new-cap': [2, {\n      'newIsCap': true,\n      'capIsNew': false\n    }],\n    'new-parens': 2,\n    'no-array-constructor': 2,\n    'no-caller': 2,\n    'no-console': 'off',\n    'no-class-assign': 2,\n    'no-cond-assign': 2,\n    'no-const-assign': 2,\n    'no-control-regex': 0,\n    'no-delete-var': 2,\n    'no-dupe-args': 2,\n    'no-dupe-class-members': 2,\n    'no-dupe-keys': 2,\n    'no-duplicate-case': 2,\n    'no-empty-character-class': 2,\n    'no-empty-pattern': 2,\n    'no-eval': 2,\n    'no-ex-assign': 2,\n    'no-extend-native': 2,\n    'no-extra-bind': 2,\n    'no-extra-boolean-cast': 2,\n    'no-extra-parens': [2, 'functions'],\n    'no-fallthrough': 2,\n    'no-floating-decimal': 2,\n    'no-func-assign': 2,\n    'no-implied-eval': 2,\n    'no-inner-declarations': [2, 'functions'],\n    'no-invalid-regexp': 2,\n    'no-irregular-whitespace': 2,\n    'no-iterator': 2,\n    'no-label-var': 2,\n    'no-labels': [2, {\n      'allowLoop': false,\n      'allowSwitch': false\n    }],\n    'no-lone-blocks': 2,\n    'no-mixed-spaces-and-tabs': 2,\n    'no-multi-spaces': 2,\n    'no-multi-str': 2,\n    'no-multiple-empty-lines': [2, {\n      'max': 1\n    }],\n    'no-native-reassign': 2,\n    'no-negated-in-lhs': 2,\n    'no-new-object': 2,\n    'no-new-require': 2,\n    'no-new-symbol': 2,\n    'no-new-wrappers': 2,\n    'no-obj-calls': 2,\n    'no-octal': 2,\n    'no-octal-escape': 2,\n    'no-path-concat': 2,\n    'no-proto': 2,\n    'no-redeclare': 2,\n    'no-regex-spaces': 2,\n    'no-return-assign': [2, 'except-parens'],\n    'no-self-assign': 2,\n    'no-self-compare': 2,\n    'no-sequences': 2,\n    'no-shadow-restricted-names': 2,\n    'no-spaced-func': 2,\n    'no-sparse-arrays': 2,\n    'no-this-before-super': 2,\n    'no-throw-literal': 2,\n    'no-trailing-spaces': 2,\n    'no-undef': 2,\n    'no-undef-init': 2,\n    'no-unexpected-multiline': 2,\n    'no-unmodified-loop-condition': 2,\n    'no-unneeded-ternary': [2, {\n      'defaultAssignment': false\n    }],\n    'no-unreachable': 2,\n    'no-unsafe-finally': 2,\n    'no-unused-vars': [2, {\n      'vars': 'all',\n      'args': 'none'\n    }],\n    'no-useless-call': 2,\n    'no-useless-computed-key': 2,\n    'no-useless-constructor': 2,\n    'no-useless-escape': 0,\n    'no-whitespace-before-property': 2,\n    'no-with': 2,\n    'one-var': [2, {\n      'initialized': 'never'\n    }],\n    'operator-linebreak': [2, 'after', {\n      'overrides': {\n        '?': 'before',\n        ':': 'before'\n      }\n    }],\n    'padded-blocks': [2, 'never'],\n    'quotes': [2, 'single', {\n      'avoidEscape': true,\n      'allowTemplateLiterals': true\n    }],\n    'semi': [2, 'never'],\n    'semi-spacing': [2, {\n      'before': false,\n      'after': true\n    }],\n    'space-before-blocks': [2, 'always'],\n    'space-before-function-paren': [2, 'never'],\n    'space-in-parens': [2, 'never'],\n    'space-infix-ops': 2,\n    'space-unary-ops': [2, {\n      'words': true,\n      'nonwords': false\n    }],\n    'spaced-comment': [2, 'always', {\n      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']\n    }],\n    'template-curly-spacing': [2, 'never'],\n    'use-isnan': 2,\n    'valid-typeof': 2,\n    'wrap-iife': [2, 'any'],\n    'yield-star-spacing': [2, 'both'],\n    'yoda': [2, 'never'],\n    'prefer-const': 2,\n    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,\n    'object-curly-spacing': [2, 'always', {\n      objectsInObjects: false\n    }],\n    'array-bracket-spacing': [2, 'never']\n  }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\npatreon: panjiachen\ncustom: https://panjiachen.github.io/vue-element-admin-site/donate\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report（报告问题）\nabout: Create a report to help us improve\n---\n<!--\n    注意：为更好的解决你的问题，请参考模板提供完整信息，准确描述问题，信息不全的 issue 将被关闭。\n\n    Note: In order to better solve your problem, please refer to the template to provide complete information, accurately describe the problem, and the incomplete information issue will be closed.\n-->\n\n\n## Bug report（问题描述）\n\n#### Steps to reproduce（问题复现步骤）\n<!--\n1. [xxx]\n2. [xxx]\n3. [xxxx]\n-->\n\n#### Screenshot or Gif（截图或动态图）\n\n\n#### Link to minimal reproduction（最小可在线还原demo）\n\n<!--\nPlease only use Codepen, JSFiddle, CodeSandbox or a github repo\n-->\n\n#### Other relevant information（格外信息）\n- Your OS:\n- Node.js version:\n- vue-element-admin version:\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature Request（新功能建议）\nabout: Suggest an idea for this project\n---\n\n## Feature request（新功能建议）\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.md",
    "content": "---\nname: Question（提问）\nabout: Asking questions about use\n---\n\n## Question（提问）\n\n<!--\n    提问之前，请确定你已经过自己的努力，尝试解决过这个问题。\n    若是代码相关问题，请不要只截图，请提供在线 demo，以便节约彼此的时间。\n\n    Before asking a question, please make sure that you have tried your best to solve this problem.\n    If it's a code-related issue, please don't just take screenshots. Please provide an online demo to save each other's time.\n-->\n\n#### Steps to reproduce（问题复现步骤）\n<!--\n1. [xxx]\n2. [xxx]\n3. [xxxx]\n-->\n\n#### Screenshot or Gif（截图或动态图）\n\n\n#### Link to minimal reproduction（最小可在线还原demo）\n\n<!--\nPlease only use Codepen, JSFiddle, CodeSandbox or a github repo\n-->\n\n#### Other relevant information（格外信息）\n- Your OS:\n- Node.js version:\n- vue-element-admin version:\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules/\ndist/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n**/*.log\n\ntests/**/coverage/\ntests/e2e/reports\nselenium-debug.log\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.local\n\npackage-lock.json\nyarn.lock\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js: 10\nscript: npm run test\nnotifications:\n  email: false\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017-present PanJiaChen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.es.md",
    "content": "<p align=\"center\">\n  <img width=\"320\" src=\"https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vuejs/vue\">\n    <img src=\"https://img.shields.io/badge/vue-2.6.10-brightgreen.svg\" alt=\"vue\">\n  </a>\n  <a href=\"https://github.com/ElemeFE/element\">\n    <img src=\"https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg\" alt=\"element-ui\">\n  </a>\n  <a href=\"https://travis-ci.org/PanJiaChen/vue-element-admin\" rel=\"nofollow\">\n    <img src=\"https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master\" alt=\"Estado de Construcción\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/mashape/apistatus.svg\" alt=\"Licencia\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/releases\">\n    <img src=\"https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg\" alt=\"Liberación Github\">\n  </a>\n  <a href=\"https://gitter.im/vue-element-admin/discuss\">\n    <img src=\"https://badges.gitter.im/Join%20Chat.svg\" alt=\"Gitter\">\n  </a>\n  <a href=\"https://panjiachen.github.io/vue-element-admin-site/donate\">\n    <img src=\"https://img.shields.io/badge/%24-donate-ff69b4.svg\" alt=\"Donación\">\n  </a>\n</p>\n\nEspañol | [English](./README.md) | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md)\n\n## Introducción\n\n[vue-element-admin](https://panjiachen.github.io/vue-element-admin) es una interfáz de administración preparada para producción. Está basada en [vue](https://github.com/vuejs/vue) y usa [element-ui](https://github.com/ElemeFE/element) como conjunto de herramientas de interfáz de usuario.\n\nVue Element Admin es una solución práctica basada en la nueva plataforma de desarrollo de vue, construida con soporte a i18 para el manejo de múltiples lenguajes, plantillas estándares para aplicaciones de negocio y un conjunto de asombrosas características. Esta herramienta ayuda a construir largas y complejas Aplicacones de una sola página (SPA). Creo que lo que necesites hacer, este proyecto te ayudará.\n\n- [Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin)\n\n- [Documentación](https://panjiachen.github.io/vue-element-admin-site/)\n\n- [Canal de Gitter](https://gitter.im/vue-element-admin/discuss)\n\n- [Para Donaciones](https://panjiachen.github.io/vue-element-admin-site/donate/)\n\n- [Enlace de Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)\n\n- [Canal de Gitee](https://panjiachen.gitee.io/vue-element-admin/)\n\n- Plantilla base recomendada para usar: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)\n- Aplicación de Escritorio: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)\n- Plantilla de Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Créditos: [@Armour](https://github.com/Armour))\n- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)\n\n**Después de la versión `v4.1.0+`, la rama por defecto master no tendrá soporte para i18n. Por favor utilice la rama [i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), los cambios serán incluidos en la rama master**\n\n**la versión actual es `v4.0+` construida con `vue-cli`. Si encuentra algún problema, por favor coloque un [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). Si desea usar la versión anterior, puede cambiar de rama a [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), no relacionado con `vue-cli`**\n\n**Este proyecto no está soportado para versiones antigüas de navegadores (ej. IE).**\n\n## Preparación\n\nNecesita instalar [node](https://nodejs.org/) y [git](https://git-scm.com/) localmente. El proyecto es basado en [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), toda la solicitud de datos simulada se realiza a través de [Mock.js](https://github.com/nuysoft/Mock).\nEntendiendo y aprendiendo esto pudiera ayudarle con su proyecto.\n\n[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox)\n\n<p align=\"center\">\n  <img width=\"900\" src=\"https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png\">\n</p>\n\n## Patrocinantes\n\nSea un patrocinante y coloque su logo en nuestro LEEME en GitHub con un enlace directo a su sitio web. [[Se un Patrocinante]](https://www.patreon.com/panjiachen)\n\n### Akveo\n<a href=\"https://store.akveo.com/products/vue-java-admin-dashboard-spring?utm_campaign=akveo_store-Vue-Vue_demo%2Fgithub&utm_source=vue_admin&utm_medium=referral&utm_content=github_banner\"><img width=\"500px\" src=\"https://raw.githubusercontent.com/PanJiaChen/vue-element-admin-site/master/docs/.vuepress/public/images/vue-java-banner.png\" /></a><p>Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M\n</p>\n\n### Flatlogic\n\n<a href=\"https://flatlogic.com/admin-dashboards?from=vue-element-admin\"><img width=\"150px\" src=\"https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png\" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p>\n\n## Características\n\n```\n- Iniciar / Cerrar Sesión\n\n- Permisos de Autenticación\n  - Página de Permisos\n  - Directivas de permisos\n  - Página de configuración de permisos\n  - Autenticación por dos pasos\n\n- Construcción Multi-entorno\n  - Desarrollo (dev)\n  - sit\n  - Escenario de pruebas (stage),\n  - Producción (prod)\n\n- Características Globales\n  - I18n\n  - Temas dinámicos\n  - Menu lateral dinámico (soporte a rutas multi-nivel)\n  - Barra de rutas dinámica\n  - Tags-view (Pestañas de página, Soporta operación de clic derecho)\n  - Svg Sprite\n  - Datos de simulación con Mock\n  - Pantalla completa\n  - Menu lateral responsivo\n\n- Editor\n  - Editor de Texto Enriquecido\n  - Editor Markdown\n  - Editor JSON\n\n- Excel\n  - Exportación a Excel\n  - Carga de Excel\n  - Visualización de Excel\n  - Exportación como ZIP\n\n- Tabla\n  - Tabla Dinámica\n  - Tabla con Arrastrar y Soltar\n  - Tabla de edición en línea\n\n- Páginas de Error\n  - 401\n  - 404\n\n- Componentes\n  - Carga de Avatar\n  - Botón para subir al inicio\n  - Arrastrar y Soltar (Diaglogo)\n  - Arrastrar y Soltar (Seleccionar)\n  - Arrastrar y Soltar (Kanban)\n  - Arrastrar y Soltar (Lista)\n  - Panel de división\n  - Componente para soltar archivos\n  - Adhesión de objetos\n  - Contador hasta\n\n- Ejemplo Avanzado\n- Registro de Errores\n- Tablero de indicadores\n- Página de Guías\n- ECharts (Gráficos)\n- Portapapeles\n- Convertidor de Markdown a HTML\n```\n\n## Iniciando\n\n```bash\n# clone el proyecto\ngit clone https://github.com/PanJiaChen/vue-element-admin.git\n\n# vaya al directorio clonado\ncd vue-element-admin\n\n# instale las dependencias\nnpm install\n\n# corra el proyecto como desarrollador\nnpm run dev\n```\n\nAutomáticamente se abrirá el siguiente enlace en su navegador http://localhost:9527\n\n## Construcción\n\n```bash\n# Construcción para entornos de prueba\nnpm run build:stage\n\n# Construcción para entornos de producción\nnpm run build:prod\n```\n\n## Avanzado\n\n```bash\n# Vista previa con efectos de entorno\nnpm run preview\n\n# Vista previa  con efectos + análisis de recursos estáticos\nnpm run preview -- --report\n\n# Chequeo de formato de código\nnpm run lint\n\n# Chequeo de formato de código y auto-corrección\nnpm run lint -- --fix\n```\n\nVaya a [Documentación](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información\n\n## Registro de Cambios\n\nLos cambios detallados por cada liberación se encuentran en [notas de liberación](https://github.com/PanJiaChen/vue-element-admin/releases).\n\n## Demostración en línea\n\n[Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin)\n\n## Donación\n\nSi este proyecto es de mucha ayuda para ti, puedes comprarle al autor un vaso de jugo :tropical_drink:\n\n![Donar](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png)\n\n[dona por Paypal](https://www.paypal.me/panfree23)\n\n[Comprame un Café](https://www.buymeacoffee.com/Pan)\n\n## Navegadores Soportados\n\nNavegadores modernos e Internet Explorer 10+.\n\n| [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png\" alt=\"IE / Edge\" width=\"24px\" height=\"24px\" />](https://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\" />](https://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\" />](https://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\" />](https://godban.github.io/browsers-support-badges/)</br>Safari |\n| --------- | --------- | --------- | --------- |\n| IE10, IE11, Edge | últimas 2 versiones | últimas 2 versiones | últimas 2 versiones |\n\n## Licencia\n\n[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)\n\nCopyright (c) 2017-presente PanJiaChen\n"
  },
  {
    "path": "README.ja.md",
    "content": "<p align=\"center\">\n  <img width=\"320\" src=\"https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vuejs/vue\">\n    <img src=\"https://img.shields.io/badge/vue-2.6.10-brightgreen.svg\" alt=\"vue\">\n  </a>\n  <a href=\"https://github.com/ElemeFE/element\">\n    <img src=\"https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg\" alt=\"element-ui\">\n  </a>\n  <a href=\"https://travis-ci.org/PanJiaChen/vue-element-admin\" rel=\"nofollow\">\n    <img src=\"https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master\" alt=\"Build Status\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/mashape/apistatus.svg\" alt=\"license\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/releases\">\n    <img src=\"https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg\" alt=\"GitHub release\">\n  </a>\n  <a href=\"https://gitter.im/vue-element-admin/discuss\">\n    <img src=\"https://badges.gitter.im/Join%20Chat.svg\" alt=\"gitter\">\n  </a>\n  <a href=\"https://panjiachen.gitee.io/vue-element-admin-site/zh/donate\">\n    <img src=\"https://img.shields.io/badge/%24-donate-ff69b4.svg\" alt=\"donate\">\n  </a>\n</p>\n\n日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) | [Spanish](./README.es.md)\n\n## 概要\n\n[vue-element-admin](https://panjiachen.github.io/vue-element-admin) は管理画面のフロントエンドのインタフェースで、[vue](https://github.com/vuejs/vue) と [element-ui](https://github.com/ElemeFE/element)を使っています。i18nの多言語対応、可変ルート、権限、典型的なビジネスアプリテンプレートであり、豊富なコンポーネントを提供しています。素早くビジネス用の管理画面の現型を構築に役立ちます。\n\n- [デモページ](https://panjiachen.github.io/vue-element-admin)\n\n- [ドキュメント](https://panjiachen.github.io/vue-element-admin-site/)\n\n- [Gitter](https://gitter.im/vue-element-admin/discuss)\n\n- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate)\n\n- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)\n\n- おすすめシンプルテンプレート: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)\n- デスクトップバージョン: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)\n- Typescriptバージョン: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (感謝: [@Armour](https://github.com/Armour))\n- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)\n\n**バージョン`v4.1.0+`以降について、デフォルトのmasterブランチではi18nをサポートしていません。masterブランチと共にアップデートされる[i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n)を使用してください。 **\n\n**現在のバージョン `v4.0+` は `vue-cli` で構築していて、バグ報告は[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)のissueでお願いします。旧バージョン[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)もあります。こちらは`vue-cli`に依存しないです。**\n\n**低いバージョンのブラウザはサーポートしないです(例えば ie)，必要があれば polyfill を追加してください。 [詳細はこちら](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)**\n\n## 前準備\n\nローカル環境に [node](http://nodejs.org/) と [git](https://git-scm.com/)のインストールが必要です。[ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) と [element-ui](https://github.com/ElemeFE/element)で開発しています。Requestは[Mock.js](https://github.com/nuysoft/Mock)のモックデータを使っています。\n\n**バグ修正や新規機能追加のissue と pull requestは大歓迎です。**\n\n[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox)\n\n<p align=\"center\">\n  <img width=\"900\" src=\"https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png\">\n</p>\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen)\n\n### Akveo\n<a href=\"https://store.akveo.com/products/vue-java-admin-dashboard-spring?utm_campaign=akveo_store-Vue-Vue_demo%2Fgithub&utm_source=vue_admin&utm_medium=referral&utm_content=github_banner\"><img width=\"500px\" src=\"https://raw.githubusercontent.com/PanJiaChen/vue-element-admin-site/master/docs/.vuepress/public/images/vue-java-banner.png\" /></a><p>Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M\n</p>\n\n### Flatlogic\n\n<a href=\"https://flatlogic.com/admin-dashboards?from=vue-element-admin\"><img width=\"150px\" src=\"https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png\" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p>\n\n## 機能一覧\n\n```\n- ログイン / ログアウト\n\n- Auth認証\n  - ページ権限\n  - 権限パーミッション\n  - 権限設定\n  - 外部IDでログイン\n\n- 複数環境デプロイ\n  - dev\n  - sit\n  - stage\n  - prod\n\n- 共通機能\n  - 多言語切替\n  - テーマ切替\n  - サイトメニュー（ルートから生成）\n  - パンくずリストナビゲーション\n  - タブナビゲーション\n  - Svg Sprite アイコン\n  - ローカル/バックエンド モック データ\n  - Screenfull\n\n- WYSIWYG\n  - TinyMCE\n  - Markdown\n  - JSON\n\n- Excel\n  - エクスポート\n  - インポート\n  - リード\n  - Zip\n\n- テーブル\n  - ダイナミックテーブル\n  - ドラッグアンドドロップテーブル\n  - インラインエディットテーブル\n\n- エラーページ\n  - 401\n  - 404\n\n- コンポーネント\n  - アバターアップロード\n  - トップに戻る\n  - ドラッグダイアログ\n  - ドラッグ選択\n  - ドラッグKanban\n  - ドラッグリスト\n  - ペインの分割\n  - Dropzone\n  - スティッキー\n  - CountTo\n\n- 高度なサンプル\n- エラーログ\n- ダッシュボード\n- ガイドページ\n- ECharts\n- クリップボード\n- Markdown to html\n```\n\n## Getting started\n\n```bash\n# clone the project\ngit clone https://github.com/PanJiaChen/vue-element-admin.git\n\n# enter the project directory\ncd vue-element-admin\n\n# install dependency\nnpm install\n\n# develop\nnpm run dev\n```\n\nhttp://localhost:9527 が自動的に開きます。\n\n## Build\n\n```bash\n# build for test environment\nnpm run build:stage\n\n# build for production environment\nnpm run build:prod\n```\n\n## Advanced\n\n```bash\n# preview the release environment effect\nnpm run preview\n\n# preview the release environment effect + static resource analysis\nnpm run preview -- --report\n\n# code format check\nnpm run lint\n\n# code format check and auto fix\nnpm run lint -- --fix\n```\n\n詳細は [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) を参照してください。\n\n## Changelog\n\n各リリースの詳細は [release notes](https://github.com/PanJiaChen/vue-element-admin/releases) にあります。\n\n## Online Demo\n\n[Preview](https://panjiachen.github.io/vue-element-admin)\n\n## Donate\n\nIf you find this project useful, you can buy author a glass of juice :tropical_drink:\n\n![donate](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png)\n\n[Paypal Me](https://www.paypal.me/panfree23)\n\n[Buy me a coffee](https://www.buymeacoffee.com/Pan)\n\n## Browsers support\n\nModern browsers and Internet Explorer 10+.\n\n| [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png\" alt=\"IE / Edge\" width=\"24px\" height=\"24px\" />](https://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\" />](https://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\" />](https://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\" />](https://godban.github.io/browsers-support-badges/)</br>Safari |\n| --------- | --------- | --------- | --------- |\n| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions |\n\n## License\n\n[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)\n\nCopyright (c) 2017-present PanJiaChen\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img width=\"320\" src=\"https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vuejs/vue\">\n    <img src=\"https://img.shields.io/badge/vue-2.6.10-brightgreen.svg\" alt=\"vue\">\n  </a>\n  <a href=\"https://github.com/ElemeFE/element\">\n    <img src=\"https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg\" alt=\"element-ui\">\n  </a>\n  <a href=\"https://travis-ci.org/PanJiaChen/vue-element-admin\" rel=\"nofollow\">\n    <img src=\"https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master\" alt=\"Build Status\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/mashape/apistatus.svg\" alt=\"license\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/releases\">\n    <img src=\"https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg\" alt=\"GitHub release\">\n  </a>\n  <a href=\"https://gitter.im/vue-element-admin/discuss\">\n    <img src=\"https://badges.gitter.im/Join%20Chat.svg\" alt=\"gitter\">\n  </a>\n  <a href=\"https://panjiachen.github.io/vue-element-admin-site/donate\">\n    <img src=\"https://img.shields.io/badge/%24-donate-ff69b4.svg\" alt=\"donate\">\n  </a>\n</p>\n\nEnglish | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md)\n\n<!-- <p align=\"center\">\n  <b>SPONSORED BY</b>\n</p>\n<table align=\"center\" cellspacing=\"0\" cellpadding=\"0\">\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"middle\">\n       <a href=\"\" title=\"\" target=\"_blank\" style=\"padding-right: 20px;\">\n        <img height=\"200px\" style=\"padding-right: 20px;\" src=\"\" title=\"variantForm\">\n        </a>\n      </td>\n    </tr>\n  </tbody> \n</table>-->\n\n## Introduction\n\n[vue-element-admin](https://panjiachen.github.io/vue-element-admin) is a production-ready front-end solution for admin interfaces. It is based on [vue](https://github.com/vuejs/vue) and uses the UI Toolkit [element-ui](https://github.com/ElemeFE/element).\n\n[vue-element-admin](https://panjiachen.github.io/vue-element-admin) is based on the newest development stack of vue and it has a built-in i18n solution, typical templates for enterprise applications, and lots of awesome features. It helps you build large and complex Single-Page Applications. I believe whatever your needs are, this project will help you.\n\n- [Preview](https://panjiachen.github.io/vue-element-admin)\n\n- [Documentation](https://panjiachen.github.io/vue-element-admin-site/)\n\n- [Gitter](https://gitter.im/vue-element-admin/discuss)\n\n- [Donate](https://panjiachen.github.io/vue-element-admin-site/donate/)\n\n- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)\n\n- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览\n\n- Base template recommends using: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)\n- Desktop: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)\n- Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour))\n- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)\n\n**After the `v4.1.0+` version, the default master branch will not support i18n. Please use [i18n Branch](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), it will keep up with the master update**\n\n**The current version is `v4.0+` build on `vue-cli`. If you find a problem, please put [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), it does not rely on `vue-cli`**\n\n**This project does not support low version browsers (e.g. IE). Please add polyfill by yourself.**\n\n## Preparation\n\nYou need to install [node](https://nodejs.org/) and [git](https://git-scm.com/) locally. The project is based on [ES2015+](https://es6.ruanyifeng.com/), [vue](https://cn.vuejs.org/index.html), [vuex](https://vuex.vuejs.org/zh-cn/), [vue-router](https://router.vuejs.org/zh-cn/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), all request data is simulated using [Mock.js](https://github.com/nuysoft/Mock).\nUnderstanding and learning this knowledge in advance will greatly help the use of this project.\n\n[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox)\n\n<p align=\"center\">\n  <img width=\"900\" src=\"https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png\">\n</p>\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen)\n\n### Akveo\n<a href=\"https://store.akveo.com/products/vue-java-admin-dashboard-spring?utm_campaign=akveo_store-Vue-Vue_demo%2Fgithub&utm_source=vue_admin&utm_medium=referral&utm_content=github_banner\"><img width=\"500px\" src=\"https://raw.githubusercontent.com/PanJiaChen/vue-element-admin-site/master/docs/.vuepress/public/images/vue-java-banner.png\" /></a><p>Get Java backend for Vue admin with 20% discount for 39$ use coupon code SWB0RAZPZR1M\n</p>\n\n### Flatlogic\n\n<a href=\"https://flatlogic.com/admin-dashboards?from=vue-element-admin\"><img width=\"150px\" src=\"https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png\" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p>\n\n## Features\n\n```\n- Login / Logout\n\n- Permission Authentication\n  - Page permission\n  - Directive permission\n  - Permission configuration page\n  - Two-step login\n\n- Multi-environment build\n  - Develop (dev)\n  - sit\n  - Stage Test (stage)\n  - Production (prod)\n\n- Global Features\n  - I18n\n  - Multiple dynamic themes\n  - Dynamic sidebar (supports multi-level routing)\n  - Dynamic breadcrumb\n  - Tags-view (Tab page Support right-click operation)\n  - Svg Sprite\n  - Mock data\n  - Screenfull\n  - Responsive Sidebar\n\n- Editor\n  - Rich Text Editor\n  - Markdown Editor\n  - JSON Editor\n\n- Excel\n  - Export Excel\n  - Upload Excel\n  - Visualization Excel\n  - Export zip\n\n- Table\n  - Dynamic Table\n  - Drag And Drop Table\n  - Inline Edit Table\n\n- Error Page\n  - 401\n  - 404\n\n- Components\n  - Avatar Upload\n  - Back To Top\n  - Drag Dialog\n  - Drag Select\n  - Drag Kanban\n  - Drag List\n  - SplitPane\n  - Dropzone\n  - Sticky\n  - CountTo\n\n- Advanced Example\n- Error Log\n- Dashboard\n- Guide Page\n- ECharts\n- Clipboard\n- Markdown to html\n```\n\n## Getting started\n\n```bash\n# clone the project\ngit clone https://github.com/PanJiaChen/vue-element-admin.git\n\n# enter the project directory\ncd vue-element-admin\n\n# install dependency\nnpm install\n\n# develop\nnpm run dev\n```\n\nThis will automatically open http://localhost:9527\n\n## Build\n\n```bash\n# build for test environment\nnpm run build:stage\n\n# build for production environment\nnpm run build:prod\n```\n\n## Advanced\n\n```bash\n# preview the release environment effect\nnpm run preview\n\n# preview the release environment effect + static resource analysis\nnpm run preview -- --report\n\n# code format check\nnpm run lint\n\n# code format check and auto fix\nnpm run lint -- --fix\n```\n\nRefer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information\n\n## Changelog\n\nDetailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases).\n\n## Online Demo\n\n[Preview](https://panjiachen.github.io/vue-element-admin)\n\n## Donate\n\nIf you find this project useful, you can buy author a glass of juice :tropical_drink:\n\n![donate](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png)\n\n[Paypal Me](https://www.paypal.me/panfree23)\n\n[Buy me a coffee](https://www.buymeacoffee.com/Pan)\n\n## Browsers support\n\nModern browsers and Internet Explorer 10+.\n\n| [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png\" alt=\"IE / Edge\" width=\"24px\" height=\"24px\" />](https://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\" />](https://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\" />](https://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\" />](https://godban.github.io/browsers-support-badges/)</br>Safari |\n| --------- | --------- | --------- | --------- |\n| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions |\n\n## License\n\n[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)\n\nCopyright (c) 2017-present PanJiaChen\n"
  },
  {
    "path": "README.zh-CN.md",
    "content": "<p align=\"center\">\n  <img width=\"320\" src=\"https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vuejs/vue\">\n    <img src=\"https://img.shields.io/badge/vue-2.6.10-brightgreen.svg\" alt=\"vue\">\n  </a>\n  <a href=\"https://github.com/ElemeFE/element\">\n    <img src=\"https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg\" alt=\"element-ui\">\n  </a>\n  <a href=\"https://travis-ci.org/PanJiaChen/vue-element-admin\" rel=\"nofollow\">\n    <img src=\"https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master\" alt=\"Build Status\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/mashape/apistatus.svg\" alt=\"license\">\n  </a>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin/releases\">\n    <img src=\"https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg\" alt=\"GitHub release\">\n  </a>\n  <a href=\"https://gitter.im/vue-element-admin/discuss\">\n    <img src=\"https://badges.gitter.im/Join%20Chat.svg\" alt=\"gitter\">\n  </a>\n  <a href=\"https://panjiachen.gitee.io/vue-element-admin-site/zh/donate\">\n    <img src=\"https://img.shields.io/badge/%24-donate-ff69b4.svg\" alt=\"donate\">\n  </a>\n</p>\n\n简体中文 | [English](./README.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md)\n\n<!-- <p align=\"center\">\n  <b>SPONSORED BY</b>\n</p>\n<table align=\"center\" cellspacing=\"0\" cellpadding=\"0\">\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"middle\">\n       <a href=\"\" title=\"\" target=\"_blank\" style=\"padding-right: 20px;\">\n        <img height=\"200px\" style=\"padding-right: 20px;\" src=\"\" title=\"variantForm\">\n        </a>\n      </td>\n    </tr>\n  </tbody> \n</table>-->\n\n## 简介\n\n[vue-element-admin](https://panjiachen.github.io/vue-element-admin) 是一个后台前端解决方案，它基于 [vue](https://github.com/vuejs/vue) 和 [element-ui](https://github.com/ElemeFE/element)实现。它使用了最新的前端技术栈，内置了 i18n 国际化解决方案，动态路由，权限验证，提炼了典型的业务模型，提供了丰富的功能组件，它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么，本项目都能帮助到你。\n\n- [在线预览](https://panjiachen.github.io/vue-element-admin)\n\n- [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)\n\n- [Gitter 讨论组](https://gitter.im/vue-element-admin/discuss)\n\n- [Donate](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate)\n\n- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)\n\n- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 在线预览（国内用户可访问该地址）\n\n- [国内访问文档](https://panjiachen.gitee.io/vue-element-admin-site/zh/) 文档（方便没翻墙的用户查看）\n\n- 基础模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)\n- 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)\n- Typescript 版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour))\n- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)\n\n**`v4.1.0+`版本之后默认 master 分支将不支持国际化，有需要的请使用[i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n)分支，它会和 master 保持同步更新**\n\n**该项目不支持低版本浏览器(如 ie)，有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)**\n\n**目前版本为 `v4.0+` 基于 `vue-cli` 进行构建，若发现问题，欢迎提[issue](https://github.com/PanJiaChen/vue-element-admin/issues/new)。若你想使用旧版本，可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0)，它不依赖 `vue-cli`**\n\n群主 **[圈子](https://jianshiapp.com/circles/1209)** 群主会经常分享一些技术相关的东西，或者加入 [qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602) 或者关注 [微博](https://weibo.com/u/3423485724?is_all=1)\n\n## 前序准备\n\n你需要在本地安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[vue-cli](https://github.com/vuejs/vue-cli) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element)，所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)进行模拟，提前了解和学习这些知识会对使用本项目有很大的帮助。\n\n同时配套了系列教程文章，如何从零构建后一个完整的后台项目，建议大家先看完这些文章再来实践本项目\n\n- [手摸手，带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)\n- [手摸手，带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)\n- [手摸手，带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)\n- [手摸手，带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)\n- [手摸手，带你用vue撸后台 系列五(v4.0新版本)](https://juejin.im/post/5c92ff94f265da6128275a85)\n- [手摸手，带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)\n- [手摸手，带你优雅的使用 icon](https://juejin.im/post/59bb864b5188257e7a427c09)\n- [手摸手，带你用合理的姿势使用 webpack4（上）](https://juejin.im/post/5b56909a518825195f499806)\n- [手摸手，带你用合理的姿势使用 webpack4（下）](https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc)\n\n**如有问题请先看上述使用文档和文章，若不能满足，欢迎 issue 和 pr**\n\n[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/PanJiaChen/vue-element-admin/tree/CodeSandbox)\n\n<p align=\"center\">\n  <img width=\"900\" src=\"https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png\">\n</p>\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor]](https://www.patreon.com/panjiachen)\n\n### Akveo\n<a href=\"https://store.akveo.com/products/vue-java-admin-dashboard-spring?utm_campaign=akveo_store-Vue-Vue_demo%2Fgithub&utm_source=vue_admin&utm_medium=referral&utm_content=github_banner\"><img width=\"500px\" src=\"https://raw.githubusercontent.com/PanJiaChen/vue-element-admin-site/master/docs/.vuepress/public/images/vue-java-banner.png\" /></a><p>Java 后端整合，可以使用优惠码：SWB0RAZPZR1M，获得20%的价格优化</p>\n\n### Flatlogic\n\n<a href=\"https://flatlogic.com/admin-dashboards?from=vue-element-admin\"><img width=\"150px\" src=\"https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png\" /></a><p>Admin Dashboard Templates made with Vue, React and Angular.</p>\n\n\n## 功能\n\n```\n- 登录 / 注销\n\n- 权限验证\n  - 页面权限\n  - 指令权限\n  - 权限配置\n  - 二步登录\n\n- 多环境发布\n  - dev\n  - sit\n  - stage\n  - prod\n\n- 全局功能\n  - 国际化多语言\n  - 多种动态换肤\n  - 动态侧边栏（支持多级路由嵌套）\n  - 动态面包屑\n  - 快捷导航(标签页)\n  - Svg Sprite 图标\n  - 本地/后端 mock 数据\n  - Screenfull全屏\n  - 自适应收缩侧边栏\n\n- 编辑器\n  - 富文本\n  - Markdown\n  - JSON 等多格式\n\n- Excel\n  - 导出excel\n  - 导入excel\n  - 前端可视化excel\n  - 导出zip\n\n- 表格\n  - 动态表格\n  - 拖拽表格\n  - 内联编辑\n\n- 错误页面\n  - 401\n  - 404\n\n- 組件\n  - 头像上传\n  - 返回顶部\n  - 拖拽Dialog\n  - 拖拽Select\n  - 拖拽看板\n  - 列表拖拽\n  - SplitPane\n  - Dropzone\n  - Sticky\n  - CountTo\n\n- 综合实例\n- 错误日志\n- Dashboard\n- 引导页\n- ECharts 图表\n- Clipboard(剪贴复制)\n- Markdown2html\n```\n\n## 开发\n\n```bash\n# 克隆项目\ngit clone https://github.com/PanJiaChen/vue-element-admin.git\n\n# 进入项目目录\ncd vue-element-admin\n\n# 安装依赖\nnpm install\n\n# 建议不要直接使用 cnpm 安装依赖，会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题\nnpm install --registry=https://registry.npm.taobao.org\n\n# 启动服务\nnpm run dev\n```\n\n浏览器访问 http://localhost:9527\n\n## 发布\n\n```bash\n# 构建测试环境\nnpm run build:stage\n\n# 构建生产环境\nnpm run build:prod\n```\n\n## 其它\n\n```bash\n# 预览发布环境效果\nnpm run preview\n\n# 预览发布环境效果 + 静态资源分析\nnpm run preview -- --report\n\n# 代码格式检查\nnpm run lint\n\n# 代码格式检查并自动修复\nnpm run lint -- --fix\n```\n\n更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)\n\n## Changelog\n\nDetailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases).\n\n## Online Demo\n\n[在线 Demo](https://panjiachen.github.io/vue-element-admin)\n\n## Donate\n\n如果你觉得这个项目帮助到了你，你可以帮作者买一杯果汁表示鼓励 :tropical_drink:\n![donate](https://panjiachen.github.io/donate/donation.png)\n\n[更多捐赠方式](https://panjiachen.gitee.io/vue-element-admin-site/zh/donate)\n\n[Paypal Me](https://www.paypal.me/panfree23)\n\n[Buy me a coffee](https://www.buymeacoffee.com/Pan)\n\n## 购买贴纸\n\n你也可以通过 购买[官方授权的贴纸](https://smallsticker.com/product/vue-element-admin) 的方式来支持 vue-element-admin - 每售出一张贴纸，本项目将获得 2 元的捐赠。\n\n## Browsers support\n\nModern browsers and Internet Explorer 10+.\n\n| [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png\" alt=\"IE / Edge\" width=\"24px\" height=\"24px\" />](https://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\" />](https://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\" />](https://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\" />](https://godban.github.io/browsers-support-badges/)</br>Safari |\n| --------- | --------- | --------- | --------- |\n| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions |\n\n## License\n\n[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)\n\nCopyright (c) 2017-present PanJiaChen\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app\n    '@vue/cli-plugin-babel/preset'\n  ],\n  'env': {\n    'development': {\n      // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().\n      // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.\n      // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html\n      'plugins': ['dynamic-import-node']\n    }\n  }\n}\n"
  },
  {
    "path": "build/index.js",
    "content": "const { run } = require('runjs')\nconst chalk = require('chalk')\nconst config = require('../vue.config.js')\nconst rawArgv = process.argv.slice(2)\nconst args = rawArgv.join(' ')\n\nif (process.env.npm_config_preview || rawArgv.includes('--preview')) {\n  const report = rawArgv.includes('--report')\n\n  run(`vue-cli-service build ${args}`)\n\n  const port = 9526\n  const publicPath = config.publicPath\n\n  var connect = require('connect')\n  var serveStatic = require('serve-static')\n  const app = connect()\n\n  app.use(\n    publicPath,\n    serveStatic('./dist', {\n      index: ['index.html', '/']\n    })\n  )\n\n  app.listen(port, function () {\n    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))\n    if (report) {\n      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))\n    }\n\n  })\n} else {\n  run(`vue-cli-service build ${args}`)\n}\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],\n  transform: {\n    '^.+\\\\.vue$': 'vue-jest',\n    '.+\\\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':\n      'jest-transform-stub',\n    '^.+\\\\.jsx?$': 'babel-jest'\n  },\n  moduleNameMapper: {\n    '^@/(.*)$': '<rootDir>/src/$1'\n  },\n  snapshotSerializers: ['jest-serializer-vue'],\n  testMatch: [\n    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'\n  ],\n  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],\n  coverageDirectory: '<rootDir>/tests/unit/coverage',\n  // 'collectCoverage': true,\n  'coverageReporters': [\n    'lcov',\n    'text-summary'\n  ],\n  testURL: 'http://localhost/'\n}\n"
  },
  {
    "path": "jsconfig.json",
    "content": "{ \n  \"compilerOptions\": {\n    \"baseUrl\": \"./\",\n    \"paths\": {\n        \"@/*\": [\"src/*\"]\n    }\n  },\n  \"exclude\": [\"node_modules\", \"dist\"]\n}"
  },
  {
    "path": "mock/article.js",
    "content": "const Mock = require('mockjs')\n\nconst List = []\nconst count = 100\n\nconst baseContent = '<p>I am testing data, I am testing data.</p><p><img src=\"https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943\"></p>'\nconst image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3'\n\nfor (let i = 0; i < count; i++) {\n  List.push(Mock.mock({\n    id: '@increment',\n    timestamp: +Mock.Random.date('T'),\n    author: '@first',\n    reviewer: '@first',\n    title: '@title(5, 10)',\n    content_short: 'mock data',\n    content: baseContent,\n    forecast: '@float(0, 100, 2, 2)',\n    importance: '@integer(1, 3)',\n    'type|1': ['CN', 'US', 'JP', 'EU'],\n    'status|1': ['published', 'draft'],\n    display_time: '@datetime',\n    comment_disabled: true,\n    pageviews: '@integer(300, 5000)',\n    image_uri,\n    platforms: ['a-platform']\n  }))\n}\n\nmodule.exports = [\n  {\n    url: '/vue-element-admin/article/list',\n    type: 'get',\n    response: config => {\n      const { importance, type, title, page = 1, limit = 20, sort } = config.query\n\n      let mockList = List.filter(item => {\n        if (importance && item.importance !== +importance) return false\n        if (type && item.type !== type) return false\n        if (title && item.title.indexOf(title) < 0) return false\n        return true\n      })\n\n      if (sort === '-id') {\n        mockList = mockList.reverse()\n      }\n\n      const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))\n\n      return {\n        code: 20000,\n        data: {\n          total: mockList.length,\n          items: pageList\n        }\n      }\n    }\n  },\n\n  {\n    url: '/vue-element-admin/article/detail',\n    type: 'get',\n    response: config => {\n      const { id } = config.query\n      for (const article of List) {\n        if (article.id === +id) {\n          return {\n            code: 20000,\n            data: article\n          }\n        }\n      }\n    }\n  },\n\n  {\n    url: '/vue-element-admin/article/pv',\n    type: 'get',\n    response: _ => {\n      return {\n        code: 20000,\n        data: {\n          pvData: [\n            { key: 'PC', pv: 1024 },\n            { key: 'mobile', pv: 1024 },\n            { key: 'ios', pv: 1024 },\n            { key: 'android', pv: 1024 }\n          ]\n        }\n      }\n    }\n  },\n\n  {\n    url: '/vue-element-admin/article/create',\n    type: 'post',\n    response: _ => {\n      return {\n        code: 20000,\n        data: 'success'\n      }\n    }\n  },\n\n  {\n    url: '/vue-element-admin/article/update',\n    type: 'post',\n    response: _ => {\n      return {\n        code: 20000,\n        data: 'success'\n      }\n    }\n  }\n]\n\n"
  },
  {
    "path": "mock/index.js",
    "content": "const Mock = require('mockjs')\nconst { param2Obj } = require('./utils')\n\nconst user = require('./user')\nconst role = require('./role')\nconst article = require('./article')\nconst search = require('./remote-search')\n\nconst mocks = [\n  ...user,\n  ...role,\n  ...article,\n  ...search\n]\n\n// for front mock\n// please use it cautiously, it will redefine XMLHttpRequest,\n// which will cause many of your third-party libraries to be invalidated(like progress event).\nfunction mockXHR() {\n  // mock patch\n  // https://github.com/nuysoft/Mock/issues/300\n  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send\n  Mock.XHR.prototype.send = function() {\n    if (this.custom.xhr) {\n      this.custom.xhr.withCredentials = this.withCredentials || false\n\n      if (this.responseType) {\n        this.custom.xhr.responseType = this.responseType\n      }\n    }\n    this.proxy_send(...arguments)\n  }\n\n  function XHR2ExpressReqWrap(respond) {\n    return function(options) {\n      let result = null\n      if (respond instanceof Function) {\n        const { body, type, url } = options\n        // https://expressjs.com/en/4x/api.html#req\n        result = respond({\n          method: type,\n          body: JSON.parse(body),\n          query: param2Obj(url)\n        })\n      } else {\n        result = respond\n      }\n      return Mock.mock(result)\n    }\n  }\n\n  for (const i of mocks) {\n    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))\n  }\n}\n\nmodule.exports = {\n  mocks,\n  mockXHR\n}\n"
  },
  {
    "path": "mock/mock-server.js",
    "content": "const chokidar = require('chokidar')\nconst bodyParser = require('body-parser')\nconst chalk = require('chalk')\nconst path = require('path')\nconst Mock = require('mockjs')\n\nconst mockDir = path.join(process.cwd(), 'mock')\n\nfunction registerRoutes(app) {\n  let mockLastIndex\n  const { mocks } = require('./index.js')\n  const mocksForServer = mocks.map(route => {\n    return responseFake(route.url, route.type, route.response)\n  })\n  for (const mock of mocksForServer) {\n    app[mock.type](mock.url, mock.response)\n    mockLastIndex = app._router.stack.length\n  }\n  const mockRoutesLength = Object.keys(mocksForServer).length\n  return {\n    mockRoutesLength: mockRoutesLength,\n    mockStartIndex: mockLastIndex - mockRoutesLength\n  }\n}\n\nfunction unregisterRoutes() {\n  Object.keys(require.cache).forEach(i => {\n    if (i.includes(mockDir)) {\n      delete require.cache[require.resolve(i)]\n    }\n  })\n}\n\n// for mock server\nconst responseFake = (url, type, respond) => {\n  return {\n    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),\n    type: type || 'get',\n    response(req, res) {\n      console.log('request invoke:' + req.path)\n      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))\n    }\n  }\n}\n\nmodule.exports = app => {\n  // parse app.body\n  // https://expressjs.com/en/4x/api.html#req.body\n  app.use(bodyParser.json())\n  app.use(bodyParser.urlencoded({\n    extended: true\n  }))\n\n  const mockRoutes = registerRoutes(app)\n  var mockRoutesLength = mockRoutes.mockRoutesLength\n  var mockStartIndex = mockRoutes.mockStartIndex\n\n  // watch files, hot reload mock server\n  chokidar.watch(mockDir, {\n    ignored: /mock-server/,\n    ignoreInitial: true\n  }).on('all', (event, path) => {\n    if (event === 'change' || event === 'add') {\n      try {\n        // remove mock routes stack\n        app._router.stack.splice(mockStartIndex, mockRoutesLength)\n\n        // clear routes cache\n        unregisterRoutes()\n\n        const mockRoutes = registerRoutes(app)\n        mockRoutesLength = mockRoutes.mockRoutesLength\n        mockStartIndex = mockRoutes.mockStartIndex\n\n        console.log(chalk.magentaBright(`\\n > Mock Server hot reload success! changed  ${path}`))\n      } catch (error) {\n        console.log(chalk.redBright(error))\n      }\n    }\n  })\n}\n"
  },
  {
    "path": "mock/remote-search.js",
    "content": "const Mock = require('mockjs')\n\nconst NameList = []\nconst count = 100\n\nfor (let i = 0; i < count; i++) {\n  NameList.push(Mock.mock({\n    name: '@first'\n  }))\n}\nNameList.push({ name: 'mock-Pan' })\n\nmodule.exports = [\n  // username search\n  {\n    url: '/vue-element-admin/search/user',\n    type: 'get',\n    response: config => {\n      const { name } = config.query\n      const mockNameList = NameList.filter(item => {\n        const lowerCaseName = item.name.toLowerCase()\n        return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0)\n      })\n      return {\n        code: 20000,\n        data: { items: mockNameList }\n      }\n    }\n  },\n\n  // transaction list\n  {\n    url: '/vue-element-admin/transaction/list',\n    type: 'get',\n    response: _ => {\n      return {\n        code: 20000,\n        data: {\n          total: 20,\n          'items|20': [{\n            order_no: '@guid()',\n            timestamp: +Mock.Random.date('T'),\n            username: '@name()',\n            price: '@float(1000, 15000, 0, 2)',\n            'status|1': ['success', 'pending']\n          }]\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "mock/role/index.js",
    "content": "const Mock = require('mockjs')\nconst { deepClone } = require('../utils')\nconst { asyncRoutes, constantRoutes } = require('./routes.js')\n\nconst routes = deepClone([...constantRoutes, ...asyncRoutes])\n\nconst roles = [\n  {\n    key: 'admin',\n    name: 'admin',\n    description: 'Super Administrator. Have access to view all pages.',\n    routes: routes\n  },\n  {\n    key: 'editor',\n    name: 'editor',\n    description: 'Normal Editor. Can see all pages except permission page',\n    routes: routes.filter(i => i.path !== '/permission')// just a mock\n  },\n  {\n    key: 'visitor',\n    name: 'visitor',\n    description: 'Just a visitor. Can only see the home page and the document page',\n    routes: [{\n      path: '',\n      redirect: 'dashboard',\n      children: [\n        {\n          path: 'dashboard',\n          name: 'Dashboard',\n          meta: { title: 'dashboard', icon: 'dashboard' }\n        }\n      ]\n    }]\n  }\n]\n\nmodule.exports = [\n  // mock get all routes form server\n  {\n    url: '/vue-element-admin/routes',\n    type: 'get',\n    response: _ => {\n      return {\n        code: 20000,\n        data: routes\n      }\n    }\n  },\n\n  // mock get all roles form server\n  {\n    url: '/vue-element-admin/roles',\n    type: 'get',\n    response: _ => {\n      return {\n        code: 20000,\n        data: roles\n      }\n    }\n  },\n\n  // add role\n  {\n    url: '/vue-element-admin/role',\n    type: 'post',\n    response: {\n      code: 20000,\n      data: {\n        key: Mock.mock('@integer(300, 5000)')\n      }\n    }\n  },\n\n  // update role\n  {\n    url: '/vue-element-admin/role/[A-Za-z0-9]',\n    type: 'put',\n    response: {\n      code: 20000,\n      data: {\n        status: 'success'\n      }\n    }\n  },\n\n  // delete role\n  {\n    url: '/vue-element-admin/role/[A-Za-z0-9]',\n    type: 'delete',\n    response: {\n      code: 20000,\n      data: {\n        status: 'success'\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "mock/role/routes.js",
    "content": "// Just a mock data\n\nconst constantRoutes = [\n  {\n    path: '/redirect',\n    component: 'layout/Layout',\n    hidden: true,\n    children: [\n      {\n        path: '/redirect/:path*',\n        component: 'views/redirect/index'\n      }\n    ]\n  },\n  {\n    path: '/login',\n    component: 'views/login/index',\n    hidden: true\n  },\n  {\n    path: '/auth-redirect',\n    component: 'views/login/auth-redirect',\n    hidden: true\n  },\n  {\n    path: '/404',\n    component: 'views/error-page/404',\n    hidden: true\n  },\n  {\n    path: '/401',\n    component: 'views/error-page/401',\n    hidden: true\n  },\n  {\n    path: '',\n    component: 'layout/Layout',\n    redirect: 'dashboard',\n    children: [\n      {\n        path: 'dashboard',\n        component: 'views/dashboard/index',\n        name: 'Dashboard',\n        meta: { title: 'Dashboard', icon: 'dashboard', affix: true }\n      }\n    ]\n  },\n  {\n    path: '/documentation',\n    component: 'layout/Layout',\n    children: [\n      {\n        path: 'index',\n        component: 'views/documentation/index',\n        name: 'Documentation',\n        meta: { title: 'Documentation', icon: 'documentation', affix: true }\n      }\n    ]\n  },\n  {\n    path: '/guide',\n    component: 'layout/Layout',\n    redirect: '/guide/index',\n    children: [\n      {\n        path: 'index',\n        component: 'views/guide/index',\n        name: 'Guide',\n        meta: { title: 'Guide', icon: 'guide', noCache: true }\n      }\n    ]\n  }\n]\n\nconst asyncRoutes = [\n  {\n    path: '/permission',\n    component: 'layout/Layout',\n    redirect: '/permission/index',\n    alwaysShow: true,\n    meta: {\n      title: 'Permission',\n      icon: 'lock',\n      roles: ['admin', 'editor']\n    },\n    children: [\n      {\n        path: 'page',\n        component: 'views/permission/page',\n        name: 'PagePermission',\n        meta: {\n          title: 'Page Permission',\n          roles: ['admin']\n        }\n      },\n      {\n        path: 'directive',\n        component: 'views/permission/directive',\n        name: 'DirectivePermission',\n        meta: {\n          title: 'Directive Permission'\n        }\n      },\n      {\n        path: 'role',\n        component: 'views/permission/role',\n        name: 'RolePermission',\n        meta: {\n          title: 'Role Permission',\n          roles: ['admin']\n        }\n      }\n    ]\n  },\n\n  {\n    path: '/icon',\n    component: 'layout/Layout',\n    children: [\n      {\n        path: 'index',\n        component: 'views/icons/index',\n        name: 'Icons',\n        meta: { title: 'Icons', icon: 'icon', noCache: true }\n      }\n    ]\n  },\n\n  {\n    path: '/components',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    name: 'ComponentDemo',\n    meta: {\n      title: 'Components',\n      icon: 'component'\n    },\n    children: [\n      {\n        path: 'tinymce',\n        component: 'views/components-demo/tinymce',\n        name: 'TinymceDemo',\n        meta: { title: 'Tinymce' }\n      },\n      {\n        path: 'markdown',\n        component: 'views/components-demo/markdown',\n        name: 'MarkdownDemo',\n        meta: { title: 'Markdown' }\n      },\n      {\n        path: 'json-editor',\n        component: 'views/components-demo/json-editor',\n        name: 'JsonEditorDemo',\n        meta: { title: 'Json Editor' }\n      },\n      {\n        path: 'split-pane',\n        component: 'views/components-demo/split-pane',\n        name: 'SplitpaneDemo',\n        meta: { title: 'SplitPane' }\n      },\n      {\n        path: 'avatar-upload',\n        component: 'views/components-demo/avatar-upload',\n        name: 'AvatarUploadDemo',\n        meta: { title: 'Avatar Upload' }\n      },\n      {\n        path: 'dropzone',\n        component: 'views/components-demo/dropzone',\n        name: 'DropzoneDemo',\n        meta: { title: 'Dropzone' }\n      },\n      {\n        path: 'sticky',\n        component: 'views/components-demo/sticky',\n        name: 'StickyDemo',\n        meta: { title: 'Sticky' }\n      },\n      {\n        path: 'count-to',\n        component: 'views/components-demo/count-to',\n        name: 'CountToDemo',\n        meta: { title: 'Count To' }\n      },\n      {\n        path: 'mixin',\n        component: 'views/components-demo/mixin',\n        name: 'ComponentMixinDemo',\n        meta: { title: 'componentMixin' }\n      },\n      {\n        path: 'back-to-top',\n        component: 'views/components-demo/back-to-top',\n        name: 'BackToTopDemo',\n        meta: { title: 'Back To Top' }\n      },\n      {\n        path: 'drag-dialog',\n        component: 'views/components-demo/drag-dialog',\n        name: 'DragDialogDemo',\n        meta: { title: 'Drag Dialog' }\n      },\n      {\n        path: 'drag-select',\n        component: 'views/components-demo/drag-select',\n        name: 'DragSelectDemo',\n        meta: { title: 'Drag Select' }\n      },\n      {\n        path: 'dnd-list',\n        component: 'views/components-demo/dnd-list',\n        name: 'DndListDemo',\n        meta: { title: 'Dnd List' }\n      },\n      {\n        path: 'drag-kanban',\n        component: 'views/components-demo/drag-kanban',\n        name: 'DragKanbanDemo',\n        meta: { title: 'Drag Kanban' }\n      }\n    ]\n  },\n  {\n    path: '/charts',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    name: 'Charts',\n    meta: {\n      title: 'Charts',\n      icon: 'chart'\n    },\n    children: [\n      {\n        path: 'keyboard',\n        component: 'views/charts/keyboard',\n        name: 'KeyboardChart',\n        meta: { title: 'Keyboard Chart', noCache: true }\n      },\n      {\n        path: 'line',\n        component: 'views/charts/line',\n        name: 'LineChart',\n        meta: { title: 'Line Chart', noCache: true }\n      },\n      {\n        path: 'mixchart',\n        component: 'views/charts/mixChart',\n        name: 'MixChart',\n        meta: { title: 'Mix Chart', noCache: true }\n      }\n    ]\n  },\n  {\n    path: '/nested',\n    component: 'layout/Layout',\n    redirect: '/nested/menu1/menu1-1',\n    name: 'Nested',\n    meta: {\n      title: 'Nested',\n      icon: 'nested'\n    },\n    children: [\n      {\n        path: 'menu1',\n        component: 'views/nested/menu1/index',\n        name: 'Menu1',\n        meta: { title: 'Menu1' },\n        redirect: '/nested/menu1/menu1-1',\n        children: [\n          {\n            path: 'menu1-1',\n            component: 'views/nested/menu1/menu1-1',\n            name: 'Menu1-1',\n            meta: { title: 'Menu1-1' }\n          },\n          {\n            path: 'menu1-2',\n            component: 'views/nested/menu1/menu1-2',\n            name: 'Menu1-2',\n            redirect: '/nested/menu1/menu1-2/menu1-2-1',\n            meta: { title: 'Menu1-2' },\n            children: [\n              {\n                path: 'menu1-2-1',\n                component: 'views/nested/menu1/menu1-2/menu1-2-1',\n                name: 'Menu1-2-1',\n                meta: { title: 'Menu1-2-1' }\n              },\n              {\n                path: 'menu1-2-2',\n                component: 'views/nested/menu1/menu1-2/menu1-2-2',\n                name: 'Menu1-2-2',\n                meta: { title: 'Menu1-2-2' }\n              }\n            ]\n          },\n          {\n            path: 'menu1-3',\n            component: 'views/nested/menu1/menu1-3',\n            name: 'Menu1-3',\n            meta: { title: 'Menu1-3' }\n          }\n        ]\n      },\n      {\n        path: 'menu2',\n        name: 'Menu2',\n        component: 'views/nested/menu2/index',\n        meta: { title: 'Menu2' }\n      }\n    ]\n  },\n\n  {\n    path: '/example',\n    component: 'layout/Layout',\n    redirect: '/example/list',\n    name: 'Example',\n    meta: {\n      title: 'Example',\n      icon: 'example'\n    },\n    children: [\n      {\n        path: 'create',\n        component: 'views/example/create',\n        name: 'CreateArticle',\n        meta: { title: 'Create Article', icon: 'edit' }\n      },\n      {\n        path: 'edit/:id(\\\\d+)',\n        component: 'views/example/edit',\n        name: 'EditArticle',\n        meta: { title: 'Edit Article', noCache: true },\n        hidden: true\n      },\n      {\n        path: 'list',\n        component: 'views/example/list',\n        name: 'ArticleList',\n        meta: { title: 'Article List', icon: 'list' }\n      }\n    ]\n  },\n\n  {\n    path: '/tab',\n    component: 'layout/Layout',\n    children: [\n      {\n        path: 'index',\n        component: 'views/tab/index',\n        name: 'Tab',\n        meta: { title: 'Tab', icon: 'tab' }\n      }\n    ]\n  },\n\n  {\n    path: '/error',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    name: 'ErrorPages',\n    meta: {\n      title: 'Error Pages',\n      icon: '404'\n    },\n    children: [\n      {\n        path: '401',\n        component: 'views/error-page/401',\n        name: 'Page401',\n        meta: { title: 'Page 401', noCache: true }\n      },\n      {\n        path: '404',\n        component: 'views/error-page/404',\n        name: 'Page404',\n        meta: { title: 'Page 404', noCache: true }\n      }\n    ]\n  },\n\n  {\n    path: '/error-log',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    children: [\n      {\n        path: 'log',\n        component: 'views/error-log/index',\n        name: 'ErrorLog',\n        meta: { title: 'Error Log', icon: 'bug' }\n      }\n    ]\n  },\n\n  {\n    path: '/excel',\n    component: 'layout/Layout',\n    redirect: '/excel/export-excel',\n    name: 'Excel',\n    meta: {\n      title: 'Excel',\n      icon: 'excel'\n    },\n    children: [\n      {\n        path: 'export-excel',\n        component: 'views/excel/export-excel',\n        name: 'ExportExcel',\n        meta: { title: 'Export Excel' }\n      },\n      {\n        path: 'export-selected-excel',\n        component: 'views/excel/select-excel',\n        name: 'SelectExcel',\n        meta: { title: 'Select Excel' }\n      },\n      {\n        path: 'export-merge-header',\n        component: 'views/excel/merge-header',\n        name: 'MergeHeader',\n        meta: { title: 'Merge Header' }\n      },\n      {\n        path: 'upload-excel',\n        component: 'views/excel/upload-excel',\n        name: 'UploadExcel',\n        meta: { title: 'Upload Excel' }\n      }\n    ]\n  },\n\n  {\n    path: '/zip',\n    component: 'layout/Layout',\n    redirect: '/zip/download',\n    alwaysShow: true,\n    meta: { title: 'Zip', icon: 'zip' },\n    children: [\n      {\n        path: 'download',\n        component: 'views/zip/index',\n        name: 'ExportZip',\n        meta: { title: 'Export Zip' }\n      }\n    ]\n  },\n\n  {\n    path: '/pdf',\n    component: 'layout/Layout',\n    redirect: '/pdf/index',\n    children: [\n      {\n        path: 'index',\n        component: 'views/pdf/index',\n        name: 'PDF',\n        meta: { title: 'PDF', icon: 'pdf' }\n      }\n    ]\n  },\n  {\n    path: '/pdf/download',\n    component: 'views/pdf/download',\n    hidden: true\n  },\n\n  {\n    path: '/theme',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    children: [\n      {\n        path: 'index',\n        component: 'views/theme/index',\n        name: 'Theme',\n        meta: { title: 'Theme', icon: 'theme' }\n      }\n    ]\n  },\n\n  {\n    path: '/clipboard',\n    component: 'layout/Layout',\n    redirect: 'noRedirect',\n    children: [\n      {\n        path: 'index',\n        component: 'views/clipboard/index',\n        name: 'ClipboardDemo',\n        meta: { title: 'Clipboard Demo', icon: 'clipboard' }\n      }\n    ]\n  },\n\n  {\n    path: '/i18n',\n    component: 'layout/Layout',\n    children: [\n      {\n        path: 'index',\n        component: 'views/i18n-demo/index',\n        name: 'I18n',\n        meta: { title: 'I18n', icon: 'international' }\n      }\n    ]\n  },\n\n  {\n    path: 'external-link',\n    component: 'layout/Layout',\n    children: [\n      {\n        path: 'https://github.com/PanJiaChen/vue-element-admin',\n        meta: { title: 'External Link', icon: 'link' }\n      }\n    ]\n  },\n\n  { path: '*', redirect: '/404', hidden: true }\n]\n\nmodule.exports = {\n  constantRoutes,\n  asyncRoutes\n}\n"
  },
  {
    "path": "mock/user.js",
    "content": "\nconst tokens = {\n  admin: {\n    token: 'admin-token'\n  },\n  editor: {\n    token: 'editor-token'\n  }\n}\n\nconst users = {\n  'admin-token': {\n    roles: ['admin'],\n    introduction: 'I am a super administrator',\n    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',\n    name: 'Super Admin'\n  },\n  'editor-token': {\n    roles: ['editor'],\n    introduction: 'I am an editor',\n    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',\n    name: 'Normal Editor'\n  }\n}\n\nmodule.exports = [\n  // user login\n  {\n    url: '/vue-element-admin/user/login',\n    type: 'post',\n    response: config => {\n      const { username } = config.body\n      const token = tokens[username]\n\n      // mock error\n      if (!token) {\n        return {\n          code: 60204,\n          message: 'Account and password are incorrect.'\n        }\n      }\n\n      return {\n        code: 20000,\n        data: token\n      }\n    }\n  },\n\n  // get user info\n  {\n    url: '/vue-element-admin/user/info\\.*',\n    type: 'get',\n    response: config => {\n      const { token } = config.query\n      const info = users[token]\n\n      // mock error\n      if (!info) {\n        return {\n          code: 50008,\n          message: 'Login failed, unable to get user details.'\n        }\n      }\n\n      return {\n        code: 20000,\n        data: info\n      }\n    }\n  },\n\n  // user logout\n  {\n    url: '/vue-element-admin/user/logout',\n    type: 'post',\n    response: _ => {\n      return {\n        code: 20000,\n        data: 'success'\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "mock/utils.js",
    "content": "/**\n * @param {string} url\n * @returns {Object}\n */\nfunction param2Obj(url) {\n  const search = decodeURIComponent(url.split('?')[1]).replace(/\\+/g, ' ')\n  if (!search) {\n    return {}\n  }\n  const obj = {}\n  const searchArr = search.split('&')\n  searchArr.forEach(v => {\n    const index = v.indexOf('=')\n    if (index !== -1) {\n      const name = v.substring(0, index)\n      const val = v.substring(index + 1, v.length)\n      obj[name] = val\n    }\n  })\n  return obj\n}\n\n/**\n * This is just a simple version of deep copy\n * Has a lot of edge cases bug\n * If you want to use a perfect deep copy, use lodash's _.cloneDeep\n * @param {Object} source\n * @returns {Object}\n */\nfunction deepClone(source) {\n  if (!source && typeof source !== 'object') {\n    throw new Error('error arguments', 'deepClone')\n  }\n  const targetObj = source.constructor === Array ? [] : {}\n  Object.keys(source).forEach(keys => {\n    if (source[keys] && typeof source[keys] === 'object') {\n      targetObj[keys] = deepClone(source[keys])\n    } else {\n      targetObj[keys] = source[keys]\n    }\n  })\n  return targetObj\n}\n\nmodule.exports = {\n  param2Obj,\n  deepClone\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vue-element-admin\",\n  \"version\": \"4.4.0\",\n  \"description\": \"A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features\",\n  \"author\": \"Pan <panfree23@gmail.com>\",\n  \"scripts\": {\n    \"dev\": \"vue-cli-service serve\",\n    \"lint\": \"eslint --ext .js,.vue src\",\n    \"build:prod\": \"vue-cli-service build\",\n    \"build:stage\": \"vue-cli-service build --mode staging\",\n    \"preview\": \"node build/index.js --preview\",\n    \"new\": \"plop\",\n    \"svgo\": \"svgo -f src/icons/svg --config=src/icons/svgo.yml\",\n    \"test:unit\": \"jest --clearCache && vue-cli-service test:unit\",\n    \"test:ci\": \"npm run lint && npm run test:unit\"\n  },\n  \"dependencies\": {\n    \"axios\": \"0.18.1\",\n    \"clipboard\": \"2.0.4\",\n    \"codemirror\": \"5.45.0\",\n    \"core-js\": \"3.6.5\",\n    \"driver.js\": \"0.9.5\",\n    \"dropzone\": \"5.5.1\",\n    \"echarts\": \"4.2.1\",\n    \"element-ui\": \"2.13.2\",\n    \"file-saver\": \"2.0.1\",\n    \"fuse.js\": \"3.4.4\",\n    \"js-cookie\": \"2.2.0\",\n    \"jsonlint\": \"1.6.3\",\n    \"jszip\": \"3.2.1\",\n    \"normalize.css\": \"7.0.0\",\n    \"nprogress\": \"0.2.0\",\n    \"path-to-regexp\": \"2.4.0\",\n    \"screenfull\": \"4.2.0\",\n    \"script-loader\": \"0.7.2\",\n    \"sortablejs\": \"1.8.4\",\n    \"tui-editor\": \"1.3.3\",\n    \"vue\": \"2.6.10\",\n    \"vue-count-to\": \"1.0.13\",\n    \"vue-router\": \"3.0.2\",\n    \"vue-splitpane\": \"1.0.4\",\n    \"vuedraggable\": \"2.20.0\",\n    \"vuex\": \"3.1.0\",\n    \"xlsx\": \"0.14.1\"\n  },\n  \"devDependencies\": {\n    \"@vue/cli-plugin-babel\": \"4.4.4\",\n    \"@vue/cli-plugin-eslint\": \"4.4.4\",\n    \"@vue/cli-plugin-unit-jest\": \"4.4.4\",\n    \"@vue/cli-service\": \"4.4.4\",\n    \"@vue/test-utils\": \"1.0.0-beta.29\",\n    \"autoprefixer\": \"9.5.1\",\n    \"babel-eslint\": \"10.1.0\",\n    \"babel-jest\": \"23.6.0\",\n    \"babel-plugin-dynamic-import-node\": \"2.3.3\",\n    \"chalk\": \"2.4.2\",\n    \"chokidar\": \"2.1.5\",\n    \"connect\": \"3.6.6\",\n    \"eslint\": \"6.7.2\",\n    \"eslint-plugin-vue\": \"6.2.2\",\n    \"html-webpack-plugin\": \"3.2.0\",\n    \"husky\": \"1.3.1\",\n    \"lint-staged\": \"8.1.5\",\n    \"mockjs\": \"1.0.1-beta3\",\n    \"plop\": \"2.3.0\",\n    \"runjs\": \"4.3.2\",\n    \"sass\": \"1.26.2\",\n    \"sass-loader\": \"8.0.2\",\n    \"script-ext-html-webpack-plugin\": \"2.1.3\",\n    \"serve-static\": \"1.13.2\",\n    \"svg-sprite-loader\": \"4.1.3\",\n    \"svgo\": \"1.2.0\",\n    \"vue-template-compiler\": \"2.6.10\"\n  },\n  \"browserslist\": [\n    \"> 1%\",\n    \"last 2 versions\"\n  ],\n  \"bugs\": {\n    \"url\": \"https://github.com/PanJiaChen/vue-element-admin/issues\"\n  },\n  \"engines\": {\n    \"node\": \">=8.9\",\n    \"npm\": \">= 3.0.0\"\n  },\n  \"keywords\": [\n    \"vue\",\n    \"admin\",\n    \"dashboard\",\n    \"element-ui\",\n    \"boilerplate\",\n    \"admin-template\",\n    \"management-system\"\n  ],\n  \"license\": \"MIT\",\n  \"lint-staged\": {\n    \"src/**/*.{js,vue}\": [\n      \"eslint --fix\",\n      \"git add\"\n    ]\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"lint-staged\"\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/PanJiaChen/vue-element-admin.git\"\n  }\n}\n"
  },
  {
    "path": "plop-templates/component/index.hbs",
    "content": "{{#if template}}\n<template>\n  <div />\n</template>\n{{/if}}\n\n{{#if script}}\n<script>\nexport default {\n  name: '{{ properCase name }}',\n  props: {},\n  data() {\n    return {}\n  },\n  created() {},\n  mounted() {},\n  methods: {}\n}\n</script>\n{{/if}}\n\n{{#if style}}\n<style lang=\"scss\" scoped>\n\n</style>\n{{/if}}\n"
  },
  {
    "path": "plop-templates/component/prompt.js",
    "content": "const { notEmpty } = require('../utils.js')\n\nmodule.exports = {\n  description: 'generate vue component',\n  prompts: [{\n    type: 'input',\n    name: 'name',\n    message: 'component name please',\n    validate: notEmpty('name')\n  },\n  {\n    type: 'checkbox',\n    name: 'blocks',\n    message: 'Blocks:',\n    choices: [{\n      name: '<template>',\n      value: 'template',\n      checked: true\n    },\n    {\n      name: '<script>',\n      value: 'script',\n      checked: true\n    },\n    {\n      name: 'style',\n      value: 'style',\n      checked: true\n    }\n    ],\n    validate(value) {\n      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {\n        return 'Components require at least a <script> or <template> tag.'\n      }\n      return true\n    }\n  }\n  ],\n  actions: data => {\n    const name = '{{properCase name}}'\n    const actions = [{\n      type: 'add',\n      path: `src/components/${name}/index.vue`,\n      templateFile: 'plop-templates/component/index.hbs',\n      data: {\n        name: name,\n        template: data.blocks.includes('template'),\n        script: data.blocks.includes('script'),\n        style: data.blocks.includes('style')\n      }\n    }]\n\n    return actions\n  }\n}\n"
  },
  {
    "path": "plop-templates/store/index.hbs",
    "content": "{{#if state}}\nconst state = {}\n{{/if}}\n\n{{#if mutations}}\nconst mutations = {}\n{{/if}}\n\n{{#if actions}}\nconst actions = {}\n{{/if}}\n\nexport default {\n  namespaced: true,\n  {{options}}\n}\n"
  },
  {
    "path": "plop-templates/store/prompt.js",
    "content": "const { notEmpty } = require('../utils.js')\n\nmodule.exports = {\n  description: 'generate store',\n  prompts: [{\n    type: 'input',\n    name: 'name',\n    message: 'store name please',\n    validate: notEmpty('name')\n  },\n  {\n    type: 'checkbox',\n    name: 'blocks',\n    message: 'Blocks:',\n    choices: [{\n      name: 'state',\n      value: 'state',\n      checked: true\n    },\n    {\n      name: 'mutations',\n      value: 'mutations',\n      checked: true\n    },\n    {\n      name: 'actions',\n      value: 'actions',\n      checked: true\n    }\n    ],\n    validate(value) {\n      if (!value.includes('state') || !value.includes('mutations')) {\n        return 'store require at least state and mutations'\n      }\n      return true\n    }\n  }\n  ],\n  actions(data) {\n    const name = '{{name}}'\n    const { blocks } = data\n    const options = ['state', 'mutations']\n    const joinFlag = `,\n  `\n    if (blocks.length === 3) {\n      options.push('actions')\n    }\n\n    const actions = [{\n      type: 'add',\n      path: `src/store/modules/${name}.js`,\n      templateFile: 'plop-templates/store/index.hbs',\n      data: {\n        options: options.join(joinFlag),\n        state: blocks.includes('state'),\n        mutations: blocks.includes('mutations'),\n        actions: blocks.includes('actions')\n      }\n    }]\n    return actions\n  }\n}\n"
  },
  {
    "path": "plop-templates/utils.js",
    "content": "exports.notEmpty = name => v =>\n  !v || v.trim() === '' ? `${name} is required` : true\n"
  },
  {
    "path": "plop-templates/view/index.hbs",
    "content": "{{#if template}}\n<template>\n  <div />\n</template>\n{{/if}}\n\n{{#if script}}\n<script>\nexport default {\n  name: '{{ properCase name }}',\n  props: {},\n  data() {\n    return {}\n  },\n  created() {},\n  mounted() {},\n  methods: {}\n}\n</script>\n{{/if}}\n\n{{#if style}}\n<style lang=\"scss\" scoped>\n\n</style>\n{{/if}}\n"
  },
  {
    "path": "plop-templates/view/prompt.js",
    "content": "const { notEmpty } = require('../utils.js')\n\nmodule.exports = {\n  description: 'generate a view',\n  prompts: [{\n    type: 'input',\n    name: 'name',\n    message: 'view name please',\n    validate: notEmpty('name')\n  },\n  {\n    type: 'checkbox',\n    name: 'blocks',\n    message: 'Blocks:',\n    choices: [{\n      name: '<template>',\n      value: 'template',\n      checked: true\n    },\n    {\n      name: '<script>',\n      value: 'script',\n      checked: true\n    },\n    {\n      name: 'style',\n      value: 'style',\n      checked: true\n    }\n    ],\n    validate(value) {\n      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {\n        return 'View require at least a <script> or <template> tag.'\n      }\n      return true\n    }\n  }\n  ],\n  actions: data => {\n    const name = '{{name}}'\n    const actions = [{\n      type: 'add',\n      path: `src/views/${name}/index.vue`,\n      templateFile: 'plop-templates/view/index.hbs',\n      data: {\n        name: name,\n        template: data.blocks.includes('template'),\n        script: data.blocks.includes('script'),\n        style: data.blocks.includes('style')\n      }\n    }]\n\n    return actions\n  }\n}\n"
  },
  {
    "path": "plopfile.js",
    "content": "const viewGenerator = require('./plop-templates/view/prompt')\nconst componentGenerator = require('./plop-templates/component/prompt')\nconst storeGenerator = require('./plop-templates/store/prompt.js')\n\nmodule.exports = function(plop) {\n  plop.setGenerator('view', viewGenerator)\n  plop.setGenerator('component', componentGenerator)\n  plop.setGenerator('store', storeGenerator)\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    autoprefixer: {}\n  }\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <link rel=\"icon\" href=\"<%= BASE_URL %>favicon.ico\">\n    <title><%= webpackConfig.name %></title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <!-- built files will be auto injected -->\n  </body>\n</html>\n"
  },
  {
    "path": "src/App.vue",
    "content": "<template>\n  <div id=\"app\">\n    <router-view />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'App'\n}\n</script>\n"
  },
  {
    "path": "src/api/article.js",
    "content": "import request from '@/utils/request'\n\nexport function fetchList(query) {\n  return request({\n    url: '/vue-element-admin/article/list',\n    method: 'get',\n    params: query\n  })\n}\n\nexport function fetchArticle(id) {\n  return request({\n    url: '/vue-element-admin/article/detail',\n    method: 'get',\n    params: { id }\n  })\n}\n\nexport function fetchPv(pv) {\n  return request({\n    url: '/vue-element-admin/article/pv',\n    method: 'get',\n    params: { pv }\n  })\n}\n\nexport function createArticle(data) {\n  return request({\n    url: '/vue-element-admin/article/create',\n    method: 'post',\n    data\n  })\n}\n\nexport function updateArticle(data) {\n  return request({\n    url: '/vue-element-admin/article/update',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/qiniu.js",
    "content": "import request from '@/utils/request'\n\nexport function getToken() {\n  return request({\n    url: '/qiniu/upload/token', // 假地址 自行替换\n    method: 'get'\n  })\n}\n"
  },
  {
    "path": "src/api/remote-search.js",
    "content": "import request from '@/utils/request'\n\nexport function searchUser(name) {\n  return request({\n    url: '/vue-element-admin/search/user',\n    method: 'get',\n    params: { name }\n  })\n}\n\nexport function transactionList(query) {\n  return request({\n    url: '/vue-element-admin/transaction/list',\n    method: 'get',\n    params: query\n  })\n}\n"
  },
  {
    "path": "src/api/role.js",
    "content": "import request from '@/utils/request'\n\nexport function getRoutes() {\n  return request({\n    url: '/vue-element-admin/routes',\n    method: 'get'\n  })\n}\n\nexport function getRoles() {\n  return request({\n    url: '/vue-element-admin/roles',\n    method: 'get'\n  })\n}\n\nexport function addRole(data) {\n  return request({\n    url: '/vue-element-admin/role',\n    method: 'post',\n    data\n  })\n}\n\nexport function updateRole(id, data) {\n  return request({\n    url: `/vue-element-admin/role/${id}`,\n    method: 'put',\n    data\n  })\n}\n\nexport function deleteRole(id) {\n  return request({\n    url: `/vue-element-admin/role/${id}`,\n    method: 'delete'\n  })\n}\n"
  },
  {
    "path": "src/api/user.js",
    "content": "import request from '@/utils/request'\n\nexport function login(data) {\n  return request({\n    url: '/vue-element-admin/user/login',\n    method: 'post',\n    data\n  })\n}\n\nexport function getInfo(token) {\n  return request({\n    url: '/vue-element-admin/user/info',\n    method: 'get',\n    params: { token }\n  })\n}\n\nexport function logout() {\n  return request({\n    url: '/vue-element-admin/user/logout',\n    method: 'post'\n  })\n}\n"
  },
  {
    "path": "src/assets/custom-theme/index.css",
    "content": "@charset \"UTF-8\";.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}@font-face{font-family:element-icons;src:url(fonts/element-icons.woff?t=1508751886602) format(\"woff\"),url(fonts/element-icons.ttf?t=1508751886602) format(\"truetype\");font-weight:400;font-style:normal}.custom-theme [class*=\" el-icon-\"],.custom-theme [class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-icon-upload:before{content:\"\\e60d\"}.custom-theme .el-icon-error:before{content:\"\\e62c\"}.custom-theme .el-icon-success:before{content:\"\\e62d\"}.custom-theme .el-icon-warning:before{content:\"\\e62e\"}.custom-theme .el-icon-sort-down:before{content:\"\\e630\"}.custom-theme .el-icon-sort-up:before{content:\"\\e631\"}.custom-theme .el-icon-arrow-left:before{content:\"\\e600\"}.custom-theme .el-icon-circle-plus:before{content:\"\\e601\"}.custom-theme .el-icon-circle-plus-outline:before{content:\"\\e602\"}.custom-theme .el-icon-arrow-down:before{content:\"\\e603\"}.custom-theme .el-icon-arrow-right:before{content:\"\\e604\"}.custom-theme .el-icon-arrow-up:before{content:\"\\e605\"}.custom-theme .el-icon-back:before{content:\"\\e606\"}.custom-theme .el-icon-circle-close:before{content:\"\\e607\"}.custom-theme .el-icon-date:before{content:\"\\e608\"}.custom-theme .el-icon-circle-close-outline:before{content:\"\\e609\"}.custom-theme .el-icon-caret-left:before{content:\"\\e60a\"}.custom-theme .el-icon-caret-bottom:before{content:\"\\e60b\"}.custom-theme .el-icon-caret-top:before{content:\"\\e60c\"}.custom-theme .el-icon-caret-right:before{content:\"\\e60e\"}.custom-theme .el-icon-close:before{content:\"\\e60f\"}.custom-theme .el-icon-d-arrow-left:before{content:\"\\e610\"}.custom-theme .el-icon-check:before{content:\"\\e611\"}.custom-theme .el-icon-delete:before{content:\"\\e612\"}.custom-theme .el-icon-d-arrow-right:before{content:\"\\e613\"}.custom-theme .el-icon-document:before{content:\"\\e614\"}.custom-theme .el-icon-d-caret:before{content:\"\\e615\"}.custom-theme .el-icon-edit-outline:before{content:\"\\e616\"}.custom-theme .el-icon-download:before{content:\"\\e617\"}.custom-theme .el-icon-goods:before{content:\"\\e618\"}.custom-theme .el-icon-search:before{content:\"\\e619\"}.custom-theme .el-icon-info:before{content:\"\\e61a\"}.custom-theme .el-icon-message:before{content:\"\\e61b\"}.custom-theme .el-icon-edit:before{content:\"\\e61c\"}.custom-theme .el-icon-location:before{content:\"\\e61d\"}.custom-theme .el-icon-loading:before{content:\"\\e61e\"}.custom-theme .el-icon-location-outline:before{content:\"\\e61f\"}.custom-theme .el-icon-menu:before{content:\"\\e620\"}.custom-theme .el-icon-minus:before{content:\"\\e621\"}.custom-theme .el-icon-bell:before{content:\"\\e622\"}.custom-theme .el-icon-mobile-phone:before{content:\"\\e624\"}.custom-theme .el-icon-news:before{content:\"\\e625\"}.custom-theme .el-icon-more:before{content:\"\\e646\"}.custom-theme .el-icon-more-outline:before{content:\"\\e626\"}.custom-theme .el-icon-phone:before{content:\"\\e627\"}.custom-theme .el-icon-phone-outline:before{content:\"\\e628\"}.custom-theme .el-icon-picture:before{content:\"\\e629\"}.custom-theme .el-icon-picture-outline:before{content:\"\\e62a\"}.custom-theme .el-icon-plus:before{content:\"\\e62b\"}.custom-theme .el-icon-printer:before{content:\"\\e62f\"}.custom-theme .el-icon-rank:before{content:\"\\e632\"}.custom-theme .el-icon-refresh:before{content:\"\\e633\"}.custom-theme .el-icon-question:before{content:\"\\e634\"}.custom-theme .el-icon-remove:before{content:\"\\e635\"}.custom-theme .el-icon-share:before{content:\"\\e636\"}.custom-theme .el-icon-star-on:before{content:\"\\e637\"}.custom-theme .el-icon-setting:before{content:\"\\e638\"}.custom-theme .el-icon-circle-check:before{content:\"\\e639\"}.custom-theme .el-icon-service:before{content:\"\\e63a\"}.custom-theme .el-icon-sold-out:before{content:\"\\e63b\"}.custom-theme .el-icon-remove-outline:before{content:\"\\e63c\"}.custom-theme .el-icon-star-off:before{content:\"\\e63d\"}.custom-theme .el-icon-circle-check-outline:before{content:\"\\e63e\"}.custom-theme .el-icon-tickets:before{content:\"\\e63f\"}.custom-theme .el-icon-sort:before{content:\"\\e640\"}.custom-theme .el-icon-zoom-in:before{content:\"\\e641\"}.custom-theme .el-icon-time:before{content:\"\\e642\"}.custom-theme .el-icon-view:before{content:\"\\e643\"}.custom-theme .el-icon-upload2:before{content:\"\\e644\"}.custom-theme .el-icon-zoom-out:before{content:\"\\e645\"}.custom-theme .el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.custom-theme .el-icon--right{margin-left:5px}.custom-theme .el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-select-dropdown{position:absolute;z-index:1001;border:solid 1px #dfe4ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#262729;background-color:#fff}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:\"\\E611\";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.custom-theme .el-select-dropdown .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.custom-theme .el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.custom-theme .el-select-dropdown__wrap{max-height:274px}.custom-theme .el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-select-dropdown__item.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-select-dropdown__item.is-disabled:hover{background-color:#fff}.custom-theme .el-select-dropdown__item.hover,.custom-theme .el-select-dropdown__item:hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown__item.selected{color:#262729;font-weight:700}.custom-theme .el-select-dropdown__item span{line-height:34px!important}.custom-theme .el-select-group{margin:0;padding:0}.custom-theme .el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.custom-theme .el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.custom-theme .el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#dfe4ed}.custom-theme .el-select-group__title{padding-left:20px;font-size:12px;color:#0a76a4;line-height:30px}.custom-theme .el-select-group .el-select-dropdown__item{padding-left:20px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-select{display:inline-block;position:relative}.custom-theme .el-select:hover .el-input__inner{border-color:#b4bccc}.custom-theme .el-select .el-input__inner{cursor:pointer;padding-right:35px}.custom-theme .el-select .el-input__inner:focus{border-color:#262729}.custom-theme .el-select .el-input .el-select__caret{color:#b4bccc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);line-height:16px;cursor:pointer}.custom-theme .el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.custom-theme .el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#b4bccc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover{color:#878d99}.custom-theme .el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover{border-color:#dfe4ed}.custom-theme .el-select>.el-input{display:block}.custom-theme .el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;vertical-align:baseline;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.custom-theme .el-select__input.is-mini{height:14px}.custom-theme .el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#b4bccc;line-height:18px;font-size:14px}.custom-theme .el-select__close:hover{color:#878d99}.custom-theme .el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.custom-theme .el-select .el-tag__close{margin-top:-2px}.custom-theme .el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:3px 0 3px 6px;background-color:#f0f2f5}.custom-theme .el-select .el-tag__close.el-icon-close{background-color:#b4bccc;right:-7px;color:#fff}.custom-theme .el-select .el-tag__close.el-icon-close:hover{background-color:#878d99}.custom-theme .el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.custom-theme .el-select__tag{display:inline-block;height:24px;line-height:24px;font-size:14px;border-radius:4px;color:#fff;background-color:#262729}.custom-theme .el-select__tag .el-icon-close{font-size:14px}.custom-theme .el-pagination{white-space:nowrap;padding:2px 5px;color:#2d2f33;font-weight:700}.custom-theme .el-pagination::after,.custom-theme .el-pagination::before{display:table;content:\"\"}.custom-theme .el-pagination::after{clear:both}.custom-theme .el-pagination button,.custom-theme .el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-pagination .el-input__inner{text-align:center}.custom-theme .el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-pagination .el-select .el-input{width:100px;margin:0 5px}.custom-theme .el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px;height:28px}.custom-theme .el-pagination button{border:none;padding:0 6px;background:0 0}.custom-theme .el-pagination button:focus{outline:0}.custom-theme .el-pagination button:hover{color:#262729}.custom-theme .el-pagination button.disabled{color:#b4bccc;background-color:#fff;cursor:not-allowed}.custom-theme .el-pagination .btn-next,.custom-theme .el-pagination .btn-prev{background:center center no-repeat;background-size:16px;background-color:#fff;cursor:pointer;margin:0;color:#2d2f33}.custom-theme .el-pagination .btn-next .el-icon,.custom-theme .el-pagination .btn-prev .el-icon{display:block;font-size:12px}.custom-theme .el-pagination .btn-prev{padding-right:12px}.custom-theme .el-pagination .btn-next{padding-left:12px}.custom-theme .el-pagination--small .btn-next,.custom-theme .el-pagination--small .btn-prev,.custom-theme .el-pagination--small .el-pager li,.custom-theme .el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.custom-theme .el-pagination--small .arrow.disabled{visibility:hidden}.custom-theme .el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.custom-theme .el-pagination__sizes .el-input .el-input__inner:hover{border-color:#262729}.custom-theme .el-pagination__total{margin-right:10px;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__jump{margin-left:24px;font-weight:400;color:#5a5e66}.custom-theme .el-pagination__jump .el-input__inner{padding:0 3px}.custom-theme .el-pagination__rightwrapper{float:right}.custom-theme .el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px;-moz-appearance:textfield}.custom-theme .el-pagination__editor.el-input{width:50px}.custom-theme .el-pagination__editor.el-input .el-input__inner{height:28px}.custom-theme .el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.custom-theme .el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.custom-theme .el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;display:inline-block;vertical-align:top;font-size:0;padding:0;margin:0}.custom-theme .el-pager .el-icon-more::before{vertical-align:-4px}.custom-theme .el-pager li{padding:0 4px;background:#fff;vertical-align:top;display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;margin:0}.custom-theme .el-pager li.btn-quicknext,.custom-theme .el-pager li.btn-quickprev{line-height:28px;color:#2d2f33}.custom-theme .el-pager li.btn-quickprev:hover{cursor:pointer}.custom-theme .el-pager li.btn-quicknext:hover{cursor:pointer}.custom-theme .el-pager li.active+li{border-left:0}.custom-theme .el-pager li:hover{color:#262729}.custom-theme .el-pager li.active{color:#262729;cursor:default}.custom-theme .v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.custom-theme .v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.custom-theme .v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.custom-theme .el-dialog{position:relative;margin:0 auto 50px;background:#fff;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.custom-theme .el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.custom-theme .el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.custom-theme .el-dialog__header{padding:15px;padding-bottom:10px}.custom-theme .el-dialog__headerbtn{position:absolute;top:15px;right:15px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.custom-theme .el-dialog__headerbtn .el-dialog__close{color:#0a76a4}.custom-theme .el-dialog__headerbtn:focus .el-dialog__close,.custom-theme .el-dialog__headerbtn:hover .el-dialog__close{color:#262729}.custom-theme .el-dialog__title{line-height:24px;font-size:18px;color:#2d2f33}.custom-theme .el-dialog__body{padding:30px 20px;color:#5a5e66;line-height:24px;font-size:14px}.custom-theme .el-dialog__footer{padding:15px;padding-top:10px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-dialog--center{text-align:center}.custom-theme .el-dialog--center .el-dialog__header{padding-top:30px}.custom-theme .el-dialog--center .el-dialog__body{text-align:initial;padding:25px 27px 30px}.custom-theme .el-dialog--center .el-dialog__footer{text-align:inherit;padding-bottom:30px}.custom-theme .dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.custom-theme .dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-autocomplete{position:relative;display:inline-block}.custom-theme .el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px}.custom-theme .el-autocomplete-suggestion.el-popper .popper__arrow{left:24px!important}.custom-theme .el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto;background-color:#fff;border:1px solid #dfe4ed;border-radius:4px}.custom-theme .el-autocomplete-suggestion__list{margin:0;padding:0}.custom-theme .el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#5a5e66;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-theme .el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.custom-theme .el-autocomplete-suggestion li.highlighted{background-color:#f5f7fa}.custom-theme .el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.custom-theme .el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.custom-theme .el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.custom-theme .el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.custom-theme .el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:\"\"}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-dropdown{display:inline-block;position:relative;color:#5a5e66;font-size:14px}.custom-theme .el-dropdown .el-button-group{display:block}.custom-theme .el-dropdown .el-button-group .el-button{float:none}.custom-theme .el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.custom-theme .el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.custom-theme .el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.custom-theme .el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.custom-theme .el-dropdown__icon{font-size:12px;margin:0 3px}.custom-theme .el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #e6ebf5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#5a5e66;cursor:pointer}.custom-theme .el-dropdown-menu__item:not(.is-disabled):hover{background-color:#e9e9ea;color:#515254}.custom-theme .el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #e6ebf5}.custom-theme .el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#fff}.custom-theme .el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.custom-theme .el-dropdown-menu--medium{padding:6px 0}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.custom-theme .el-dropdown-menu--small{padding:6px 0}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.custom-theme .el-dropdown-menu--mini{padding:3px 0}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.custom-theme .el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#fff}.custom-theme .el-menu::after,.custom-theme .el-menu::before{display:table;content:\"\"}.custom-theme .el-menu::after{clear:both}.custom-theme .el-menu li{list-style:none}.custom-theme .el-menu--horizontal{border-right:none;border-bottom:solid 1px #e6e6e6}.custom-theme .el-menu--horizontal .el-menu-item{float:left;height:60px;line-height:60px;margin:0;cursor:pointer;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:2px solid transparent;color:#878d99}.custom-theme .el-menu--horizontal .el-menu-item a,.custom-theme .el-menu--horizontal .el-menu-item a:hover{color:inherit}.custom-theme .el-menu--horizontal .el-menu-item:focus,.custom-theme .el-menu--horizontal .el-menu-item:hover{background-color:#fff}.custom-theme .el-menu--horizontal .el-submenu{float:left;position:relative}.custom-theme .el-menu--horizontal .el-submenu:focus{outline:0}.custom-theme .el-menu--horizontal .el-submenu:focus>.el-submenu__title{color:#2d2f33}.custom-theme .el-menu--horizontal .el-submenu>.el-menu{position:absolute;top:65px;left:0;border:none;padding:5px 0;background-color:#fff;z-index:100;min-width:100%;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#878d99}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title:hover{background-color:#fff}.custom-theme .el-menu--horizontal .el-submenu .el-menu-item{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px}.custom-theme .el-menu--horizontal .el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.custom-theme .el-menu--horizontal .el-menu-item:focus,.custom-theme .el-menu--horizontal .el-menu-item:hover,.custom-theme .el-menu--horizontal .el-submenu__title:hover{outline:0;color:#2d2f33}.custom-theme .el-menu--horizontal>.el-menu-item.is-active,.custom-theme .el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #262729;color:#2d2f33}.custom-theme .el-menu--collapse{width:64px}.custom-theme .el-menu--collapse>.el-menu-item [class^=el-icon-],.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.custom-theme .el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.custom-theme .el-menu--collapse>.el-menu-item span,.custom-theme .el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.custom-theme .el-menu--collapse>.el-menu-item.is-active i{color:inherit}.custom-theme .el-menu--collapse .el-menu .el-submenu{min-width:200px}.custom-theme .el-menu--collapse .el-submenu{position:relative}.custom-theme .el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #dfe4ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.custom-theme .el-menu-item{height:56px;line-height:56px;font-size:14px;color:#2d2f33;padding:0 20px;cursor:pointer;position:relative;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.custom-theme .el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px}.custom-theme .el-menu-item *{vertical-align:middle}.custom-theme .el-menu-item:first-child{margin-left:0}.custom-theme .el-menu-item:last-child{margin-right:0}.custom-theme .el-menu-item:focus,.custom-theme .el-menu-item:hover{outline:0;background-color:#e9e9ea}.custom-theme .el-menu-item i{color:#878d99}.custom-theme .el-menu-item.is-active{color:#262729}.custom-theme .el-menu-item.is-active i{color:inherit}.custom-theme .el-submenu__title{position:relative;height:56px;line-height:56px;font-size:14px;color:#2d2f33;padding:0 20px;cursor:pointer;position:relative;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.custom-theme .el-submenu__title *{vertical-align:middle}.custom-theme .el-submenu__title i{color:#878d99}.custom-theme .el-submenu__title:hover{background-color:#e9e9ea}.custom-theme .el-submenu .el-menu{border:none}.custom-theme .el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.custom-theme .el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.custom-theme .el-submenu.is-active .el-submenu__title{border-bottom-color:#262729}.custom-theme .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.custom-theme .el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.custom-theme .el-menu-item-group>ul{padding:0}.custom-theme .el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#878d99}.custom-theme .horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.custom-theme .el-input-number .el-input{display:block}.custom-theme .el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.custom-theme .el-input-number__decrease,.custom-theme .el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#5a5e66;cursor:pointer;font-size:13px}.custom-theme .el-input-number__decrease:hover,.custom-theme .el-input-number__increase:hover{color:#262729}.custom-theme .el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.custom-theme .el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#262729}.custom-theme .el-input-number__decrease.is-disabled,.custom-theme .el-input-number__increase.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #d8dce5}.custom-theme .el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #d8dce5}.custom-theme .el-input-number.is-disabled .el-input-number__decrease,.custom-theme .el-input-number.is-disabled .el-input-number__increase{border-color:#dfe4ed;color:#dfe4ed}.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover,.custom-theme .el-input-number.is-disabled .el-input-number__increase:hover{color:#dfe4ed;cursor:not-allowed}.custom-theme .el-input-number--medium{width:200px;line-height:34px}.custom-theme .el-input-number--medium .el-input-number__decrease,.custom-theme .el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.custom-theme .el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.custom-theme .el-input-number--small{width:130px;line-height:30px}.custom-theme .el-input-number--small .el-input-number__decrease,.custom-theme .el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.custom-theme .el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.custom-theme .el-input-number--mini{width:130px;line-height:26px}.custom-theme .el-input-number--mini .el-input-number__decrease,.custom-theme .el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.custom-theme .el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.custom-theme .el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease,.custom-theme .el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #d8dce5}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #d8dce5;border-radius:0 0 4px 0}.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.custom-theme .el-radio{color:#5a5e66;font-weight:500;line-height:1;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;outline:0;font-size:14px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.custom-theme .el-radio.is-bordered{padding:10px 20px 10px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-radio.is-bordered.is-checked{border-color:#262729}.custom-theme .el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#e6ebf5}.custom-theme .el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.custom-theme .el-radio--medium.is-bordered{padding:8px 20px 8px 10px;border-radius:4px}.custom-theme .el-radio--medium.is-bordered .el-radio__label{font-size:14px}.custom-theme .el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.custom-theme .el-radio--small.is-bordered{padding:6px 15px 6px 10px;border-radius:3px}.custom-theme .el-radio--small.is-bordered .el-radio__label{font-size:12px}.custom-theme .el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.custom-theme .el-radio--mini.is-bordered{padding:4px 15px 4px 10px;border-radius:3px}.custom-theme .el-radio--mini.is-bordered .el-radio__label{font-size:12px}.custom-theme .el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.custom-theme .el-radio+.el-radio{margin-left:30px}.custom-theme .el-radio__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-radio__input.is-disabled .el-radio__inner{background-color:#f5f7fa;border-color:#dfe4ed;cursor:not-allowed}.custom-theme .el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#f5f7fa}.custom-theme .el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#dfe4ed}.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#b4bccc}.custom-theme .el-radio__input.is-disabled+span.el-radio__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-radio__input.is-checked .el-radio__inner{border-color:#262729;background:#262729}.custom-theme .el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.custom-theme .el-radio__input.is-checked+.el-radio__label{color:#262729}.custom-theme .el-radio__input.is-focus .el-radio__inner{border-color:#262729}.custom-theme .el-radio__inner{border:1px solid #d8dce5;border-radius:100%;width:14px;height:14px;background-color:#fff;position:relative;cursor:pointer;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-radio__inner:hover{border-color:#262729}.custom-theme .el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:\"\";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);transition:transform .15s cubic-bezier(.71,-.46,.88,.6);transition:transform .15s cubic-bezier(.71,-.46,.88,.6),-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6)}.custom-theme .el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.custom-theme .el-radio:focus:not(.is-focus):not(:active) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #262729;box-shadow:0 0 2px 2px #262729}.custom-theme .el-radio__label{font-size:14px;padding-left:10px}.custom-theme .el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0}.custom-theme .el-radio-button{position:relative;display:inline-block;outline:0}.custom-theme .el-radio-button__inner{display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;background:#fff;border:1px solid #d8dce5;font-weight:500;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-radio-button__inner.is-round{padding:12px 20px}.custom-theme .el-radio-button__inner:hover{color:#262729}.custom-theme .el-radio-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1;left:-999px}.custom-theme .el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #262729;box-shadow:-1px 0 0 0 #262729}.custom-theme .el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#edf2fc}.custom-theme .el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.custom-theme .el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.custom-theme .el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.custom-theme .el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.custom-theme .el-radio-button:focus:not(.is-focus):not(:active){-webkit-box-shadow:0 0 2px 2px #262729;box-shadow:0 0 2px 2px #262729}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:\"\";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-switch{display:inline-block;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.custom-theme .el-switch.is-disabled .el-switch__core,.custom-theme .el-switch.is-disabled .el-switch__label{cursor:not-allowed}.custom-theme .el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;display:inline-block;font-size:14px;font-weight:500;cursor:pointer;vertical-align:middle;color:#2d2f33}.custom-theme .el-switch__label.is-active{color:#262729}.custom-theme .el-switch__label--left{margin-right:10px}.custom-theme .el-switch__label--right{margin-left:10px}.custom-theme .el-switch__label *{line-height:1;font-size:14px;display:inline-block}.custom-theme .el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.custom-theme .el-switch__input:focus~.el-switch__core{outline:1px solid #262729}.custom-theme .el-switch__core{margin:0;display:inline-block;position:relative;width:40px;height:20px;border:1px solid #d8dce5;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#d8dce5;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.custom-theme .el-switch__core .el-switch__button{position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;width:16px;height:16px;background-color:#fff}.custom-theme .el-switch.is-checked .el-switch__core{border-color:#262729;background-color:#262729}.custom-theme .el-switch.is-disabled{opacity:.6}.custom-theme .el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.custom-theme .el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.custom-theme .el-switch .label-fade-enter,.custom-theme .el-switch .label-fade-leave-active{opacity:0}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-select-dropdown{position:absolute;z-index:1001;border:solid 1px #dfe4ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#262729;background-color:#fff}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:\"\\E611\";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.custom-theme .el-select-dropdown .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.custom-theme .el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.custom-theme .el-select-dropdown__wrap{max-height:274px}.custom-theme .el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-select-dropdown__item.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-select-dropdown__item.is-disabled:hover{background-color:#fff}.custom-theme .el-select-dropdown__item.hover,.custom-theme .el-select-dropdown__item:hover{background-color:#f5f7fa}.custom-theme .el-select-dropdown__item.selected{color:#262729;font-weight:700}.custom-theme .el-select-dropdown__item span{line-height:34px!important}.custom-theme .el-select-group{margin:0;padding:0}.custom-theme .el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.custom-theme .el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.custom-theme .el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#dfe4ed}.custom-theme .el-select-group__title{padding-left:20px;font-size:12px;color:#0a76a4;line-height:30px}.custom-theme .el-select-group .el-select-dropdown__item{padding-left:20px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-select{display:inline-block;position:relative}.custom-theme .el-select:hover .el-input__inner{border-color:#b4bccc}.custom-theme .el-select .el-input__inner{cursor:pointer;padding-right:35px}.custom-theme .el-select .el-input__inner:focus{border-color:#262729}.custom-theme .el-select .el-input .el-select__caret{color:#b4bccc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);line-height:16px;cursor:pointer}.custom-theme .el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.custom-theme .el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#b4bccc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover{color:#878d99}.custom-theme .el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover{border-color:#dfe4ed}.custom-theme .el-select>.el-input{display:block}.custom-theme .el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;vertical-align:baseline;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.custom-theme .el-select__input.is-mini{height:14px}.custom-theme .el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#b4bccc;line-height:18px;font-size:14px}.custom-theme .el-select__close:hover{color:#878d99}.custom-theme .el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.custom-theme .el-select .el-tag__close{margin-top:-2px}.custom-theme .el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:3px 0 3px 6px;background-color:#f0f2f5}.custom-theme .el-select .el-tag__close.el-icon-close{background-color:#b4bccc;right:-7px;color:#fff}.custom-theme .el-select .el-tag__close.el-icon-close:hover{background-color:#878d99}.custom-theme .el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.custom-theme .el-select__tag{display:inline-block;height:24px;line-height:24px;font-size:14px;border-radius:4px;color:#fff;background-color:#262729}.custom-theme .el-select__tag .el-icon-close{font-size:14px}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:\"\"}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:\"\";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;background-color:#fff;font-size:14px;color:#5a5e66}.custom-theme .el-table__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.custom-theme .el-table__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:color(#262729 s(16%) l(44%))}.custom-theme .el-table__expand-column .cell{padding:0;text-align:center}.custom-theme .el-table__expand-icon{position:relative;cursor:pointer;color:#666;font-size:12px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.custom-theme .el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.custom-theme .el-table__expanded-cell{background-color:#fff}.custom-theme .el-table__expanded-cell[class*=cell]{padding:20px 50px}.custom-theme .el-table__expanded-cell:hover{background-color:#f5f7fa!important}.custom-theme .el-table--fit{border-right:0;border-bottom:0}.custom-theme .el-table--fit td.gutter,.custom-theme .el-table--fit th.gutter{border-right-width:1px}.custom-theme .el-table thead{color:#878d99;font-weight:500}.custom-theme .el-table thead.is-group th{background:#f5f7fa}.custom-theme .el-table td,.custom-theme .el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative}.custom-theme .el-table td.is-center,.custom-theme .el-table th.is-center{text-align:center}.custom-theme .el-table td.is-left,.custom-theme .el-table th.is-left{text-align:left}.custom-theme .el-table td.is-right,.custom-theme .el-table th.is-right{text-align:right}.custom-theme .el-table td.gutter,.custom-theme .el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.custom-theme .el-table td.is-hidden>*,.custom-theme .el-table th.is-hidden>*{visibility:hidden}.custom-theme .el-table--medium td,.custom-theme .el-table--medium th{padding:10px 0}.custom-theme .el-table--small{font-size:12px}.custom-theme .el-table--small td,.custom-theme .el-table--small th{padding:8px 0}.custom-theme .el-table--mini{font-size:12px}.custom-theme .el-table--mini td,.custom-theme .el-table--mini th{padding:6px 0}.custom-theme .el-table tr{background-color:#fff}.custom-theme .el-table tr input[type=checkbox]{margin:0}.custom-theme .el-table td,.custom-theme .el-table th.is-leaf{border-bottom:1px solid #e6ebf5}.custom-theme .el-table th.is-sortable{cursor:pointer}.custom-theme .el-table th{white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:left}.custom-theme .el-table th div{display:inline-block;padding-left:10px;padding-right:10px;line-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.custom-theme .el-table th>.cell{position:relative;word-wrap:normal;text-overflow:ellipsis;display:inline-block;vertical-align:middle;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-table th>.cell.highlight{color:#262729}.custom-theme .el-table th.required>div::before{display:inline-block;content:\"\";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.custom-theme .el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-table td.gutter{width:0}.custom-theme .el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-left:10px;padding-right:10px}.custom-theme .el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.custom-theme .el-table td:first-child .cell,.custom-theme .el-table th:first-child .cell{padding-left:0}.custom-theme .el-table--border,.custom-theme .el-table--group{border:1px solid #e6ebf5}.custom-theme .el-table--border::after,.custom-theme .el-table--group::after,.custom-theme .el-table::before{content:'';position:absolute;background-color:#e6ebf5;z-index:1}.custom-theme .el-table--border::after,.custom-theme .el-table--group::after{top:0;right:0;width:1px;height:100%}.custom-theme .el-table::before{left:0;bottom:0;width:100%;height:1px}.custom-theme .el-table--border{border-right:none;border-bottom:none}.custom-theme .el-table--border td,.custom-theme .el-table--border th{border-right:1px solid #e6ebf5}.custom-theme .el-table--border td:first-child .cell,.custom-theme .el-table--border th:first-child .cell{padding-left:10px}.custom-theme .el-table--border .has-gutter td:nth-last-of-type(2),.custom-theme .el-table--border .has-gutter th:nth-last-of-type(2){border-right:none}.custom-theme .el-table--border th.gutter:last-of-type{border-bottom:1px solid #e6ebf5;border-bottom-width:1px}.custom-theme .el-table--border th{border-bottom:1px solid #e6ebf5}.custom-theme .el-table--hidden{visibility:hidden}.custom-theme .el-table__fixed,.custom-theme .el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.custom-theme .el-table__fixed-right::before,.custom-theme .el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#e6ebf5;z-index:4}.custom-theme .el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff;border-bottom:1px solid #e6ebf5}.custom-theme .el-table__fixed-right{top:0;left:auto;right:0}.custom-theme .el-table__fixed-right .el-table__fixed-body-wrapper,.custom-theme .el-table__fixed-right .el-table__fixed-footer-wrapper,.custom-theme .el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.custom-theme .el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.custom-theme .el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.custom-theme .el-table__fixed-footer-wrapper tbody td{border-top:1px solid #e6ebf5;background-color:#f5f7fa;color:#5a5e66}.custom-theme .el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.custom-theme .el-table__body-wrapper,.custom-theme .el-table__footer-wrapper,.custom-theme .el-table__header-wrapper{width:100%}.custom-theme .el-table__footer-wrapper{margin-top:-1px}.custom-theme .el-table__footer-wrapper td{border-top:1px solid #e6ebf5}.custom-theme .el-table__body,.custom-theme .el-table__footer,.custom-theme .el-table__header{table-layout:fixed}.custom-theme .el-table__footer-wrapper,.custom-theme .el-table__header-wrapper{overflow:hidden}.custom-theme .el-table__footer-wrapper tbody td,.custom-theme .el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#5a5e66}.custom-theme .el-table__body-wrapper{overflow:auto;position:relative}.custom-theme .el-table__body-wrapper.is-scroll-none~.el-table__fixed,.custom-theme .el-table__body-wrapper.is-scroll-none~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper.is-scroll-left~.el-table__fixed{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper.is-scroll-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-right~.el-table__fixed-right{border-left:1px solid #e6ebf5}.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-left~.el-table__fixed{border-right:1px solid #e6ebf5}.custom-theme .el-table .caret-wrapper{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:13px;width:24px;cursor:pointer;overflow:initial}.custom-theme .el-table .sort-caret{color:#0a76a4;width:14px;overflow:hidden;font-size:13px}.custom-theme .el-table .ascending .sort-caret.ascending{color:#262729}.custom-theme .el-table .descending .sort-caret.descending{color:#262729}.custom-theme .el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#e9e9ea}.custom-theme .el-table__body tr.hover-row.current-row>td,.custom-theme .el-table__body tr.hover-row.el-table__row--striped.current-row>td,.custom-theme .el-table__body tr.hover-row.el-table__row--striped>td,.custom-theme .el-table__body tr.hover-row>td{background-color:#e9e9ea}.custom-theme .el-table__body tr.current-row>td{background-color:#e9e9ea}.custom-theme .el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #e6ebf5;z-index:10}.custom-theme .el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.custom-theme .el-table__column-filter-trigger i{color:#0a76a4;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.custom-theme .el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.custom-theme .el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.custom-theme .el-table--fluid-height .el-table__fixed,.custom-theme .el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:\"\";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-table-column--selection .cell{padding-left:14px;padding-right:14px}.custom-theme .el-table-filter{border:solid 1px #e6ebf5;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.custom-theme .el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.custom-theme .el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.custom-theme .el-table-filter__list-item:hover{background-color:#e9e9ea;color:#515254}.custom-theme .el-table-filter__list-item.is-active{background-color:#262729;color:#fff}.custom-theme .el-table-filter__content{min-width:100px}.custom-theme .el-table-filter__bottom{border-top:1px solid #e6ebf5;padding:8px}.custom-theme .el-table-filter__bottom button{background:0 0;border:none;color:#5a5e66;cursor:pointer;font-size:13px;padding:0 3px}.custom-theme .el-table-filter__bottom button:hover{color:#262729}.custom-theme .el-table-filter__bottom button:focus{outline:0}.custom-theme .el-table-filter__bottom button.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-table-filter__checkbox-group{padding:10px}.custom-theme .el-table-filter__checkbox-group label.el-checkbox{display:block;margin-bottom:8px;margin-left:5px}.custom-theme .el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.custom-theme .el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#edf2fc}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#5a5e66}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.custom-theme .el-date-table.is-week-mode .el-date-table__row.current div{background-color:#edf2fc}.custom-theme .el-date-table td{width:32px;height:30px;padding:4px 0;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.custom-theme .el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.custom-theme .el-date-table td.next-month,.custom-theme .el-date-table td.prev-month{color:#b4bccc}.custom-theme .el-date-table td.today{position:relative}.custom-theme .el-date-table td.today span{color:#262729}.custom-theme .el-date-table td.today.end-date span,.custom-theme .el-date-table td.today.start-date span{color:#fff}.custom-theme .el-date-table td.available:hover{color:#262729}.custom-theme .el-date-table td.in-range div{background-color:#edf2fc}.custom-theme .el-date-table td.in-range div:hover{background-color:#edf2fc}.custom-theme .el-date-table td.current:not(.disabled) span{color:#fff;background-color:#262729}.custom-theme .el-date-table td.end-date div,.custom-theme .el-date-table td.start-date div{color:#fff}.custom-theme .el-date-table td.end-date span,.custom-theme .el-date-table td.start-date span{background-color:#262729}.custom-theme .el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.custom-theme .el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.custom-theme .el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#b4bccc}.custom-theme .el-date-table td.week{font-size:80%;color:#5a5e66}.custom-theme .el-date-table th{padding:5px;color:#5a5e66;font-weight:400;border-bottom:solid 1px #e6ebf5}.custom-theme .el-month-table{font-size:12px;margin:-1px;border-collapse:collapse}.custom-theme .el-month-table td{text-align:center;padding:20px 3px;cursor:pointer}.custom-theme .el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#b4bccc}.custom-theme .el-month-table td.disabled .cell:hover{color:#b4bccc}.custom-theme .el-month-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#5a5e66;margin:0 auto}.custom-theme .el-month-table td .cell:hover{color:#262729}.custom-theme .el-month-table td.current:not(.disabled) .cell{color:#262729}.custom-theme .el-year-table{font-size:12px;margin:-1px;border-collapse:collapse}.custom-theme .el-year-table .el-icon{color:#2d2f33}.custom-theme .el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.custom-theme .el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#b4bccc}.custom-theme .el-year-table td.disabled .cell:hover{color:#b4bccc}.custom-theme .el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#5a5e66;margin:0 auto}.custom-theme .el-year-table td .cell:hover{color:#262729}.custom-theme .el-year-table td.current:not(.disabled) .cell{color:#262729}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2){margin-left:1%}.custom-theme .el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.custom-theme .el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.custom-theme .el-time-spinner__arrow{font-size:12px;color:#878d99;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.custom-theme .el-time-spinner__arrow:hover{color:#262729}.custom-theme .el-time-spinner__arrow.el-icon-arrow-up{top:10px}.custom-theme .el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.custom-theme .el-time-spinner__input.el-input{width:70%}.custom-theme .el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.custom-theme .el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.custom-theme .el-time-spinner__list::after,.custom-theme .el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.custom-theme .el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#5a5e66}.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.custom-theme .el-time-spinner__item.active:not(.disabled){color:#2d2f33;font-weight:700}.custom-theme .el-time-spinner__item.disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-picker-panel{color:#5a5e66;border:1px solid #dfe4ed;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.custom-theme .el-picker-panel__body-wrapper::after,.custom-theme .el-picker-panel__body::after{content:\"\";display:table;clear:both}.custom-theme .el-picker-panel__content{position:relative;margin:15px}.custom-theme .el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.custom-theme .el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#5a5e66;padding-left:12px;text-align:left;outline:0;cursor:pointer}.custom-theme .el-picker-panel__shortcut:hover{color:#262729}.custom-theme .el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#262729}.custom-theme .el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-picker-panel__icon-btn{font-size:12px;color:#2d2f33;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.custom-theme .el-picker-panel__icon-btn:hover{color:#262729}.custom-theme .el-picker-panel__icon-btn.is-disabled{color:#bbb}.custom-theme .el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.custom-theme .el-picker-panel__link-btn{vertical-align:middle}.custom-theme .el-picker-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-picker-panel [slot=sidebar],.custom-theme .el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.custom-theme .el-picker-panel [slot=sidebar]+.el-picker-panel__body,.custom-theme .el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.custom-theme .el-date-picker{width:322px}.custom-theme .el-date-picker.has-sidebar.has-time{width:434px}.custom-theme .el-date-picker.has-sidebar{width:438px}.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.custom-theme .el-date-picker .el-picker-panel__content{width:292px}.custom-theme .el-date-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-picker__header{margin:12px;text-align:center}.custom-theme .el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #e6ebf5}.custom-theme .el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.custom-theme .el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#5a5e66}.custom-theme .el-date-picker__header-label:hover{color:#262729}.custom-theme .el-date-picker__header-label.active{color:#262729}.custom-theme .el-date-picker__prev-btn{float:left}.custom-theme .el-date-picker__next-btn{float:right}.custom-theme .el-date-picker__time-wrap{padding:10px;text-align:center}.custom-theme .el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.custom-theme .el-date-range-picker{width:646px}.custom-theme .el-date-range-picker.has-sidebar{width:756px}.custom-theme .el-date-range-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-range-picker .el-picker-panel__body{min-width:513px}.custom-theme .el-date-range-picker .el-picker-panel__content{margin:0}.custom-theme .el-date-range-picker__header{position:relative;text-align:center;height:28px}.custom-theme .el-date-range-picker__header [class*=arrow-left]{float:left}.custom-theme .el-date-range-picker__header [class*=arrow-right]{float:right}.custom-theme .el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.custom-theme .el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.custom-theme .el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.custom-theme .el-date-range-picker__content.is-right .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.custom-theme .el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.custom-theme .el-date-range-picker__editors-wrap.is-right{text-align:right}.custom-theme .el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#2d2f33}.custom-theme .el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.custom-theme .el-time-range-picker{width:354px;overflow:visible}.custom-theme .el-time-range-picker__content{position:relative;text-align:center;padding:10px}.custom-theme .el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.custom-theme .el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.custom-theme .el-time-range-picker__body{border-radius:2px;border:1px solid #dfe4ed}.custom-theme .el-time-panel{margin:5px 0;border:solid 1px #dfe4ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-time-panel__content{font-size:0;position:relative;overflow:hidden}.custom-theme .el-time-panel__content::after,.custom-theme .el-time-panel__content::before{content:\"\";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #dfe4ed;border-bottom:1px solid #dfe4ed}.custom-theme .el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.custom-theme .el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.custom-theme .el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.custom-theme .el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.custom-theme .el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#2d2f33}.custom-theme .el-time-panel__btn.confirm{font-weight:800;color:#262729}.custom-theme .el-time-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-picker-panel{color:#5a5e66;border:1px solid #dfe4ed;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.custom-theme .el-picker-panel__body-wrapper::after,.custom-theme .el-picker-panel__body::after{content:\"\";display:table;clear:both}.custom-theme .el-picker-panel__content{position:relative;margin:15px}.custom-theme .el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.custom-theme .el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#5a5e66;padding-left:12px;text-align:left;outline:0;cursor:pointer}.custom-theme .el-picker-panel__shortcut:hover{color:#262729}.custom-theme .el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#262729}.custom-theme .el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-picker-panel__icon-btn{font-size:12px;color:#2d2f33;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.custom-theme .el-picker-panel__icon-btn:hover{color:#262729}.custom-theme .el-picker-panel__icon-btn.is-disabled{color:#bbb}.custom-theme .el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.custom-theme .el-picker-panel__link-btn{vertical-align:middle}.custom-theme .el-picker-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-picker-panel [slot=sidebar],.custom-theme .el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.custom-theme .el-picker-panel [slot=sidebar]+.el-picker-panel__body,.custom-theme .el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.custom-theme .el-date-picker{width:322px}.custom-theme .el-date-picker.has-sidebar.has-time{width:434px}.custom-theme .el-date-picker.has-sidebar{width:438px}.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.custom-theme .el-date-picker .el-picker-panel__content{width:292px}.custom-theme .el-date-picker table{table-layout:fixed;width:100%}.custom-theme .el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.custom-theme .el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-date-picker__header{margin:12px;text-align:center}.custom-theme .el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #e6ebf5}.custom-theme .el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.custom-theme .el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#5a5e66}.custom-theme .el-date-picker__header-label:hover{color:#262729}.custom-theme .el-date-picker__header-label.active{color:#262729}.custom-theme .el-date-picker__prev-btn{float:left}.custom-theme .el-date-picker__next-btn{float:right}.custom-theme .el-date-picker__time-wrap{padding:10px;text-align:center}.custom-theme .el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .time-select{margin:5px 0;min-width:0}.custom-theme .time-select .el-picker-panel__content{max-height:200px;margin:0}.custom-theme .time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.custom-theme .time-select-item.selected:not(.disabled){color:#262729;font-weight:700}.custom-theme .time-select-item.disabled{color:#dfe4ed;cursor:not-allowed}.custom-theme .time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.custom-theme .fade-in-linear-enter-active,.custom-theme .fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .fade-in-linear-enter,.custom-theme .fade-in-linear-leave,.custom-theme .fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-linear-enter-active,.custom-theme .el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-theme .el-fade-in-linear-enter,.custom-theme .el-fade-in-linear-leave,.custom-theme .el-fade-in-linear-leave-active{opacity:0}.custom-theme .el-fade-in-enter-active,.custom-theme .el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-fade-in-enter,.custom-theme .el-fade-in-leave-active{opacity:0}.custom-theme .el-zoom-in-center-enter-active,.custom-theme .el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-zoom-in-center-enter,.custom-theme .el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.custom-theme .el-zoom-in-top-enter-active,.custom-theme .el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center top;transform-origin:center top}.custom-theme .el-zoom-in-top-enter,.custom-theme .el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-bottom-enter-active,.custom-theme .el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:center bottom;transform-origin:center bottom}.custom-theme .el-zoom-in-bottom-enter,.custom-theme .el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.custom-theme .el-zoom-in-left-enter-active,.custom-theme .el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;-webkit-transform-origin:top left;transform-origin:top left}.custom-theme .el-zoom-in-left-enter,.custom-theme .el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.custom-theme .collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.custom-theme .horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.custom-theme .el-list-enter-active,.custom-theme .el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.custom-theme .el-list-enter,.custom-theme .el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.custom-theme .el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.custom-theme .el-date-editor{position:relative;display:inline-block;text-align:left}.custom-theme .el-date-editor.el-input,.custom-theme .el-date-editor.el-input__inner{width:220px}.custom-theme .el-date-editor--daterange.el-input,.custom-theme .el-date-editor--daterange.el-input__inner,.custom-theme .el-date-editor--timerange.el-input,.custom-theme .el-date-editor--timerange.el-input__inner{width:350px}.custom-theme .el-date-editor--datetimerange.el-input,.custom-theme .el-date-editor--datetimerange.el-input__inner{width:400px}.custom-theme .el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#b4bccc;float:left;line-height:32px}.custom-theme .el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#5a5e66}.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-input::placeholder{color:#b4bccc}.custom-theme .el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#2d2f33}.custom-theme .el-date-editor .el-range__close-icon{font-size:14px;color:#b4bccc;width:25px;display:inline-block;float:right;line-height:32px}.custom-theme .el-range-editor.el-input__inner{padding:3px 10px}.custom-theme .el-range-editor.is-active{border-color:#262729}.custom-theme .el-range-editor.is-active:hover{border-color:#262729}.custom-theme .el-range-editor--medium.el-input__inner{height:36px}.custom-theme .el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.custom-theme .el-range-editor--medium .el-range-input{font-size:14px}.custom-theme .el-range-editor--medium .el-range__close-icon,.custom-theme .el-range-editor--medium .el-range__icon{line-height:28px}.custom-theme .el-range-editor--small.el-input__inner{height:32px}.custom-theme .el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.custom-theme .el-range-editor--small .el-range-input{font-size:13px}.custom-theme .el-range-editor--small .el-range__close-icon,.custom-theme .el-range-editor--small .el-range__icon{line-height:24px}.custom-theme .el-range-editor--mini.el-input__inner{height:28px}.custom-theme .el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.custom-theme .el-range-editor--mini .el-range-input{font-size:12px}.custom-theme .el-range-editor--mini .el-range__close-icon,.custom-theme .el-range-editor--mini .el-range__icon{line-height:20px}.custom-theme .el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled:focus,.custom-theme .el-range-editor.is-disabled:hover{border-color:#dfe4ed}.custom-theme .el-range-editor.is-disabled input{background-color:#f5f7fa;color:#b4bccc;cursor:not-allowed}.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled input::placeholder{color:#b4bccc}.custom-theme .el-range-editor.is-disabled .el-range-separator{color:#b4bccc}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2){margin-left:1%}.custom-theme .el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.custom-theme .el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.custom-theme .el-time-spinner__arrow{font-size:12px;color:#878d99;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.custom-theme .el-time-spinner__arrow:hover{color:#262729}.custom-theme .el-time-spinner__arrow.el-icon-arrow-up{top:10px}.custom-theme .el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.custom-theme .el-time-spinner__input.el-input{width:70%}.custom-theme .el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.custom-theme .el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.custom-theme .el-time-spinner__list::after,.custom-theme .el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.custom-theme .el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#5a5e66}.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.custom-theme .el-time-spinner__item.active:not(.disabled){color:#2d2f33;font-weight:700}.custom-theme .el-time-spinner__item.disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-time-panel{margin:5px 0;border:solid 1px #dfe4ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-time-panel__content{font-size:0;position:relative;overflow:hidden}.custom-theme .el-time-panel__content::after,.custom-theme .el-time-panel__content::before{content:\"\";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #dfe4ed;border-bottom:1px solid #dfe4ed}.custom-theme .el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.custom-theme .el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.custom-theme .el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.custom-theme .el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.custom-theme .el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#2d2f33}.custom-theme .el-time-panel__btn.confirm{font-weight:800;color:#262729}.custom-theme .el-time-panel .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-popover{position:absolute;background:#fff;min-width:150px;border-radius:4px;border:1px solid #e6ebf5;padding:12px;z-index:2000;color:#5a5e66;line-height:1.4;text-align:justify;word-break:break-all;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-popover--plain{padding:18px 20px}.custom-theme .el-popover__title{color:#2d2f33;font-size:16px;line-height:1;margin-bottom:12px}.custom-theme .el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2}.custom-theme .el-tooltip__popper .popper__arrow,.custom-theme .el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-tooltip__popper .popper__arrow{border-width:6px}.custom-theme .el-tooltip__popper .popper__arrow::after{content:\" \";border-width:5px}.custom-theme .el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=right]{margin-left:12px}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=left]{margin-right:12px}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-dark{background:#2d2f33;color:#fff}.custom-theme .el-tooltip__popper.is-light{background:#fff;border:1px solid #2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.custom-theme .v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.custom-theme .v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.custom-theme .v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:\"\"}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #e6ebf5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.custom-theme .el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.custom-theme .el-message-box__wrapper::after{content:\"\";display:inline-block;height:100%;width:0;vertical-align:middle}.custom-theme .el-message-box__header{position:relative;padding:15px;padding-bottom:10px}.custom-theme .el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#2d2f33}.custom-theme .el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.custom-theme .el-message-box__headerbtn .el-message-box__close{color:#0a76a4}.custom-theme .el-message-box__headerbtn:focus .el-message-box__close,.custom-theme .el-message-box__headerbtn:hover .el-message-box__close{color:#262729}.custom-theme .el-message-box__content{position:relative;padding:10px 15px;color:#5a5e66;font-size:14px}.custom-theme .el-message-box__input{padding-top:15px}.custom-theme .el-message-box__input input.invalid{border-color:#b3450e}.custom-theme .el-message-box__input input.invalid:focus{border-color:#b3450e}.custom-theme .el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.custom-theme .el-message-box__status::before{padding-left:1px}.custom-theme .el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.custom-theme .el-message-box__status.el-icon-success{color:#409167}.custom-theme .el-message-box__status.el-icon-info{color:#0a76a4}.custom-theme .el-message-box__status.el-icon-warning{color:#9da408}.custom-theme .el-message-box__status.el-icon-error{color:#b3450e}.custom-theme .el-message-box__message{margin:0}.custom-theme .el-message-box__message p{margin:0;line-height:24px}.custom-theme .el-message-box__errormsg{color:#b3450e;font-size:12px;min-height:18px;margin-top:2px}.custom-theme .el-message-box__btns{padding:5px 15px 0;text-align:right}.custom-theme .el-message-box__btns button:nth-child(2){margin-left:10px}.custom-theme .el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.custom-theme .el-message-box--center{padding-bottom:30px}.custom-theme .el-message-box--center .el-message-box__header{padding-top:30px}.custom-theme .el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.custom-theme .el-message-box--center .el-message-box__message{margin-left:0}.custom-theme .el-message-box--center .el-message-box__btns,.custom-theme .el-message-box--center .el-message-box__content{text-align:center}.custom-theme .el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.custom-theme .msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.custom-theme .msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.custom-theme .el-breadcrumb{font-size:14px;line-height:1}.custom-theme .el-breadcrumb::after,.custom-theme .el-breadcrumb::before{display:table;content:\"\"}.custom-theme .el-breadcrumb::after{clear:both}.custom-theme .el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#b4bccc}.custom-theme .el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.custom-theme .el-breadcrumb__item{float:left}.custom-theme .el-breadcrumb__inner,.custom-theme .el-breadcrumb__inner a{font-weight:700;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#2d2f33}.custom-theme .el-breadcrumb__inner a:hover,.custom-theme .el-breadcrumb__inner:hover{color:#262729;cursor:pointer}.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#5a5e66;cursor:text}.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.custom-theme .el-form--label-left .el-form-item__label{text-align:left}.custom-theme .el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px 0}.custom-theme .el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.custom-theme .el-form--inline .el-form-item__label{float:none;display:inline-block}.custom-theme .el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.custom-theme .el-form--inline.el-form--label-top .el-form-item__content{display:block}.custom-theme .el-form-item{margin-bottom:22px}.custom-theme .el-form-item::after,.custom-theme .el-form-item::before{display:table;content:\"\"}.custom-theme .el-form-item::after{clear:both}.custom-theme .el-form-item .el-form-item{margin-bottom:0}.custom-theme .el-form-item .el-input__validateIcon{display:none}.custom-theme .el-form-item--medium .el-form-item__label{line-height:36px}.custom-theme .el-form-item--medium .el-form-item__content{line-height:36px}.custom-theme .el-form-item--small .el-form-item__label{line-height:32px}.custom-theme .el-form-item--small .el-form-item__content{line-height:32px}.custom-theme .el-form-item--small.el-form-item{margin-bottom:18px}.custom-theme .el-form-item--small .el-form-item__error{padding-top:2px}.custom-theme .el-form-item--mini .el-form-item__label{line-height:28px}.custom-theme .el-form-item--mini .el-form-item__content{line-height:28px}.custom-theme .el-form-item--mini.el-form-item{margin-bottom:18px}.custom-theme .el-form-item--mini .el-form-item__error{padding-top:1px}.custom-theme .el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#5a5e66;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-form-item__content{line-height:40px;position:relative;font-size:14px}.custom-theme .el-form-item__content::after,.custom-theme .el-form-item__content::before{display:table;content:\"\"}.custom-theme .el-form-item__content::after{clear:both}.custom-theme .el-form-item__error{color:#b3450e;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.custom-theme .el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.custom-theme .el-form-item.is-required .el-form-item__label:before{content:'*';color:#b3450e;margin-right:4px}.custom-theme .el-form-item.is-error .el-input__inner,.custom-theme .el-form-item.is-error .el-input__inner:focus,.custom-theme .el-form-item.is-error .el-textarea__inner,.custom-theme .el-form-item.is-error .el-textarea__inner:focus{border-color:#b3450e}.custom-theme .el-form-item.is-error .el-input-group__append .el-input__inner,.custom-theme .el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.custom-theme .el-form-item.is-error .el-input__validateIcon{color:#b3450e}.custom-theme .el-form-item.is-success .el-input__inner,.custom-theme .el-form-item.is-success .el-input__inner:focus,.custom-theme .el-form-item.is-success .el-textarea__inner,.custom-theme .el-form-item.is-success .el-textarea__inner:focus{border-color:#409167}.custom-theme .el-form-item.is-success .el-input-group__append .el-input__inner,.custom-theme .el-form-item.is-success .el-input-group__prepend .el-input__inner{border-color:transparent}.custom-theme .el-form-item.is-success .el-input__validateIcon{color:#409167}.custom-theme .el-form-item--feedback .el-input__validateIcon{display:inline-block}.custom-theme .el-tabs__header{padding:0;position:relative;margin:0 0 15px}.custom-theme .el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#262729;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.custom-theme .el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.custom-theme .el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.custom-theme .el-tabs__new-tab:hover{color:#262729}.custom-theme .el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.custom-theme .el-tabs__nav-wrap::after{content:\"\";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#dfe4ed;z-index:1}.custom-theme .el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-tabs__nav-scroll{overflow:hidden}.custom-theme .el-tabs__nav-next,.custom-theme .el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#878d99}.custom-theme .el-tabs__nav-next{right:0}.custom-theme .el-tabs__nav-prev{left:0}.custom-theme .el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.custom-theme .el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#2d2f33;position:relative}.custom-theme .el-tabs__item:focus,.custom-theme .el-tabs__item:focus:active{outline:0}.custom-theme .el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.custom-theme .el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.custom-theme .el-tabs__item .el-icon-close:hover{background-color:#b4bccc;color:#fff}.custom-theme .el-tabs__item.is-active{color:#262729}.custom-theme .el-tabs__item:hover{color:#262729;cursor:pointer}.custom-theme .el-tabs__item.is-disabled{color:#b4bccc;cursor:default}.custom-theme .el-tabs__content{overflow:hidden;position:relative}.custom-theme .el-tabs--card>.el-tabs__header{border-bottom:1px solid #dfe4ed}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #dfe4ed;border-bottom:none;border-radius:4px 4px 0 0}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #dfe4ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.custom-theme .el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.custom-theme .el-tabs--border-card{background:#fff;border:1px solid #d8dce5;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.custom-theme .el-tabs--border-card>.el-tabs__content{padding:15px}.custom-theme .el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #dfe4ed;margin:0}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin:-1px -1px 0;color:#878d99}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#262729;background-color:#fff;border-right-color:#d8dce5;border-left-color:#d8dce5}.custom-theme .el-tabs--border-card>.el-tabs__header .el-tabs__item:hover{color:#262729}.custom-theme .el-tabs--bottom:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2),.custom-theme .el-tabs--top:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2){padding-left:0}.custom-theme .el-tabs--bottom .el-tabs__header{margin-bottom:0;margin-top:10px}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__header{border-bottom:0;border-top:1px solid #d8dce5}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap{margin-top:-1px;margin-bottom:0}.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:0 -1px -1px -1px}.custom-theme .el-tabs--left,.custom-theme .el-tabs--right{overflow:hidden}.custom-theme .el-tabs--left .el-tabs__header,.custom-theme .el-tabs--left .el-tabs__nav-scroll,.custom-theme .el-tabs--left .el-tabs__nav-wrap,.custom-theme .el-tabs--right .el-tabs__header,.custom-theme .el-tabs--right .el-tabs__nav-scroll,.custom-theme .el-tabs--right .el-tabs__nav-wrap{height:100%}.custom-theme .el-tabs--left .el-tabs__active-bar,.custom-theme .el-tabs--right .el-tabs__active-bar{top:0;bottom:auto;width:2px;height:auto}.custom-theme .el-tabs--left .el-tabs__nav-wrap,.custom-theme .el-tabs--right .el-tabs__nav-wrap{margin-bottom:0}.custom-theme .el-tabs--left .el-tabs__nav-wrap.is-scrollable,.custom-theme .el-tabs--right .el-tabs__nav-wrap.is-scrollable{padding:30px 0}.custom-theme .el-tabs--left .el-tabs__nav-wrap::after,.custom-theme .el-tabs--right .el-tabs__nav-wrap::after{height:100%;width:2px;bottom:auto;top:0}.custom-theme .el-tabs--left .el-tabs__nav,.custom-theme .el-tabs--right .el-tabs__nav{float:none}.custom-theme .el-tabs--left .el-tabs__item,.custom-theme .el-tabs--right .el-tabs__item{display:block}.custom-theme .el-tabs--left .el-tabs__nav-next,.custom-theme .el-tabs--left .el-tabs__nav-prev,.custom-theme .el-tabs--right .el-tabs__nav-next,.custom-theme .el-tabs--right .el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.custom-theme .el-tabs--left .el-tabs__nav-next i,.custom-theme .el-tabs--left .el-tabs__nav-prev i,.custom-theme .el-tabs--right .el-tabs__nav-next i,.custom-theme .el-tabs--right .el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.custom-theme .el-tabs--left .el-tabs__nav-prev,.custom-theme .el-tabs--right .el-tabs__nav-prev{left:auto;top:0}.custom-theme .el-tabs--left .el-tabs__nav-next,.custom-theme .el-tabs--right .el-tabs__nav-next{right:auto;bottom:0}.custom-theme .el-tabs--left .el-tabs__header{float:left;margin-bottom:0;margin-right:10px}.custom-theme .el-tabs--left .el-tabs__nav-wrap{margin-right:-1px}.custom-theme .el-tabs--left .el-tabs__nav-wrap::after{left:auto;right:0}.custom-theme .el-tabs--left .el-tabs__active-bar{right:0;left:auto}.custom-theme .el-tabs--left .el-tabs__item{text-align:right}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__active-bar{display:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item{border-left:none;border-right:1px solid #dfe4ed;border-bottom:none;border-top:1px solid #dfe4ed}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item:first-child{border-right:1px solid #dfe4ed;border-top:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active{border:1px solid #dfe4ed;border-right-color:#fff;border-left:none;border-bottom:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:first-child{border-top:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:last-child{border-bottom:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #dfe4ed;border-right:none}.custom-theme .el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__header{border-right:1px solid #dfe4ed}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:-1px 0 -1px -1px}.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.custom-theme .el-tabs--right .el-tabs__header{float:right;margin-bottom:0;margin-left:10px}.custom-theme .el-tabs--right .el-tabs__nav-wrap{margin-left:-1px}.custom-theme .el-tabs--right .el-tabs__nav-wrap::after{left:0;right:auto}.custom-theme .el-tabs--right .el-tabs__active-bar{left:0}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__active-bar{display:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item{border-bottom:none;border-top:1px solid #dfe4ed}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item:first-child{border-left:1px solid #dfe4ed;border-top:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active{border:1px solid #dfe4ed;border-left-color:#fff;border-right:none;border-bottom:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:first-child{border-top:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:last-child{border-bottom:none}.custom-theme .el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #dfe4ed;border-left:none}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__header{border-left:1px solid #dfe4ed}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item{border:1px solid transparent;margin:-1px -1px -1px 0}.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.custom-theme .slideInLeft-transition,.custom-theme .slideInRight-transition{display:inline-block}.custom-theme .slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.custom-theme .slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.custom-theme .slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.custom-theme .slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.custom-theme .el-tag{background-color:rgba(38,39,41,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#262729;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(38,39,41,.2);white-space:nowrap}.custom-theme .el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:18px;width:18px;line-height:18px;vertical-align:middle;top:-1px;right:-5px;color:#262729}.custom-theme .el-tag .el-icon-close::before{display:block}.custom-theme .el-tag .el-icon-close:hover{background-color:#262729;color:#fff}.custom-theme .el-tag--info{background-color:rgba(10,118,164,.1);border-color:rgba(10,118,164,.2);color:#0a76a4}.custom-theme .el-tag--info.is-hit{border-color:#0a76a4}.custom-theme .el-tag--info .el-tag__close{color:#0a76a4}.custom-theme .el-tag--info .el-tag__close:hover{background-color:#0a76a4;color:#fff}.custom-theme .el-tag--success{background-color:rgba(64,145,103,.1);border-color:rgba(64,145,103,.2);color:#409167}.custom-theme .el-tag--success.is-hit{border-color:#409167}.custom-theme .el-tag--success .el-tag__close{color:#409167}.custom-theme .el-tag--success .el-tag__close:hover{background-color:#409167;color:#fff}.custom-theme .el-tag--warning{background-color:rgba(157,164,8,.1);border-color:rgba(157,164,8,.2);color:#9da408}.custom-theme .el-tag--warning.is-hit{border-color:#9da408}.custom-theme .el-tag--warning .el-tag__close{color:#9da408}.custom-theme .el-tag--warning .el-tag__close:hover{background-color:#9da408;color:#fff}.custom-theme .el-tag--danger{background-color:rgba(179,69,14,.1);border-color:rgba(179,69,14,.2);color:#b3450e}.custom-theme .el-tag--danger.is-hit{border-color:#b3450e}.custom-theme .el-tag--danger .el-tag__close{color:#b3450e}.custom-theme .el-tag--danger .el-tag__close:hover{background-color:#b3450e;color:#fff}.custom-theme .el-tag--medium{height:28px;line-height:26px}.custom-theme .el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--small{height:24px;padding:0 8px;line-height:22px}.custom-theme .el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-tag--mini{height:20px;padding:0 5px;line-height:19px}.custom-theme .el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.custom-theme .el-tree{cursor:default;background:#fff;color:#5a5e66}.custom-theme .el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.custom-theme .el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#623615}.custom-theme .el-tree-node{white-space:nowrap}.custom-theme .el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.custom-theme .el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.custom-theme .el-tree-node__content>.el-checkbox{margin-right:8px}.custom-theme .el-tree-node__content:hover{background-color:#f5f7fa}.custom-theme .el-tree-node__expand-icon{cursor:pointer;color:#b4bccc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.custom-theme .el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.custom-theme .el-tree-node__label{font-size:14px}.custom-theme .el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#b4bccc}.custom-theme .el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.custom-theme .el-tree-node.is-expanded>.el-tree-node__children{display:block}.custom-theme .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#eee}.custom-theme .el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.custom-theme .el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-alert--success{background-color:#ecf4f0;color:#409167}.custom-theme .el-alert--success .el-alert__description{color:#409167}.custom-theme .el-alert--info{background-color:#e7f1f6;color:#0a76a4}.custom-theme .el-alert--info .el-alert__description{color:#0a76a4}.custom-theme .el-alert--warning{background-color:#f5f6e6;color:#9da408}.custom-theme .el-alert--warning .el-alert__description{color:#9da408}.custom-theme .el-alert--error{background-color:#f7ece7;color:#b3450e}.custom-theme .el-alert--error .el-alert__description{color:#b3450e}.custom-theme .el-alert__content{display:table-cell;padding:0 8px}.custom-theme .el-alert__icon{font-size:16px;width:16px}.custom-theme .el-alert__icon.is-big{font-size:28px;width:28px}.custom-theme .el-alert__title{font-size:13px;line-height:18px}.custom-theme .el-alert__title.is-bold{font-weight:700}.custom-theme .el-alert .el-alert__description{font-size:12px;margin:5px 0 0 0}.custom-theme .el-alert__closebtn{font-size:12px;color:#b4bccc;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.custom-theme .el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.custom-theme .el-alert-fade-enter,.custom-theme .el-alert-fade-leave-active{opacity:0}.custom-theme .el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #e6ebf5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.custom-theme .el-notification.right{right:16px}.custom-theme .el-notification.left{left:16px}.custom-theme .el-notification__group{margin-left:13px}.custom-theme .el-notification__title{font-weight:700;font-size:16px;color:#2d2f33;margin:0}.custom-theme .el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0 0;color:#5a5e66;text-align:justify}.custom-theme .el-notification__content p{margin:0}.custom-theme .el-notification__icon{height:24px;width:24px;font-size:24px;-webkit-transform:translateY(4px);transform:translateY(4px)}.custom-theme .el-notification__closeBtn{position:absolute;top:15px;right:15px;cursor:pointer;color:#878d99;font-size:16px}.custom-theme .el-notification__closeBtn:hover{color:#5a5e66}.custom-theme .el-notification .el-icon-success{color:#409167}.custom-theme .el-notification .el-icon-error{color:#b3450e}.custom-theme .el-notification .el-icon-info{color:#0a76a4}.custom-theme .el-notification .el-icon-warning{color:#9da408}.custom-theme .el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.custom-theme .el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.custom-theme .el-notification-fade-leave-active{opacity:0}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.custom-theme .el-input-number .el-input{display:block}.custom-theme .el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.custom-theme .el-input-number__decrease,.custom-theme .el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#5a5e66;cursor:pointer;font-size:13px}.custom-theme .el-input-number__decrease:hover,.custom-theme .el-input-number__increase:hover{color:#262729}.custom-theme .el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.custom-theme .el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#262729}.custom-theme .el-input-number__decrease.is-disabled,.custom-theme .el-input-number__increase.is-disabled{color:#b4bccc;cursor:not-allowed}.custom-theme .el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #d8dce5}.custom-theme .el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #d8dce5}.custom-theme .el-input-number.is-disabled .el-input-number__decrease,.custom-theme .el-input-number.is-disabled .el-input-number__increase{border-color:#dfe4ed;color:#dfe4ed}.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover,.custom-theme .el-input-number.is-disabled .el-input-number__increase:hover{color:#dfe4ed;cursor:not-allowed}.custom-theme .el-input-number--medium{width:200px;line-height:34px}.custom-theme .el-input-number--medium .el-input-number__decrease,.custom-theme .el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.custom-theme .el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.custom-theme .el-input-number--small{width:130px;line-height:30px}.custom-theme .el-input-number--small .el-input-number__decrease,.custom-theme .el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.custom-theme .el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.custom-theme .el-input-number--mini{width:130px;line-height:26px}.custom-theme .el-input-number--mini .el-input-number__decrease,.custom-theme .el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.custom-theme .el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.custom-theme .el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease,.custom-theme .el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.custom-theme .el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #d8dce5}.custom-theme .el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #d8dce5;border-radius:0 0 4px 0}.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease],.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.custom-theme .el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2}.custom-theme .el-tooltip__popper .popper__arrow,.custom-theme .el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-tooltip__popper .popper__arrow{border-width:6px}.custom-theme .el-tooltip__popper .popper__arrow::after{content:\" \";border-width:5px}.custom-theme .el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#2d2f33;border-bottom-width:0}.custom-theme .el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=right]{margin-left:12px}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#2d2f33;border-left-width:0}.custom-theme .el-tooltip__popper[x-placement^=left]{margin-right:12px}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-dark{background:#2d2f33;color:#fff}.custom-theme .el-tooltip__popper.is-light{background:#fff;border:1px solid #2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#2d2f33}.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.custom-theme .el-slider::after,.custom-theme .el-slider::before{display:table;content:\"\"}.custom-theme .el-slider::after{clear:both}.custom-theme .el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#dfe4ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.custom-theme .el-slider__runway.show-input{margin-right:160px;width:auto}.custom-theme .el-slider__runway.disabled{cursor:default}.custom-theme .el-slider__runway.disabled .el-slider__bar{background-color:#b4bccc}.custom-theme .el-slider__runway.disabled .el-slider__button{border-color:#b4bccc}.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.hover,.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button.dragging,.custom-theme .el-slider__runway.disabled .el-slider__button.hover,.custom-theme .el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1)}.custom-theme .el-slider__runway.disabled .el-slider__button.hover,.custom-theme .el-slider__runway.disabled .el-slider__button:hover{cursor:not-allowed}.custom-theme .el-slider__runway.disabled .el-slider__button.dragging{cursor:not-allowed}.custom-theme .el-slider__input{float:right;margin-top:3px}.custom-theme .el-slider__bar{height:6px;background-color:#262729;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.custom-theme .el-slider__button-wrapper{height:36px;width:36px;position:absolute;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-slider__button-wrapper::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-slider__button-wrapper .el-tooltip{vertical-align:middle;display:inline-block}.custom-theme .el-slider__button-wrapper.hover,.custom-theme .el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.custom-theme .el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.custom-theme .el-slider__button{width:16px;height:16px;border:solid 2px #262729;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-slider__button.dragging,.custom-theme .el-slider__button.hover,.custom-theme .el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.custom-theme .el-slider__button.hover,.custom-theme .el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.custom-theme .el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.custom-theme .el-slider__stop{position:absolute;height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.custom-theme .el-slider.is-vertical{position:relative}.custom-theme .el-slider.is-vertical .el-slider__runway{width:4px;height:100%;margin:0 16px}.custom-theme .el-slider.is-vertical .el-slider__bar{width:4px;height:auto;border-radius:0 0 3px 3px}.custom-theme .el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.custom-theme .el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.custom-theme .el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #d8dce5;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#b4bccc}.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#262729}.custom-theme .el-loading-parent--relative{position:relative!important}.custom-theme .el-loading-parent--hidden{overflow:hidden!important}.custom-theme .el-loading-mask{position:absolute;z-index:10000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.custom-theme .el-loading-mask.is-fullscreen{position:fixed}.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.custom-theme .el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.custom-theme .el-loading-spinner .el-loading-text{color:#262729;margin:3px 0;font-size:14px}.custom-theme .el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.custom-theme .el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#262729;stroke-linecap:round}.custom-theme .el-loading-spinner i{color:#262729}.custom-theme .el-loading-fade-enter,.custom-theme .el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.custom-theme .el-row{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-row::after,.custom-theme .el-row::before{display:table;content:\"\"}.custom-theme .el-row::after{clear:both}.custom-theme .el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-row--flex:after,.custom-theme .el-row--flex:before{display:none}.custom-theme .el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.custom-theme .el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.custom-theme .el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.custom-theme .el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.custom-theme [class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-col-0{display:none}.custom-theme .el-col-1{width:4.16667%}.custom-theme .el-col-offset-1{margin-left:4.16667%}.custom-theme .el-col-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-push-1{position:relative;left:4.16667%}.custom-theme .el-col-2{width:8.33333%}.custom-theme .el-col-offset-2{margin-left:8.33333%}.custom-theme .el-col-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-push-2{position:relative;left:8.33333%}.custom-theme .el-col-3{width:12.5%}.custom-theme .el-col-offset-3{margin-left:12.5%}.custom-theme .el-col-pull-3{position:relative;right:12.5%}.custom-theme .el-col-push-3{position:relative;left:12.5%}.custom-theme .el-col-4{width:16.66667%}.custom-theme .el-col-offset-4{margin-left:16.66667%}.custom-theme .el-col-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-push-4{position:relative;left:16.66667%}.custom-theme .el-col-5{width:20.83333%}.custom-theme .el-col-offset-5{margin-left:20.83333%}.custom-theme .el-col-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-push-5{position:relative;left:20.83333%}.custom-theme .el-col-6{width:25%}.custom-theme .el-col-offset-6{margin-left:25%}.custom-theme .el-col-pull-6{position:relative;right:25%}.custom-theme .el-col-push-6{position:relative;left:25%}.custom-theme .el-col-7{width:29.16667%}.custom-theme .el-col-offset-7{margin-left:29.16667%}.custom-theme .el-col-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-push-7{position:relative;left:29.16667%}.custom-theme .el-col-8{width:33.33333%}.custom-theme .el-col-offset-8{margin-left:33.33333%}.custom-theme .el-col-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-push-8{position:relative;left:33.33333%}.custom-theme .el-col-9{width:37.5%}.custom-theme .el-col-offset-9{margin-left:37.5%}.custom-theme .el-col-pull-9{position:relative;right:37.5%}.custom-theme .el-col-push-9{position:relative;left:37.5%}.custom-theme .el-col-10{width:41.66667%}.custom-theme .el-col-offset-10{margin-left:41.66667%}.custom-theme .el-col-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-push-10{position:relative;left:41.66667%}.custom-theme .el-col-11{width:45.83333%}.custom-theme .el-col-offset-11{margin-left:45.83333%}.custom-theme .el-col-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-push-11{position:relative;left:45.83333%}.custom-theme .el-col-12{width:50%}.custom-theme .el-col-offset-12{margin-left:50%}.custom-theme .el-col-pull-12{position:relative;right:50%}.custom-theme .el-col-push-12{position:relative;left:50%}.custom-theme .el-col-13{width:54.16667%}.custom-theme .el-col-offset-13{margin-left:54.16667%}.custom-theme .el-col-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-push-13{position:relative;left:54.16667%}.custom-theme .el-col-14{width:58.33333%}.custom-theme .el-col-offset-14{margin-left:58.33333%}.custom-theme .el-col-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-push-14{position:relative;left:58.33333%}.custom-theme .el-col-15{width:62.5%}.custom-theme .el-col-offset-15{margin-left:62.5%}.custom-theme .el-col-pull-15{position:relative;right:62.5%}.custom-theme .el-col-push-15{position:relative;left:62.5%}.custom-theme .el-col-16{width:66.66667%}.custom-theme .el-col-offset-16{margin-left:66.66667%}.custom-theme .el-col-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-push-16{position:relative;left:66.66667%}.custom-theme .el-col-17{width:70.83333%}.custom-theme .el-col-offset-17{margin-left:70.83333%}.custom-theme .el-col-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-push-17{position:relative;left:70.83333%}.custom-theme .el-col-18{width:75%}.custom-theme .el-col-offset-18{margin-left:75%}.custom-theme .el-col-pull-18{position:relative;right:75%}.custom-theme .el-col-push-18{position:relative;left:75%}.custom-theme .el-col-19{width:79.16667%}.custom-theme .el-col-offset-19{margin-left:79.16667%}.custom-theme .el-col-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-push-19{position:relative;left:79.16667%}.custom-theme .el-col-20{width:83.33333%}.custom-theme .el-col-offset-20{margin-left:83.33333%}.custom-theme .el-col-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-push-20{position:relative;left:83.33333%}.custom-theme .el-col-21{width:87.5%}.custom-theme .el-col-offset-21{margin-left:87.5%}.custom-theme .el-col-pull-21{position:relative;right:87.5%}.custom-theme .el-col-push-21{position:relative;left:87.5%}.custom-theme .el-col-22{width:91.66667%}.custom-theme .el-col-offset-22{margin-left:91.66667%}.custom-theme .el-col-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-push-22{position:relative;left:91.66667%}.custom-theme .el-col-23{width:95.83333%}.custom-theme .el-col-offset-23{margin-left:95.83333%}.custom-theme .el-col-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-push-23{position:relative;left:95.83333%}.custom-theme .el-col-24{width:100%}.custom-theme .el-col-offset-24{margin-left:100%}.custom-theme .el-col-pull-24{position:relative;right:100%}.custom-theme .el-col-push-24{position:relative;left:100%}@media only screen and (max-width:768px){.custom-theme .el-col-xs-0{display:none}.custom-theme .el-col-xs-1{width:4.16667%}.custom-theme .el-col-xs-offset-1{margin-left:4.16667%}.custom-theme .el-col-xs-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-xs-push-1{position:relative;left:4.16667%}.custom-theme .el-col-xs-2{width:8.33333%}.custom-theme .el-col-xs-offset-2{margin-left:8.33333%}.custom-theme .el-col-xs-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-xs-push-2{position:relative;left:8.33333%}.custom-theme .el-col-xs-3{width:12.5%}.custom-theme .el-col-xs-offset-3{margin-left:12.5%}.custom-theme .el-col-xs-pull-3{position:relative;right:12.5%}.custom-theme .el-col-xs-push-3{position:relative;left:12.5%}.custom-theme .el-col-xs-4{width:16.66667%}.custom-theme .el-col-xs-offset-4{margin-left:16.66667%}.custom-theme .el-col-xs-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-xs-push-4{position:relative;left:16.66667%}.custom-theme .el-col-xs-5{width:20.83333%}.custom-theme .el-col-xs-offset-5{margin-left:20.83333%}.custom-theme .el-col-xs-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-xs-push-5{position:relative;left:20.83333%}.custom-theme .el-col-xs-6{width:25%}.custom-theme .el-col-xs-offset-6{margin-left:25%}.custom-theme .el-col-xs-pull-6{position:relative;right:25%}.custom-theme .el-col-xs-push-6{position:relative;left:25%}.custom-theme .el-col-xs-7{width:29.16667%}.custom-theme .el-col-xs-offset-7{margin-left:29.16667%}.custom-theme .el-col-xs-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-xs-push-7{position:relative;left:29.16667%}.custom-theme .el-col-xs-8{width:33.33333%}.custom-theme .el-col-xs-offset-8{margin-left:33.33333%}.custom-theme .el-col-xs-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-xs-push-8{position:relative;left:33.33333%}.custom-theme .el-col-xs-9{width:37.5%}.custom-theme .el-col-xs-offset-9{margin-left:37.5%}.custom-theme .el-col-xs-pull-9{position:relative;right:37.5%}.custom-theme .el-col-xs-push-9{position:relative;left:37.5%}.custom-theme .el-col-xs-10{width:41.66667%}.custom-theme .el-col-xs-offset-10{margin-left:41.66667%}.custom-theme .el-col-xs-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-xs-push-10{position:relative;left:41.66667%}.custom-theme .el-col-xs-11{width:45.83333%}.custom-theme .el-col-xs-offset-11{margin-left:45.83333%}.custom-theme .el-col-xs-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-xs-push-11{position:relative;left:45.83333%}.custom-theme .el-col-xs-12{width:50%}.custom-theme .el-col-xs-offset-12{margin-left:50%}.custom-theme .el-col-xs-pull-12{position:relative;right:50%}.custom-theme .el-col-xs-push-12{position:relative;left:50%}.custom-theme .el-col-xs-13{width:54.16667%}.custom-theme .el-col-xs-offset-13{margin-left:54.16667%}.custom-theme .el-col-xs-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-xs-push-13{position:relative;left:54.16667%}.custom-theme .el-col-xs-14{width:58.33333%}.custom-theme .el-col-xs-offset-14{margin-left:58.33333%}.custom-theme .el-col-xs-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-xs-push-14{position:relative;left:58.33333%}.custom-theme .el-col-xs-15{width:62.5%}.custom-theme .el-col-xs-offset-15{margin-left:62.5%}.custom-theme .el-col-xs-pull-15{position:relative;right:62.5%}.custom-theme .el-col-xs-push-15{position:relative;left:62.5%}.custom-theme .el-col-xs-16{width:66.66667%}.custom-theme .el-col-xs-offset-16{margin-left:66.66667%}.custom-theme .el-col-xs-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-xs-push-16{position:relative;left:66.66667%}.custom-theme .el-col-xs-17{width:70.83333%}.custom-theme .el-col-xs-offset-17{margin-left:70.83333%}.custom-theme .el-col-xs-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-xs-push-17{position:relative;left:70.83333%}.custom-theme .el-col-xs-18{width:75%}.custom-theme .el-col-xs-offset-18{margin-left:75%}.custom-theme .el-col-xs-pull-18{position:relative;right:75%}.custom-theme .el-col-xs-push-18{position:relative;left:75%}.custom-theme .el-col-xs-19{width:79.16667%}.custom-theme .el-col-xs-offset-19{margin-left:79.16667%}.custom-theme .el-col-xs-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-xs-push-19{position:relative;left:79.16667%}.custom-theme .el-col-xs-20{width:83.33333%}.custom-theme .el-col-xs-offset-20{margin-left:83.33333%}.custom-theme .el-col-xs-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-xs-push-20{position:relative;left:83.33333%}.custom-theme .el-col-xs-21{width:87.5%}.custom-theme .el-col-xs-offset-21{margin-left:87.5%}.custom-theme .el-col-xs-pull-21{position:relative;right:87.5%}.custom-theme .el-col-xs-push-21{position:relative;left:87.5%}.custom-theme .el-col-xs-22{width:91.66667%}.custom-theme .el-col-xs-offset-22{margin-left:91.66667%}.custom-theme .el-col-xs-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-xs-push-22{position:relative;left:91.66667%}.custom-theme .el-col-xs-23{width:95.83333%}.custom-theme .el-col-xs-offset-23{margin-left:95.83333%}.custom-theme .el-col-xs-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-xs-push-23{position:relative;left:95.83333%}.custom-theme .el-col-xs-24{width:100%}.custom-theme .el-col-xs-offset-24{margin-left:100%}.custom-theme .el-col-xs-pull-24{position:relative;right:100%}.custom-theme .el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.custom-theme .el-col-sm-0{display:none}.custom-theme .el-col-sm-1{width:4.16667%}.custom-theme .el-col-sm-offset-1{margin-left:4.16667%}.custom-theme .el-col-sm-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-sm-push-1{position:relative;left:4.16667%}.custom-theme .el-col-sm-2{width:8.33333%}.custom-theme .el-col-sm-offset-2{margin-left:8.33333%}.custom-theme .el-col-sm-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-sm-push-2{position:relative;left:8.33333%}.custom-theme .el-col-sm-3{width:12.5%}.custom-theme .el-col-sm-offset-3{margin-left:12.5%}.custom-theme .el-col-sm-pull-3{position:relative;right:12.5%}.custom-theme .el-col-sm-push-3{position:relative;left:12.5%}.custom-theme .el-col-sm-4{width:16.66667%}.custom-theme .el-col-sm-offset-4{margin-left:16.66667%}.custom-theme .el-col-sm-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-sm-push-4{position:relative;left:16.66667%}.custom-theme .el-col-sm-5{width:20.83333%}.custom-theme .el-col-sm-offset-5{margin-left:20.83333%}.custom-theme .el-col-sm-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-sm-push-5{position:relative;left:20.83333%}.custom-theme .el-col-sm-6{width:25%}.custom-theme .el-col-sm-offset-6{margin-left:25%}.custom-theme .el-col-sm-pull-6{position:relative;right:25%}.custom-theme .el-col-sm-push-6{position:relative;left:25%}.custom-theme .el-col-sm-7{width:29.16667%}.custom-theme .el-col-sm-offset-7{margin-left:29.16667%}.custom-theme .el-col-sm-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-sm-push-7{position:relative;left:29.16667%}.custom-theme .el-col-sm-8{width:33.33333%}.custom-theme .el-col-sm-offset-8{margin-left:33.33333%}.custom-theme .el-col-sm-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-sm-push-8{position:relative;left:33.33333%}.custom-theme .el-col-sm-9{width:37.5%}.custom-theme .el-col-sm-offset-9{margin-left:37.5%}.custom-theme .el-col-sm-pull-9{position:relative;right:37.5%}.custom-theme .el-col-sm-push-9{position:relative;left:37.5%}.custom-theme .el-col-sm-10{width:41.66667%}.custom-theme .el-col-sm-offset-10{margin-left:41.66667%}.custom-theme .el-col-sm-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-sm-push-10{position:relative;left:41.66667%}.custom-theme .el-col-sm-11{width:45.83333%}.custom-theme .el-col-sm-offset-11{margin-left:45.83333%}.custom-theme .el-col-sm-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-sm-push-11{position:relative;left:45.83333%}.custom-theme .el-col-sm-12{width:50%}.custom-theme .el-col-sm-offset-12{margin-left:50%}.custom-theme .el-col-sm-pull-12{position:relative;right:50%}.custom-theme .el-col-sm-push-12{position:relative;left:50%}.custom-theme .el-col-sm-13{width:54.16667%}.custom-theme .el-col-sm-offset-13{margin-left:54.16667%}.custom-theme .el-col-sm-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-sm-push-13{position:relative;left:54.16667%}.custom-theme .el-col-sm-14{width:58.33333%}.custom-theme .el-col-sm-offset-14{margin-left:58.33333%}.custom-theme .el-col-sm-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-sm-push-14{position:relative;left:58.33333%}.custom-theme .el-col-sm-15{width:62.5%}.custom-theme .el-col-sm-offset-15{margin-left:62.5%}.custom-theme .el-col-sm-pull-15{position:relative;right:62.5%}.custom-theme .el-col-sm-push-15{position:relative;left:62.5%}.custom-theme .el-col-sm-16{width:66.66667%}.custom-theme .el-col-sm-offset-16{margin-left:66.66667%}.custom-theme .el-col-sm-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-sm-push-16{position:relative;left:66.66667%}.custom-theme .el-col-sm-17{width:70.83333%}.custom-theme .el-col-sm-offset-17{margin-left:70.83333%}.custom-theme .el-col-sm-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-sm-push-17{position:relative;left:70.83333%}.custom-theme .el-col-sm-18{width:75%}.custom-theme .el-col-sm-offset-18{margin-left:75%}.custom-theme .el-col-sm-pull-18{position:relative;right:75%}.custom-theme .el-col-sm-push-18{position:relative;left:75%}.custom-theme .el-col-sm-19{width:79.16667%}.custom-theme .el-col-sm-offset-19{margin-left:79.16667%}.custom-theme .el-col-sm-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-sm-push-19{position:relative;left:79.16667%}.custom-theme .el-col-sm-20{width:83.33333%}.custom-theme .el-col-sm-offset-20{margin-left:83.33333%}.custom-theme .el-col-sm-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-sm-push-20{position:relative;left:83.33333%}.custom-theme .el-col-sm-21{width:87.5%}.custom-theme .el-col-sm-offset-21{margin-left:87.5%}.custom-theme .el-col-sm-pull-21{position:relative;right:87.5%}.custom-theme .el-col-sm-push-21{position:relative;left:87.5%}.custom-theme .el-col-sm-22{width:91.66667%}.custom-theme .el-col-sm-offset-22{margin-left:91.66667%}.custom-theme .el-col-sm-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-sm-push-22{position:relative;left:91.66667%}.custom-theme .el-col-sm-23{width:95.83333%}.custom-theme .el-col-sm-offset-23{margin-left:95.83333%}.custom-theme .el-col-sm-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-sm-push-23{position:relative;left:95.83333%}.custom-theme .el-col-sm-24{width:100%}.custom-theme .el-col-sm-offset-24{margin-left:100%}.custom-theme .el-col-sm-pull-24{position:relative;right:100%}.custom-theme .el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.custom-theme .el-col-md-0{display:none}.custom-theme .el-col-md-1{width:4.16667%}.custom-theme .el-col-md-offset-1{margin-left:4.16667%}.custom-theme .el-col-md-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-md-push-1{position:relative;left:4.16667%}.custom-theme .el-col-md-2{width:8.33333%}.custom-theme .el-col-md-offset-2{margin-left:8.33333%}.custom-theme .el-col-md-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-md-push-2{position:relative;left:8.33333%}.custom-theme .el-col-md-3{width:12.5%}.custom-theme .el-col-md-offset-3{margin-left:12.5%}.custom-theme .el-col-md-pull-3{position:relative;right:12.5%}.custom-theme .el-col-md-push-3{position:relative;left:12.5%}.custom-theme .el-col-md-4{width:16.66667%}.custom-theme .el-col-md-offset-4{margin-left:16.66667%}.custom-theme .el-col-md-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-md-push-4{position:relative;left:16.66667%}.custom-theme .el-col-md-5{width:20.83333%}.custom-theme .el-col-md-offset-5{margin-left:20.83333%}.custom-theme .el-col-md-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-md-push-5{position:relative;left:20.83333%}.custom-theme .el-col-md-6{width:25%}.custom-theme .el-col-md-offset-6{margin-left:25%}.custom-theme .el-col-md-pull-6{position:relative;right:25%}.custom-theme .el-col-md-push-6{position:relative;left:25%}.custom-theme .el-col-md-7{width:29.16667%}.custom-theme .el-col-md-offset-7{margin-left:29.16667%}.custom-theme .el-col-md-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-md-push-7{position:relative;left:29.16667%}.custom-theme .el-col-md-8{width:33.33333%}.custom-theme .el-col-md-offset-8{margin-left:33.33333%}.custom-theme .el-col-md-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-md-push-8{position:relative;left:33.33333%}.custom-theme .el-col-md-9{width:37.5%}.custom-theme .el-col-md-offset-9{margin-left:37.5%}.custom-theme .el-col-md-pull-9{position:relative;right:37.5%}.custom-theme .el-col-md-push-9{position:relative;left:37.5%}.custom-theme .el-col-md-10{width:41.66667%}.custom-theme .el-col-md-offset-10{margin-left:41.66667%}.custom-theme .el-col-md-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-md-push-10{position:relative;left:41.66667%}.custom-theme .el-col-md-11{width:45.83333%}.custom-theme .el-col-md-offset-11{margin-left:45.83333%}.custom-theme .el-col-md-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-md-push-11{position:relative;left:45.83333%}.custom-theme .el-col-md-12{width:50%}.custom-theme .el-col-md-offset-12{margin-left:50%}.custom-theme .el-col-md-pull-12{position:relative;right:50%}.custom-theme .el-col-md-push-12{position:relative;left:50%}.custom-theme .el-col-md-13{width:54.16667%}.custom-theme .el-col-md-offset-13{margin-left:54.16667%}.custom-theme .el-col-md-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-md-push-13{position:relative;left:54.16667%}.custom-theme .el-col-md-14{width:58.33333%}.custom-theme .el-col-md-offset-14{margin-left:58.33333%}.custom-theme .el-col-md-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-md-push-14{position:relative;left:58.33333%}.custom-theme .el-col-md-15{width:62.5%}.custom-theme .el-col-md-offset-15{margin-left:62.5%}.custom-theme .el-col-md-pull-15{position:relative;right:62.5%}.custom-theme .el-col-md-push-15{position:relative;left:62.5%}.custom-theme .el-col-md-16{width:66.66667%}.custom-theme .el-col-md-offset-16{margin-left:66.66667%}.custom-theme .el-col-md-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-md-push-16{position:relative;left:66.66667%}.custom-theme .el-col-md-17{width:70.83333%}.custom-theme .el-col-md-offset-17{margin-left:70.83333%}.custom-theme .el-col-md-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-md-push-17{position:relative;left:70.83333%}.custom-theme .el-col-md-18{width:75%}.custom-theme .el-col-md-offset-18{margin-left:75%}.custom-theme .el-col-md-pull-18{position:relative;right:75%}.custom-theme .el-col-md-push-18{position:relative;left:75%}.custom-theme .el-col-md-19{width:79.16667%}.custom-theme .el-col-md-offset-19{margin-left:79.16667%}.custom-theme .el-col-md-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-md-push-19{position:relative;left:79.16667%}.custom-theme .el-col-md-20{width:83.33333%}.custom-theme .el-col-md-offset-20{margin-left:83.33333%}.custom-theme .el-col-md-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-md-push-20{position:relative;left:83.33333%}.custom-theme .el-col-md-21{width:87.5%}.custom-theme .el-col-md-offset-21{margin-left:87.5%}.custom-theme .el-col-md-pull-21{position:relative;right:87.5%}.custom-theme .el-col-md-push-21{position:relative;left:87.5%}.custom-theme .el-col-md-22{width:91.66667%}.custom-theme .el-col-md-offset-22{margin-left:91.66667%}.custom-theme .el-col-md-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-md-push-22{position:relative;left:91.66667%}.custom-theme .el-col-md-23{width:95.83333%}.custom-theme .el-col-md-offset-23{margin-left:95.83333%}.custom-theme .el-col-md-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-md-push-23{position:relative;left:95.83333%}.custom-theme .el-col-md-24{width:100%}.custom-theme .el-col-md-offset-24{margin-left:100%}.custom-theme .el-col-md-pull-24{position:relative;right:100%}.custom-theme .el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.custom-theme .el-col-lg-0{display:none}.custom-theme .el-col-lg-1{width:4.16667%}.custom-theme .el-col-lg-offset-1{margin-left:4.16667%}.custom-theme .el-col-lg-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-lg-push-1{position:relative;left:4.16667%}.custom-theme .el-col-lg-2{width:8.33333%}.custom-theme .el-col-lg-offset-2{margin-left:8.33333%}.custom-theme .el-col-lg-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-lg-push-2{position:relative;left:8.33333%}.custom-theme .el-col-lg-3{width:12.5%}.custom-theme .el-col-lg-offset-3{margin-left:12.5%}.custom-theme .el-col-lg-pull-3{position:relative;right:12.5%}.custom-theme .el-col-lg-push-3{position:relative;left:12.5%}.custom-theme .el-col-lg-4{width:16.66667%}.custom-theme .el-col-lg-offset-4{margin-left:16.66667%}.custom-theme .el-col-lg-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-lg-push-4{position:relative;left:16.66667%}.custom-theme .el-col-lg-5{width:20.83333%}.custom-theme .el-col-lg-offset-5{margin-left:20.83333%}.custom-theme .el-col-lg-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-lg-push-5{position:relative;left:20.83333%}.custom-theme .el-col-lg-6{width:25%}.custom-theme .el-col-lg-offset-6{margin-left:25%}.custom-theme .el-col-lg-pull-6{position:relative;right:25%}.custom-theme .el-col-lg-push-6{position:relative;left:25%}.custom-theme .el-col-lg-7{width:29.16667%}.custom-theme .el-col-lg-offset-7{margin-left:29.16667%}.custom-theme .el-col-lg-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-lg-push-7{position:relative;left:29.16667%}.custom-theme .el-col-lg-8{width:33.33333%}.custom-theme .el-col-lg-offset-8{margin-left:33.33333%}.custom-theme .el-col-lg-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-lg-push-8{position:relative;left:33.33333%}.custom-theme .el-col-lg-9{width:37.5%}.custom-theme .el-col-lg-offset-9{margin-left:37.5%}.custom-theme .el-col-lg-pull-9{position:relative;right:37.5%}.custom-theme .el-col-lg-push-9{position:relative;left:37.5%}.custom-theme .el-col-lg-10{width:41.66667%}.custom-theme .el-col-lg-offset-10{margin-left:41.66667%}.custom-theme .el-col-lg-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-lg-push-10{position:relative;left:41.66667%}.custom-theme .el-col-lg-11{width:45.83333%}.custom-theme .el-col-lg-offset-11{margin-left:45.83333%}.custom-theme .el-col-lg-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-lg-push-11{position:relative;left:45.83333%}.custom-theme .el-col-lg-12{width:50%}.custom-theme .el-col-lg-offset-12{margin-left:50%}.custom-theme .el-col-lg-pull-12{position:relative;right:50%}.custom-theme .el-col-lg-push-12{position:relative;left:50%}.custom-theme .el-col-lg-13{width:54.16667%}.custom-theme .el-col-lg-offset-13{margin-left:54.16667%}.custom-theme .el-col-lg-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-lg-push-13{position:relative;left:54.16667%}.custom-theme .el-col-lg-14{width:58.33333%}.custom-theme .el-col-lg-offset-14{margin-left:58.33333%}.custom-theme .el-col-lg-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-lg-push-14{position:relative;left:58.33333%}.custom-theme .el-col-lg-15{width:62.5%}.custom-theme .el-col-lg-offset-15{margin-left:62.5%}.custom-theme .el-col-lg-pull-15{position:relative;right:62.5%}.custom-theme .el-col-lg-push-15{position:relative;left:62.5%}.custom-theme .el-col-lg-16{width:66.66667%}.custom-theme .el-col-lg-offset-16{margin-left:66.66667%}.custom-theme .el-col-lg-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-lg-push-16{position:relative;left:66.66667%}.custom-theme .el-col-lg-17{width:70.83333%}.custom-theme .el-col-lg-offset-17{margin-left:70.83333%}.custom-theme .el-col-lg-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-lg-push-17{position:relative;left:70.83333%}.custom-theme .el-col-lg-18{width:75%}.custom-theme .el-col-lg-offset-18{margin-left:75%}.custom-theme .el-col-lg-pull-18{position:relative;right:75%}.custom-theme .el-col-lg-push-18{position:relative;left:75%}.custom-theme .el-col-lg-19{width:79.16667%}.custom-theme .el-col-lg-offset-19{margin-left:79.16667%}.custom-theme .el-col-lg-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-lg-push-19{position:relative;left:79.16667%}.custom-theme .el-col-lg-20{width:83.33333%}.custom-theme .el-col-lg-offset-20{margin-left:83.33333%}.custom-theme .el-col-lg-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-lg-push-20{position:relative;left:83.33333%}.custom-theme .el-col-lg-21{width:87.5%}.custom-theme .el-col-lg-offset-21{margin-left:87.5%}.custom-theme .el-col-lg-pull-21{position:relative;right:87.5%}.custom-theme .el-col-lg-push-21{position:relative;left:87.5%}.custom-theme .el-col-lg-22{width:91.66667%}.custom-theme .el-col-lg-offset-22{margin-left:91.66667%}.custom-theme .el-col-lg-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-lg-push-22{position:relative;left:91.66667%}.custom-theme .el-col-lg-23{width:95.83333%}.custom-theme .el-col-lg-offset-23{margin-left:95.83333%}.custom-theme .el-col-lg-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-lg-push-23{position:relative;left:95.83333%}.custom-theme .el-col-lg-24{width:100%}.custom-theme .el-col-lg-offset-24{margin-left:100%}.custom-theme .el-col-lg-pull-24{position:relative;right:100%}.custom-theme .el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.custom-theme .el-col-xl-0{display:none}.custom-theme .el-col-xl-1{width:4.16667%}.custom-theme .el-col-xl-offset-1{margin-left:4.16667%}.custom-theme .el-col-xl-pull-1{position:relative;right:4.16667%}.custom-theme .el-col-xl-push-1{position:relative;left:4.16667%}.custom-theme .el-col-xl-2{width:8.33333%}.custom-theme .el-col-xl-offset-2{margin-left:8.33333%}.custom-theme .el-col-xl-pull-2{position:relative;right:8.33333%}.custom-theme .el-col-xl-push-2{position:relative;left:8.33333%}.custom-theme .el-col-xl-3{width:12.5%}.custom-theme .el-col-xl-offset-3{margin-left:12.5%}.custom-theme .el-col-xl-pull-3{position:relative;right:12.5%}.custom-theme .el-col-xl-push-3{position:relative;left:12.5%}.custom-theme .el-col-xl-4{width:16.66667%}.custom-theme .el-col-xl-offset-4{margin-left:16.66667%}.custom-theme .el-col-xl-pull-4{position:relative;right:16.66667%}.custom-theme .el-col-xl-push-4{position:relative;left:16.66667%}.custom-theme .el-col-xl-5{width:20.83333%}.custom-theme .el-col-xl-offset-5{margin-left:20.83333%}.custom-theme .el-col-xl-pull-5{position:relative;right:20.83333%}.custom-theme .el-col-xl-push-5{position:relative;left:20.83333%}.custom-theme .el-col-xl-6{width:25%}.custom-theme .el-col-xl-offset-6{margin-left:25%}.custom-theme .el-col-xl-pull-6{position:relative;right:25%}.custom-theme .el-col-xl-push-6{position:relative;left:25%}.custom-theme .el-col-xl-7{width:29.16667%}.custom-theme .el-col-xl-offset-7{margin-left:29.16667%}.custom-theme .el-col-xl-pull-7{position:relative;right:29.16667%}.custom-theme .el-col-xl-push-7{position:relative;left:29.16667%}.custom-theme .el-col-xl-8{width:33.33333%}.custom-theme .el-col-xl-offset-8{margin-left:33.33333%}.custom-theme .el-col-xl-pull-8{position:relative;right:33.33333%}.custom-theme .el-col-xl-push-8{position:relative;left:33.33333%}.custom-theme .el-col-xl-9{width:37.5%}.custom-theme .el-col-xl-offset-9{margin-left:37.5%}.custom-theme .el-col-xl-pull-9{position:relative;right:37.5%}.custom-theme .el-col-xl-push-9{position:relative;left:37.5%}.custom-theme .el-col-xl-10{width:41.66667%}.custom-theme .el-col-xl-offset-10{margin-left:41.66667%}.custom-theme .el-col-xl-pull-10{position:relative;right:41.66667%}.custom-theme .el-col-xl-push-10{position:relative;left:41.66667%}.custom-theme .el-col-xl-11{width:45.83333%}.custom-theme .el-col-xl-offset-11{margin-left:45.83333%}.custom-theme .el-col-xl-pull-11{position:relative;right:45.83333%}.custom-theme .el-col-xl-push-11{position:relative;left:45.83333%}.custom-theme .el-col-xl-12{width:50%}.custom-theme .el-col-xl-offset-12{margin-left:50%}.custom-theme .el-col-xl-pull-12{position:relative;right:50%}.custom-theme .el-col-xl-push-12{position:relative;left:50%}.custom-theme .el-col-xl-13{width:54.16667%}.custom-theme .el-col-xl-offset-13{margin-left:54.16667%}.custom-theme .el-col-xl-pull-13{position:relative;right:54.16667%}.custom-theme .el-col-xl-push-13{position:relative;left:54.16667%}.custom-theme .el-col-xl-14{width:58.33333%}.custom-theme .el-col-xl-offset-14{margin-left:58.33333%}.custom-theme .el-col-xl-pull-14{position:relative;right:58.33333%}.custom-theme .el-col-xl-push-14{position:relative;left:58.33333%}.custom-theme .el-col-xl-15{width:62.5%}.custom-theme .el-col-xl-offset-15{margin-left:62.5%}.custom-theme .el-col-xl-pull-15{position:relative;right:62.5%}.custom-theme .el-col-xl-push-15{position:relative;left:62.5%}.custom-theme .el-col-xl-16{width:66.66667%}.custom-theme .el-col-xl-offset-16{margin-left:66.66667%}.custom-theme .el-col-xl-pull-16{position:relative;right:66.66667%}.custom-theme .el-col-xl-push-16{position:relative;left:66.66667%}.custom-theme .el-col-xl-17{width:70.83333%}.custom-theme .el-col-xl-offset-17{margin-left:70.83333%}.custom-theme .el-col-xl-pull-17{position:relative;right:70.83333%}.custom-theme .el-col-xl-push-17{position:relative;left:70.83333%}.custom-theme .el-col-xl-18{width:75%}.custom-theme .el-col-xl-offset-18{margin-left:75%}.custom-theme .el-col-xl-pull-18{position:relative;right:75%}.custom-theme .el-col-xl-push-18{position:relative;left:75%}.custom-theme .el-col-xl-19{width:79.16667%}.custom-theme .el-col-xl-offset-19{margin-left:79.16667%}.custom-theme .el-col-xl-pull-19{position:relative;right:79.16667%}.custom-theme .el-col-xl-push-19{position:relative;left:79.16667%}.custom-theme .el-col-xl-20{width:83.33333%}.custom-theme .el-col-xl-offset-20{margin-left:83.33333%}.custom-theme .el-col-xl-pull-20{position:relative;right:83.33333%}.custom-theme .el-col-xl-push-20{position:relative;left:83.33333%}.custom-theme .el-col-xl-21{width:87.5%}.custom-theme .el-col-xl-offset-21{margin-left:87.5%}.custom-theme .el-col-xl-pull-21{position:relative;right:87.5%}.custom-theme .el-col-xl-push-21{position:relative;left:87.5%}.custom-theme .el-col-xl-22{width:91.66667%}.custom-theme .el-col-xl-offset-22{margin-left:91.66667%}.custom-theme .el-col-xl-pull-22{position:relative;right:91.66667%}.custom-theme .el-col-xl-push-22{position:relative;left:91.66667%}.custom-theme .el-col-xl-23{width:95.83333%}.custom-theme .el-col-xl-offset-23{margin-left:95.83333%}.custom-theme .el-col-xl-pull-23{position:relative;right:95.83333%}.custom-theme .el-col-xl-push-23{position:relative;left:95.83333%}.custom-theme .el-col-xl-24{width:100%}.custom-theme .el-col-xl-offset-24{margin-left:100%}.custom-theme .el-col-xl-pull-24{position:relative;right:100%}.custom-theme .el-col-xl-push-24{position:relative;left:100%}}.custom-theme .el-progress{position:relative;line-height:1}.custom-theme .el-progress__text{font-size:14px;color:#5a5e66;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.custom-theme .el-progress__text i{vertical-align:middle;display:block}.custom-theme .el-progress--circle{display:inline-block}.custom-theme .el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.custom-theme .el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.custom-theme .el-progress--without-text .el-progress__text{display:none}.custom-theme .el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.custom-theme .el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.custom-theme .el-progress.is-success .el-progress-bar__inner{background-color:#409167}.custom-theme .el-progress.is-success .el-progress__text{color:#409167}.custom-theme .el-progress.is-exception .el-progress-bar__inner{background-color:#b3450e}.custom-theme .el-progress.is-exception .el-progress__text{color:#b3450e}.custom-theme .el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-progress-bar__outer{height:6px;border-radius:100px;background-color:#e6ebf5;overflow:hidden;position:relative;vertical-align:middle}.custom-theme .el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#262729;text-align:right;border-radius:100px;line-height:1;white-space:nowrap}.custom-theme .el-progress-bar__inner::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.custom-theme .el-upload{display:inline-block;text-align:center;cursor:pointer}.custom-theme .el-upload__input{display:none}.custom-theme .el-upload__tip{font-size:12px;color:#5a5e66;margin-top:7px}.custom-theme .el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0}.custom-theme .el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;cursor:pointer;line-height:146px;vertical-align:top}.custom-theme .el-upload--picture-card i{font-size:28px;color:#8c939d}.custom-theme .el-upload--picture-card:hover{border-color:#262729;color:#262729}.custom-theme .el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;cursor:pointer;position:relative;overflow:hidden}.custom-theme .el-upload-dragger .el-icon-upload{font-size:67px;color:#b4bccc;margin:40px 0 16px;line-height:50px}.custom-theme .el-upload-dragger+.el-upload__tip{text-align:center}.custom-theme .el-upload-dragger~.el-upload__files{border-top:1px solid #d8dce5;margin-top:7px;padding-top:5px}.custom-theme .el-upload-dragger .el-upload__text{color:#5a5e66;font-size:14px;text-align:center}.custom-theme .el-upload-dragger .el-upload__text em{color:#262729;font-style:normal}.custom-theme .el-upload-dragger:hover{border-color:#262729}.custom-theme .el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #262729}.custom-theme .el-upload-list{margin:0;padding:0;list-style:none}.custom-theme .el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#5a5e66;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.custom-theme .el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.custom-theme .el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.custom-theme .el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.custom-theme .el-upload-list__item:first-child{margin-top:10px}.custom-theme .el-upload-list__item .el-icon-upload-success{color:#409167}.custom-theme .el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#5a5e66}.custom-theme .el-upload-list__item .el-icon-close:hover{opacity:1}.custom-theme .el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:0;cursor:pointer;opacity:1;color:#262729;-webkit-transform:translate(15%,0);transform:translate(15%,0)}.custom-theme .el-upload-list__item:hover{background-color:#f5f7fa}.custom-theme .el-upload-list__item:hover .el-icon-close{display:inline-block}.custom-theme .el-upload-list__item:hover .el-progress__text{display:none}.custom-theme .el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:focus,.custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#262729;cursor:pointer}.custom-theme .el-upload-list__item.is-success:focus .el-icon-close-tip{display:inline-block}.custom-theme .el-upload-list__item.is-success:active,.custom-theme .el-upload-list__item.is-success:focus:not(.focusing){outline-width:0}.custom-theme .el-upload-list__item.is-success:active .el-icon-close-tip,.custom-theme .el-upload-list__item.is-success:focus:not(.focusing) .el-icon-close-tip{display:none}.custom-theme .el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.custom-theme .el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none}.custom-theme .el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.custom-theme .el-upload-list__item-name{color:#5a5e66;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.custom-theme .el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#878d99;line-height:inherit}.custom-theme .el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.custom-theme .el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#5a5e66;display:none}.custom-theme .el-upload-list__item-delete:hover{color:#262729}.custom-theme .el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.custom-theme .el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-check,.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-close{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.custom-theme .el-upload-list--picture-card .el-upload-list__item-name{display:none}.custom-theme .el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.custom-theme .el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.custom-theme .el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.custom-theme .el-upload-list--picture .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-check,.custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.custom-theme .el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px}.custom-theme .el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.custom-theme .el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.custom-theme .el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.custom-theme .el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.custom-theme .el-upload-list--picture .el-progress{position:relative;top:-7px}.custom-theme .el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.custom-theme .el-upload-cover::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-upload-cover img{display:block;width:100%;height:100%}.custom-theme .el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.custom-theme .el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.custom-theme .el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.custom-theme .el-upload-cover__progress+.el-upload__inner{opacity:0}.custom-theme .el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.custom-theme .el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.custom-theme .el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s;transition:transform .3s cubic-bezier(.23,1,.32,1) .1s,opacity .3s cubic-bezier(.23,1,.32,1) .1s,-webkit-transform .3s cubic-bezier(.23,1,.32,1) .1s;margin-top:60px}.custom-theme .el-upload-cover__interact .btn i{margin-top:0}.custom-theme .el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.custom-theme .el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.custom-theme .el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.custom-theme .el-upload-cover__interact .btn:hover span{opacity:1}.custom-theme .el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.custom-theme .el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#2d2f33}.custom-theme .el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.custom-theme .el-progress{position:relative;line-height:1}.custom-theme .el-progress__text{font-size:14px;color:#5a5e66;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.custom-theme .el-progress__text i{vertical-align:middle;display:block}.custom-theme .el-progress--circle{display:inline-block}.custom-theme .el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.custom-theme .el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.custom-theme .el-progress--without-text .el-progress__text{display:none}.custom-theme .el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.custom-theme .el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.custom-theme .el-progress.is-success .el-progress-bar__inner{background-color:#409167}.custom-theme .el-progress.is-success .el-progress__text{color:#409167}.custom-theme .el-progress.is-exception .el-progress-bar__inner{background-color:#b3450e}.custom-theme .el-progress.is-exception .el-progress__text{color:#b3450e}.custom-theme .el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-progress-bar__outer{height:6px;border-radius:100px;background-color:#e6ebf5;overflow:hidden;position:relative;vertical-align:middle}.custom-theme .el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#262729;text-align:right;border-radius:100px;line-height:1;white-space:nowrap}.custom-theme .el-progress-bar__inner::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.custom-theme .el-time-spinner{width:100%;white-space:nowrap}.custom-theme .el-spinner{display:inline-block;vertical-align:middle}.custom-theme .el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.custom-theme .el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.custom-theme .el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#e6ebf5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,transform .4s;transition:opacity .3s,transform .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-message p{margin:0}.custom-theme .el-message--info .el-message__content{color:#0a76a4}.custom-theme .el-message--success{background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-message--success .el-message__content{color:#409167}.custom-theme .el-message--warning{background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-message--warning .el-message__content{color:#9da408}.custom-theme .el-message--error{background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-message--error .el-message__content{color:#b3450e}.custom-theme .el-message__icon{margin-right:10px}.custom-theme .el-message__content{padding:0;font-size:14px;line-height:1}.custom-theme .el-message__content:focus{outline-width:0}.custom-theme .el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#b4bccc;font-size:16px}.custom-theme .el-message__closeBtn:focus{outline-width:0}.custom-theme .el-message__closeBtn:hover{color:#878d99}.custom-theme .el-message .el-icon-success{color:#409167}.custom-theme .el-message .el-icon-error{color:#b3450e}.custom-theme .el-message .el-icon-info{color:#0a76a4}.custom-theme .el-message .el-icon-warning{color:#9da408}.custom-theme .el-message-fade-enter,.custom-theme .el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.custom-theme .el-badge{position:relative;vertical-align:middle;display:inline-block}.custom-theme .el-badge__content{background-color:#b3450e;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.custom-theme .el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.custom-theme .el-badge__content.is-fixed.is-dot{right:5px}.custom-theme .el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.custom-theme .el-card{border-radius:4px;border:1px solid #e6ebf5;background-color:#fff;overflow:hidden;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);color:#2d2f33}.custom-theme .el-card__header{padding:18px 20px;border-bottom:1px solid #e6ebf5;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-card__body{padding:20px}.custom-theme .el-rate{height:20px;line-height:1}.custom-theme .el-rate:active,.custom-theme .el-rate:focus{outline-width:0}.custom-theme .el-rate__item{display:inline-block;position:relative;font-size:0;vertical-align:middle}.custom-theme .el-rate__icon{position:relative;display:inline-block;font-size:18px;margin-right:6px;color:#b4bccc;-webkit-transition:.3s;transition:.3s}.custom-theme .el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.custom-theme .el-rate__icon .path2{position:absolute;left:0;top:0}.custom-theme .el-rate__decimal{position:absolute;top:0;left:0;display:inline-block;overflow:hidden}.custom-theme .el-rate__text{font-size:14px;vertical-align:middle}.custom-theme .el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.custom-theme .el-steps--horizontal{white-space:nowrap}.custom-theme .el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.custom-theme .el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.custom-theme .el-step:last-of-type .el-step__line{display:none}.custom-theme .el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.custom-theme .el-step:last-of-type .el-step__description,.custom-theme .el-step:last-of-type .el-step__main{padding-right:0}.custom-theme .el-step__head{position:relative;width:100%}.custom-theme .el-step__head.is-process{color:#2d2f33;border-color:#2d2f33}.custom-theme .el-step__head.is-wait{color:#b4bccc;border-color:#b4bccc}.custom-theme .el-step__head.is-success{color:#409167;border-color:#409167}.custom-theme .el-step__head.is-error{color:#b3450e;border-color:#b3450e}.custom-theme .el-step__head.is-finish{color:#262729;border-color:#262729}.custom-theme .el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.custom-theme .el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.custom-theme .el-step__icon.is-icon{width:40px}.custom-theme .el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.custom-theme .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.custom-theme .el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.custom-theme .el-step__line{position:absolute;border-color:inherit;background-color:#b4bccc}.custom-theme .el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.custom-theme .el-step__main{white-space:normal;text-align:left}.custom-theme .el-step__title{font-size:16px;line-height:38px}.custom-theme .el-step__title.is-process{font-weight:700;color:#2d2f33}.custom-theme .el-step__title.is-wait{color:#b4bccc}.custom-theme .el-step__title.is-success{color:#409167}.custom-theme .el-step__title.is-error{color:#b3450e}.custom-theme .el-step__title.is-finish{color:#262729}.custom-theme .el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.custom-theme .el-step__description.is-process{color:#2d2f33}.custom-theme .el-step__description.is-wait{color:#b4bccc}.custom-theme .el-step__description.is-success{color:#409167}.custom-theme .el-step__description.is-error{color:#b3450e}.custom-theme .el-step__description.is-finish{color:#262729}.custom-theme .el-step.is-horizontal{display:inline-block}.custom-theme .el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.custom-theme .el-step.is-vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.custom-theme .el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.custom-theme .el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.custom-theme .el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.custom-theme .el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.custom-theme .el-step.is-vertical .el-step__icon.is-icon{width:24px}.custom-theme .el-step.is-center .el-step__head{text-align:center}.custom-theme .el-step.is-center .el-step__main{text-align:center}.custom-theme .el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.custom-theme .el-step.is-center .el-step__line{left:50%;right:-50%}.custom-theme .el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.custom-theme .el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.custom-theme .el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.custom-theme .el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.custom-theme .el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.custom-theme .el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.custom-theme .el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.custom-theme .el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.custom-theme .el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.custom-theme .el-step.is-simple .el-step__arrow::after,.custom-theme .el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#b4bccc}.custom-theme .el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.custom-theme .el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.custom-theme .el-step.is-simple:last-of-type .el-step__arrow{display:none}.custom-theme .el-carousel{overflow-x:hidden;position:relative}.custom-theme .el-carousel__container{position:relative;height:300px}.custom-theme .el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.custom-theme .el-carousel__arrow--left{left:16px}.custom-theme .el-carousel__arrow--right{right:16px}.custom-theme .el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.custom-theme .el-carousel__arrow i{cursor:pointer}.custom-theme .el-carousel__indicators{position:absolute;list-style:none;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin:0;padding:0;z-index:2}.custom-theme .el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.custom-theme .el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.custom-theme .el-carousel__indicators--outside button{background-color:#b4bccc;opacity:.24}.custom-theme .el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.custom-theme .el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.custom-theme .el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.custom-theme .el-carousel__indicator{display:inline-block;background-color:transparent;padding:12px 4px;cursor:pointer}.custom-theme .el-carousel__indicator:hover button{opacity:.72}.custom-theme .el-carousel__indicator.is-active button{opacity:1}.custom-theme .el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.custom-theme .carousel-arrow-left-enter,.custom-theme .carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.custom-theme .carousel-arrow-right-enter,.custom-theme .carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.custom-theme .el-scrollbar{overflow:hidden;position:relative}.custom-theme .el-scrollbar:active>.el-scrollbar__bar,.custom-theme .el-scrollbar:focus>.el-scrollbar__bar,.custom-theme .el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.custom-theme .el-scrollbar__wrap{overflow:scroll;height:100%}.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.custom-theme .el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(135,141,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.custom-theme .el-scrollbar__thumb:hover{background-color:rgba(135,141,153,.5)}.custom-theme .el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.custom-theme .el-scrollbar__bar.is-vertical{width:6px;top:2px}.custom-theme .el-scrollbar__bar.is-vertical>div{width:100%}.custom-theme .el-scrollbar__bar.is-horizontal{height:6px;left:2px}.custom-theme .el-scrollbar__bar.is-horizontal>div{height:100%}.custom-theme .el-carousel__item{position:absolute;top:0;left:0;width:100%;height:100%;display:inline-block;overflow:hidden;z-index:0}.custom-theme .el-carousel__item.is-active{z-index:2}.custom-theme .el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.custom-theme .el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.custom-theme .el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.custom-theme .el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.custom-theme .el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.custom-theme .el-carousel__item--card.is-active{z-index:2}.custom-theme .el-carousel__mask{position:absolute;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.custom-theme .el-collapse{border-top:1px solid #e6ebf5;border-bottom:1px solid #e6ebf5}.custom-theme .el-collapse-item__header{height:48px;line-height:48px;background-color:#fff;color:#2d2f33;cursor:pointer;border-bottom:1px solid #e6ebf5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s}.custom-theme .el-collapse-item__header:active,.custom-theme .el-collapse-item__header:focus:not(.focusing){outline-width:0}.custom-theme .el-collapse-item__arrow{margin-right:8px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:right;line-height:48px;font-weight:300}.custom-theme .el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e6ebf5}.custom-theme .el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#2d2f33;line-height:1.769230769230769}.custom-theme .el-collapse-item.is-active .el-collapse-item__header{border-bottom-color:transparent}.custom-theme .el-collapse-item.is-active .el-collapse-item__header .el-collapse-item__arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.custom-theme .el-collapse-item:last-child{margin-bottom:-1px}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-popper .popper__arrow,.custom-theme .el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.custom-theme .el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.custom-theme .el-popper .popper__arrow::after{content:\" \";border-width:6px}.custom-theme .el-popper[x-placement^=top]{margin-bottom:12px}.custom-theme .el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#e6ebf5;border-bottom-width:0}.custom-theme .el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.custom-theme .el-popper[x-placement^=bottom]{margin-top:12px}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#e6ebf5}.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.custom-theme .el-popper[x-placement^=right]{margin-left:12px}.custom-theme .el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#e6ebf5;border-left-width:0}.custom-theme .el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.custom-theme .el-popper[x-placement^=left]{margin-right:12px}.custom-theme .el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#e6ebf5}.custom-theme .el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.custom-theme .el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.custom-theme .el-cascader .el-input,.custom-theme .el-cascader .el-input__inner{cursor:pointer}.custom-theme .el-cascader .el-input__icon{-webkit-transition:none;transition:none}.custom-theme .el-cascader .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.custom-theme .el-cascader .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.custom-theme .el-cascader .el-icon-circle-close{z-index:2;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-cascader .el-icon-circle-close:hover{color:#878d99}.custom-theme .el-cascader__clearIcon{z-index:2;position:relative}.custom-theme .el-cascader__label{position:absolute;left:0;top:0;height:100%;padding:0 25px 0 15px;color:#5a5e66;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:left;font-size:inherit}.custom-theme .el-cascader__label span{color:#000}.custom-theme .el-cascader--medium{font-size:14px;line-height:36px}.custom-theme .el-cascader--small{font-size:13px;line-height:32px}.custom-theme .el-cascader--mini{font-size:12px;line-height:28px}.custom-theme .el-cascader.is-disabled .el-cascader__label{z-index:2;color:#b4bccc}.custom-theme .el-cascader-menus{white-space:nowrap;background:#fff;position:absolute;margin:5px 0;z-index:2;border:solid 1px #dfe4ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-cascader-menus .popper__arrow{-webkit-transform:translateX(-400%);transform:translateX(-400%)}.custom-theme .el-cascader-menu{display:inline-block;vertical-align:top;height:204px;overflow:auto;border-right:solid 1px #dfe4ed;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:6px 0;min-width:160px}.custom-theme .el-cascader-menu:last-child{border-right:0}.custom-theme .el-cascader-menu__item{font-size:14px;padding:8px 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5a5e66;height:34px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.custom-theme .el-cascader-menu__item--extensible:after{font-family:element-icons;content:\"\\e604\";font-size:14px;color:#bfcbd9;position:absolute;right:15px}.custom-theme .el-cascader-menu__item.is-disabled{color:#b4bccc;background-color:#fff;cursor:not-allowed}.custom-theme .el-cascader-menu__item.is-disabled:hover{background-color:#fff}.custom-theme .el-cascader-menu__item.is-active{color:#262729}.custom-theme .el-cascader-menu__item:hover{background-color:#f5f7fa}.custom-theme .el-cascader-menu__item.selected{color:#fff;background-color:#f5f7fa}.custom-theme .el-cascader-menu__item__keyword{font-weight:700}.custom-theme .el-cascader-menu--flexible{height:auto;max-height:180px;overflow:auto}.custom-theme .el-cascader-menu--flexible .el-cascader-menu__item{overflow:visible}.custom-theme .el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.custom-theme .el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.custom-theme .el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.custom-theme .el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.custom-theme .el-color-svpanel{position:relative;width:280px;height:180px}.custom-theme .el-color-svpanel__black,.custom-theme .el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.custom-theme .el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.custom-theme .el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:linear-gradient(to top,#000,transparent)}.custom-theme .el-color-svpanel__cursor{position:absolute}.custom-theme .el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.custom-theme .el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.custom-theme .el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.custom-theme .el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.custom-theme .el-color-alpha-slider.is-vertical{width:20px;height:180px}.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.custom-theme .el-color-dropdown{width:300px}.custom-theme .el-color-dropdown__main-wrapper{margin-bottom:6px}.custom-theme .el-color-dropdown__main-wrapper::after{content:\"\";display:table;clear:both}.custom-theme .el-color-dropdown__btns{margin-top:6px;text-align:right}.custom-theme .el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.custom-theme .el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.custom-theme .el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.custom-theme .el-color-dropdown__btn:hover{color:#262729;border-color:#262729}.custom-theme .el-color-dropdown__link-btn{cursor:pointer;color:#262729;text-decoration:none;padding:15px;font-size:12px}.custom-theme .el-color-dropdown__link-btn:hover{color:tint(#262729,20%)}.custom-theme .el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.custom-theme .el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.custom-theme .el-color-picker--medium{height:36px}.custom-theme .el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.custom-theme .el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.custom-theme .el-color-picker--small{height:32px}.custom-theme .el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.custom-theme .el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.custom-theme .el-color-picker--small .el-color-picker__empty,.custom-theme .el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.custom-theme .el-color-picker--mini{height:28px}.custom-theme .el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.custom-theme .el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.custom-theme .el-color-picker--mini .el-color-picker__empty,.custom-theme .el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.custom-theme .el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.custom-theme .el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.custom-theme .el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.custom-theme .el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.custom-theme .el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.custom-theme .el-color-picker__empty{font-size:12px;color:#999;position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.custom-theme .el-color-picker__icon{display:inline-block;position:absolute;width:100%;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#fff;text-align:center;font-size:12px}.custom-theme .el-color-picker__panel{position:absolute;z-index:10;padding:6px;background-color:#fff;border:1px solid #e6ebf5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.custom-theme .el-input{position:relative;font-size:14px;display:inline-block;width:100%}.custom-theme .el-input::-webkit-scrollbar{z-index:11;width:6px}.custom-theme .el-input::-webkit-scrollbar:horizontal{height:6px}.custom-theme .el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.custom-theme .el-input::-webkit-scrollbar-corner{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track{background:#fff}.custom-theme .el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.custom-theme .el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #d8dce5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#5a5e66;display:inline-block;font-size:inherit;height:40px;line-height:1;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.custom-theme .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input__inner:hover{border-color:#b4bccc}.custom-theme .el-input__inner:focus{outline:0;border-color:#262729}.custom-theme .el-input__suffix{position:absolute;height:100%;right:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s;pointer-events:none}.custom-theme .el-input__suffix-inner{pointer-events:all}.custom-theme .el-input__prefix{position:absolute;height:100%;left:5px;top:0;text-align:center;color:#b4bccc;-webkit-transition:all .3s;transition:all .3s}.custom-theme .el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.custom-theme .el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.custom-theme .el-input__validateIcon{pointer-events:none}.custom-theme .el-input.is-active .el-input__inner{outline:0;border-color:#262729}.custom-theme .el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__inner::placeholder{color:#b4bccc}.custom-theme .el-input.is-disabled .el-input__icon{cursor:not-allowed}.custom-theme .el-input--suffix .el-input__inner{padding-right:30px}.custom-theme .el-input--prefix .el-input__inner{padding-left:30px}.custom-theme .el-input--medium{font-size:14px}.custom-theme .el-input--medium .el-input__inner{height:36px}.custom-theme .el-input--medium .el-input__icon{line-height:36px}.custom-theme .el-input--small{font-size:13px}.custom-theme .el-input--small .el-input__inner{height:32px}.custom-theme .el-input--small .el-input__icon{line-height:32px}.custom-theme .el-input--mini{font-size:12px}.custom-theme .el-input--mini .el-input__inner{height:28px}.custom-theme .el-input--mini .el-input__icon{line-height:28px}.custom-theme .el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate}.custom-theme .el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.custom-theme .el-input-group__append,.custom-theme .el-input-group__prepend{background-color:#f5f7fa;color:#0a76a4;vertical-align:middle;display:table-cell;position:relative;border:1px solid #d8dce5;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.custom-theme .el-input-group__append:focus,.custom-theme .el-input-group__prepend:focus{outline:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-select,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-select{display:inline-block;margin:-20px}.custom-theme .el-input-group__append button.el-button,.custom-theme .el-input-group__append div.el-select .el-input__inner,.custom-theme .el-input-group__append div.el-select:hover .el-input__inner,.custom-theme .el-input-group__prepend button.el-button,.custom-theme .el-input-group__prepend div.el-select .el-input__inner,.custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.custom-theme .el-input-group__append .el-button,.custom-theme .el-input-group__append .el-input,.custom-theme .el-input-group__prepend .el-button,.custom-theme .el-input-group__prepend .el-input{font-size:inherit}.custom-theme .el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-input-group--append .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-textarea{display:inline-block;width:100%;vertical-align:bottom}.custom-theme .el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:14px;color:#5a5e66;background-color:#fff;background-image:none;border:1px solid #d8dce5;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.custom-theme .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-textarea__inner:hover{border-color:#b4bccc}.custom-theme .el-textarea__inner:focus{outline:0;border-color:#262729}.custom-theme .el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#dfe4ed;color:#b4bccc;cursor:not-allowed}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#b4bccc}.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder{color:#b4bccc}.custom-theme .el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-color:#d8dce5;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button+.el-button{margin-left:10px}.custom-theme .el-button.is-round{padding:12px 20px}.custom-theme .el-button:focus,.custom-theme .el-button:hover{color:#262729;border-color:#bebebf;background-color:#e9e9ea}.custom-theme .el-button:active{color:#222325;border-color:#222325;outline:0}.custom-theme .el-button::-moz-focus-inner{border:0}.custom-theme .el-button [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-button.is-plain:focus,.custom-theme .el-button.is-plain:hover{background:#fff;border-color:#262729;color:#262729}.custom-theme .el-button.is-plain:active{background:#fff;border-color:#222325;color:#222325;outline:0}.custom-theme .el-button.is-active{color:#222325;border-color:#222325}.custom-theme .el-button.is-disabled,.custom-theme .el-button.is-disabled:focus,.custom-theme .el-button.is-disabled:hover{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5}.custom-theme .el-button.is-disabled.el-button--text{background-color:transparent}.custom-theme .el-button.is-disabled.is-plain,.custom-theme .el-button.is-disabled.is-plain:focus,.custom-theme .el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#e6ebf5;color:#b4bccc}.custom-theme .el-button.is-loading{position:relative;pointer-events:none}.custom-theme .el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.custom-theme .el-button.is-round{border-radius:20px;padding:12px 23px}.custom-theme .el-button--primary{color:#fff;background-color:#262729;border-color:#262729}.custom-theme .el-button--primary:focus,.custom-theme .el-button--primary:hover{background:#515254;border-color:#515254;color:#fff}.custom-theme .el-button--primary:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-active{background:#222325;border-color:#222325;color:#fff}.custom-theme .el-button--primary.is-disabled,.custom-theme .el-button--primary.is-disabled:active,.custom-theme .el-button--primary.is-disabled:focus,.custom-theme .el-button--primary.is-disabled:hover{color:#fff;background-color:#939394;border-color:#939394}.custom-theme .el-button--primary.is-plain{color:#262729;background:#e9e9ea;border-color:#a8a9a9}.custom-theme .el-button--primary.is-plain:focus,.custom-theme .el-button--primary.is-plain:hover{background:#262729;border-color:#262729;color:#fff}.custom-theme .el-button--primary.is-plain:active{background:#222325;border-color:#222325;color:#fff;outline:0}.custom-theme .el-button--primary.is-plain.is-disabled,.custom-theme .el-button--primary.is-plain.is-disabled:active,.custom-theme .el-button--primary.is-plain.is-disabled:focus,.custom-theme .el-button--primary.is-plain.is-disabled:hover{color:#7d7d7f;background-color:#e9e9ea;border-color:#d4d4d4}.custom-theme .el-button--success{color:#fff;background-color:#409167;border-color:#409167}.custom-theme .el-button--success:focus,.custom-theme .el-button--success:hover{background:#66a785;border-color:#66a785;color:#fff}.custom-theme .el-button--success:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-active{background:#3a835d;border-color:#3a835d;color:#fff}.custom-theme .el-button--success.is-disabled,.custom-theme .el-button--success.is-disabled:active,.custom-theme .el-button--success.is-disabled:focus,.custom-theme .el-button--success.is-disabled:hover{color:#fff;background-color:#a0c8b3;border-color:#a0c8b3}.custom-theme .el-button--success.is-plain{color:#409167;background:#ecf4f0;border-color:#b3d3c2}.custom-theme .el-button--success.is-plain:focus,.custom-theme .el-button--success.is-plain:hover{background:#409167;border-color:#409167;color:#fff}.custom-theme .el-button--success.is-plain:active{background:#3a835d;border-color:#3a835d;color:#fff;outline:0}.custom-theme .el-button--success.is-plain.is-disabled,.custom-theme .el-button--success.is-plain.is-disabled:active,.custom-theme .el-button--success.is-plain.is-disabled:focus,.custom-theme .el-button--success.is-plain.is-disabled:hover{color:#8cbda4;background-color:#ecf4f0;border-color:#d9e9e1}.custom-theme .el-button--warning{color:#fff;background-color:#9da408;border-color:#9da408}.custom-theme .el-button--warning:focus,.custom-theme .el-button--warning:hover{background:#b1b639;border-color:#b1b639;color:#fff}.custom-theme .el-button--warning:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-active{background:#8d9407;border-color:#8d9407;color:#fff}.custom-theme .el-button--warning.is-disabled,.custom-theme .el-button--warning.is-disabled:active,.custom-theme .el-button--warning.is-disabled:focus,.custom-theme .el-button--warning.is-disabled:hover{color:#fff;background-color:#ced284;border-color:#ced284}.custom-theme .el-button--warning.is-plain{color:#9da408;background:#f5f6e6;border-color:#d8db9c}.custom-theme .el-button--warning.is-plain:focus,.custom-theme .el-button--warning.is-plain:hover{background:#9da408;border-color:#9da408;color:#fff}.custom-theme .el-button--warning.is-plain:active{background:#8d9407;border-color:#8d9407;color:#fff;outline:0}.custom-theme .el-button--warning.is-plain.is-disabled,.custom-theme .el-button--warning.is-plain.is-disabled:active,.custom-theme .el-button--warning.is-plain.is-disabled:focus,.custom-theme .el-button--warning.is-plain.is-disabled:hover{color:#c4c86b;background-color:#f5f6e6;border-color:#ebedce}.custom-theme .el-button--danger{color:#fff;background-color:#b3450e;border-color:#b3450e}.custom-theme .el-button--danger:focus,.custom-theme .el-button--danger:hover{background:#c26a3e;border-color:#c26a3e;color:#fff}.custom-theme .el-button--danger:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-active{background:#a13e0d;border-color:#a13e0d;color:#fff}.custom-theme .el-button--danger.is-disabled,.custom-theme .el-button--danger.is-disabled:active,.custom-theme .el-button--danger.is-disabled:focus,.custom-theme .el-button--danger.is-disabled:hover{color:#fff;background-color:#d9a287;border-color:#d9a287}.custom-theme .el-button--danger.is-plain{color:#b3450e;background:#f7ece7;border-color:#e1b59f}.custom-theme .el-button--danger.is-plain:focus,.custom-theme .el-button--danger.is-plain:hover{background:#b3450e;border-color:#b3450e;color:#fff}.custom-theme .el-button--danger.is-plain:active{background:#a13e0d;border-color:#a13e0d;color:#fff;outline:0}.custom-theme .el-button--danger.is-plain.is-disabled,.custom-theme .el-button--danger.is-plain.is-disabled:active,.custom-theme .el-button--danger.is-plain.is-disabled:focus,.custom-theme .el-button--danger.is-plain.is-disabled:hover{color:#d18f6e;background-color:#f7ece7;border-color:#f0dacf}.custom-theme .el-button--info{color:#fff;background-color:#0a76a4;border-color:#0a76a4}.custom-theme .el-button--info:focus,.custom-theme .el-button--info:hover{background:#3b91b6;border-color:#3b91b6;color:#fff}.custom-theme .el-button--info:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-active{background:#096a94;border-color:#096a94;color:#fff}.custom-theme .el-button--info.is-disabled,.custom-theme .el-button--info.is-disabled:active,.custom-theme .el-button--info.is-disabled:focus,.custom-theme .el-button--info.is-disabled:hover{color:#fff;background-color:#85bbd2;border-color:#85bbd2}.custom-theme .el-button--info.is-plain{color:#0a76a4;background:#e7f1f6;border-color:#9dc8db}.custom-theme .el-button--info.is-plain:focus,.custom-theme .el-button--info.is-plain:hover{background:#0a76a4;border-color:#0a76a4;color:#fff}.custom-theme .el-button--info.is-plain:active{background:#096a94;border-color:#096a94;color:#fff;outline:0}.custom-theme .el-button--info.is-plain.is-disabled,.custom-theme .el-button--info.is-plain.is-disabled:active,.custom-theme .el-button--info.is-plain.is-disabled:focus,.custom-theme .el-button--info.is-plain.is-disabled:hover{color:#6cadc8;background-color:#e7f1f6;border-color:#cee4ed}.custom-theme .el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.custom-theme .el-button--medium.is-round{padding:10px 20px}.custom-theme .el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--small.is-round{padding:9px 15px}.custom-theme .el-button--mini{padding:7px 15px;font-size:12px;border-radius:3px}.custom-theme .el-button--mini.is-round{padding:7px 15px}.custom-theme .el-button--text{border:none;color:#262729;background:0 0;padding-left:0;padding-right:0}.custom-theme .el-button--text:focus,.custom-theme .el-button--text:hover{color:#515254;border-color:transparent;background-color:transparent}.custom-theme .el-button--text:active{color:#222325;border-color:transparent;background-color:transparent}.custom-theme .el-button-group{display:inline-block;vertical-align:middle}.custom-theme .el-button-group::after,.custom-theme .el-button-group::before{display:table;content:\"\"}.custom-theme .el-button-group::after{clear:both}.custom-theme .el-button-group .el-button{float:left;position:relative}.custom-theme .el-button-group .el-button+.el-button{margin-left:0}.custom-theme .el-button-group .el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.custom-theme .el-button-group .el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child){border-radius:0}.custom-theme .el-button-group .el-button:not(:last-child){margin-right:-1px}.custom-theme .el-button-group .el-button:active,.custom-theme .el-button-group .el-button:focus,.custom-theme .el-button-group .el-button:hover{z-index:1}.custom-theme .el-button-group .el-button.is-active{z-index:1}.custom-theme .el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.custom-theme .el-checkbox{color:#5a5e66;font-weight:500;font-size:14px;position:relative;cursor:pointer;display:inline-block;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.custom-theme .el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #d8dce5}.custom-theme .el-checkbox.is-bordered.is-checked{border-color:#262729}.custom-theme .el-checkbox.is-bordered.is-disabled{border-color:#e6ebf5;cursor:not-allowed}.custom-theme .el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small{padding:3px 15px 7px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini{padding:1px 15px 5px 10px;border-radius:3px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.custom-theme .el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-block;line-height:1;position:relative;vertical-align:middle}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5;cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#edf2fc;border-color:#d8dce5}.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#b4bccc;border-color:#b4bccc}.custom-theme .el-checkbox__input.is-disabled+span.el-checkbox__label{color:#b4bccc;cursor:not-allowed}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.custom-theme .el-checkbox__input.is-checked+.el-checkbox__label{color:#262729}.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner{border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#262729;border-color:#262729}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.custom-theme .el-checkbox__inner{display:inline-block;position:relative;border:1px solid #d8dce5;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.custom-theme .el-checkbox__inner:hover{border-color:#262729}.custom-theme .el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:\"\";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) 50ms;-webkit-transform-origin:center;transform-origin:center}.custom-theme .el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;left:-999px}.custom-theme .el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.custom-theme .el-checkbox+.el-checkbox{margin-left:30px}.custom-theme .el-checkbox-button{position:relative;display:inline-block}.custom-theme .el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #d8dce5;border-left:0;color:#5a5e66;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button__inner.is-round{padding:12px 20px}.custom-theme .el-checkbox-button__inner:hover{color:#262729}.custom-theme .el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.custom-theme .el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.custom-theme .el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;left:-999px}.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#262729;border-color:#262729;-webkit-box-shadow:-1px 0 0 0 #7d7d7f;box-shadow:-1px 0 0 0 #7d7d7f}.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#b4bccc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#e6ebf5;-webkit-box-shadow:none;box-shadow:none}.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #d8dce5;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#262729}.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.custom-theme .el-checkbox-group{font-size:0}.custom-theme .el-transfer{font-size:14px}.custom-theme .el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.custom-theme .el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#262729;font-size:0}.custom-theme .el-transfer__button.is-with-texts{border-radius:4px}.custom-theme .el-transfer__button.is-disabled{border:1px solid #d8dce5;background-color:#f5f7fa;color:#b4bccc}.custom-theme .el-transfer__button.is-disabled:hover{border:1px solid #d8dce5;background-color:#f5f7fa;color:#b4bccc}.custom-theme .el-transfer__button:first-child{margin-bottom:10px}.custom-theme .el-transfer__button:nth-child(2){margin:0}.custom-theme .el-transfer__button i,.custom-theme .el-transfer__button span{font-size:14px}.custom-theme .el-transfer__button [class*=el-icon-]+span{margin-left:0}.custom-theme .el-transfer-panel{border:1px solid #e6ebf5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.custom-theme .el-transfer-panel__body{height:246px}.custom-theme .el-transfer-panel__body.is-with-footer{padding-bottom:40px}.custom-theme .el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.custom-theme .el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block}.custom-theme .el-transfer-panel__item+.el-transfer-panel__item{margin-left:0}.custom-theme .el-transfer-panel__item.el-checkbox{color:#5a5e66}.custom-theme .el-transfer-panel__item:hover{color:#262729}.custom-theme .el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.custom-theme .el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.custom-theme .el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.custom-theme .el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.custom-theme .el-transfer-panel__filter .el-input__icon{margin-left:5px}.custom-theme .el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.custom-theme .el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #e6ebf5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#2d2f33;font-weight:400}.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#878d99;font-size:12px;font-weight:400}.custom-theme .el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #e6ebf5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.custom-theme .el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.custom-theme .el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#5a5e66}.custom-theme .el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#878d99}.custom-theme .el-transfer-panel .el-checkbox__label{padding-left:8px}.custom-theme .el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.custom-theme .el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.custom-theme .el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.custom-theme .el-header{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.custom-theme .el-main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px}.custom-theme .el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}"
  },
  {
    "path": "src/components/BackToTop/index.vue",
    "content": "<template>\n  <transition :name=\"transitionName\">\n    <div v-show=\"visible\" :style=\"customStyle\" class=\"back-to-ceiling\" @click=\"backToTop\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 17 17\" xmlns=\"http://www.w3.org/2000/svg\" class=\"Icon Icon--backToTopArrow\" aria-hidden=\"true\" style=\"height:16px;width:16px\"><path d=\"M12.036 15.59a1 1 0 0 1-.997.995H5.032a.996.996 0 0 1-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29a1.003 1.003 0 0 1 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z\" /></svg>\n    </div>\n  </transition>\n</template>\n\n<script>\nexport default {\n  name: 'BackToTop',\n  props: {\n    visibilityHeight: {\n      type: Number,\n      default: 400\n    },\n    backPosition: {\n      type: Number,\n      default: 0\n    },\n    customStyle: {\n      type: Object,\n      default: function() {\n        return {\n          right: '50px',\n          bottom: '50px',\n          width: '40px',\n          height: '40px',\n          'border-radius': '4px',\n          'line-height': '45px',\n          background: '#e7eaf1'\n        }\n      }\n    },\n    transitionName: {\n      type: String,\n      default: 'fade'\n    }\n  },\n  data() {\n    return {\n      visible: false,\n      interval: null,\n      isMoving: false\n    }\n  },\n  mounted() {\n    window.addEventListener('scroll', this.handleScroll)\n  },\n  beforeDestroy() {\n    window.removeEventListener('scroll', this.handleScroll)\n    if (this.interval) {\n      clearInterval(this.interval)\n    }\n  },\n  methods: {\n    handleScroll() {\n      this.visible = window.pageYOffset > this.visibilityHeight\n    },\n    backToTop() {\n      if (this.isMoving) return\n      const start = window.pageYOffset\n      let i = 0\n      this.isMoving = true\n      this.interval = setInterval(() => {\n        const next = Math.floor(this.easeInOutQuad(10 * i, start, -start, 500))\n        if (next <= this.backPosition) {\n          window.scrollTo(0, this.backPosition)\n          clearInterval(this.interval)\n          this.isMoving = false\n        } else {\n          window.scrollTo(0, next)\n        }\n        i++\n      }, 16.7)\n    },\n    easeInOutQuad(t, b, c, d) {\n      if ((t /= d / 2) < 1) return c / 2 * t * t + b\n      return -c / 2 * (--t * (t - 2) - 1) + b\n    }\n  }\n}\n</script>\n\n<style scoped>\n.back-to-ceiling {\n  position: fixed;\n  display: inline-block;\n  text-align: center;\n  cursor: pointer;\n}\n\n.back-to-ceiling:hover {\n  background: #d5dbe7;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity .5s;\n}\n\n.fade-enter,\n.fade-leave-to {\n  opacity: 0\n}\n\n.back-to-ceiling .Icon {\n  fill: #9aaabf;\n  background: none;\n}\n</style>\n"
  },
  {
    "path": "src/components/Breadcrumb/index.vue",
    "content": "<template>\n  <el-breadcrumb class=\"app-breadcrumb\" separator=\"/\">\n    <transition-group name=\"breadcrumb\">\n      <el-breadcrumb-item v-for=\"(item,index) in levelList\" :key=\"item.path\">\n        <span v-if=\"item.redirect==='noRedirect'||index==levelList.length-1\" class=\"no-redirect\">{{ item.meta.title }}</span>\n        <a v-else @click.prevent=\"handleLink(item)\">{{ item.meta.title }}</a>\n      </el-breadcrumb-item>\n    </transition-group>\n  </el-breadcrumb>\n</template>\n\n<script>\nimport pathToRegexp from 'path-to-regexp'\n\nexport default {\n  data() {\n    return {\n      levelList: null\n    }\n  },\n  watch: {\n    $route(route) {\n      // if you go to the redirect page, do not update the breadcrumbs\n      if (route.path.startsWith('/redirect/')) {\n        return\n      }\n      this.getBreadcrumb()\n    }\n  },\n  created() {\n    this.getBreadcrumb()\n  },\n  methods: {\n    getBreadcrumb() {\n      // only show routes with meta.title\n      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)\n      const first = matched[0]\n\n      if (!this.isDashboard(first)) {\n        matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)\n      }\n\n      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)\n    },\n    isDashboard(route) {\n      const name = route && route.name\n      if (!name) {\n        return false\n      }\n      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()\n    },\n    pathCompile(path) {\n      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561\n      const { params } = this.$route\n      var toPath = pathToRegexp.compile(path)\n      return toPath(params)\n    },\n    handleLink(item) {\n      const { redirect, path } = item\n      if (redirect) {\n        this.$router.push(redirect)\n        return\n      }\n      this.$router.push(this.pathCompile(path))\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-breadcrumb.el-breadcrumb {\n  display: inline-block;\n  font-size: 14px;\n  line-height: 50px;\n  margin-left: 8px;\n\n  .no-redirect {\n    color: #97a8be;\n    cursor: text;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Charts/Keyboard.vue",
    "content": "<template>\n  <div :id=\"id\" :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nimport resize from './mixins/resize'\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    id: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '200px'\n    },\n    height: {\n      type: String,\n      default: '200px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.initChart()\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(document.getElementById(this.id))\n\n      const xAxisData = []\n      const data = []\n      const data2 = []\n      for (let i = 0; i < 50; i++) {\n        xAxisData.push(i)\n        data.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5)\n        data2.push((Math.sin(i / 5) * (i / 5 + 10) + i / 6) * 3)\n      }\n      this.chart.setOption({\n        backgroundColor: '#08263a',\n        grid: {\n          left: '5%',\n          right: '5%'\n        },\n        xAxis: [{\n          show: false,\n          data: xAxisData\n        }, {\n          show: false,\n          data: xAxisData\n        }],\n        visualMap: {\n          show: false,\n          min: 0,\n          max: 50,\n          dimension: 0,\n          inRange: {\n            color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055']\n          }\n        },\n        yAxis: {\n          axisLine: {\n            show: false\n          },\n          axisLabel: {\n            textStyle: {\n              color: '#4a657a'\n            }\n          },\n          splitLine: {\n            show: true,\n            lineStyle: {\n              color: '#08263f'\n            }\n          },\n          axisTick: {\n            show: false\n          }\n        },\n        series: [{\n          name: 'back',\n          type: 'bar',\n          data: data2,\n          z: 1,\n          itemStyle: {\n            normal: {\n              opacity: 0.4,\n              barBorderRadius: 5,\n              shadowBlur: 3,\n              shadowColor: '#111'\n            }\n          }\n        }, {\n          name: 'Simulate Shadow',\n          type: 'line',\n          data,\n          z: 2,\n          showSymbol: false,\n          animationDelay: 0,\n          animationEasing: 'linear',\n          animationDuration: 1200,\n          lineStyle: {\n            normal: {\n              color: 'transparent'\n            }\n          },\n          areaStyle: {\n            normal: {\n              color: '#08263a',\n              shadowBlur: 50,\n              shadowColor: '#000'\n            }\n          }\n        }, {\n          name: 'front',\n          type: 'bar',\n          data,\n          xAxisIndex: 1,\n          z: 3,\n          itemStyle: {\n            normal: {\n              barBorderRadius: 5\n            }\n          }\n        }],\n        animationEasing: 'elasticOut',\n        animationEasingUpdate: 'elasticOut',\n        animationDelay(idx) {\n          return idx * 20\n        },\n        animationDelayUpdate(idx) {\n          return idx * 20\n        }\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/components/Charts/LineMarker.vue",
    "content": "<template>\n  <div :id=\"id\" :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nimport resize from './mixins/resize'\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    id: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '200px'\n    },\n    height: {\n      type: String,\n      default: '200px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.initChart()\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(document.getElementById(this.id))\n\n      this.chart.setOption({\n        backgroundColor: '#394056',\n        title: {\n          top: 20,\n          text: 'Requests',\n          textStyle: {\n            fontWeight: 'normal',\n            fontSize: 16,\n            color: '#F1F1F3'\n          },\n          left: '1%'\n        },\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            lineStyle: {\n              color: '#57617B'\n            }\n          }\n        },\n        legend: {\n          top: 20,\n          icon: 'rect',\n          itemWidth: 14,\n          itemHeight: 5,\n          itemGap: 13,\n          data: ['CMCC', 'CTCC', 'CUCC'],\n          right: '4%',\n          textStyle: {\n            fontSize: 12,\n            color: '#F1F1F3'\n          }\n        },\n        grid: {\n          top: 100,\n          left: '2%',\n          right: '2%',\n          bottom: '2%',\n          containLabel: true\n        },\n        xAxis: [{\n          type: 'category',\n          boundaryGap: false,\n          axisLine: {\n            lineStyle: {\n              color: '#57617B'\n            }\n          },\n          data: ['13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55']\n        }],\n        yAxis: [{\n          type: 'value',\n          name: '(%)',\n          axisTick: {\n            show: false\n          },\n          axisLine: {\n            lineStyle: {\n              color: '#57617B'\n            }\n          },\n          axisLabel: {\n            margin: 10,\n            textStyle: {\n              fontSize: 14\n            }\n          },\n          splitLine: {\n            lineStyle: {\n              color: '#57617B'\n            }\n          }\n        }],\n        series: [{\n          name: 'CMCC',\n          type: 'line',\n          smooth: true,\n          symbol: 'circle',\n          symbolSize: 5,\n          showSymbol: false,\n          lineStyle: {\n            normal: {\n              width: 1\n            }\n          },\n          areaStyle: {\n            normal: {\n              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{\n                offset: 0,\n                color: 'rgba(137, 189, 27, 0.3)'\n              }, {\n                offset: 0.8,\n                color: 'rgba(137, 189, 27, 0)'\n              }], false),\n              shadowColor: 'rgba(0, 0, 0, 0.1)',\n              shadowBlur: 10\n            }\n          },\n          itemStyle: {\n            normal: {\n              color: 'rgb(137,189,27)',\n              borderColor: 'rgba(137,189,2,0.27)',\n              borderWidth: 12\n\n            }\n          },\n          data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]\n        }, {\n          name: 'CTCC',\n          type: 'line',\n          smooth: true,\n          symbol: 'circle',\n          symbolSize: 5,\n          showSymbol: false,\n          lineStyle: {\n            normal: {\n              width: 1\n            }\n          },\n          areaStyle: {\n            normal: {\n              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{\n                offset: 0,\n                color: 'rgba(0, 136, 212, 0.3)'\n              }, {\n                offset: 0.8,\n                color: 'rgba(0, 136, 212, 0)'\n              }], false),\n              shadowColor: 'rgba(0, 0, 0, 0.1)',\n              shadowBlur: 10\n            }\n          },\n          itemStyle: {\n            normal: {\n              color: 'rgb(0,136,212)',\n              borderColor: 'rgba(0,136,212,0.2)',\n              borderWidth: 12\n\n            }\n          },\n          data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150]\n        }, {\n          name: 'CUCC',\n          type: 'line',\n          smooth: true,\n          symbol: 'circle',\n          symbolSize: 5,\n          showSymbol: false,\n          lineStyle: {\n            normal: {\n              width: 1\n            }\n          },\n          areaStyle: {\n            normal: {\n              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{\n                offset: 0,\n                color: 'rgba(219, 50, 51, 0.3)'\n              }, {\n                offset: 0.8,\n                color: 'rgba(219, 50, 51, 0)'\n              }], false),\n              shadowColor: 'rgba(0, 0, 0, 0.1)',\n              shadowBlur: 10\n            }\n          },\n          itemStyle: {\n            normal: {\n              color: 'rgb(219,50,51)',\n              borderColor: 'rgba(219,50,51,0.2)',\n              borderWidth: 12\n            }\n          },\n          data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122]\n        }]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/components/Charts/MixChart.vue",
    "content": "<template>\n  <div :id=\"id\" :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nimport resize from './mixins/resize'\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    id: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '200px'\n    },\n    height: {\n      type: String,\n      default: '200px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.initChart()\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(document.getElementById(this.id))\n      const xData = (function() {\n        const data = []\n        for (let i = 1; i < 13; i++) {\n          data.push(i + 'month')\n        }\n        return data\n      }())\n      this.chart.setOption({\n        backgroundColor: '#344b58',\n        title: {\n          text: 'statistics',\n          x: '20',\n          top: '20',\n          textStyle: {\n            color: '#fff',\n            fontSize: '22'\n          },\n          subtextStyle: {\n            color: '#90979c',\n            fontSize: '16'\n          }\n        },\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            textStyle: {\n              color: '#fff'\n            }\n          }\n        },\n        grid: {\n          left: '5%',\n          right: '5%',\n          borderWidth: 0,\n          top: 150,\n          bottom: 95,\n          textStyle: {\n            color: '#fff'\n          }\n        },\n        legend: {\n          x: '5%',\n          top: '10%',\n          textStyle: {\n            color: '#90979c'\n          },\n          data: ['female', 'male', 'average']\n        },\n        calculable: true,\n        xAxis: [{\n          type: 'category',\n          axisLine: {\n            lineStyle: {\n              color: '#90979c'\n            }\n          },\n          splitLine: {\n            show: false\n          },\n          axisTick: {\n            show: false\n          },\n          splitArea: {\n            show: false\n          },\n          axisLabel: {\n            interval: 0\n\n          },\n          data: xData\n        }],\n        yAxis: [{\n          type: 'value',\n          splitLine: {\n            show: false\n          },\n          axisLine: {\n            lineStyle: {\n              color: '#90979c'\n            }\n          },\n          axisTick: {\n            show: false\n          },\n          axisLabel: {\n            interval: 0\n          },\n          splitArea: {\n            show: false\n          }\n        }],\n        dataZoom: [{\n          show: true,\n          height: 30,\n          xAxisIndex: [\n            0\n          ],\n          bottom: 30,\n          start: 10,\n          end: 80,\n          handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',\n          handleSize: '110%',\n          handleStyle: {\n            color: '#d3dee5'\n\n          },\n          textStyle: {\n            color: '#fff' },\n          borderColor: '#90979c'\n\n        }, {\n          type: 'inside',\n          show: true,\n          height: 15,\n          start: 1,\n          end: 35\n        }],\n        series: [{\n          name: 'female',\n          type: 'bar',\n          stack: 'total',\n          barMaxWidth: 35,\n          barGap: '10%',\n          itemStyle: {\n            normal: {\n              color: 'rgba(255,144,128,1)',\n              label: {\n                show: true,\n                textStyle: {\n                  color: '#fff'\n                },\n                position: 'insideTop',\n                formatter(p) {\n                  return p.value > 0 ? p.value : ''\n                }\n              }\n            }\n          },\n          data: [\n            709,\n            1917,\n            2455,\n            2610,\n            1719,\n            1433,\n            1544,\n            3285,\n            5208,\n            3372,\n            2484,\n            4078\n          ]\n        },\n\n        {\n          name: 'male',\n          type: 'bar',\n          stack: 'total',\n          itemStyle: {\n            normal: {\n              color: 'rgba(0,191,183,1)',\n              barBorderRadius: 0,\n              label: {\n                show: true,\n                position: 'top',\n                formatter(p) {\n                  return p.value > 0 ? p.value : ''\n                }\n              }\n            }\n          },\n          data: [\n            327,\n            1776,\n            507,\n            1200,\n            800,\n            482,\n            204,\n            1390,\n            1001,\n            951,\n            381,\n            220\n          ]\n        }, {\n          name: 'average',\n          type: 'line',\n          stack: 'total',\n          symbolSize: 10,\n          symbol: 'circle',\n          itemStyle: {\n            normal: {\n              color: 'rgba(252,230,48,1)',\n              barBorderRadius: 0,\n              label: {\n                show: true,\n                position: 'top',\n                formatter(p) {\n                  return p.value > 0 ? p.value : ''\n                }\n              }\n            }\n          },\n          data: [\n            1036,\n            3693,\n            2962,\n            3810,\n            2519,\n            1915,\n            1748,\n            4675,\n            6209,\n            4323,\n            2865,\n            4298\n          ]\n        }\n        ]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/components/Charts/mixins/resize.js",
    "content": "import { debounce } from '@/utils'\n\nexport default {\n  data() {\n    return {\n      $_sidebarElm: null,\n      $_resizeHandler: null\n    }\n  },\n  mounted() {\n    this.initListener()\n  },\n  activated() {\n    if (!this.$_resizeHandler) {\n      // avoid duplication init\n      this.initListener()\n    }\n\n    // when keep-alive chart activated, auto resize\n    this.resize()\n  },\n  beforeDestroy() {\n    this.destroyListener()\n  },\n  deactivated() {\n    this.destroyListener()\n  },\n  methods: {\n    // use $_ for mixins properties\n    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential\n    $_sidebarResizeHandler(e) {\n      if (e.propertyName === 'width') {\n        this.$_resizeHandler()\n      }\n    },\n    initListener() {\n      this.$_resizeHandler = debounce(() => {\n        this.resize()\n      }, 100)\n      window.addEventListener('resize', this.$_resizeHandler)\n\n      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]\n      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)\n    },\n    destroyListener() {\n      window.removeEventListener('resize', this.$_resizeHandler)\n      this.$_resizeHandler = null\n\n      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)\n    },\n    resize() {\n      const { chart } = this\n      chart && chart.resize()\n    }\n  }\n}\n"
  },
  {
    "path": "src/components/DndList/index.vue",
    "content": "<template>\n  <div class=\"dndList\">\n    <div :style=\"{width:width1}\" class=\"dndList-list\">\n      <h3>{{ list1Title }}</h3>\n      <draggable :set-data=\"setData\" :list=\"list1\" group=\"article\" class=\"dragArea\">\n        <div v-for=\"element in list1\" :key=\"element.id\" class=\"list-complete-item\">\n          <div class=\"list-complete-item-handle\">\n            {{ element.id }}[{{ element.author }}] {{ element.title }}\n          </div>\n          <div style=\"position:absolute;right:0px;\">\n            <span style=\"float: right ;margin-top: -20px;margin-right:5px;\" @click=\"deleteEle(element)\">\n              <i style=\"color:#ff4949\" class=\"el-icon-delete\" />\n            </span>\n          </div>\n        </div>\n      </draggable>\n    </div>\n    <div :style=\"{width:width2}\" class=\"dndList-list\">\n      <h3>{{ list2Title }}</h3>\n      <draggable :list=\"list2\" group=\"article\" class=\"dragArea\">\n        <div v-for=\"element in list2\" :key=\"element.id\" class=\"list-complete-item\">\n          <div class=\"list-complete-item-handle2\" @click=\"pushEle(element)\">\n            {{ element.id }} [{{ element.author }}] {{ element.title }}\n          </div>\n        </div>\n      </draggable>\n    </div>\n  </div>\n</template>\n\n<script>\nimport draggable from 'vuedraggable'\n\nexport default {\n  name: 'DndList',\n  components: { draggable },\n  props: {\n    list1: {\n      type: Array,\n      default() {\n        return []\n      }\n    },\n    list2: {\n      type: Array,\n      default() {\n        return []\n      }\n    },\n    list1Title: {\n      type: String,\n      default: 'list1'\n    },\n    list2Title: {\n      type: String,\n      default: 'list2'\n    },\n    width1: {\n      type: String,\n      default: '48%'\n    },\n    width2: {\n      type: String,\n      default: '48%'\n    }\n  },\n  methods: {\n    isNotInList1(v) {\n      return this.list1.every(k => v.id !== k.id)\n    },\n    isNotInList2(v) {\n      return this.list2.every(k => v.id !== k.id)\n    },\n    deleteEle(ele) {\n      for (const item of this.list1) {\n        if (item.id === ele.id) {\n          const index = this.list1.indexOf(item)\n          this.list1.splice(index, 1)\n          break\n        }\n      }\n      if (this.isNotInList2(ele)) {\n        this.list2.unshift(ele)\n      }\n    },\n    pushEle(ele) {\n      for (const item of this.list2) {\n        if (item.id === ele.id) {\n          const index = this.list2.indexOf(item)\n          this.list2.splice(index, 1)\n          break\n        }\n      }\n      if (this.isNotInList1(ele)) {\n        this.list1.push(ele)\n      }\n    },\n    setData(dataTransfer) {\n      // to avoid Firefox bug\n      // Detail see : https://github.com/RubaXa/Sortable/issues/1012\n      dataTransfer.setData('Text', '')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dndList {\n  background: #fff;\n  padding-bottom: 40px;\n  &:after {\n    content: \"\";\n    display: table;\n    clear: both;\n  }\n  .dndList-list {\n    float: left;\n    padding-bottom: 30px;\n    &:first-of-type {\n      margin-right: 2%;\n    }\n    .dragArea {\n      margin-top: 15px;\n      min-height: 50px;\n      padding-bottom: 30px;\n    }\n  }\n}\n\n.list-complete-item {\n  cursor: pointer;\n  position: relative;\n  font-size: 14px;\n  padding: 5px 12px;\n  margin-top: 4px;\n  border: 1px solid #bfcbd9;\n  transition: all 1s;\n}\n\n.list-complete-item-handle {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  margin-right: 50px;\n}\n\n.list-complete-item-handle2 {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  margin-right: 20px;\n}\n\n.list-complete-item.sortable-chosen {\n  background: #4AB7BD;\n}\n\n.list-complete-item.sortable-ghost {\n  background: #30B08F;\n}\n\n.list-complete-enter,\n.list-complete-leave-active {\n  opacity: 0;\n}\n</style>\n"
  },
  {
    "path": "src/components/DragSelect/index.vue",
    "content": "<template>\n  <el-select ref=\"dragSelect\" v-model=\"selectVal\" v-bind=\"$attrs\" class=\"drag-select\" multiple v-on=\"$listeners\">\n    <slot />\n  </el-select>\n</template>\n\n<script>\nimport Sortable from 'sortablejs'\n\nexport default {\n  name: 'DragSelect',\n  props: {\n    value: {\n      type: Array,\n      required: true\n    }\n  },\n  computed: {\n    selectVal: {\n      get() {\n        return [...this.value]\n      },\n      set(val) {\n        this.$emit('input', [...val])\n      }\n    }\n  },\n  mounted() {\n    this.setSort()\n  },\n  methods: {\n    setSort() {\n      const el = this.$refs.dragSelect.$el.querySelectorAll('.el-select__tags > span')[0]\n      this.sortable = Sortable.create(el, {\n        ghostClass: 'sortable-ghost', // Class name for the drop placeholder,\n        setData: function(dataTransfer) {\n          dataTransfer.setData('Text', '')\n          // to avoid Firefox bug\n          // Detail see : https://github.com/RubaXa/Sortable/issues/1012\n        },\n        onEnd: evt => {\n          const targetRow = this.value.splice(evt.oldIndex, 1)[0]\n          this.value.splice(evt.newIndex, 0, targetRow)\n        }\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.drag-select {\n  ::v-deep {\n    .sortable-ghost {\n      opacity: .8;\n      color: #fff !important;\n      background: #42b983 !important;\n    }\n\n    .el-tag {\n      cursor: pointer;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Dropzone/index.vue",
    "content": "<template>\n  <div :id=\"id\" :ref=\"id\" :action=\"url\" class=\"dropzone\">\n    <input type=\"file\" name=\"file\">\n  </div>\n</template>\n\n<script>\nimport Dropzone from 'dropzone'\nimport 'dropzone/dist/dropzone.css'\n// import { getToken } from 'api/qiniu';\n\nDropzone.autoDiscover = false\n\nexport default {\n  props: {\n    id: {\n      type: String,\n      required: true\n    },\n    url: {\n      type: String,\n      required: true\n    },\n    clickable: {\n      type: Boolean,\n      default: true\n    },\n    defaultMsg: {\n      type: String,\n      default: '上传图片'\n    },\n    acceptedFiles: {\n      type: String,\n      default: ''\n    },\n    thumbnailHeight: {\n      type: Number,\n      default: 200\n    },\n    thumbnailWidth: {\n      type: Number,\n      default: 200\n    },\n    showRemoveLink: {\n      type: Boolean,\n      default: true\n    },\n    maxFilesize: {\n      type: Number,\n      default: 2\n    },\n    maxFiles: {\n      type: Number,\n      default: 3\n    },\n    autoProcessQueue: {\n      type: Boolean,\n      default: true\n    },\n    useCustomDropzoneOptions: {\n      type: Boolean,\n      default: false\n    },\n    defaultImg: {\n      default: '',\n      type: [String, Array]\n    },\n    couldPaste: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    return {\n      dropzone: '',\n      initOnce: true\n    }\n  },\n  watch: {\n    defaultImg(val) {\n      if (val.length === 0) {\n        this.initOnce = false\n        return\n      }\n      if (!this.initOnce) return\n      this.initImages(val)\n      this.initOnce = false\n    }\n  },\n  mounted() {\n    const element = document.getElementById(this.id)\n    const vm = this\n    this.dropzone = new Dropzone(element, {\n      clickable: this.clickable,\n      thumbnailWidth: this.thumbnailWidth,\n      thumbnailHeight: this.thumbnailHeight,\n      maxFiles: this.maxFiles,\n      maxFilesize: this.maxFilesize,\n      dictRemoveFile: 'Remove',\n      addRemoveLinks: this.showRemoveLink,\n      acceptedFiles: this.acceptedFiles,\n      autoProcessQueue: this.autoProcessQueue,\n      dictDefaultMessage: '<i style=\"margin-top: 3em;display: inline-block\" class=\"material-icons\">' + this.defaultMsg + '</i><br>Drop files here to upload',\n      dictMaxFilesExceeded: '只能一个图',\n      previewTemplate: '<div class=\"dz-preview dz-file-preview\">  <div class=\"dz-image\" style=\"width:' + this.thumbnailWidth + 'px;height:' + this.thumbnailHeight + 'px\" ><img style=\"width:' + this.thumbnailWidth + 'px;height:' + this.thumbnailHeight + 'px\" data-dz-thumbnail /></div>  <div class=\"dz-details\"><div class=\"dz-size\"><span data-dz-size></span></div> <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>  <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>  <div class=\"dz-success-mark\"> <i class=\"material-icons\">done</i> </div>  <div class=\"dz-error-mark\"><i class=\"material-icons\">error</i></div></div>',\n      init() {\n        const val = vm.defaultImg\n        if (!val) return\n        if (Array.isArray(val)) {\n          if (val.length === 0) return\n          val.map((v, i) => {\n            const mockFile = { name: 'name' + i, size: 12345, url: v }\n            this.options.addedfile.call(this, mockFile)\n            this.options.thumbnail.call(this, mockFile, v)\n            mockFile.previewElement.classList.add('dz-success')\n            mockFile.previewElement.classList.add('dz-complete')\n            vm.initOnce = false\n            return true\n          })\n        } else {\n          const mockFile = { name: 'name', size: 12345, url: val }\n          this.options.addedfile.call(this, mockFile)\n          this.options.thumbnail.call(this, mockFile, val)\n          mockFile.previewElement.classList.add('dz-success')\n          mockFile.previewElement.classList.add('dz-complete')\n          vm.initOnce = false\n        }\n      },\n      accept: (file, done) => {\n        /* 七牛*/\n        // const token = this.$store.getters.token;\n        // getToken(token).then(response => {\n        //   file.token = response.data.qiniu_token;\n        //   file.key = response.data.qiniu_key;\n        //   file.url = response.data.qiniu_url;\n        //   done();\n        // })\n        done()\n      },\n      sending: (file, xhr, formData) => {\n        // formData.append('token', file.token);\n        // formData.append('key', file.key);\n        vm.initOnce = false\n      }\n    })\n\n    if (this.couldPaste) {\n      document.addEventListener('paste', this.pasteImg)\n    }\n\n    this.dropzone.on('success', file => {\n      vm.$emit('dropzone-success', file, vm.dropzone.element)\n    })\n    this.dropzone.on('addedfile', file => {\n      vm.$emit('dropzone-fileAdded', file)\n    })\n    this.dropzone.on('removedfile', file => {\n      vm.$emit('dropzone-removedFile', file)\n    })\n    this.dropzone.on('error', (file, error, xhr) => {\n      vm.$emit('dropzone-error', file, error, xhr)\n    })\n    this.dropzone.on('successmultiple', (file, error, xhr) => {\n      vm.$emit('dropzone-successmultiple', file, error, xhr)\n    })\n  },\n  destroyed() {\n    document.removeEventListener('paste', this.pasteImg)\n    this.dropzone.destroy()\n  },\n  methods: {\n    removeAllFiles() {\n      this.dropzone.removeAllFiles(true)\n    },\n    processQueue() {\n      this.dropzone.processQueue()\n    },\n    pasteImg(event) {\n      const items = (event.clipboardData || event.originalEvent.clipboardData).items\n      if (items[0].kind === 'file') {\n        this.dropzone.addFile(items[0].getAsFile())\n      }\n    },\n    initImages(val) {\n      if (!val) return\n      if (Array.isArray(val)) {\n        val.map((v, i) => {\n          const mockFile = { name: 'name' + i, size: 12345, url: v }\n          this.dropzone.options.addedfile.call(this.dropzone, mockFile)\n          this.dropzone.options.thumbnail.call(this.dropzone, mockFile, v)\n          mockFile.previewElement.classList.add('dz-success')\n          mockFile.previewElement.classList.add('dz-complete')\n          return true\n        })\n      } else {\n        const mockFile = { name: 'name', size: 12345, url: val }\n        this.dropzone.options.addedfile.call(this.dropzone, mockFile)\n        this.dropzone.options.thumbnail.call(this.dropzone, mockFile, val)\n        mockFile.previewElement.classList.add('dz-success')\n        mockFile.previewElement.classList.add('dz-complete')\n      }\n    }\n\n  }\n}\n</script>\n\n<style scoped>\n    .dropzone {\n        border: 2px solid #E5E5E5;\n        font-family: 'Roboto', sans-serif;\n        color: #777;\n        transition: background-color .2s linear;\n        padding: 5px;\n    }\n\n    .dropzone:hover {\n        background-color: #F6F6F6;\n    }\n\n    i {\n        color: #CCC;\n    }\n\n    .dropzone .dz-image img {\n        width: 100%;\n        height: 100%;\n    }\n\n    .dropzone input[name='file'] {\n        display: none;\n    }\n\n    .dropzone .dz-preview .dz-image {\n        border-radius: 0px;\n    }\n\n    .dropzone .dz-preview:hover .dz-image img {\n        transform: none;\n        filter: none;\n        width: 100%;\n        height: 100%;\n    }\n\n    .dropzone .dz-preview .dz-details {\n        bottom: 0px;\n        top: 0px;\n        color: white;\n        background-color: rgba(33, 150, 243, 0.8);\n        transition: opacity .2s linear;\n        text-align: left;\n    }\n\n    .dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {\n        background-color: transparent;\n    }\n\n    .dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {\n        border: none;\n    }\n\n    .dropzone .dz-preview .dz-details .dz-filename:hover span {\n        background-color: transparent;\n        border: none;\n    }\n\n    .dropzone .dz-preview .dz-remove {\n        position: absolute;\n        z-index: 30;\n        color: white;\n        margin-left: 15px;\n        padding: 10px;\n        top: inherit;\n        bottom: 15px;\n        border: 2px white solid;\n        text-decoration: none;\n        text-transform: uppercase;\n        font-size: 0.8rem;\n        font-weight: 800;\n        letter-spacing: 1.1px;\n        opacity: 0;\n    }\n\n    .dropzone .dz-preview:hover .dz-remove {\n        opacity: 1;\n    }\n\n    .dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {\n        margin-left: -40px;\n        margin-top: -50px;\n    }\n\n    .dropzone .dz-preview .dz-success-mark i, .dropzone .dz-preview .dz-error-mark i {\n        color: white;\n        font-size: 5rem;\n    }\n</style>\n"
  },
  {
    "path": "src/components/ErrorLog/index.vue",
    "content": "<template>\n  <div v-if=\"errorLogs.length>0\">\n    <el-badge :is-dot=\"true\" style=\"line-height: 25px;margin-top: -5px;\" @click.native=\"dialogTableVisible=true\">\n      <el-button style=\"padding: 8px 10px;\" size=\"small\" type=\"danger\">\n        <svg-icon icon-class=\"bug\" />\n      </el-button>\n    </el-badge>\n\n    <el-dialog :visible.sync=\"dialogTableVisible\" width=\"80%\" append-to-body>\n      <div slot=\"title\">\n        <span style=\"padding-right: 10px;\">Error Log</span>\n        <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-delete\" @click=\"clearAll\">Clear All</el-button>\n      </div>\n      <el-table :data=\"errorLogs\" border>\n        <el-table-column label=\"Message\">\n          <template slot-scope=\"{row}\">\n            <div>\n              <span class=\"message-title\">Msg:</span>\n              <el-tag type=\"danger\">\n                {{ row.err.message }}\n              </el-tag>\n            </div>\n            <br>\n            <div>\n              <span class=\"message-title\" style=\"padding-right: 10px;\">Info: </span>\n              <el-tag type=\"warning\">\n                {{ row.vm.$vnode.tag }} error in {{ row.info }}\n              </el-tag>\n            </div>\n            <br>\n            <div>\n              <span class=\"message-title\" style=\"padding-right: 16px;\">Url: </span>\n              <el-tag type=\"success\">\n                {{ row.url }}\n              </el-tag>\n            </div>\n          </template>\n        </el-table-column>\n        <el-table-column label=\"Stack\">\n          <template slot-scope=\"scope\">\n            {{ scope.row.err.stack }}\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ErrorLog',\n  data() {\n    return {\n      dialogTableVisible: false\n    }\n  },\n  computed: {\n    errorLogs() {\n      return this.$store.getters.errorLogs\n    }\n  },\n  methods: {\n    clearAll() {\n      this.dialogTableVisible = false\n      this.$store.dispatch('errorLog/clearErrorLog')\n    }\n  }\n}\n</script>\n\n<style scoped>\n.message-title {\n  font-size: 16px;\n  color: #333;\n  font-weight: bold;\n  padding-right: 8px;\n}\n</style>\n"
  },
  {
    "path": "src/components/GithubCorner/index.vue",
    "content": "<template>\n  <a href=\"https://github.com/PanJiaChen/vue-element-admin\" target=\"_blank\" class=\"github-corner\" aria-label=\"View source on Github\">\n    <svg\n      width=\"80\"\n      height=\"80\"\n      viewBox=\"0 0 250 250\"\n      style=\"fill:#40c9c6; color:#fff;\"\n      aria-hidden=\"true\"\n    >\n      <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\" />\n      <path\n        d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\"\n        fill=\"currentColor\"\n        style=\"transform-origin: 130px 106px;\"\n        class=\"octo-arm\"\n      />\n      <path\n        d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\"\n        fill=\"currentColor\"\n        class=\"octo-body\"\n      />\n    </svg>\n  </a>\n</template>\n\n<style scoped>\n.github-corner:hover .octo-arm {\n  animation: octocat-wave 560ms ease-in-out\n}\n\n@keyframes octocat-wave {\n  0%,\n  100% {\n    transform: rotate(0)\n  }\n  20%,\n  60% {\n    transform: rotate(-25deg)\n  }\n  40%,\n  80% {\n    transform: rotate(10deg)\n  }\n}\n\n@media (max-width:500px) {\n  .github-corner:hover .octo-arm {\n    animation: none\n  }\n  .github-corner .octo-arm {\n    animation: octocat-wave 560ms ease-in-out\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Hamburger/index.vue",
    "content": "<template>\n  <div style=\"padding: 0 15px;\" @click=\"toggleClick\">\n    <svg\n      :class=\"{'is-active':isActive}\"\n      class=\"hamburger\"\n      viewBox=\"0 0 1024 1024\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"64\"\n      height=\"64\"\n    >\n      <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\" />\n    </svg>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'Hamburger',\n  props: {\n    isActive: {\n      type: Boolean,\n      default: false\n    }\n  },\n  methods: {\n    toggleClick() {\n      this.$emit('toggleClick')\n    }\n  }\n}\n</script>\n\n<style scoped>\n.hamburger {\n  display: inline-block;\n  vertical-align: middle;\n  width: 20px;\n  height: 20px;\n}\n\n.hamburger.is-active {\n  transform: rotate(180deg);\n}\n</style>\n"
  },
  {
    "path": "src/components/HeaderSearch/index.vue",
    "content": "<template>\n  <div :class=\"{'show':show}\" class=\"header-search\">\n    <svg-icon class-name=\"search-icon\" icon-class=\"search\" @click.stop=\"click\" />\n    <el-select\n      ref=\"headerSearchSelect\"\n      v-model=\"search\"\n      :remote-method=\"querySearch\"\n      filterable\n      default-first-option\n      remote\n      placeholder=\"Search\"\n      class=\"header-search-select\"\n      @change=\"change\"\n    >\n      <el-option v-for=\"item in options\" :key=\"item.path\" :value=\"item\" :label=\"item.title.join(' > ')\" />\n    </el-select>\n  </div>\n</template>\n\n<script>\n// fuse is a lightweight fuzzy-search module\n// make search results more in line with expectations\nimport Fuse from 'fuse.js'\nimport path from 'path'\n\nexport default {\n  name: 'HeaderSearch',\n  data() {\n    return {\n      search: '',\n      options: [],\n      searchPool: [],\n      show: false,\n      fuse: undefined\n    }\n  },\n  computed: {\n    routes() {\n      return this.$store.getters.permission_routes\n    }\n  },\n  watch: {\n    routes() {\n      this.searchPool = this.generateRoutes(this.routes)\n    },\n    searchPool(list) {\n      this.initFuse(list)\n    },\n    show(value) {\n      if (value) {\n        document.body.addEventListener('click', this.close)\n      } else {\n        document.body.removeEventListener('click', this.close)\n      }\n    }\n  },\n  mounted() {\n    this.searchPool = this.generateRoutes(this.routes)\n  },\n  methods: {\n    click() {\n      this.show = !this.show\n      if (this.show) {\n        this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.focus()\n      }\n    },\n    close() {\n      this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.blur()\n      this.options = []\n      this.show = false\n    },\n    change(val) {\n      this.$router.push(val.path)\n      this.search = ''\n      this.options = []\n      this.$nextTick(() => {\n        this.show = false\n      })\n    },\n    initFuse(list) {\n      this.fuse = new Fuse(list, {\n        shouldSort: true,\n        threshold: 0.4,\n        location: 0,\n        distance: 100,\n        maxPatternLength: 32,\n        minMatchCharLength: 1,\n        keys: [{\n          name: 'title',\n          weight: 0.7\n        }, {\n          name: 'path',\n          weight: 0.3\n        }]\n      })\n    },\n    // Filter out the routes that can be displayed in the sidebar\n    // And generate the internationalized title\n    generateRoutes(routes, basePath = '/', prefixTitle = []) {\n      let res = []\n\n      for (const router of routes) {\n        // skip hidden router\n        if (router.hidden) { continue }\n\n        const data = {\n          path: path.resolve(basePath, router.path),\n          title: [...prefixTitle]\n        }\n\n        if (router.meta && router.meta.title) {\n          data.title = [...data.title, router.meta.title]\n\n          if (router.redirect !== 'noRedirect') {\n            // only push the routes with title\n            // special case: need to exclude parent router without redirect\n            res.push(data)\n          }\n        }\n\n        // recursive child routes\n        if (router.children) {\n          const tempRoutes = this.generateRoutes(router.children, data.path, data.title)\n          if (tempRoutes.length >= 1) {\n            res = [...res, ...tempRoutes]\n          }\n        }\n      }\n      return res\n    },\n    querySearch(query) {\n      if (query !== '') {\n        this.options = this.fuse.search(query)\n      } else {\n        this.options = []\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.header-search {\n  font-size: 0 !important;\n\n  .search-icon {\n    cursor: pointer;\n    font-size: 18px;\n    vertical-align: middle;\n  }\n\n  .header-search-select {\n    font-size: 18px;\n    transition: width 0.2s;\n    width: 0;\n    overflow: hidden;\n    background: transparent;\n    border-radius: 0;\n    display: inline-block;\n    vertical-align: middle;\n\n    ::v-deep .el-input__inner {\n      border-radius: 0;\n      border: 0;\n      padding-left: 0;\n      padding-right: 0;\n      box-shadow: none !important;\n      border-bottom: 1px solid #d9d9d9;\n      vertical-align: middle;\n    }\n  }\n\n  &.show {\n    .header-search-select {\n      width: 210px;\n      margin-left: 10px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/ImageCropper/index.vue",
    "content": "<template>\n  <div v-show=\"value\" class=\"vue-image-crop-upload\">\n    <div class=\"vicp-wrap\">\n      <div class=\"vicp-close\" @click=\"off\">\n        <i class=\"vicp-icon4\" />\n      </div>\n\n      <div v-show=\"step == 1\" class=\"vicp-step1\">\n        <div\n          class=\"vicp-drop-area\"\n          @dragleave=\"preventDefault\"\n          @dragover=\"preventDefault\"\n          @dragenter=\"preventDefault\"\n          @click=\"handleClick\"\n          @drop=\"handleChange\"\n        >\n          <i v-show=\"loading != 1\" class=\"vicp-icon1\">\n            <i class=\"vicp-icon1-arrow\" />\n            <i class=\"vicp-icon1-body\" />\n            <i class=\"vicp-icon1-bottom\" />\n          </i>\n          <span v-show=\"loading !== 1\" class=\"vicp-hint\">{{ lang.hint }}</span>\n          <span v-show=\"!isSupported\" class=\"vicp-no-supported-hint\">{{ lang.noSupported }}</span>\n          <input v-show=\"false\" v-if=\"step == 1\" ref=\"fileinput\" type=\"file\" @change=\"handleChange\">\n        </div>\n        <div v-show=\"hasError\" class=\"vicp-error\">\n          <i class=\"vicp-icon2\" />\n          {{ errorMsg }}\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"off\" @mousedown=\"ripple\">{{ lang.btn.off }}</a>\n        </div>\n      </div>\n\n      <div v-if=\"step == 2\" class=\"vicp-step2\">\n        <div class=\"vicp-crop\">\n          <div v-show=\"true\" class=\"vicp-crop-left\">\n            <div class=\"vicp-img-container\">\n              <img\n                ref=\"img\"\n                :src=\"sourceImgUrl\"\n                :style=\"sourceImgStyle\"\n                class=\"vicp-img\"\n                draggable=\"false\"\n                @drag=\"preventDefault\"\n                @dragstart=\"preventDefault\"\n                @dragend=\"preventDefault\"\n                @dragleave=\"preventDefault\"\n                @dragover=\"preventDefault\"\n                @dragenter=\"preventDefault\"\n                @drop=\"preventDefault\"\n                @touchstart=\"imgStartMove\"\n                @touchmove=\"imgMove\"\n                @touchend=\"createImg\"\n                @touchcancel=\"createImg\"\n                @mousedown=\"imgStartMove\"\n                @mousemove=\"imgMove\"\n                @mouseup=\"createImg\"\n                @mouseout=\"createImg\"\n              >\n              <div :style=\"sourceImgShadeStyle\" class=\"vicp-img-shade vicp-img-shade-1\" />\n              <div :style=\"sourceImgShadeStyle\" class=\"vicp-img-shade vicp-img-shade-2\" />\n            </div>\n\n            <div class=\"vicp-range\">\n              <input\n                :value=\"scale.range\"\n                type=\"range\"\n                step=\"1\"\n                min=\"0\"\n                max=\"100\"\n                @input=\"zoomChange\"\n              >\n              <i\n                class=\"vicp-icon5\"\n                @mousedown=\"startZoomSub\"\n                @mouseout=\"endZoomSub\"\n                @mouseup=\"endZoomSub\"\n              />\n              <i\n                class=\"vicp-icon6\"\n                @mousedown=\"startZoomAdd\"\n                @mouseout=\"endZoomAdd\"\n                @mouseup=\"endZoomAdd\"\n              />\n            </div>\n\n            <div v-if=\"!noRotate\" class=\"vicp-rotate\">\n              <i @mousedown=\"startRotateLeft\" @mouseout=\"endRotate\" @mouseup=\"endRotate\">↺</i>\n              <i @mousedown=\"startRotateRight\" @mouseout=\"endRotate\" @mouseup=\"endRotate\">↻</i>\n            </div>\n          </div>\n          <div v-show=\"true\" class=\"vicp-crop-right\">\n            <div class=\"vicp-preview\">\n              <div v-if=\"!noSquare\" class=\"vicp-preview-item\">\n                <img :src=\"createImgUrl\" :style=\"previewStyle\">\n                <span>{{ lang.preview }}</span>\n              </div>\n              <div v-if=\"!noCircle\" class=\"vicp-preview-item vicp-preview-item-circle\">\n                <img :src=\"createImgUrl\" :style=\"previewStyle\">\n                <span>{{ lang.preview }}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"setStep(1)\" @mousedown=\"ripple\">{{ lang.btn.back }}</a>\n          <a class=\"vicp-operate-btn\" @click=\"prepareUpload\" @mousedown=\"ripple\">{{ lang.btn.save }}</a>\n        </div>\n      </div>\n\n      <div v-if=\"step == 3\" class=\"vicp-step3\">\n        <div class=\"vicp-upload\">\n          <span v-show=\"loading === 1\" class=\"vicp-loading\">{{ lang.loading }}</span>\n          <div class=\"vicp-progress-wrap\">\n            <span v-show=\"loading === 1\" :style=\"progressStyle\" class=\"vicp-progress\" />\n          </div>\n          <div v-show=\"hasError\" class=\"vicp-error\">\n            <i class=\"vicp-icon2\" />\n            {{ errorMsg }}\n          </div>\n          <div v-show=\"loading === 2\" class=\"vicp-success\">\n            <i class=\"vicp-icon3\" />\n            {{ lang.success }}\n          </div>\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"setStep(2)\" @mousedown=\"ripple\">{{ lang.btn.back }}</a>\n          <a @click=\"off\" @mousedown=\"ripple\">{{ lang.btn.close }}</a>\n        </div>\n      </div>\n      <canvas v-show=\"false\" ref=\"canvas\" :width=\"width\" :height=\"height\" />\n    </div>\n  </div>\n</template>\n\n<script>\n'use strict'\nimport request from '@/utils/request'\nimport language from './utils/language.js'\nimport mimes from './utils/mimes.js'\nimport data2blob from './utils/data2blob.js'\nimport effectRipple from './utils/effectRipple.js'\nexport default {\n  props: {\n    // 域，上传文件name，触发事件会带上（如果一个页面多个图片上传控件，可以做区分\n    field: {\n      type: String,\n      default: 'avatar'\n    },\n    // 原名key，类似于id，触发事件会带上（如果一个页面多个图片上传控件，可以做区分\n    ki: {\n      type: Number,\n      default: 0\n    },\n    // 显示该控件与否\n    value: {\n      type: Boolean,\n      default: true\n    },\n    // 上传地址\n    url: {\n      type: String,\n      default: ''\n    },\n    // 其他要上传文件附带的数据，对象格式\n    params: {\n      type: Object,\n      default: null\n    },\n    // Add custom headers\n    headers: {\n      type: Object,\n      default: null\n    },\n    // 剪裁图片的宽\n    width: {\n      type: Number,\n      default: 200\n    },\n    // 剪裁图片的高\n    height: {\n      type: Number,\n      default: 200\n    },\n    // 不显示旋转功能\n    noRotate: {\n      type: Boolean,\n      default: true\n    },\n    // 不预览圆形图片\n    noCircle: {\n      type: Boolean,\n      default: false\n    },\n    // 不预览方形图片\n    noSquare: {\n      type: Boolean,\n      default: false\n    },\n    // 单文件大小限制\n    maxSize: {\n      type: Number,\n      default: 10240\n    },\n    // 语言类型\n    langType: {\n      type: String,\n      default: 'zh'\n    },\n    // 语言包\n    langExt: {\n      type: Object,\n      default: null\n    },\n    // 图片上传格式\n    imgFormat: {\n      type: String,\n      default: 'png'\n    },\n    // 是否支持跨域\n    withCredentials: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    const { imgFormat, langType, langExt, width, height } = this\n    let isSupported = true\n    const allowImgFormat = ['jpg', 'png']\n    const tempImgFormat =\n      allowImgFormat.indexOf(imgFormat) === -1 ? 'jpg' : imgFormat\n    const lang = language[langType] ? language[langType] : language['en']\n    const mime = mimes[tempImgFormat]\n    // 规范图片格式\n    this.imgFormat = tempImgFormat\n    if (langExt) {\n      Object.assign(lang, langExt)\n    }\n    if (typeof FormData !== 'function') {\n      isSupported = false\n    }\n    return {\n      // 图片的mime\n      mime,\n      // 语言包\n      lang,\n      // 浏览器是否支持该控件\n      isSupported,\n      // 浏览器是否支持触屏事件\n      // eslint-disable-next-line no-prototype-builtins\n      isSupportTouch: document.hasOwnProperty('ontouchstart'),\n      // 步骤\n      step: 1, // 1选择文件 2剪裁 3上传\n      // 上传状态及进度\n      loading: 0, // 0未开始 1正在 2成功 3错误\n      progress: 0,\n      // 是否有错误及错误信息\n      hasError: false,\n      errorMsg: '',\n      // 需求图宽高比\n      ratio: width / height,\n      // 原图地址、生成图片地址\n      sourceImg: null,\n      sourceImgUrl: '',\n      createImgUrl: '',\n      // 原图片拖动事件初始值\n      sourceImgMouseDown: {\n        on: false,\n        mX: 0, // 鼠标按下的坐标\n        mY: 0,\n        x: 0, // scale原图坐标\n        y: 0\n      },\n      // 生成图片预览的容器大小\n      previewContainer: {\n        width: 100,\n        height: 100\n      },\n      // 原图容器宽高\n      sourceImgContainer: {\n        // sic\n        width: 240,\n        height: 184 // 如果生成图比例与此一致会出现bug，先改成特殊的格式吧，哈哈哈\n      },\n      // 原图展示属性\n      scale: {\n        zoomAddOn: false, // 按钮缩放事件开启\n        zoomSubOn: false, // 按钮缩放事件开启\n        range: 1, // 最大100\n        rotateLeft: false, // 按钮向左旋转事件开启\n        rotateRight: false, // 按钮向右旋转事件开启\n        degree: 0, // 旋转度数\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        maxWidth: 0,\n        maxHeight: 0,\n        minWidth: 0, // 最宽\n        minHeight: 0,\n        naturalWidth: 0, // 原宽\n        naturalHeight: 0\n      }\n    }\n  },\n  computed: {\n    // 进度条样式\n    progressStyle() {\n      const { progress } = this\n      return {\n        width: progress + '%'\n      }\n    },\n    // 原图样式\n    sourceImgStyle() {\n      const { scale, sourceImgMasking } = this\n      const top = scale.y + sourceImgMasking.y + 'px'\n      const left = scale.x + sourceImgMasking.x + 'px'\n      return {\n        top,\n        left,\n        width: scale.width + 'px',\n        height: scale.height + 'px',\n        transform: 'rotate(' + scale.degree + 'deg)', // 旋转时 左侧原始图旋转样式\n        '-ms-transform': 'rotate(' + scale.degree + 'deg)', // 兼容IE9\n        '-moz-transform': 'rotate(' + scale.degree + 'deg)', // 兼容FireFox\n        '-webkit-transform': 'rotate(' + scale.degree + 'deg)', // 兼容Safari 和 chrome\n        '-o-transform': 'rotate(' + scale.degree + 'deg)' // 兼容 Opera\n      }\n    },\n    // 原图蒙版属性\n    sourceImgMasking() {\n      const { width, height, ratio, sourceImgContainer } = this\n      const sic = sourceImgContainer\n      const sicRatio = sic.width / sic.height // 原图容器宽高比\n      let x = 0\n      let y = 0\n      let w = sic.width\n      let h = sic.height\n      let scale = 1\n      if (ratio < sicRatio) {\n        scale = sic.height / height\n        w = sic.height * ratio\n        x = (sic.width - w) / 2\n      }\n      if (ratio > sicRatio) {\n        scale = sic.width / width\n        h = sic.width / ratio\n        y = (sic.height - h) / 2\n      }\n      return {\n        scale, // 蒙版相对需求宽高的缩放\n        x,\n        y,\n        width: w,\n        height: h\n      }\n    },\n    // 原图遮罩样式\n    sourceImgShadeStyle() {\n      const { sourceImgMasking, sourceImgContainer } = this\n      const sic = sourceImgContainer\n      const sim = sourceImgMasking\n      const w =\n        sim.width === sic.width ? sim.width : (sic.width - sim.width) / 2\n      const h =\n        sim.height === sic.height ? sim.height : (sic.height - sim.height) / 2\n      return {\n        width: w + 'px',\n        height: h + 'px'\n      }\n    },\n    previewStyle() {\n      const { ratio, previewContainer } = this\n      const pc = previewContainer\n      let w = pc.width\n      let h = pc.height\n      const pcRatio = w / h\n      if (ratio < pcRatio) {\n        w = pc.height * ratio\n      }\n      if (ratio > pcRatio) {\n        h = pc.width / ratio\n      }\n      return {\n        width: w + 'px',\n        height: h + 'px'\n      }\n    }\n  },\n  watch: {\n    value(newValue) {\n      if (newValue && this.loading !== 1) {\n        this.reset()\n      }\n    }\n  },\n  created() {\n    // 绑定按键esc隐藏此插件事件\n    document.addEventListener('keyup', this.closeHandler)\n  },\n  destroyed() {\n    document.removeEventListener('keyup', this.closeHandler)\n  },\n  methods: {\n    // 点击波纹效果\n    ripple(e) {\n      effectRipple(e)\n    },\n    // 关闭控件\n    off() {\n      setTimeout(() => {\n        this.$emit('input', false)\n        this.$emit('close')\n        if (this.step === 3 && this.loading === 2) {\n          this.setStep(1)\n        }\n      }, 200)\n    },\n    // 设置步骤\n    setStep(no) {\n      // 延时是为了显示动画效果呢，哈哈哈\n      setTimeout(() => {\n        this.step = no\n      }, 200)\n    },\n    /* 图片选择区域函数绑定\n     ---------------------------------------------------------------*/\n    preventDefault(e) {\n      e.preventDefault()\n      return false\n    },\n    handleClick(e) {\n      if (this.loading !== 1) {\n        if (e.target !== this.$refs.fileinput) {\n          e.preventDefault()\n          if (document.activeElement !== this.$refs) {\n            this.$refs.fileinput.click()\n          }\n        }\n      }\n    },\n    handleChange(e) {\n      e.preventDefault()\n      if (this.loading !== 1) {\n        const files = e.target.files || e.dataTransfer.files\n        this.reset()\n        if (this.checkFile(files[0])) {\n          this.setSourceImg(files[0])\n        }\n      }\n    },\n    /* ---------------------------------------------------------------*/\n    // 检测选择的文件是否合适\n    checkFile(file) {\n      const { lang, maxSize } = this\n      // 仅限图片\n      if (file.type.indexOf('image') === -1) {\n        this.hasError = true\n        this.errorMsg = lang.error.onlyImg\n        return false\n      }\n      // 超出大小\n      if (file.size / 1024 > maxSize) {\n        this.hasError = true\n        this.errorMsg = lang.error.outOfSize + maxSize + 'kb'\n        return false\n      }\n      return true\n    },\n    // 重置控件\n    reset() {\n      this.loading = 0\n      this.hasError = false\n      this.errorMsg = ''\n      this.progress = 0\n    },\n    // 设置图片源\n    setSourceImg(file) {\n      const fr = new FileReader()\n      fr.onload = e => {\n        this.sourceImgUrl = fr.result\n        this.startCrop()\n      }\n      fr.readAsDataURL(file)\n    },\n    // 剪裁前准备工作\n    startCrop() {\n      const {\n        width,\n        height,\n        ratio,\n        scale,\n        sourceImgUrl,\n        sourceImgMasking,\n        lang\n      } = this\n      const sim = sourceImgMasking\n      const img = new Image()\n      img.src = sourceImgUrl\n      img.onload = () => {\n        const nWidth = img.naturalWidth\n        const nHeight = img.naturalHeight\n        const nRatio = nWidth / nHeight\n        let w = sim.width\n        let h = sim.height\n        let x = 0\n        let y = 0\n        // 图片像素不达标\n        if (nWidth < width || nHeight < height) {\n          this.hasError = true\n          this.errorMsg = lang.error.lowestPx + width + '*' + height\n          return false\n        }\n        if (ratio > nRatio) {\n          h = w / nRatio\n          y = (sim.height - h) / 2\n        }\n        if (ratio < nRatio) {\n          w = h * nRatio\n          x = (sim.width - w) / 2\n        }\n        scale.range = 0\n        scale.x = x\n        scale.y = y\n        scale.width = w\n        scale.height = h\n        scale.degree = 0\n        scale.minWidth = w\n        scale.minHeight = h\n        scale.maxWidth = nWidth * sim.scale\n        scale.maxHeight = nHeight * sim.scale\n        scale.naturalWidth = nWidth\n        scale.naturalHeight = nHeight\n        this.sourceImg = img\n        this.createImg()\n        this.setStep(2)\n      }\n    },\n    // 鼠标按下图片准备移动\n    imgStartMove(e) {\n      e.preventDefault()\n      // 支持触摸事件，则鼠标事件无效\n      if (this.isSupportTouch && !e.targetTouches) {\n        return false\n      }\n      const et = e.targetTouches ? e.targetTouches[0] : e\n      const { sourceImgMouseDown, scale } = this\n      const simd = sourceImgMouseDown\n      simd.mX = et.screenX\n      simd.mY = et.screenY\n      simd.x = scale.x\n      simd.y = scale.y\n      simd.on = true\n    },\n    // 鼠标按下状态下移动，图片移动\n    imgMove(e) {\n      e.preventDefault()\n      // 支持触摸事件，则鼠标事件无效\n      if (this.isSupportTouch && !e.targetTouches) {\n        return false\n      }\n      const et = e.targetTouches ? e.targetTouches[0] : e\n      const {\n        sourceImgMouseDown: { on, mX, mY, x, y },\n        scale,\n        sourceImgMasking\n      } = this\n      const sim = sourceImgMasking\n      const nX = et.screenX\n      const nY = et.screenY\n      const dX = nX - mX\n      const dY = nY - mY\n      let rX = x + dX\n      let rY = y + dY\n      if (!on) return\n      if (rX > 0) {\n        rX = 0\n      }\n      if (rY > 0) {\n        rY = 0\n      }\n      if (rX < sim.width - scale.width) {\n        rX = sim.width - scale.width\n      }\n      if (rY < sim.height - scale.height) {\n        rY = sim.height - scale.height\n      }\n      scale.x = rX\n      scale.y = rY\n    },\n    // 按钮按下开始向右旋转\n    startRotateRight(e) {\n      const { scale } = this\n      scale.rotateRight = true\n      const rotate = () => {\n        if (scale.rotateRight) {\n          const degree = ++scale.degree\n          this.createImg(degree)\n          setTimeout(function() {\n            rotate()\n          }, 60)\n        }\n      }\n      rotate()\n    },\n    // 按钮按下开始向左旋转\n    startRotateLeft(e) {\n      const { scale } = this\n      scale.rotateLeft = true\n      const rotate = () => {\n        if (scale.rotateLeft) {\n          const degree = --scale.degree\n          this.createImg(degree)\n          setTimeout(function() {\n            rotate()\n          }, 60)\n        }\n      }\n      rotate()\n    },\n    // 停止旋转\n    endRotate() {\n      const { scale } = this\n      scale.rotateLeft = false\n      scale.rotateRight = false\n    },\n    // 按钮按下开始放大\n    startZoomAdd(e) {\n      const { scale } = this\n      scale.zoomAddOn = true\n      const zoom = () => {\n        if (scale.zoomAddOn) {\n          const range = scale.range >= 100 ? 100 : ++scale.range\n          this.zoomImg(range)\n          setTimeout(function() {\n            zoom()\n          }, 60)\n        }\n      }\n      zoom()\n    },\n    // 按钮松开或移开取消放大\n    endZoomAdd(e) {\n      this.scale.zoomAddOn = false\n    },\n    // 按钮按下开始缩小\n    startZoomSub(e) {\n      const { scale } = this\n      scale.zoomSubOn = true\n      const zoom = () => {\n        if (scale.zoomSubOn) {\n          const range = scale.range <= 0 ? 0 : --scale.range\n          this.zoomImg(range)\n          setTimeout(function() {\n            zoom()\n          }, 60)\n        }\n      }\n      zoom()\n    },\n    // 按钮松开或移开取消缩小\n    endZoomSub(e) {\n      const { scale } = this\n      scale.zoomSubOn = false\n    },\n    zoomChange(e) {\n      this.zoomImg(e.target.value)\n    },\n    // 缩放原图\n    zoomImg(newRange) {\n      const { sourceImgMasking, scale } = this\n      const {\n        maxWidth,\n        maxHeight,\n        minWidth,\n        minHeight,\n        width,\n        height,\n        x,\n        y\n      } = scale\n      const sim = sourceImgMasking\n      // 蒙版宽高\n      const sWidth = sim.width\n      const sHeight = sim.height\n      // 新宽高\n      const nWidth = minWidth + ((maxWidth - minWidth) * newRange) / 100\n      const nHeight = minHeight + ((maxHeight - minHeight) * newRange) / 100\n      // 新坐标（根据蒙版中心点缩放）\n      let nX = sWidth / 2 - (nWidth / width) * (sWidth / 2 - x)\n      let nY = sHeight / 2 - (nHeight / height) * (sHeight / 2 - y)\n      // 判断新坐标是否超过蒙版限制\n      if (nX > 0) {\n        nX = 0\n      }\n      if (nY > 0) {\n        nY = 0\n      }\n      if (nX < sWidth - nWidth) {\n        nX = sWidth - nWidth\n      }\n      if (nY < sHeight - nHeight) {\n        nY = sHeight - nHeight\n      }\n      // 赋值处理\n      scale.x = nX\n      scale.y = nY\n      scale.width = nWidth\n      scale.height = nHeight\n      scale.range = newRange\n      setTimeout(() => {\n        if (scale.range === newRange) {\n          this.createImg()\n        }\n      }, 300)\n    },\n    // 生成需求图片\n    createImg(e) {\n      const {\n        mime,\n        sourceImg,\n        scale: { x, y, width, height, degree },\n        sourceImgMasking: { scale }\n      } = this\n      const canvas = this.$refs.canvas\n      const ctx = canvas.getContext('2d')\n      if (e) {\n        // 取消鼠标按下移动状态\n        this.sourceImgMouseDown.on = false\n      }\n      canvas.width = this.width\n      canvas.height = this.height\n      ctx.clearRect(0, 0, this.width, this.height)\n      // 将透明区域设置为白色底边\n      ctx.fillStyle = '#fff'\n      ctx.fillRect(0, 0, this.width, this.height)\n      ctx.translate(this.width * 0.5, this.height * 0.5)\n      ctx.rotate((Math.PI * degree) / 180)\n      ctx.translate(-this.width * 0.5, -this.height * 0.5)\n      ctx.drawImage(\n        sourceImg,\n        x / scale,\n        y / scale,\n        width / scale,\n        height / scale\n      )\n      this.createImgUrl = canvas.toDataURL(mime)\n    },\n    prepareUpload() {\n      const { url, createImgUrl, field, ki } = this\n      this.$emit('crop-success', createImgUrl, field, ki)\n      if (typeof url === 'string' && url) {\n        this.upload()\n      } else {\n        this.off()\n      }\n    },\n    // 上传图片\n    upload() {\n      const {\n        lang,\n        imgFormat,\n        mime,\n        url,\n        params,\n        field,\n        ki,\n        createImgUrl\n      } = this\n      const fmData = new FormData()\n      fmData.append(\n        field,\n        data2blob(createImgUrl, mime),\n        field + '.' + imgFormat\n      )\n      // 添加其他参数\n      if (typeof params === 'object' && params) {\n        Object.keys(params).forEach(k => {\n          fmData.append(k, params[k])\n        })\n      }\n      // 监听进度回调\n      // const uploadProgress = (event) => {\n      //   if (event.lengthComputable) {\n      //     this.progress = 100 * Math.round(event.loaded) / event.total\n      //   }\n      // }\n      // 上传文件\n      this.reset()\n      this.loading = 1\n      this.setStep(3)\n      request({\n        url,\n        method: 'post',\n        data: fmData\n      })\n        .then(resData => {\n          this.loading = 2\n          this.$emit('crop-upload-success', resData.data)\n        })\n        .catch(err => {\n          if (this.value) {\n            this.loading = 3\n            this.hasError = true\n            this.errorMsg = lang.fail\n            this.$emit('crop-upload-fail', err, field, ki)\n          }\n        })\n    },\n    closeHandler(e) {\n      if (this.value && (e.key === 'Escape' || e.keyCode === 27)) {\n        this.off()\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n@charset \"UTF-8\";\n@-webkit-keyframes vicp_progress {\n  0% {\n    background-position-y: 0;\n  }\n  100% {\n    background-position-y: 40px;\n  }\n}\n@keyframes vicp_progress {\n  0% {\n    background-position-y: 0;\n  }\n  100% {\n    background-position-y: 40px;\n  }\n}\n@-webkit-keyframes vicp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0) translatey(-60px);\n    transform: scale(0) translatey(-60px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale(1) translatey(0);\n    transform: scale(1) translatey(0);\n  }\n}\n@keyframes vicp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0) translatey(-60px);\n    transform: scale(0) translatey(-60px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale(1) translatey(0);\n    transform: scale(1) translatey(0);\n  }\n}\n.vue-image-crop-upload {\n  position: fixed;\n  display: block;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  z-index: 10000;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.65);\n  -webkit-tap-highlight-color: transparent;\n  -moz-tap-highlight-color: transparent;\n}\n.vue-image-crop-upload .vicp-wrap {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  position: fixed;\n  display: block;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  z-index: 10000;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  margin: auto;\n  width: 600px;\n  height: 330px;\n  padding: 25px;\n  background-color: #fff;\n  border-radius: 2px;\n  -webkit-animation: vicp 0.12s ease-in;\n  animation: vicp 0.12s ease-in;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close {\n  position: absolute;\n  right: -30px;\n  top: -30px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4 {\n  position: relative;\n  display: block;\n  width: 30px;\n  height: 30px;\n  cursor: pointer;\n  -webkit-transition: -webkit-transform 0.18s;\n  transition: -webkit-transform 0.18s;\n  transition: transform 0.18s;\n  transition: transform 0.18s, -webkit-transform 0.18s;\n  -webkit-transform: rotate(0);\n  -ms-transform: rotate(0);\n  transform: rotate(0);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after,\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::before {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  content: \"\";\n  position: absolute;\n  top: 12px;\n  left: 4px;\n  width: 20px;\n  height: 3px;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n  background-color: #fff;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after {\n  -webkit-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4:hover {\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area {\n  position: relative;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 35px;\n  height: 170px;\n  background-color: rgba(0, 0, 0, 0.03);\n  text-align: center;\n  border: 1px dashed rgba(0, 0, 0, 0.08);\n  overflow: hidden;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 {\n  display: block;\n  margin: 0 auto 6px;\n  width: 42px;\n  height: 42px;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-arrow {\n  display: block;\n  margin: 0 auto;\n  width: 0;\n  height: 0;\n  border-bottom: 14.7px solid rgba(0, 0, 0, 0.3);\n  border-left: 14.7px solid transparent;\n  border-right: 14.7px solid transparent;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-body {\n  display: block;\n  width: 12.6px;\n  height: 14.7px;\n  margin: 0 auto;\n  background-color: rgba(0, 0, 0, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-bottom {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  display: block;\n  height: 12.6px;\n  border: 6px solid rgba(0, 0, 0, 0.3);\n  border-top: none;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-hint {\n  display: block;\n  padding: 15px;\n  font-size: 14px;\n  color: #666;\n  line-height: 30px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-no-supported-hint {\n  display: block;\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: 30px;\n  width: 100%;\n  height: 60px;\n  line-height: 30px;\n  background-color: #eee;\n  text-align: center;\n  color: #666;\n  font-size: 14px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area:hover {\n  cursor: pointer;\n  border-color: rgba(0, 0, 0, 0.1);\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop {\n  overflow: hidden;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left {\n  float: left;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container {\n  position: relative;\n  display: block;\n  width: 240px;\n  height: 180px;\n  background-color: #e5e5e0;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img {\n  position: absolute;\n  display: block;\n  cursor: move;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade {\n  -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  position: absolute;\n  background-color: rgba(241, 242, 243, 0.8);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade.vicp-img-shade-1 {\n  top: 0;\n  left: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade.vicp-img-shade-2 {\n  bottom: 0;\n  right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate {\n  position: relative;\n  width: 240px;\n  height: 18px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i {\n  display: block;\n  width: 18px;\n  height: 18px;\n  border-radius: 100%;\n  line-height: 18px;\n  text-align: center;\n  font-size: 12px;\n  font-weight: bold;\n  background-color: rgba(0, 0, 0, 0.08);\n  color: #fff;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:hover {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  cursor: pointer;\n  background-color: rgba(0, 0, 0, 0.14);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:first-child {\n  float: left;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:last-child {\n  float: right;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range {\n  position: relative;\n  margin: 30px 0 10px 0;\n  width: 240px;\n  height: 18px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5,\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6 {\n  position: absolute;\n  top: 0;\n  width: 18px;\n  height: 18px;\n  border-radius: 100%;\n  background-color: rgba(0, 0, 0, 0.08);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5:hover,\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6:hover {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  cursor: pointer;\n  background-color: rgba(0, 0, 0, 0.14);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5 {\n  left: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5::before {\n  position: absolute;\n  content: \"\";\n  display: block;\n  left: 3px;\n  top: 8px;\n  width: 12px;\n  height: 2px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6 {\n  right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6::before {\n  position: absolute;\n  content: \"\";\n  display: block;\n  left: 3px;\n  top: 8px;\n  width: 12px;\n  height: 2px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6::after {\n  position: absolute;\n  content: \"\";\n  display: block;\n  top: 3px;\n  left: 8px;\n  width: 2px;\n  height: 12px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"] {\n  display: block;\n  padding-top: 5px;\n  margin: 0 auto;\n  width: 180px;\n  height: 8px;\n  vertical-align: top;\n  background: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  cursor: pointer;\n  /* 滑块\n               ---------------------------------------------------------------*/\n  /* 轨道\n               ---------------------------------------------------------------*/\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus {\n  outline: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  -webkit-appearance: none;\n  appearance: none;\n  margin-top: -3px;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border-radius: 100%;\n  border: none;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-moz-range-thumb {\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  -moz-appearance: none;\n  appearance: none;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border-radius: 100%;\n  border: none;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-thumb {\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  appearance: none;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border: none;\n  border-radius: 100%;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-moz-range-thumb {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-ms-thumb {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  margin-top: -4px;\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-webkit-slider-runnable-track {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  height: 6px;\n  cursor: pointer;\n  border-radius: 2px;\n  border: none;\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-moz-range-track {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  height: 6px;\n  cursor: pointer;\n  border-radius: 2px;\n  border: none;\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-track {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  cursor: pointer;\n  background: transparent;\n  border-color: transparent;\n  color: transparent;\n  height: 6px;\n  border-radius: 2px;\n  border: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-fill-lower {\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-fill-upper {\n  background-color: rgba(68, 170, 119, 0.15);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-webkit-slider-runnable-track {\n  background-color: rgba(68, 170, 119, 0.5);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-moz-range-track {\n  background-color: rgba(68, 170, 119, 0.5);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-ms-fill-lower {\n  background-color: rgba(68, 170, 119, 0.45);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-ms-fill-upper {\n  background-color: rgba(68, 170, 119, 0.25);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right {\n  float: right;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview {\n  height: 150px;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item {\n  position: relative;\n  padding: 5px;\n  width: 100px;\n  height: 100px;\n  float: left;\n  margin-right: 16px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item\n  span {\n  position: absolute;\n  bottom: -30px;\n  width: 100%;\n  font-size: 14px;\n  color: #bbb;\n  display: block;\n  text-align: center;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item\n  img {\n  position: absolute;\n  display: block;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  margin: auto;\n  padding: 3px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item.vicp-preview-item-circle {\n  margin-right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item.vicp-preview-item-circle\n  img {\n  border-radius: 100%;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload {\n  position: relative;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 35px;\n  height: 170px;\n  background-color: rgba(0, 0, 0, 0.03);\n  text-align: center;\n  border: 1px dashed #ddd;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-loading {\n  display: block;\n  padding: 15px;\n  font-size: 16px;\n  color: #999;\n  line-height: 30px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap {\n  margin-top: 12px;\n  background-color: rgba(0, 0, 0, 0.08);\n  border-radius: 3px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step3\n  .vicp-upload\n  .vicp-progress-wrap\n  .vicp-progress {\n  position: relative;\n  display: block;\n  height: 5px;\n  border-radius: 3px;\n  background-color: #4a7;\n  -webkit-box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);\n  box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);\n  -webkit-transition: width 0.15s linear;\n  transition: width 0.15s linear;\n  background-image: -webkit-linear-gradient(\n    135deg,\n    rgba(255, 255, 255, 0.2) 25%,\n    transparent 25%,\n    transparent 50%,\n    rgba(255, 255, 255, 0.2) 50%,\n    rgba(255, 255, 255, 0.2) 75%,\n    transparent 75%,\n    transparent\n  );\n  background-image: linear-gradient(\n    -45deg,\n    rgba(255, 255, 255, 0.2) 25%,\n    transparent 25%,\n    transparent 50%,\n    rgba(255, 255, 255, 0.2) 50%,\n    rgba(255, 255, 255, 0.2) 75%,\n    transparent 75%,\n    transparent\n  );\n  background-size: 40px 40px;\n  -webkit-animation: vicp_progress 0.5s linear infinite;\n  animation: vicp_progress 0.5s linear infinite;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step3\n  .vicp-upload\n  .vicp-progress-wrap\n  .vicp-progress::after {\n  content: \"\";\n  position: absolute;\n  display: block;\n  top: -3px;\n  right: -3px;\n  width: 9px;\n  height: 9px;\n  border: 1px solid rgba(245, 246, 247, 0.7);\n  -webkit-box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);\n  box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);\n  border-radius: 100%;\n  background-color: #4a7;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-error,\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-success {\n  height: 100px;\n  line-height: 100px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate {\n  position: absolute;\n  right: 20px;\n  bottom: 20px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate a {\n  position: relative;\n  float: left;\n  display: block;\n  margin-left: 10px;\n  width: 100px;\n  height: 36px;\n  line-height: 36px;\n  text-align: center;\n  cursor: pointer;\n  font-size: 14px;\n  color: #4a7;\n  border-radius: 2px;\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate a:hover {\n  background-color: rgba(0, 0, 0, 0.03);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-error,\n.vue-image-crop-upload .vicp-wrap .vicp-success {\n  display: block;\n  font-size: 14px;\n  line-height: 24px;\n  height: 24px;\n  color: #d10;\n  text-align: center;\n  vertical-align: top;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-success {\n  color: #4a7;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon3 {\n  position: relative;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  top: 4px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon3::after {\n  position: absolute;\n  top: 3px;\n  left: 6px;\n  width: 6px;\n  height: 10px;\n  border-width: 0 2px 2px 0;\n  border-color: #4a7;\n  border-style: solid;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n  content: \"\";\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2 {\n  position: relative;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  top: 4px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::after,\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::before {\n  content: \"\";\n  position: absolute;\n  top: 9px;\n  left: 4px;\n  width: 13px;\n  height: 2px;\n  background-color: #d10;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::after {\n  -webkit-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n}\n.e-ripple {\n  position: absolute;\n  border-radius: 100%;\n  background-color: rgba(0, 0, 0, 0.15);\n  background-clip: padding-box;\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  -webkit-transform: scale(0);\n  -ms-transform: scale(0);\n  transform: scale(0);\n  opacity: 1;\n}\n.e-ripple.z-active {\n  opacity: 0;\n  -webkit-transform: scale(2);\n  -ms-transform: scale(2);\n  transform: scale(2);\n  -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, transform 0.6s ease-out,\n    -webkit-transform 0.6s ease-out;\n}\n</style>\n"
  },
  {
    "path": "src/components/ImageCropper/utils/data2blob.js",
    "content": "/**\n * database64文件格式转换为2进制\n *\n * @param  {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字，我们只需要逗号之后的就行了\n * @param  {[String]} mime [description]\n * @return {[blob]}      [description]\n */\nexport default function(data, mime) {\n  data = data.split(',')[1]\n  data = window.atob(data)\n  var ia = new Uint8Array(data.length)\n  for (var i = 0; i < data.length; i++) {\n    ia[i] = data.charCodeAt(i)\n  }\n  // canvas.toDataURL 返回的默认格式就是 image/png\n  return new Blob([ia], {\n    type: mime\n  })\n}\n"
  },
  {
    "path": "src/components/ImageCropper/utils/effectRipple.js",
    "content": "/**\n * 点击波纹效果\n *\n * @param  {[event]} e        [description]\n * @param  {[Object]} arg_opts [description]\n * @return {[bollean]}          [description]\n */\nexport default function(e, arg_opts) {\n  var opts = Object.assign({\n    ele: e.target, // 波纹作用元素\n    type: 'hit', // hit点击位置扩散center中心点扩展\n    bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色\n  }, arg_opts)\n  var target = opts.ele\n  if (target) {\n    var rect = target.getBoundingClientRect()\n    var ripple = target.querySelector('.e-ripple')\n    if (!ripple) {\n      ripple = document.createElement('span')\n      ripple.className = 'e-ripple'\n      ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'\n      target.appendChild(ripple)\n    } else {\n      ripple.className = 'e-ripple'\n    }\n    switch (opts.type) {\n      case 'center':\n        ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'\n        ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'\n        break\n      default:\n        ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px'\n        ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px'\n    }\n    ripple.style.backgroundColor = opts.bgc\n    ripple.className = 'e-ripple z-active'\n    return false\n  }\n}\n"
  },
  {
    "path": "src/components/ImageCropper/utils/language.js",
    "content": "export default {\n  zh: {\n    hint: '点击，或拖动图片至此处',\n    loading: '正在上传……',\n    noSupported: '浏览器不支持该功能，请使用IE10以上或其他现在浏览器！',\n    success: '上传成功',\n    fail: '图片上传失败',\n    preview: '头像预览',\n    btn: {\n      off: '取消',\n      close: '关闭',\n      back: '上一步',\n      save: '保存'\n    },\n    error: {\n      onlyImg: '仅限图片格式',\n      outOfSize: '单文件大小不能超过 ',\n      lowestPx: '图片最低像素为（宽*高）：'\n    }\n  },\n  'zh-tw': {\n    hint: '點擊，或拖動圖片至此處',\n    loading: '正在上傳……',\n    noSupported: '瀏覽器不支持該功能，請使用IE10以上或其他現代瀏覽器！',\n    success: '上傳成功',\n    fail: '圖片上傳失敗',\n    preview: '頭像預覽',\n    btn: {\n      off: '取消',\n      close: '關閉',\n      back: '上一步',\n      save: '保存'\n    },\n    error: {\n      onlyImg: '僅限圖片格式',\n      outOfSize: '單文件大小不能超過 ',\n      lowestPx: '圖片最低像素為（寬*高）：'\n    }\n  },\n  en: {\n    hint: 'Click or drag the file here to upload',\n    loading: 'Uploading…',\n    noSupported: 'Browser is not supported, please use IE10+ or other browsers',\n    success: 'Upload success',\n    fail: 'Upload failed',\n    preview: 'Preview',\n    btn: {\n      off: 'Cancel',\n      close: 'Close',\n      back: 'Back',\n      save: 'Save'\n    },\n    error: {\n      onlyImg: 'Image only',\n      outOfSize: 'Image exceeds size limit: ',\n      lowestPx: 'Image\\'s size is too low. Expected at least: '\n    }\n  },\n  ro: {\n    hint: 'Atinge sau trage fișierul aici',\n    loading: 'Se încarcă',\n    noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.',\n    success: 'S-a încărcat cu succes',\n    fail: 'A apărut o problemă la încărcare',\n    preview: 'Previzualizează',\n\n    btn: {\n      off: 'Anulează',\n      close: 'Închide',\n      back: 'Înapoi',\n      save: 'Salvează'\n    },\n\n    error: {\n      onlyImg: 'Doar imagini',\n      outOfSize: 'Imaginea depășește limita de: ',\n      loewstPx: 'Imaginea este prea mică; Minim: '\n    }\n  },\n  ru: {\n    hint: 'Нажмите, или перетащите файл в это окно',\n    loading: 'Загружаю……',\n    noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры',\n    success: 'Загрузка выполнена успешно',\n    fail: 'Ошибка загрузки',\n    preview: 'Предпросмотр',\n    btn: {\n      off: 'Отменить',\n      close: 'Закрыть',\n      back: 'Назад',\n      save: 'Сохранить'\n    },\n    error: {\n      onlyImg: 'Только изображения',\n      outOfSize: 'Изображение превышает предельный размер: ',\n      lowestPx: 'Минимальный размер изображения: '\n    }\n  },\n  'pt-br': {\n    hint: 'Clique ou arraste o arquivo aqui para carregar',\n    loading: 'Carregando…',\n    noSupported: 'Browser não suportado, use o IE10+ ou outro browser',\n    success: 'Sucesso ao carregar imagem',\n    fail: 'Falha ao carregar imagem',\n    preview: 'Pré-visualizar',\n    btn: {\n      off: 'Cancelar',\n      close: 'Fechar',\n      back: 'Voltar',\n      save: 'Salvar'\n    },\n    error: {\n      onlyImg: 'Apenas imagens',\n      outOfSize: 'A imagem excede o limite de tamanho: ',\n      lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: '\n    }\n  },\n  fr: {\n    hint: 'Cliquez ou glissez le fichier ici.',\n    loading: 'Téléchargement…',\n    noSupported: 'Votre navigateur n\\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\\'il vous plaît.',\n    success: 'Téléchargement réussit',\n    fail: 'Téléchargement echoué',\n    preview: 'Aperçu',\n    btn: {\n      off: 'Annuler',\n      close: 'Fermer',\n      back: 'Retour',\n      save: 'Enregistrer'\n    },\n    error: {\n      onlyImg: 'Image uniquement',\n      outOfSize: 'L\\'image sélectionnée dépasse la taille maximum: ',\n      lowestPx: 'L\\'image sélectionnée est trop petite. Dimensions attendues: '\n    }\n  },\n  nl: {\n    hint: 'Klik hier of sleep een afbeelding in dit vlak',\n    loading: 'Uploaden…',\n    noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.',\n    success: 'Upload succesvol',\n    fail: 'Upload mislukt',\n    preview: 'Voorbeeld',\n    btn: {\n      off: 'Annuleren',\n      close: 'Sluiten',\n      back: 'Terug',\n      save: 'Opslaan'\n    },\n    error: {\n      onlyImg: 'Alleen afbeeldingen',\n      outOfSize: 'De afbeelding is groter dan: ',\n      lowestPx: 'De afbeelding is te klein! Minimale afmetingen: '\n    }\n  },\n  tr: {\n    hint: 'Tıkla veya yüklemek istediğini buraya sürükle',\n    loading: 'Yükleniyor…',\n    noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın',\n    success: 'Yükleme başarılı',\n    fail: 'Yüklemede hata oluştu',\n    preview: 'Önizle',\n    btn: {\n      off: 'İptal',\n      close: 'Kapat',\n      back: 'Geri',\n      save: 'Kaydet'\n    },\n    error: {\n      onlyImg: 'Sadece resim',\n      outOfSize: 'Resim yükleme limitini aşıyor: ',\n      lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: '\n    }\n  },\n  'es-MX': {\n    hint: 'Selecciona o arrastra una imagen',\n    loading: 'Subiendo...',\n    noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes',\n    success: 'Subido exitosamente',\n    fail: 'Sucedió un error',\n    preview: 'Vista previa',\n    btn: {\n      off: 'Cancelar',\n      close: 'Cerrar',\n      back: 'Atras',\n      save: 'Guardar'\n    },\n    error: {\n      onlyImg: 'Unicamente imagenes',\n      outOfSize: 'La imagen excede el tamaño maximo:',\n      lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:'\n    }\n  },\n  de: {\n    hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen',\n    loading: 'Hochladen…',\n    noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser',\n    success: 'Upload erfolgreich',\n    fail: 'Upload fehlgeschlagen',\n    preview: 'Vorschau',\n    btn: {\n      off: 'Abbrechen',\n      close: 'Schließen',\n      back: 'Zurück',\n      save: 'Speichern'\n    },\n    error: {\n      onlyImg: 'Nur Bilder',\n      outOfSize: 'Das Bild ist zu groß: ',\n      lowestPx: 'Das Bild ist zu klein. Mindestens: '\n    }\n  },\n  ja: {\n    hint: 'クリック・ドラッグしてファイルをアップロード',\n    loading: 'アップロード中...',\n    noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。',\n    success: 'アップロード成功',\n    fail: 'アップロード失敗',\n    preview: 'プレビュー',\n    btn: {\n      off: 'キャンセル',\n      close: '閉じる',\n      back: '戻る',\n      save: '保存'\n    },\n    error: {\n      onlyImg: '画像のみ',\n      outOfSize: '画像サイズが上限を超えています。上限: ',\n      lowestPx: '画像が小さすぎます。最小サイズ: '\n    }\n  }\n}\n"
  },
  {
    "path": "src/components/ImageCropper/utils/mimes.js",
    "content": "export default {\n  'jpg': 'image/jpeg',\n  'png': 'image/png',\n  'gif': 'image/gif',\n  'svg': 'image/svg+xml',\n  'psd': 'image/photoshop'\n}\n"
  },
  {
    "path": "src/components/JsonEditor/index.vue",
    "content": "<template>\n  <div class=\"json-editor\">\n    <textarea ref=\"textarea\" />\n  </div>\n</template>\n\n<script>\nimport CodeMirror from 'codemirror'\nimport 'codemirror/addon/lint/lint.css'\nimport 'codemirror/lib/codemirror.css'\nimport 'codemirror/theme/rubyblue.css'\nrequire('script-loader!jsonlint')\nimport 'codemirror/mode/javascript/javascript'\nimport 'codemirror/addon/lint/lint'\nimport 'codemirror/addon/lint/json-lint'\n\nexport default {\n  name: 'JsonEditor',\n  /* eslint-disable vue/require-prop-types */\n  props: ['value'],\n  data() {\n    return {\n      jsonEditor: false\n    }\n  },\n  watch: {\n    value(value) {\n      const editorValue = this.jsonEditor.getValue()\n      if (value !== editorValue) {\n        this.jsonEditor.setValue(JSON.stringify(this.value, null, 2))\n      }\n    }\n  },\n  mounted() {\n    this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {\n      lineNumbers: true,\n      mode: 'application/json',\n      gutters: ['CodeMirror-lint-markers'],\n      theme: 'rubyblue',\n      lint: true\n    })\n\n    this.jsonEditor.setValue(JSON.stringify(this.value, null, 2))\n    this.jsonEditor.on('change', cm => {\n      this.$emit('changed', cm.getValue())\n      this.$emit('input', cm.getValue())\n    })\n  },\n  methods: {\n    getValue() {\n      return this.jsonEditor.getValue()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.json-editor {\n  height: 100%;\n  position: relative;\n\n  ::v-deep {\n    .CodeMirror {\n      height: auto;\n      min-height: 300px;\n    }\n\n    .CodeMirror-scroll {\n      min-height: 300px;\n    }\n\n    .cm-s-rubyblue span.cm-string {\n      color: #F08047;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Kanban/index.vue",
    "content": "<template>\n  <div class=\"board-column\">\n    <div class=\"board-column-header\">\n      {{ headerText }}\n    </div>\n    <draggable\n      :list=\"list\"\n      v-bind=\"$attrs\"\n      class=\"board-column-content\"\n      :set-data=\"setData\"\n    >\n      <div v-for=\"element in list\" :key=\"element.id\" class=\"board-item\">\n        {{ element.name }} {{ element.id }}\n      </div>\n    </draggable>\n  </div>\n</template>\n\n<script>\nimport draggable from 'vuedraggable'\n\nexport default {\n  name: 'DragKanbanDemo',\n  components: {\n    draggable\n  },\n  props: {\n    headerText: {\n      type: String,\n      default: 'Header'\n    },\n    options: {\n      type: Object,\n      default() {\n        return {}\n      }\n    },\n    list: {\n      type: Array,\n      default() {\n        return []\n      }\n    }\n  },\n  methods: {\n    setData(dataTransfer) {\n      // to avoid Firefox bug\n      // Detail see : https://github.com/RubaXa/Sortable/issues/1012\n      dataTransfer.setData('Text', '')\n    }\n  }\n}\n</script>\n<style lang=\"scss\" scoped>\n.board-column {\n  min-width: 300px;\n  min-height: 100px;\n  height: auto;\n  overflow: hidden;\n  background: #f0f0f0;\n  border-radius: 3px;\n\n  .board-column-header {\n    height: 50px;\n    line-height: 50px;\n    overflow: hidden;\n    padding: 0 20px;\n    text-align: center;\n    background: #333;\n    color: #fff;\n    border-radius: 3px 3px 0 0;\n  }\n\n  .board-column-content {\n    height: auto;\n    overflow: hidden;\n    border: 10px solid transparent;\n    min-height: 60px;\n    display: flex;\n    justify-content: flex-start;\n    flex-direction: column;\n    align-items: center;\n\n    .board-item {\n      cursor: pointer;\n      width: 100%;\n      height: 64px;\n      margin: 5px 0;\n      background-color: #fff;\n      text-align: left;\n      line-height: 54px;\n      padding: 5px 10px;\n      box-sizing: border-box;\n      box-shadow: 0px 1px 3px 0 rgba(0, 0, 0, 0.2);\n    }\n  }\n}\n</style>\n\n"
  },
  {
    "path": "src/components/MDinput/index.vue",
    "content": "<template>\n  <div :class=\"computedClasses\" class=\"material-input__component\">\n    <div :class=\"{iconClass:icon}\">\n      <i v-if=\"icon\" :class=\"['el-icon-' + icon]\" class=\"el-input__icon material-input__icon\" />\n      <input\n        v-if=\"type === 'email'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :required=\"required\"\n        type=\"email\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <input\n        v-if=\"type === 'url'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :required=\"required\"\n        type=\"url\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <input\n        v-if=\"type === 'number'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :step=\"step\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :max=\"max\"\n        :min=\"min\"\n        :minlength=\"minlength\"\n        :maxlength=\"maxlength\"\n        :required=\"required\"\n        type=\"number\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <input\n        v-if=\"type === 'password'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :max=\"max\"\n        :min=\"min\"\n        :required=\"required\"\n        type=\"password\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <input\n        v-if=\"type === 'tel'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :required=\"required\"\n        type=\"tel\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <input\n        v-if=\"type === 'text'\"\n        v-model=\"currentValue\"\n        :name=\"name\"\n        :placeholder=\"fillPlaceHolder\"\n        :readonly=\"readonly\"\n        :disabled=\"disabled\"\n        :autocomplete=\"autoComplete\"\n        :minlength=\"minlength\"\n        :maxlength=\"maxlength\"\n        :required=\"required\"\n        type=\"text\"\n        class=\"material-input\"\n        @focus=\"handleMdFocus\"\n        @blur=\"handleMdBlur\"\n        @input=\"handleModelInput\"\n      >\n      <span class=\"material-input-bar\" />\n      <label class=\"material-label\">\n        <slot />\n      </label>\n    </div>\n  </div>\n</template>\n\n<script>\n// source:https://github.com/wemake-services/vue-material-input/blob/master/src/components/MaterialInput.vue\n\nexport default {\n  name: 'MdInput',\n  props: {\n    /* eslint-disable */\n    icon: String,\n    name: String,\n    type: {\n      type: String,\n      default: 'text'\n    },\n    value: [String, Number],\n    placeholder: String,\n    readonly: Boolean,\n    disabled: Boolean,\n    min: String,\n    max: String,\n    step: String,\n    minlength: Number,\n    maxlength: Number,\n    required: {\n      type: Boolean,\n      default: true\n    },\n    autoComplete: {\n      type: String,\n      default: 'off'\n    },\n    validateEvent: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data() {\n    return {\n      currentValue: this.value,\n      focus: false,\n      fillPlaceHolder: null\n    }\n  },\n  computed: {\n    computedClasses() {\n      return {\n        'material--active': this.focus,\n        'material--disabled': this.disabled,\n        'material--raised': Boolean(this.focus || this.currentValue) // has value\n      }\n    }\n  },\n  watch: {\n    value(newValue) {\n      this.currentValue = newValue\n    }\n  },\n  methods: {\n    handleModelInput(event) {\n      const value = event.target.value\n      this.$emit('input', value)\n      if (this.$parent.$options.componentName === 'ElFormItem') {\n        if (this.validateEvent) {\n          this.$parent.$emit('el.form.change', [value])\n        }\n      }\n      this.$emit('change', value)\n    },\n    handleMdFocus(event) {\n      this.focus = true\n      this.$emit('focus', event)\n      if (this.placeholder && this.placeholder !== '') {\n        this.fillPlaceHolder = this.placeholder\n      }\n    },\n    handleMdBlur(event) {\n      this.focus = false\n      this.$emit('blur', event)\n      this.fillPlaceHolder = null\n      if (this.$parent.$options.componentName === 'ElFormItem') {\n        if (this.validateEvent) {\n          this.$parent.$emit('el.form.blur', [this.currentValue])\n        }\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  // Fonts:\n  $font-size-base: 16px;\n  $font-size-small: 18px;\n  $font-size-smallest: 12px;\n  $font-weight-normal: normal;\n  $font-weight-bold: bold;\n  $apixel: 1px;\n  // Utils\n  $spacer: 12px;\n  $transition: 0.2s ease all;\n  $index: 0px;\n  $index-has-icon: 30px;\n  // Theme:\n  $color-white: white;\n  $color-grey: #9E9E9E;\n  $color-grey-light: #E0E0E0;\n  $color-blue: #2196F3;\n  $color-red: #F44336;\n  $color-black: black;\n  // Base clases:\n  %base-bar-pseudo {\n    content: '';\n    height: 1px;\n    width: 0;\n    bottom: 0;\n    position: absolute;\n    transition: $transition;\n  }\n\n  // Mixins:\n  @mixin slided-top() {\n    top: - ($font-size-base + $spacer);\n    left: 0;\n    font-size: $font-size-base;\n    font-weight: $font-weight-bold;\n  }\n\n  // Component:\n  .material-input__component {\n    margin-top: 36px;\n    position: relative;\n    * {\n      box-sizing: border-box;\n    }\n    .iconClass {\n      .material-input__icon {\n        position: absolute;\n        left: 0;\n        line-height: $font-size-base;\n        color: $color-blue;\n        top: $spacer;\n        width: $index-has-icon;\n        height: $font-size-base;\n        font-size: $font-size-base;\n        font-weight: $font-weight-normal;\n        pointer-events: none;\n      }\n      .material-label {\n        left: $index-has-icon;\n      }\n      .material-input {\n        text-indent: $index-has-icon;\n      }\n    }\n    .material-input {\n      font-size: $font-size-base;\n      padding: $spacer $spacer $spacer - $apixel * 10 $spacer / 2;\n      display: block;\n      width: 100%;\n      border: none;\n      line-height: 1;\n      border-radius: 0;\n      &:focus {\n        outline: none;\n        border: none;\n        border-bottom: 1px solid transparent; // fixes the height issue\n      }\n    }\n    .material-label {\n      font-weight: $font-weight-normal;\n      position: absolute;\n      pointer-events: none;\n      left: $index;\n      top: 0;\n      transition: $transition;\n      font-size: $font-size-small;\n    }\n    .material-input-bar {\n      position: relative;\n      display: block;\n      width: 100%;\n      &:before {\n        @extend %base-bar-pseudo;\n        left: 50%;\n      }\n      &:after {\n        @extend %base-bar-pseudo;\n        right: 50%;\n      }\n    }\n    // Disabled state:\n    &.material--disabled {\n      .material-input {\n        border-bottom-style: dashed;\n      }\n    }\n    // Raised state:\n    &.material--raised {\n      .material-label {\n        @include slided-top();\n      }\n    }\n    // Active state:\n    &.material--active {\n      .material-input-bar {\n        &:before,\n        &:after {\n          width: 50%;\n        }\n      }\n    }\n  }\n\n  .material-input__component {\n    background: $color-white;\n    .material-input {\n      background: none;\n      color: $color-black;\n      text-indent: $index;\n      border-bottom: 1px solid $color-grey-light;\n    }\n    .material-label {\n      color: $color-grey;\n    }\n    .material-input-bar {\n      &:before,\n      &:after {\n        background: $color-blue;\n      }\n    }\n    // Active state:\n    &.material--active {\n      .material-label {\n        color: $color-blue;\n      }\n    }\n    // Errors:\n    &.material--has-errors {\n      &.material--active .material-label {\n        color: $color-red;\n      }\n      .material-input-bar {\n        &:before,\n        &:after {\n          background: transparent;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/components/MarkdownEditor/default-options.js",
    "content": "// doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor\nexport default {\n  minHeight: '200px',\n  previewStyle: 'vertical',\n  useCommandShortcut: true,\n  useDefaultHTMLSanitizer: true,\n  usageStatistics: false,\n  hideModeSwitch: false,\n  toolbarItems: [\n    'heading',\n    'bold',\n    'italic',\n    'strike',\n    'divider',\n    'hr',\n    'quote',\n    'divider',\n    'ul',\n    'ol',\n    'task',\n    'indent',\n    'outdent',\n    'divider',\n    'table',\n    'image',\n    'link',\n    'divider',\n    'code',\n    'codeblock'\n  ]\n}\n"
  },
  {
    "path": "src/components/MarkdownEditor/index.vue",
    "content": "<template>\n  <div :id=\"id\" />\n</template>\n\n<script>\n// deps for editor\nimport 'codemirror/lib/codemirror.css' // codemirror\nimport 'tui-editor/dist/tui-editor.css' // editor ui\nimport 'tui-editor/dist/tui-editor-contents.css' // editor content\n\nimport Editor from 'tui-editor'\nimport defaultOptions from './default-options'\n\nexport default {\n  name: 'MarkdownEditor',\n  props: {\n    value: {\n      type: String,\n      default: ''\n    },\n    id: {\n      type: String,\n      required: false,\n      default() {\n        return 'markdown-editor-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')\n      }\n    },\n    options: {\n      type: Object,\n      default() {\n        return defaultOptions\n      }\n    },\n    mode: {\n      type: String,\n      default: 'markdown'\n    },\n    height: {\n      type: String,\n      required: false,\n      default: '300px'\n    },\n    language: {\n      type: String,\n      required: false,\n      default: 'en_US' // https://github.com/nhnent/tui.editor/tree/master/src/js/langs\n    }\n  },\n  data() {\n    return {\n      editor: null\n    }\n  },\n  computed: {\n    editorOptions() {\n      const options = Object.assign({}, defaultOptions, this.options)\n      options.initialEditType = this.mode\n      options.height = this.height\n      options.language = this.language\n      return options\n    }\n  },\n  watch: {\n    value(newValue, preValue) {\n      if (newValue !== preValue && newValue !== this.editor.getValue()) {\n        this.editor.setValue(newValue)\n      }\n    },\n    language(val) {\n      this.destroyEditor()\n      this.initEditor()\n    },\n    height(newValue) {\n      this.editor.height(newValue)\n    },\n    mode(newValue) {\n      this.editor.changeMode(newValue)\n    }\n  },\n  mounted() {\n    this.initEditor()\n  },\n  destroyed() {\n    this.destroyEditor()\n  },\n  methods: {\n    initEditor() {\n      this.editor = new Editor({\n        el: document.getElementById(this.id),\n        ...this.editorOptions\n      })\n      if (this.value) {\n        this.editor.setValue(this.value)\n      }\n      this.editor.on('change', () => {\n        this.$emit('input', this.editor.getValue())\n      })\n    },\n    destroyEditor() {\n      if (!this.editor) return\n      this.editor.off('change')\n      this.editor.remove()\n    },\n    setValue(value) {\n      this.editor.setValue(value)\n    },\n    getValue() {\n      return this.editor.getValue()\n    },\n    setHtml(value) {\n      this.editor.setHtml(value)\n    },\n    getHtml() {\n      return this.editor.getHtml()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/components/Pagination/index.vue",
    "content": "<template>\n  <div :class=\"{'hidden':hidden}\" class=\"pagination-container\">\n    <el-pagination\n      :background=\"background\"\n      :current-page.sync=\"currentPage\"\n      :page-size.sync=\"pageSize\"\n      :layout=\"layout\"\n      :page-sizes=\"pageSizes\"\n      :total=\"total\"\n      v-bind=\"$attrs\"\n      @size-change=\"handleSizeChange\"\n      @current-change=\"handleCurrentChange\"\n    />\n  </div>\n</template>\n\n<script>\nimport { scrollTo } from '@/utils/scroll-to'\n\nexport default {\n  name: 'Pagination',\n  props: {\n    total: {\n      required: true,\n      type: Number\n    },\n    page: {\n      type: Number,\n      default: 1\n    },\n    limit: {\n      type: Number,\n      default: 20\n    },\n    pageSizes: {\n      type: Array,\n      default() {\n        return [10, 20, 30, 50]\n      }\n    },\n    layout: {\n      type: String,\n      default: 'total, sizes, prev, pager, next, jumper'\n    },\n    background: {\n      type: Boolean,\n      default: true\n    },\n    autoScroll: {\n      type: Boolean,\n      default: true\n    },\n    hidden: {\n      type: Boolean,\n      default: false\n    }\n  },\n  computed: {\n    currentPage: {\n      get() {\n        return this.page\n      },\n      set(val) {\n        this.$emit('update:page', val)\n      }\n    },\n    pageSize: {\n      get() {\n        return this.limit\n      },\n      set(val) {\n        this.$emit('update:limit', val)\n      }\n    }\n  },\n  methods: {\n    handleSizeChange(val) {\n      this.$emit('pagination', { page: this.currentPage, limit: val })\n      if (this.autoScroll) {\n        scrollTo(0, 800)\n      }\n    },\n    handleCurrentChange(val) {\n      this.$emit('pagination', { page: val, limit: this.pageSize })\n      if (this.autoScroll) {\n        scrollTo(0, 800)\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n.pagination-container {\n  background: #fff;\n  padding: 32px 16px;\n}\n.pagination-container.hidden {\n  display: none;\n}\n</style>\n"
  },
  {
    "path": "src/components/PanThumb/index.vue",
    "content": "<template>\n  <div :style=\"{zIndex:zIndex,height:height,width:width}\" class=\"pan-item\">\n    <div class=\"pan-info\">\n      <div class=\"pan-info-roles-container\">\n        <slot />\n      </div>\n    </div>\n    <!-- eslint-disable-next-line -->\n    <div :style=\"{backgroundImage: `url(${image})`}\" class=\"pan-thumb\"></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'PanThumb',\n  props: {\n    image: {\n      type: String,\n      required: true\n    },\n    zIndex: {\n      type: Number,\n      default: 1\n    },\n    width: {\n      type: String,\n      default: '150px'\n    },\n    height: {\n      type: String,\n      default: '150px'\n    }\n  }\n}\n</script>\n\n<style scoped>\n.pan-item {\n  width: 200px;\n  height: 200px;\n  border-radius: 50%;\n  display: inline-block;\n  position: relative;\n  cursor: default;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.pan-info-roles-container {\n  padding: 20px;\n  text-align: center;\n}\n\n.pan-thumb {\n  width: 100%;\n  height: 100%;\n  background-position: center center;\n  background-size: cover;\n  border-radius: 50%;\n  overflow: hidden;\n  position: absolute;\n  transform-origin: 95% 40%;\n  transition: all 0.3s ease-in-out;\n}\n\n/* .pan-thumb:after {\n  content: '';\n  width: 8px;\n  height: 8px;\n  position: absolute;\n  border-radius: 50%;\n  top: 40%;\n  left: 95%;\n  margin: -4px 0 0 -4px;\n  background: radial-gradient(ellipse at center, rgba(14, 14, 14, 1) 0%, rgba(125, 126, 125, 1) 100%);\n  box-shadow: 0 0 1px rgba(255, 255, 255, 0.9);\n} */\n\n.pan-info {\n  position: absolute;\n  width: inherit;\n  height: inherit;\n  border-radius: 50%;\n  overflow: hidden;\n  box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);\n}\n\n.pan-info h3 {\n  color: #fff;\n  text-transform: uppercase;\n  position: relative;\n  letter-spacing: 2px;\n  font-size: 18px;\n  margin: 0 60px;\n  padding: 22px 0 0 0;\n  height: 85px;\n  font-family: 'Open Sans', Arial, sans-serif;\n  text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);\n}\n\n.pan-info p {\n  color: #fff;\n  padding: 10px 5px;\n  font-style: italic;\n  margin: 0 30px;\n  font-size: 12px;\n  border-top: 1px solid rgba(255, 255, 255, 0.5);\n}\n\n.pan-info p a {\n  display: block;\n  color: #333;\n  width: 80px;\n  height: 80px;\n  background: rgba(255, 255, 255, 0.3);\n  border-radius: 50%;\n  color: #fff;\n  font-style: normal;\n  font-weight: 700;\n  text-transform: uppercase;\n  font-size: 9px;\n  letter-spacing: 1px;\n  padding-top: 24px;\n  margin: 7px auto 0;\n  font-family: 'Open Sans', Arial, sans-serif;\n  opacity: 0;\n  transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;\n  transform: translateX(60px) rotate(90deg);\n}\n\n.pan-info p a:hover {\n  background: rgba(255, 255, 255, 0.5);\n}\n\n.pan-item:hover .pan-thumb {\n  transform: rotate(-110deg);\n}\n\n.pan-item:hover .pan-info p a {\n  opacity: 1;\n  transform: translateX(0px) rotate(0deg);\n}\n</style>\n"
  },
  {
    "path": "src/components/RightPanel/index.vue",
    "content": "<template>\n  <div ref=\"rightPanel\" :class=\"{show:show}\" class=\"rightPanel-container\">\n    <div class=\"rightPanel-background\" />\n    <div class=\"rightPanel\">\n      <div class=\"handle-button\" :style=\"{'top':buttonTop+'px','background-color':theme}\" @click=\"show=!show\">\n        <i :class=\"show?'el-icon-close':'el-icon-setting'\" />\n      </div>\n      <div class=\"rightPanel-items\">\n        <slot />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { addClass, removeClass } from '@/utils'\n\nexport default {\n  name: 'RightPanel',\n  props: {\n    clickNotClose: {\n      default: false,\n      type: Boolean\n    },\n    buttonTop: {\n      default: 250,\n      type: Number\n    }\n  },\n  data() {\n    return {\n      show: false\n    }\n  },\n  computed: {\n    theme() {\n      return this.$store.state.settings.theme\n    }\n  },\n  watch: {\n    show(value) {\n      if (value && !this.clickNotClose) {\n        this.addEventClick()\n      }\n      if (value) {\n        addClass(document.body, 'showRightPanel')\n      } else {\n        removeClass(document.body, 'showRightPanel')\n      }\n    }\n  },\n  mounted() {\n    this.insertToBody()\n  },\n  beforeDestroy() {\n    const elx = this.$refs.rightPanel\n    elx.remove()\n  },\n  methods: {\n    addEventClick() {\n      window.addEventListener('click', this.closeSidebar)\n    },\n    closeSidebar(evt) {\n      const parent = evt.target.closest('.rightPanel')\n      if (!parent) {\n        this.show = false\n        window.removeEventListener('click', this.closeSidebar)\n      }\n    },\n    insertToBody() {\n      const elx = this.$refs.rightPanel\n      const body = document.querySelector('body')\n      body.insertBefore(elx, body.firstChild)\n    }\n  }\n}\n</script>\n\n<style>\n.showRightPanel {\n  overflow: hidden;\n  position: relative;\n  width: calc(100% - 15px);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.rightPanel-background {\n  position: fixed;\n  top: 0;\n  left: 0;\n  opacity: 0;\n  transition: opacity .3s cubic-bezier(.7, .3, .1, 1);\n  background: rgba(0, 0, 0, .2);\n  z-index: -1;\n}\n\n.rightPanel {\n  width: 100%;\n  max-width: 260px;\n  height: 100vh;\n  position: fixed;\n  top: 0;\n  right: 0;\n  box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);\n  transition: all .25s cubic-bezier(.7, .3, .1, 1);\n  transform: translate(100%);\n  background: #fff;\n  z-index: 40000;\n}\n\n.show {\n  transition: all .3s cubic-bezier(.7, .3, .1, 1);\n\n  .rightPanel-background {\n    z-index: 20000;\n    opacity: 1;\n    width: 100%;\n    height: 100%;\n  }\n\n  .rightPanel {\n    transform: translate(0);\n  }\n}\n\n.handle-button {\n  width: 48px;\n  height: 48px;\n  position: absolute;\n  left: -48px;\n  text-align: center;\n  font-size: 24px;\n  border-radius: 6px 0 0 6px !important;\n  z-index: 0;\n  pointer-events: auto;\n  cursor: pointer;\n  color: #fff;\n  line-height: 48px;\n  i {\n    font-size: 24px;\n    line-height: 48px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Screenfull/index.vue",
    "content": "<template>\n  <div>\n    <svg-icon :icon-class=\"isFullscreen?'exit-fullscreen':'fullscreen'\" @click=\"click\" />\n  </div>\n</template>\n\n<script>\nimport screenfull from 'screenfull'\n\nexport default {\n  name: 'Screenfull',\n  data() {\n    return {\n      isFullscreen: false\n    }\n  },\n  mounted() {\n    this.init()\n  },\n  beforeDestroy() {\n    this.destroy()\n  },\n  methods: {\n    click() {\n      if (!screenfull.enabled) {\n        this.$message({\n          message: 'you browser can not work',\n          type: 'warning'\n        })\n        return false\n      }\n      screenfull.toggle()\n    },\n    change() {\n      this.isFullscreen = screenfull.isFullscreen\n    },\n    init() {\n      if (screenfull.enabled) {\n        screenfull.on('change', this.change)\n      }\n    },\n    destroy() {\n      if (screenfull.enabled) {\n        screenfull.off('change', this.change)\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n.screenfull-svg {\n  display: inline-block;\n  cursor: pointer;\n  fill: #5a5e66;;\n  width: 20px;\n  height: 20px;\n  vertical-align: 10px;\n}\n</style>\n"
  },
  {
    "path": "src/components/Share/DropdownMenu.vue",
    "content": "<template>\n  <div :class=\"{active:isActive}\" class=\"share-dropdown-menu\">\n    <div class=\"share-dropdown-menu-wrapper\">\n      <span class=\"share-dropdown-menu-title\" @click.self=\"clickTitle\">{{ title }}</span>\n      <div v-for=\"(item,index) of items\" :key=\"index\" class=\"share-dropdown-menu-item\">\n        <a v-if=\"item.href\" :href=\"item.href\" target=\"_blank\">{{ item.title }}</a>\n        <span v-else>{{ item.title }}</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    items: {\n      type: Array,\n      default: function() {\n        return []\n      }\n    },\n    title: {\n      type: String,\n      default: 'vue'\n    }\n  },\n  data() {\n    return {\n      isActive: false\n    }\n  },\n  methods: {\n    clickTitle() {\n      this.isActive = !this.isActive\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" >\n$n: 9; //和items.length 相同\n$t: .1s;\n.share-dropdown-menu {\n  width: 250px;\n  position: relative;\n  z-index: 1;\n  height: auto!important;\n  &-title {\n    width: 100%;\n    display: block;\n    cursor: pointer;\n    background: black;\n    color: white;\n    height: 60px;\n    line-height: 60px;\n    font-size: 20px;\n    text-align: center;\n    z-index: 2;\n    transform: translate3d(0,0,0);\n  }\n  &-wrapper {\n    position: relative;\n  }\n  &-item {\n    text-align: center;\n    position: absolute;\n    width: 100%;\n    background: #e0e0e0;\n    color: #000;\n    line-height: 60px;\n    height: 60px;\n    cursor: pointer;\n    font-size: 18px;\n    overflow: hidden;\n    opacity: 1;\n    transition: transform 0.28s ease;\n    &:hover {\n      background: black;\n      color: white;\n    }\n    @for $i from 1 through $n {\n      &:nth-of-type(#{$i}) {\n        z-index: -1;\n        transition-delay: $i*$t;\n        transform: translate3d(0, -60px, 0);\n      }\n    }\n  }\n  &.active {\n    .share-dropdown-menu-wrapper {\n      z-index: 1;\n    }\n    .share-dropdown-menu-item {\n      @for $i from 1 through $n {\n        &:nth-of-type(#{$i}) {\n          transition-delay: ($n - $i)*$t;\n          transform: translate3d(0, ($i - 1)*60px, 0);\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/SizeSelect/index.vue",
    "content": "<template>\n  <el-dropdown trigger=\"click\" @command=\"handleSetSize\">\n    <div>\n      <svg-icon class-name=\"size-icon\" icon-class=\"size\" />\n    </div>\n    <el-dropdown-menu slot=\"dropdown\">\n      <el-dropdown-item v-for=\"item of sizeOptions\" :key=\"item.value\" :disabled=\"size===item.value\" :command=\"item.value\">\n        {{\n          item.label }}\n      </el-dropdown-item>\n    </el-dropdown-menu>\n  </el-dropdown>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      sizeOptions: [\n        { label: 'Default', value: 'default' },\n        { label: 'Medium', value: 'medium' },\n        { label: 'Small', value: 'small' },\n        { label: 'Mini', value: 'mini' }\n      ]\n    }\n  },\n  computed: {\n    size() {\n      return this.$store.getters.size\n    }\n  },\n  methods: {\n    handleSetSize(size) {\n      this.$ELEMENT.size = size\n      this.$store.dispatch('app/setSize', size)\n      this.refreshView()\n      this.$message({\n        message: 'Switch Size Success',\n        type: 'success'\n      })\n    },\n    refreshView() {\n      // In order to make the cached page re-rendered\n      this.$store.dispatch('tagsView/delAllCachedViews', this.$route)\n\n      const { fullPath } = this.$route\n\n      this.$nextTick(() => {\n        this.$router.replace({\n          path: '/redirect' + fullPath\n        })\n      })\n    }\n  }\n\n}\n</script>\n"
  },
  {
    "path": "src/components/Sticky/index.vue",
    "content": "<template>\n  <div :style=\"{height:height+'px',zIndex:zIndex}\">\n    <div\n      :class=\"className\"\n      :style=\"{top:(isSticky ? stickyTop +'px' : ''),zIndex:zIndex,position:position,width:width,height:height+'px'}\"\n    >\n      <slot>\n        <div>sticky</div>\n      </slot>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'Sticky',\n  props: {\n    stickyTop: {\n      type: Number,\n      default: 0\n    },\n    zIndex: {\n      type: Number,\n      default: 1\n    },\n    className: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    return {\n      active: false,\n      position: '',\n      width: undefined,\n      height: undefined,\n      isSticky: false\n    }\n  },\n  mounted() {\n    this.height = this.$el.getBoundingClientRect().height\n    window.addEventListener('scroll', this.handleScroll)\n    window.addEventListener('resize', this.handleResize)\n  },\n  activated() {\n    this.handleScroll()\n  },\n  destroyed() {\n    window.removeEventListener('scroll', this.handleScroll)\n    window.removeEventListener('resize', this.handleResize)\n  },\n  methods: {\n    sticky() {\n      if (this.active) {\n        return\n      }\n      this.position = 'fixed'\n      this.active = true\n      this.width = this.width + 'px'\n      this.isSticky = true\n    },\n    handleReset() {\n      if (!this.active) {\n        return\n      }\n      this.reset()\n    },\n    reset() {\n      this.position = ''\n      this.width = 'auto'\n      this.active = false\n      this.isSticky = false\n    },\n    handleScroll() {\n      const width = this.$el.getBoundingClientRect().width\n      this.width = width || 'auto'\n      const offsetTop = this.$el.getBoundingClientRect().top\n      if (offsetTop < this.stickyTop) {\n        this.sticky()\n        return\n      }\n      this.handleReset()\n    },\n    handleResize() {\n      if (this.isSticky) {\n        this.width = this.$el.getBoundingClientRect().width + 'px'\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/components/SvgIcon/index.vue",
    "content": "<template>\n  <div v-if=\"isExternal\" :style=\"styleExternalIcon\" class=\"svg-external-icon svg-icon\" v-on=\"$listeners\" />\n  <svg v-else :class=\"svgClass\" aria-hidden=\"true\" v-on=\"$listeners\">\n    <use :xlink:href=\"iconName\" />\n  </svg>\n</template>\n\n<script>\n// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage\nimport { isExternal } from '@/utils/validate'\n\nexport default {\n  name: 'SvgIcon',\n  props: {\n    iconClass: {\n      type: String,\n      required: true\n    },\n    className: {\n      type: String,\n      default: ''\n    }\n  },\n  computed: {\n    isExternal() {\n      return isExternal(this.iconClass)\n    },\n    iconName() {\n      return `#icon-${this.iconClass}`\n    },\n    svgClass() {\n      if (this.className) {\n        return 'svg-icon ' + this.className\n      } else {\n        return 'svg-icon'\n      }\n    },\n    styleExternalIcon() {\n      return {\n        mask: `url(${this.iconClass}) no-repeat 50% 50%`,\n        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n.svg-icon {\n  width: 1em;\n  height: 1em;\n  vertical-align: -0.15em;\n  fill: currentColor;\n  overflow: hidden;\n}\n\n.svg-external-icon {\n  background-color: currentColor;\n  mask-size: cover!important;\n  display: inline-block;\n}\n</style>\n"
  },
  {
    "path": "src/components/TextHoverEffect/Mallki.vue",
    "content": "<template>\n  <a :class=\"className\" class=\"link--mallki\" href=\"#\">\n    {{ text }}\n    <span :data-letters=\"text\" />\n    <span :data-letters=\"text\" />\n  </a>\n</template>\n\n<script>\nexport default {\n  props: {\n    className: {\n      type: String,\n      default: ''\n    },\n    text: {\n      type: String,\n      default: 'vue-element-admin'\n    }\n  }\n}\n</script>\n\n<style>\n/* Mallki */\n\n.link--mallki {\n  font-weight: 800;\n  color: #4dd9d5;\n  font-family: 'Dosis', sans-serif;\n  -webkit-transition: color 0.5s 0.25s;\n  transition: color 0.5s 0.25s;\n  overflow: hidden;\n  position: relative;\n  display: inline-block;\n  line-height: 1;\n  outline: none;\n  text-decoration: none;\n}\n\n.link--mallki:hover {\n  -webkit-transition: none;\n  transition: none;\n  color: transparent;\n}\n\n.link--mallki::before {\n  content: '';\n  width: 100%;\n  height: 6px;\n  margin: -3px 0 0 0;\n  background: #3888fa;\n  position: absolute;\n  left: 0;\n  top: 50%;\n  -webkit-transform: translate3d(-100%, 0, 0);\n  transform: translate3d(-100%, 0, 0);\n  -webkit-transition: -webkit-transform 0.4s;\n  transition: transform 0.4s;\n  -webkit-transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);\n  transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);\n}\n\n.link--mallki:hover::before {\n  -webkit-transform: translate3d(100%, 0, 0);\n  transform: translate3d(100%, 0, 0);\n}\n\n.link--mallki span {\n  position: absolute;\n  height: 50%;\n  width: 100%;\n  left: 0;\n  top: 0;\n  overflow: hidden;\n}\n\n.link--mallki span::before {\n  content: attr(data-letters);\n  color: red;\n  position: absolute;\n  left: 0;\n  width: 100%;\n  color: #3888fa;\n  -webkit-transition: -webkit-transform 0.5s;\n  transition: transform 0.5s;\n}\n\n.link--mallki span:nth-child(2) {\n  top: 50%;\n}\n\n.link--mallki span:first-child::before {\n  top: 0;\n  -webkit-transform: translate3d(0, 100%, 0);\n  transform: translate3d(0, 100%, 0);\n}\n\n.link--mallki span:nth-child(2)::before {\n  bottom: 0;\n  -webkit-transform: translate3d(0, -100%, 0);\n  transform: translate3d(0, -100%, 0);\n}\n\n.link--mallki:hover span::before {\n  -webkit-transition-delay: 0.3s;\n  transition-delay: 0.3s;\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  -webkit-transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n</style>\n"
  },
  {
    "path": "src/components/ThemePicker/index.vue",
    "content": "<template>\n  <el-color-picker\n    v-model=\"theme\"\n    :predefine=\"['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d', ]\"\n    class=\"theme-picker\"\n    popper-class=\"theme-picker-dropdown\"\n  />\n</template>\n\n<script>\nconst version = require('element-ui/package.json').version // element-ui version from node_modules\nconst ORIGINAL_THEME = '#409EFF' // default color\n\nexport default {\n  data() {\n    return {\n      chalk: '', // content of theme-chalk css\n      theme: ''\n    }\n  },\n  computed: {\n    defaultTheme() {\n      return this.$store.state.settings.theme\n    }\n  },\n  watch: {\n    defaultTheme: {\n      handler: function(val, oldVal) {\n        this.theme = val\n      },\n      immediate: true\n    },\n    async theme(val) {\n      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME\n      if (typeof val !== 'string') return\n      const themeCluster = this.getThemeCluster(val.replace('#', ''))\n      const originalCluster = this.getThemeCluster(oldVal.replace('#', ''))\n      console.log(themeCluster, originalCluster)\n\n      const $message = this.$message({\n        message: '  Compiling the theme',\n        customClass: 'theme-message',\n        type: 'success',\n        duration: 0,\n        iconClass: 'el-icon-loading'\n      })\n\n      const getHandler = (variable, id) => {\n        return () => {\n          const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))\n          const newStyle = this.updateStyle(this[variable], originalCluster, themeCluster)\n\n          let styleTag = document.getElementById(id)\n          if (!styleTag) {\n            styleTag = document.createElement('style')\n            styleTag.setAttribute('id', id)\n            document.head.appendChild(styleTag)\n          }\n          styleTag.innerText = newStyle\n        }\n      }\n\n      if (!this.chalk) {\n        const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`\n        await this.getCSSString(url, 'chalk')\n      }\n\n      const chalkHandler = getHandler('chalk', 'chalk-style')\n\n      chalkHandler()\n\n      const styles = [].slice.call(document.querySelectorAll('style'))\n        .filter(style => {\n          const text = style.innerText\n          return new RegExp(oldVal, 'i').test(text) && !/Chalk Variables/.test(text)\n        })\n      styles.forEach(style => {\n        const { innerText } = style\n        if (typeof innerText !== 'string') return\n        style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)\n      })\n\n      this.$emit('change', val)\n\n      $message.close()\n    }\n  },\n\n  methods: {\n    updateStyle(style, oldCluster, newCluster) {\n      let newStyle = style\n      oldCluster.forEach((color, index) => {\n        newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])\n      })\n      return newStyle\n    },\n\n    getCSSString(url, variable) {\n      return new Promise(resolve => {\n        const xhr = new XMLHttpRequest()\n        xhr.onreadystatechange = () => {\n          if (xhr.readyState === 4 && xhr.status === 200) {\n            this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')\n            resolve()\n          }\n        }\n        xhr.open('GET', url)\n        xhr.send()\n      })\n    },\n\n    getThemeCluster(theme) {\n      const tintColor = (color, tint) => {\n        let red = parseInt(color.slice(0, 2), 16)\n        let green = parseInt(color.slice(2, 4), 16)\n        let blue = parseInt(color.slice(4, 6), 16)\n\n        if (tint === 0) { // when primary color is in its rgb space\n          return [red, green, blue].join(',')\n        } else {\n          red += Math.round(tint * (255 - red))\n          green += Math.round(tint * (255 - green))\n          blue += Math.round(tint * (255 - blue))\n\n          red = red.toString(16)\n          green = green.toString(16)\n          blue = blue.toString(16)\n\n          return `#${red}${green}${blue}`\n        }\n      }\n\n      const shadeColor = (color, shade) => {\n        let red = parseInt(color.slice(0, 2), 16)\n        let green = parseInt(color.slice(2, 4), 16)\n        let blue = parseInt(color.slice(4, 6), 16)\n\n        red = Math.round((1 - shade) * red)\n        green = Math.round((1 - shade) * green)\n        blue = Math.round((1 - shade) * blue)\n\n        red = red.toString(16)\n        green = green.toString(16)\n        blue = blue.toString(16)\n\n        return `#${red}${green}${blue}`\n      }\n\n      const clusters = [theme]\n      for (let i = 0; i <= 9; i++) {\n        clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))\n      }\n      clusters.push(shadeColor(theme, 0.1))\n      return clusters\n    }\n  }\n}\n</script>\n\n<style>\n.theme-message,\n.theme-picker-dropdown {\n  z-index: 99999 !important;\n}\n\n.theme-picker .el-color-picker__trigger {\n  height: 26px !important;\n  width: 26px !important;\n  padding: 2px;\n}\n\n.theme-picker-dropdown .el-color-dropdown__link-btn {\n  display: none;\n}\n</style>\n"
  },
  {
    "path": "src/components/Tinymce/components/EditorImage.vue",
    "content": "<template>\n  <div class=\"upload-container\">\n    <el-button :style=\"{background:color,borderColor:color}\" icon=\"el-icon-upload\" size=\"mini\" type=\"primary\" @click=\" dialogVisible=true\">\n      upload\n    </el-button>\n    <el-dialog :visible.sync=\"dialogVisible\">\n      <el-upload\n        :multiple=\"true\"\n        :file-list=\"fileList\"\n        :show-file-list=\"true\"\n        :on-remove=\"handleRemove\"\n        :on-success=\"handleSuccess\"\n        :before-upload=\"beforeUpload\"\n        class=\"editor-slide-upload\"\n        action=\"https://httpbin.org/post\"\n        list-type=\"picture-card\"\n      >\n        <el-button size=\"small\" type=\"primary\">\n          Click upload\n        </el-button>\n      </el-upload>\n      <el-button @click=\"dialogVisible = false\">\n        Cancel\n      </el-button>\n      <el-button type=\"primary\" @click=\"handleSubmit\">\n        Confirm\n      </el-button>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\n// import { getToken } from 'api/qiniu'\n\nexport default {\n  name: 'EditorSlideUpload',\n  props: {\n    color: {\n      type: String,\n      default: '#1890ff'\n    }\n  },\n  data() {\n    return {\n      dialogVisible: false,\n      listObj: {},\n      fileList: []\n    }\n  },\n  methods: {\n    checkAllSuccess() {\n      return Object.keys(this.listObj).every(item => this.listObj[item].hasSuccess)\n    },\n    handleSubmit() {\n      const arr = Object.keys(this.listObj).map(v => this.listObj[v])\n      if (!this.checkAllSuccess()) {\n        this.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!')\n        return\n      }\n      this.$emit('successCBK', arr)\n      this.listObj = {}\n      this.fileList = []\n      this.dialogVisible = false\n    },\n    handleSuccess(response, file) {\n      const uid = file.uid\n      const objKeyArr = Object.keys(this.listObj)\n      for (let i = 0, len = objKeyArr.length; i < len; i++) {\n        if (this.listObj[objKeyArr[i]].uid === uid) {\n          this.listObj[objKeyArr[i]].url = response.files.file\n          this.listObj[objKeyArr[i]].hasSuccess = true\n          return\n        }\n      }\n    },\n    handleRemove(file) {\n      const uid = file.uid\n      const objKeyArr = Object.keys(this.listObj)\n      for (let i = 0, len = objKeyArr.length; i < len; i++) {\n        if (this.listObj[objKeyArr[i]].uid === uid) {\n          delete this.listObj[objKeyArr[i]]\n          return\n        }\n      }\n    },\n    beforeUpload(file) {\n      const _self = this\n      const _URL = window.URL || window.webkitURL\n      const fileName = file.uid\n      this.listObj[fileName] = {}\n      return new Promise((resolve, reject) => {\n        const img = new Image()\n        img.src = _URL.createObjectURL(file)\n        img.onload = function() {\n          _self.listObj[fileName] = { hasSuccess: false, uid: file.uid, width: this.width, height: this.height }\n        }\n        resolve(true)\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.editor-slide-upload {\n  margin-bottom: 20px;\n  ::v-deep .el-upload--picture-card {\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Tinymce/dynamicLoadScript.js",
    "content": "let callbacks = []\n\nfunction loadedTinymce() {\n  // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144\n  // check is successfully downloaded script\n  return window.tinymce\n}\n\nconst dynamicLoadScript = (src, callback) => {\n  const existingScript = document.getElementById(src)\n  const cb = callback || function() {}\n\n  if (!existingScript) {\n    const script = document.createElement('script')\n    script.src = src // src url for the third-party library being loaded.\n    script.id = src\n    document.body.appendChild(script)\n    callbacks.push(cb)\n    const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd\n    onEnd(script)\n  }\n\n  if (existingScript && cb) {\n    if (loadedTinymce()) {\n      cb(null, existingScript)\n    } else {\n      callbacks.push(cb)\n    }\n  }\n\n  function stdOnEnd(script) {\n    script.onload = function() {\n      // this.onload = null here is necessary\n      // because even IE9 works not like others\n      this.onerror = this.onload = null\n      for (const cb of callbacks) {\n        cb(null, script)\n      }\n      callbacks = null\n    }\n    script.onerror = function() {\n      this.onerror = this.onload = null\n      cb(new Error('Failed to load ' + src), script)\n    }\n  }\n\n  function ieOnEnd(script) {\n    script.onreadystatechange = function() {\n      if (this.readyState !== 'complete' && this.readyState !== 'loaded') return\n      this.onreadystatechange = null\n      for (const cb of callbacks) {\n        cb(null, script) // there is no way to catch loading errors in IE8\n      }\n      callbacks = null\n    }\n  }\n}\n\nexport default dynamicLoadScript\n"
  },
  {
    "path": "src/components/Tinymce/index.vue",
    "content": "<template>\n  <div :class=\"{fullscreen:fullscreen}\" class=\"tinymce-container\" :style=\"{width:containerWidth}\">\n    <textarea :id=\"tinymceId\" class=\"tinymce-textarea\" />\n    <div class=\"editor-custom-btn-container\">\n      <editorImage color=\"#1890ff\" class=\"editor-upload-btn\" @successCBK=\"imageSuccessCBK\" />\n    </div>\n  </div>\n</template>\n\n<script>\n/**\n * docs:\n * https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce\n */\nimport editorImage from './components/EditorImage'\nimport plugins from './plugins'\nimport toolbar from './toolbar'\nimport load from './dynamicLoadScript'\n\n// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one\nconst tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'\n\nexport default {\n  name: 'Tinymce',\n  components: { editorImage },\n  props: {\n    id: {\n      type: String,\n      default: function() {\n        return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')\n      }\n    },\n    value: {\n      type: String,\n      default: ''\n    },\n    toolbar: {\n      type: Array,\n      required: false,\n      default() {\n        return []\n      }\n    },\n    menubar: {\n      type: String,\n      default: 'file edit insert view format table'\n    },\n    height: {\n      type: [Number, String],\n      required: false,\n      default: 360\n    },\n    width: {\n      type: [Number, String],\n      required: false,\n      default: 'auto'\n    }\n  },\n  data() {\n    return {\n      hasChange: false,\n      hasInit: false,\n      tinymceId: this.id,\n      fullscreen: false,\n      languageTypeList: {\n        'en': 'en',\n        'zh': 'zh_CN',\n        'es': 'es_MX',\n        'ja': 'ja'\n      }\n    }\n  },\n  computed: {\n    containerWidth() {\n      const width = this.width\n      if (/^[\\d]+(\\.[\\d]+)?$/.test(width)) { // matches `100`, `'100'`\n        return `${width}px`\n      }\n      return width\n    }\n  },\n  watch: {\n    value(val) {\n      if (!this.hasChange && this.hasInit) {\n        this.$nextTick(() =>\n          window.tinymce.get(this.tinymceId).setContent(val || ''))\n      }\n    }\n  },\n  mounted() {\n    this.init()\n  },\n  activated() {\n    if (window.tinymce) {\n      this.initTinymce()\n    }\n  },\n  deactivated() {\n    this.destroyTinymce()\n  },\n  destroyed() {\n    this.destroyTinymce()\n  },\n  methods: {\n    init() {\n      // dynamic load tinymce from cdn\n      load(tinymceCDN, (err) => {\n        if (err) {\n          this.$message.error(err.message)\n          return\n        }\n        this.initTinymce()\n      })\n    },\n    initTinymce() {\n      const _this = this\n      window.tinymce.init({\n        selector: `#${this.tinymceId}`,\n        language: this.languageTypeList['en'],\n        height: this.height,\n        body_class: 'panel-body ',\n        object_resizing: false,\n        toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar,\n        menubar: this.menubar,\n        plugins: plugins,\n        end_container_on_empty_block: true,\n        powerpaste_word_import: 'clean',\n        code_dialog_height: 450,\n        code_dialog_width: 1000,\n        advlist_bullet_styles: 'square',\n        advlist_number_styles: 'default',\n        imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],\n        default_link_target: '_blank',\n        link_title: false,\n        nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin\n        init_instance_callback: editor => {\n          if (_this.value) {\n            editor.setContent(_this.value)\n          }\n          _this.hasInit = true\n          editor.on('NodeChange Change KeyUp SetContent', () => {\n            this.hasChange = true\n            this.$emit('input', editor.getContent())\n          })\n        },\n        setup(editor) {\n          editor.on('FullscreenStateChanged', (e) => {\n            _this.fullscreen = e.state\n          })\n        },\n        // it will try to keep these URLs intact\n        // https://www.tiny.cloud/docs-3x/reference/configuration/Configuration3x@convert_urls/\n        // https://stackoverflow.com/questions/5196205/disable-tinymce-absolute-to-relative-url-conversions\n        convert_urls: false\n        // 整合七牛上传\n        // images_dataimg_filter(img) {\n        //   setTimeout(() => {\n        //     const $image = $(img);\n        //     $image.removeAttr('width');\n        //     $image.removeAttr('height');\n        //     if ($image[0].height && $image[0].width) {\n        //       $image.attr('data-wscntype', 'image');\n        //       $image.attr('data-wscnh', $image[0].height);\n        //       $image.attr('data-wscnw', $image[0].width);\n        //       $image.addClass('wscnph');\n        //     }\n        //   }, 0);\n        //   return img\n        // },\n        // images_upload_handler(blobInfo, success, failure, progress) {\n        //   progress(0);\n        //   const token = _this.$store.getters.token;\n        //   getToken(token).then(response => {\n        //     const url = response.data.qiniu_url;\n        //     const formData = new FormData();\n        //     formData.append('token', response.data.qiniu_token);\n        //     formData.append('key', response.data.qiniu_key);\n        //     formData.append('file', blobInfo.blob(), url);\n        //     upload(formData).then(() => {\n        //       success(url);\n        //       progress(100);\n        //     })\n        //   }).catch(err => {\n        //     failure('出现未知问题，刷新页面，或者联系程序员')\n        //     console.log(err);\n        //   });\n        // },\n      })\n    },\n    destroyTinymce() {\n      const tinymce = window.tinymce.get(this.tinymceId)\n      if (this.fullscreen) {\n        tinymce.execCommand('mceFullScreen')\n      }\n\n      if (tinymce) {\n        tinymce.destroy()\n      }\n    },\n    setContent(value) {\n      window.tinymce.get(this.tinymceId).setContent(value)\n    },\n    getContent() {\n      window.tinymce.get(this.tinymceId).getContent()\n    },\n    imageSuccessCBK(arr) {\n      arr.forEach(v => window.tinymce.get(this.tinymceId).insertContent(`<img class=\"wscnph\" src=\"${v.url}\" >`))\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.tinymce-container {\n  position: relative;\n  line-height: normal;\n}\n\n.tinymce-container {\n  ::v-deep {\n    .mce-fullscreen {\n      z-index: 10000;\n    }\n  }\n}\n\n.tinymce-textarea {\n  visibility: hidden;\n  z-index: -1;\n}\n\n.editor-custom-btn-container {\n  position: absolute;\n  right: 4px;\n  top: 4px;\n  /*z-index: 2005;*/\n}\n\n.fullscreen .editor-custom-btn-container {\n  z-index: 10000;\n  position: fixed;\n}\n\n.editor-upload-btn {\n  display: inline-block;\n}\n</style>\n"
  },
  {
    "path": "src/components/Tinymce/plugins.js",
    "content": "// Any plugins you want to use has to be imported\n// Detail plugins list see https://www.tinymce.com/docs/plugins/\n// Custom builds see https://www.tinymce.com/download/custom-builds/\n\nconst plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount']\n\nexport default plugins\n"
  },
  {
    "path": "src/components/Tinymce/toolbar.js",
    "content": "// Here is a list of the toolbar\n// Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols\n\nconst toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']\n\nexport default toolbar\n"
  },
  {
    "path": "src/components/Upload/SingleImage.vue",
    "content": "<template>\n  <div class=\"upload-container\">\n    <el-upload\n      :data=\"dataObj\"\n      :multiple=\"false\"\n      :show-file-list=\"false\"\n      :on-success=\"handleImageSuccess\"\n      class=\"image-uploader\"\n      drag\n      action=\"https://httpbin.org/post\"\n    >\n      <i class=\"el-icon-upload\" />\n      <div class=\"el-upload__text\">\n        将文件拖到此处，或<em>点击上传</em>\n      </div>\n    </el-upload>\n    <div class=\"image-preview\">\n      <div v-show=\"imageUrl.length>1\" class=\"image-preview-wrapper\">\n        <img :src=\"imageUrl+'?imageView2/1/w/200/h/200'\">\n        <div class=\"image-preview-action\">\n          <i class=\"el-icon-delete\" @click=\"rmImage\" />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getToken } from '@/api/qiniu'\n\nexport default {\n  name: 'SingleImageUpload',\n  props: {\n    value: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    return {\n      tempUrl: '',\n      dataObj: { token: '', key: '' }\n    }\n  },\n  computed: {\n    imageUrl() {\n      return this.value\n    }\n  },\n  methods: {\n    rmImage() {\n      this.emitInput('')\n    },\n    emitInput(val) {\n      this.$emit('input', val)\n    },\n    handleImageSuccess() {\n      this.emitInput(this.tempUrl)\n    },\n    beforeUpload() {\n      const _self = this\n      return new Promise((resolve, reject) => {\n        getToken().then(response => {\n          const key = response.data.qiniu_key\n          const token = response.data.qiniu_token\n          _self._data.dataObj.token = token\n          _self._data.dataObj.key = key\n          this.tempUrl = response.data.qiniu_url\n          resolve(true)\n        }).catch(err => {\n          console.log(err)\n          reject(false)\n        })\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n    @import \"~@/styles/mixin.scss\";\n    .upload-container {\n        width: 100%;\n        position: relative;\n        @include clearfix;\n        .image-uploader {\n            width: 60%;\n            float: left;\n        }\n        .image-preview {\n            width: 200px;\n            height: 200px;\n            position: relative;\n            border: 1px dashed #d9d9d9;\n            float: left;\n            margin-left: 50px;\n            .image-preview-wrapper {\n                position: relative;\n                width: 100%;\n                height: 100%;\n                img {\n                    width: 100%;\n                    height: 100%;\n                }\n            }\n            .image-preview-action {\n                position: absolute;\n                width: 100%;\n                height: 100%;\n                left: 0;\n                top: 0;\n                cursor: default;\n                text-align: center;\n                color: #fff;\n                opacity: 0;\n                font-size: 20px;\n                background-color: rgba(0, 0, 0, .5);\n                transition: opacity .3s;\n                cursor: pointer;\n                text-align: center;\n                line-height: 200px;\n                .el-icon-delete {\n                    font-size: 36px;\n                }\n            }\n            &:hover {\n                .image-preview-action {\n                    opacity: 1;\n                }\n            }\n        }\n    }\n\n</style>\n"
  },
  {
    "path": "src/components/Upload/SingleImage2.vue",
    "content": "<template>\n  <div class=\"singleImageUpload2 upload-container\">\n    <el-upload\n      :data=\"dataObj\"\n      :multiple=\"false\"\n      :show-file-list=\"false\"\n      :on-success=\"handleImageSuccess\"\n      class=\"image-uploader\"\n      drag\n      action=\"https://httpbin.org/post\"\n    >\n      <i class=\"el-icon-upload\" />\n      <div class=\"el-upload__text\">\n        Drag或<em>点击上传</em>\n      </div>\n    </el-upload>\n    <div v-show=\"imageUrl.length>0\" class=\"image-preview\">\n      <div v-show=\"imageUrl.length>1\" class=\"image-preview-wrapper\">\n        <img :src=\"imageUrl\">\n        <div class=\"image-preview-action\">\n          <i class=\"el-icon-delete\" @click=\"rmImage\" />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getToken } from '@/api/qiniu'\n\nexport default {\n  name: 'SingleImageUpload2',\n  props: {\n    value: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    return {\n      tempUrl: '',\n      dataObj: { token: '', key: '' }\n    }\n  },\n  computed: {\n    imageUrl() {\n      return this.value\n    }\n  },\n  methods: {\n    rmImage() {\n      this.emitInput('')\n    },\n    emitInput(val) {\n      this.$emit('input', val)\n    },\n    handleImageSuccess() {\n      this.emitInput(this.tempUrl)\n    },\n    beforeUpload() {\n      const _self = this\n      return new Promise((resolve, reject) => {\n        getToken().then(response => {\n          const key = response.data.qiniu_key\n          const token = response.data.qiniu_token\n          _self._data.dataObj.token = token\n          _self._data.dataObj.key = key\n          this.tempUrl = response.data.qiniu_url\n          resolve(true)\n        }).catch(() => {\n          reject(false)\n        })\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.upload-container {\n  width: 100%;\n  height: 100%;\n  position: relative;\n  .image-uploader {\n    height: 100%;\n  }\n  .image-preview {\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    left: 0px;\n    top: 0px;\n    border: 1px dashed #d9d9d9;\n    .image-preview-wrapper {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      img {\n        width: 100%;\n        height: 100%;\n      }\n    }\n    .image-preview-action {\n      position: absolute;\n      width: 100%;\n      height: 100%;\n      left: 0;\n      top: 0;\n      cursor: default;\n      text-align: center;\n      color: #fff;\n      opacity: 0;\n      font-size: 20px;\n      background-color: rgba(0, 0, 0, .5);\n      transition: opacity .3s;\n      cursor: pointer;\n      text-align: center;\n      line-height: 200px;\n      .el-icon-delete {\n        font-size: 36px;\n      }\n    }\n    &:hover {\n      .image-preview-action {\n        opacity: 1;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/Upload/SingleImage3.vue",
    "content": "<template>\n  <div class=\"upload-container\">\n    <el-upload\n      :data=\"dataObj\"\n      :multiple=\"false\"\n      :show-file-list=\"false\"\n      :on-success=\"handleImageSuccess\"\n      class=\"image-uploader\"\n      drag\n      action=\"https://httpbin.org/post\"\n    >\n      <i class=\"el-icon-upload\" />\n      <div class=\"el-upload__text\">\n        将文件拖到此处，或<em>点击上传</em>\n      </div>\n    </el-upload>\n    <div class=\"image-preview image-app-preview\">\n      <div v-show=\"imageUrl.length>1\" class=\"image-preview-wrapper\">\n        <img :src=\"imageUrl\">\n        <div class=\"image-preview-action\">\n          <i class=\"el-icon-delete\" @click=\"rmImage\" />\n        </div>\n      </div>\n    </div>\n    <div class=\"image-preview\">\n      <div v-show=\"imageUrl.length>1\" class=\"image-preview-wrapper\">\n        <img :src=\"imageUrl\">\n        <div class=\"image-preview-action\">\n          <i class=\"el-icon-delete\" @click=\"rmImage\" />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getToken } from '@/api/qiniu'\n\nexport default {\n  name: 'SingleImageUpload3',\n  props: {\n    value: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    return {\n      tempUrl: '',\n      dataObj: { token: '', key: '' }\n    }\n  },\n  computed: {\n    imageUrl() {\n      return this.value\n    }\n  },\n  methods: {\n    rmImage() {\n      this.emitInput('')\n    },\n    emitInput(val) {\n      this.$emit('input', val)\n    },\n    handleImageSuccess(file) {\n      this.emitInput(file.files.file)\n    },\n    beforeUpload() {\n      const _self = this\n      return new Promise((resolve, reject) => {\n        getToken().then(response => {\n          const key = response.data.qiniu_key\n          const token = response.data.qiniu_token\n          _self._data.dataObj.token = token\n          _self._data.dataObj.key = key\n          this.tempUrl = response.data.qiniu_url\n          resolve(true)\n        }).catch(err => {\n          console.log(err)\n          reject(false)\n        })\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"~@/styles/mixin.scss\";\n.upload-container {\n  width: 100%;\n  position: relative;\n  @include clearfix;\n  .image-uploader {\n    width: 35%;\n    float: left;\n  }\n  .image-preview {\n    width: 200px;\n    height: 200px;\n    position: relative;\n    border: 1px dashed #d9d9d9;\n    float: left;\n    margin-left: 50px;\n    .image-preview-wrapper {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      img {\n        width: 100%;\n        height: 100%;\n      }\n    }\n    .image-preview-action {\n      position: absolute;\n      width: 100%;\n      height: 100%;\n      left: 0;\n      top: 0;\n      cursor: default;\n      text-align: center;\n      color: #fff;\n      opacity: 0;\n      font-size: 20px;\n      background-color: rgba(0, 0, 0, .5);\n      transition: opacity .3s;\n      cursor: pointer;\n      text-align: center;\n      line-height: 200px;\n      .el-icon-delete {\n        font-size: 36px;\n      }\n    }\n    &:hover {\n      .image-preview-action {\n        opacity: 1;\n      }\n    }\n  }\n  .image-app-preview {\n    width: 320px;\n    height: 180px;\n    position: relative;\n    border: 1px dashed #d9d9d9;\n    float: left;\n    margin-left: 50px;\n    .app-fake-conver {\n      height: 44px;\n      position: absolute;\n      width: 100%; // background: rgba(0, 0, 0, .1);\n      text-align: center;\n      line-height: 64px;\n      color: #fff;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/components/UploadExcel/index.vue",
    "content": "<template>\n  <div>\n    <input ref=\"excel-upload-input\" class=\"excel-upload-input\" type=\"file\" accept=\".xlsx, .xls\" @change=\"handleClick\">\n    <div class=\"drop\" @drop=\"handleDrop\" @dragover=\"handleDragover\" @dragenter=\"handleDragover\">\n      Drop excel file here or\n      <el-button :loading=\"loading\" style=\"margin-left:16px;\" size=\"mini\" type=\"primary\" @click=\"handleUpload\">\n        Browse\n      </el-button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport XLSX from 'xlsx'\n\nexport default {\n  props: {\n    beforeUpload: Function, // eslint-disable-line\n    onSuccess: Function// eslint-disable-line\n  },\n  data() {\n    return {\n      loading: false,\n      excelData: {\n        header: null,\n        results: null\n      }\n    }\n  },\n  methods: {\n    generateData({ header, results }) {\n      this.excelData.header = header\n      this.excelData.results = results\n      this.onSuccess && this.onSuccess(this.excelData)\n    },\n    handleDrop(e) {\n      e.stopPropagation()\n      e.preventDefault()\n      if (this.loading) return\n      const files = e.dataTransfer.files\n      if (files.length !== 1) {\n        this.$message.error('Only support uploading one file!')\n        return\n      }\n      const rawFile = files[0] // only use files[0]\n\n      if (!this.isExcel(rawFile)) {\n        this.$message.error('Only supports upload .xlsx, .xls, .csv suffix files')\n        return false\n      }\n      this.upload(rawFile)\n      e.stopPropagation()\n      e.preventDefault()\n    },\n    handleDragover(e) {\n      e.stopPropagation()\n      e.preventDefault()\n      e.dataTransfer.dropEffect = 'copy'\n    },\n    handleUpload() {\n      this.$refs['excel-upload-input'].click()\n    },\n    handleClick(e) {\n      const files = e.target.files\n      const rawFile = files[0] // only use files[0]\n      if (!rawFile) return\n      this.upload(rawFile)\n    },\n    upload(rawFile) {\n      this.$refs['excel-upload-input'].value = null // fix can't select the same excel\n\n      if (!this.beforeUpload) {\n        this.readerData(rawFile)\n        return\n      }\n      const before = this.beforeUpload(rawFile)\n      if (before) {\n        this.readerData(rawFile)\n      }\n    },\n    readerData(rawFile) {\n      this.loading = true\n      return new Promise((resolve, reject) => {\n        const reader = new FileReader()\n        reader.onload = e => {\n          const data = e.target.result\n          const workbook = XLSX.read(data, { type: 'array' })\n          const firstSheetName = workbook.SheetNames[0]\n          const worksheet = workbook.Sheets[firstSheetName]\n          const header = this.getHeaderRow(worksheet)\n          const results = XLSX.utils.sheet_to_json(worksheet)\n          this.generateData({ header, results })\n          this.loading = false\n          resolve()\n        }\n        reader.readAsArrayBuffer(rawFile)\n      })\n    },\n    getHeaderRow(sheet) {\n      const headers = []\n      const range = XLSX.utils.decode_range(sheet['!ref'])\n      let C\n      const R = range.s.r\n      /* start in the first row */\n      for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */\n        const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]\n        /* find the cell in the first row */\n        let hdr = 'UNKNOWN ' + C // <-- replace with your desired default\n        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)\n        headers.push(hdr)\n      }\n      return headers\n    },\n    isExcel(file) {\n      return /\\.(xlsx|xls|csv)$/.test(file.name)\n    }\n  }\n}\n</script>\n\n<style scoped>\n.excel-upload-input{\n  display: none;\n  z-index: -9999;\n}\n.drop{\n  border: 2px dashed #bbb;\n  width: 600px;\n  height: 160px;\n  line-height: 160px;\n  margin: 0 auto;\n  font-size: 24px;\n  border-radius: 5px;\n  text-align: center;\n  color: #bbb;\n  position: relative;\n}\n</style>\n"
  },
  {
    "path": "src/directive/clipboard/clipboard.js",
    "content": "// Inspired by https://github.com/Inndy/vue-clipboard2\nconst Clipboard = require('clipboard')\nif (!Clipboard) {\n  throw new Error('you should npm install `clipboard` --save at first ')\n}\n\nexport default {\n  bind(el, binding) {\n    if (binding.arg === 'success') {\n      el._v_clipboard_success = binding.value\n    } else if (binding.arg === 'error') {\n      el._v_clipboard_error = binding.value\n    } else {\n      const clipboard = new Clipboard(el, {\n        text() { return binding.value },\n        action() { return binding.arg === 'cut' ? 'cut' : 'copy' }\n      })\n      clipboard.on('success', e => {\n        const callback = el._v_clipboard_success\n        callback && callback(e) // eslint-disable-line\n      })\n      clipboard.on('error', e => {\n        const callback = el._v_clipboard_error\n        callback && callback(e) // eslint-disable-line\n      })\n      el._v_clipboard = clipboard\n    }\n  },\n  update(el, binding) {\n    if (binding.arg === 'success') {\n      el._v_clipboard_success = binding.value\n    } else if (binding.arg === 'error') {\n      el._v_clipboard_error = binding.value\n    } else {\n      el._v_clipboard.text = function() { return binding.value }\n      el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }\n    }\n  },\n  unbind(el, binding) {\n    if (binding.arg === 'success') {\n      delete el._v_clipboard_success\n    } else if (binding.arg === 'error') {\n      delete el._v_clipboard_error\n    } else {\n      el._v_clipboard.destroy()\n      delete el._v_clipboard\n    }\n  }\n}\n"
  },
  {
    "path": "src/directive/clipboard/index.js",
    "content": "import Clipboard from './clipboard'\n\nconst install = function(Vue) {\n  Vue.directive('Clipboard', Clipboard)\n}\n\nif (window.Vue) {\n  window.clipboard = Clipboard\n  Vue.use(install); // eslint-disable-line\n}\n\nClipboard.install = install\nexport default Clipboard\n"
  },
  {
    "path": "src/directive/el-drag-dialog/drag.js",
    "content": "export default {\n  bind(el, binding, vnode) {\n    const dialogHeaderEl = el.querySelector('.el-dialog__header')\n    const dragDom = el.querySelector('.el-dialog')\n    dialogHeaderEl.style.cssText += ';cursor:move;'\n    dragDom.style.cssText += ';top:0px;'\n\n    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);\n    const getStyle = (function() {\n      if (window.document.currentStyle) {\n        return (dom, attr) => dom.currentStyle[attr]\n      } else {\n        return (dom, attr) => getComputedStyle(dom, false)[attr]\n      }\n    })()\n\n    dialogHeaderEl.onmousedown = (e) => {\n      // 鼠标按下，计算当前元素距离可视区的距离\n      const disX = e.clientX - dialogHeaderEl.offsetLeft\n      const disY = e.clientY - dialogHeaderEl.offsetTop\n\n      const dragDomWidth = dragDom.offsetWidth\n      const dragDomHeight = dragDom.offsetHeight\n\n      const screenWidth = document.body.clientWidth\n      const screenHeight = document.body.clientHeight\n\n      const minDragDomLeft = dragDom.offsetLeft\n      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth\n\n      const minDragDomTop = dragDom.offsetTop\n      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight\n\n      // 获取到的值带px 正则匹配替换\n      let styL = getStyle(dragDom, 'left')\n      let styT = getStyle(dragDom, 'top')\n\n      if (styL.includes('%')) {\n        styL = +document.body.clientWidth * (+styL.replace(/\\%/g, '') / 100)\n        styT = +document.body.clientHeight * (+styT.replace(/\\%/g, '') / 100)\n      } else {\n        styL = +styL.replace(/\\px/g, '')\n        styT = +styT.replace(/\\px/g, '')\n      }\n\n      document.onmousemove = function(e) {\n        // 通过事件委托，计算移动的距离\n        let left = e.clientX - disX\n        let top = e.clientY - disY\n\n        // 边界处理\n        if (-(left) > minDragDomLeft) {\n          left = -minDragDomLeft\n        } else if (left > maxDragDomLeft) {\n          left = maxDragDomLeft\n        }\n\n        if (-(top) > minDragDomTop) {\n          top = -minDragDomTop\n        } else if (top > maxDragDomTop) {\n          top = maxDragDomTop\n        }\n\n        // 移动当前元素\n        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`\n\n        // emit onDrag event\n        vnode.child.$emit('dragDialog')\n      }\n\n      document.onmouseup = function(e) {\n        document.onmousemove = null\n        document.onmouseup = null\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/directive/el-drag-dialog/index.js",
    "content": "import drag from './drag'\n\nconst install = function(Vue) {\n  Vue.directive('el-drag-dialog', drag)\n}\n\nif (window.Vue) {\n  window['el-drag-dialog'] = drag\n  Vue.use(install); // eslint-disable-line\n}\n\ndrag.install = install\nexport default drag\n"
  },
  {
    "path": "src/directive/el-table/adaptive.js",
    "content": "import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event'\n\n/**\n * How to use\n * <el-table height=\"100px\" v-el-height-adaptive-table=\"{bottomOffset: 30}\">...</el-table>\n * el-table height is must be set\n * bottomOffset: 30(default)   // The height of the table from the bottom of the page.\n */\n\nconst doResize = (el, binding, vnode) => {\n  const { componentInstance: $table } = vnode\n\n  const { value } = binding\n\n  if (!$table.height) {\n    throw new Error(`el-$table must set the height. Such as height='100px'`)\n  }\n  const bottomOffset = (value && value.bottomOffset) || 30\n\n  if (!$table) return\n\n  const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset\n  $table.layout.setHeight(height)\n  $table.doLayout()\n}\n\nexport default {\n  bind(el, binding, vnode) {\n    el.resizeListener = () => {\n      doResize(el, binding, vnode)\n    }\n    // parameter 1 is must be \"Element\" type\n    addResizeListener(window.document.body, el.resizeListener)\n  },\n  inserted(el, binding, vnode) {\n    doResize(el, binding, vnode)\n  },\n  unbind(el) {\n    removeResizeListener(window.document.body, el.resizeListener)\n  }\n}\n"
  },
  {
    "path": "src/directive/el-table/index.js",
    "content": "import adaptive from './adaptive'\n\nconst install = function(Vue) {\n  Vue.directive('el-height-adaptive-table', adaptive)\n}\n\nif (window.Vue) {\n  window['el-height-adaptive-table'] = adaptive\n  Vue.use(install); // eslint-disable-line\n}\n\nadaptive.install = install\nexport default adaptive\n"
  },
  {
    "path": "src/directive/permission/index.js",
    "content": "import permission from './permission'\n\nconst install = function(Vue) {\n  Vue.directive('permission', permission)\n}\n\nif (window.Vue) {\n  window['permission'] = permission\n  Vue.use(install); // eslint-disable-line\n}\n\npermission.install = install\nexport default permission\n"
  },
  {
    "path": "src/directive/permission/permission.js",
    "content": "import store from '@/store'\n\nfunction checkPermission(el, binding) {\n  const { value } = binding\n  const roles = store.getters && store.getters.roles\n\n  if (value && value instanceof Array) {\n    if (value.length > 0) {\n      const permissionRoles = value\n\n      const hasPermission = roles.some(role => {\n        return permissionRoles.includes(role)\n      })\n\n      if (!hasPermission) {\n        el.parentNode && el.parentNode.removeChild(el)\n      }\n    }\n  } else {\n    throw new Error(`need roles! Like v-permission=\"['admin','editor']\"`)\n  }\n}\n\nexport default {\n  inserted(el, binding) {\n    checkPermission(el, binding)\n  },\n  update(el, binding) {\n    checkPermission(el, binding)\n  }\n}\n"
  },
  {
    "path": "src/directive/sticky.js",
    "content": "const vueSticky = {}\nlet listenAction\nvueSticky.install = Vue => {\n  Vue.directive('sticky', {\n    inserted(el, binding) {\n      const params = binding.value || {}\n      const stickyTop = params.stickyTop || 0\n      const zIndex = params.zIndex || 1000\n      const elStyle = el.style\n\n      elStyle.position = '-webkit-sticky'\n      elStyle.position = 'sticky'\n      // if the browser support css sticky（Currently Safari, Firefox and Chrome Canary）\n      // if (~elStyle.position.indexOf('sticky')) {\n      //     elStyle.top = `${stickyTop}px`;\n      //     elStyle.zIndex = zIndex;\n      //     return\n      // }\n      const elHeight = el.getBoundingClientRect().height\n      const elWidth = el.getBoundingClientRect().width\n      elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`\n\n      const parentElm = el.parentNode || document.documentElement\n      const placeholder = document.createElement('div')\n      placeholder.style.display = 'none'\n      placeholder.style.width = `${elWidth}px`\n      placeholder.style.height = `${elHeight}px`\n      parentElm.insertBefore(placeholder, el)\n\n      let active = false\n\n      const getScroll = (target, top) => {\n        const prop = top ? 'pageYOffset' : 'pageXOffset'\n        const method = top ? 'scrollTop' : 'scrollLeft'\n        let ret = target[prop]\n        if (typeof ret !== 'number') {\n          ret = window.document.documentElement[method]\n        }\n        return ret\n      }\n\n      const sticky = () => {\n        if (active) {\n          return\n        }\n        if (!elStyle.height) {\n          elStyle.height = `${el.offsetHeight}px`\n        }\n\n        elStyle.position = 'fixed'\n        elStyle.width = `${elWidth}px`\n        placeholder.style.display = 'inline-block'\n        active = true\n      }\n\n      const reset = () => {\n        if (!active) {\n          return\n        }\n\n        elStyle.position = ''\n        placeholder.style.display = 'none'\n        active = false\n      }\n\n      const check = () => {\n        const scrollTop = getScroll(window, true)\n        const offsetTop = el.getBoundingClientRect().top\n        if (offsetTop < stickyTop) {\n          sticky()\n        } else {\n          if (scrollTop < elHeight + stickyTop) {\n            reset()\n          }\n        }\n      }\n      listenAction = () => {\n        check()\n      }\n\n      window.addEventListener('scroll', listenAction)\n    },\n\n    unbind() {\n      window.removeEventListener('scroll', listenAction)\n    }\n  })\n}\n\nexport default vueSticky\n\n"
  },
  {
    "path": "src/directive/waves/index.js",
    "content": "import waves from './waves'\n\nconst install = function(Vue) {\n  Vue.directive('waves', waves)\n}\n\nif (window.Vue) {\n  window.waves = waves\n  Vue.use(install); // eslint-disable-line\n}\n\nwaves.install = install\nexport default waves\n"
  },
  {
    "path": "src/directive/waves/waves.css",
    "content": ".waves-ripple {\n    position: absolute;\n    border-radius: 100%;\n    background-color: rgba(0, 0, 0, 0.15);\n    background-clip: padding-box;\n    pointer-events: none;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    -webkit-transform: scale(0);\n    -ms-transform: scale(0);\n    transform: scale(0);\n    opacity: 1;\n}\n\n.waves-ripple.z-active {\n    opacity: 0;\n    -webkit-transform: scale(2);\n    -ms-transform: scale(2);\n    transform: scale(2);\n    -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n    transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n    transition: opacity 1.2s ease-out, transform 0.6s ease-out;\n    transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;\n}"
  },
  {
    "path": "src/directive/waves/waves.js",
    "content": "import './waves.css'\n\nconst context = '@@wavesContext'\n\nfunction handleClick(el, binding) {\n  function handle(e) {\n    const customOpts = Object.assign({}, binding.value)\n    const opts = Object.assign({\n      ele: el, // 波纹作用元素\n      type: 'hit', // hit 点击位置扩散 center中心点扩展\n      color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色\n    },\n    customOpts\n    )\n    const target = opts.ele\n    if (target) {\n      target.style.position = 'relative'\n      target.style.overflow = 'hidden'\n      const rect = target.getBoundingClientRect()\n      let ripple = target.querySelector('.waves-ripple')\n      if (!ripple) {\n        ripple = document.createElement('span')\n        ripple.className = 'waves-ripple'\n        ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'\n        target.appendChild(ripple)\n      } else {\n        ripple.className = 'waves-ripple'\n      }\n      switch (opts.type) {\n        case 'center':\n          ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'\n          ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'\n          break\n        default:\n          ripple.style.top =\n            (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||\n              document.body.scrollTop) + 'px'\n          ripple.style.left =\n            (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||\n              document.body.scrollLeft) + 'px'\n      }\n      ripple.style.backgroundColor = opts.color\n      ripple.className = 'waves-ripple z-active'\n      return false\n    }\n  }\n\n  if (!el[context]) {\n    el[context] = {\n      removeHandle: handle\n    }\n  } else {\n    el[context].removeHandle = handle\n  }\n\n  return handle\n}\n\nexport default {\n  bind(el, binding) {\n    el.addEventListener('click', handleClick(el, binding), false)\n  },\n  update(el, binding) {\n    el.removeEventListener('click', el[context].removeHandle, false)\n    el.addEventListener('click', handleClick(el, binding), false)\n  },\n  unbind(el) {\n    el.removeEventListener('click', el[context].removeHandle, false)\n    el[context] = null\n    delete el[context]\n  }\n}\n"
  },
  {
    "path": "src/filters/index.js",
    "content": "// import parseTime, formatTime and set to filter\nexport { parseTime, formatTime } from '@/utils'\n\n/**\n * Show plural label if time is plural number\n * @param {number} time\n * @param {string} label\n * @return {string}\n */\nfunction pluralize(time, label) {\n  if (time === 1) {\n    return time + label\n  }\n  return time + label + 's'\n}\n\n/**\n * @param {number} time\n */\nexport function timeAgo(time) {\n  const between = Date.now() / 1000 - Number(time)\n  if (between < 3600) {\n    return pluralize(~~(between / 60), ' minute')\n  } else if (between < 86400) {\n    return pluralize(~~(between / 3600), ' hour')\n  } else {\n    return pluralize(~~(between / 86400), ' day')\n  }\n}\n\n/**\n * Number formatting\n * like 10000 => 10k\n * @param {number} num\n * @param {number} digits\n */\nexport function numberFormatter(num, digits) {\n  const si = [\n    { value: 1E18, symbol: 'E' },\n    { value: 1E15, symbol: 'P' },\n    { value: 1E12, symbol: 'T' },\n    { value: 1E9, symbol: 'G' },\n    { value: 1E6, symbol: 'M' },\n    { value: 1E3, symbol: 'k' }\n  ]\n  for (let i = 0; i < si.length; i++) {\n    if (num >= si[i].value) {\n      return (num / si[i].value).toFixed(digits).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol\n    }\n  }\n  return num.toString()\n}\n\n/**\n * 10000 => \"10,000\"\n * @param {number} num\n */\nexport function toThousandFilter(num) {\n  return (+num || 0).toString().replace(/^-?\\d+/g, m => m.replace(/(?=(?!\\b)(\\d{3})+$)/g, ','))\n}\n\n/**\n * Upper case first char\n * @param {String} string\n */\nexport function uppercaseFirst(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1)\n}\n"
  },
  {
    "path": "src/icons/index.js",
    "content": "import Vue from 'vue'\nimport SvgIcon from '@/components/SvgIcon'// svg component\n\n// register globally\nVue.component('svg-icon', SvgIcon)\n\nconst req = require.context('./svg', false, /\\.svg$/)\nconst requireAll = requireContext => requireContext.keys().map(requireContext)\nrequireAll(req)\n"
  },
  {
    "path": "src/icons/svgo.yml",
    "content": "# replace default config\n\n# multipass: true\n# full: true\n\nplugins:\n\n  # - name\n  #\n  # or:\n  # - name: false\n  # - name: true\n  #\n  # or:\n  # - name:\n  #     param1: 1\n  #     param2: 2\n\n- removeAttrs:\n    attrs:\n      - 'fill'\n      - 'fill-rule'\n"
  },
  {
    "path": "src/layout/components/AppMain.vue",
    "content": "<template>\n  <section class=\"app-main\">\n    <transition name=\"fade-transform\" mode=\"out-in\">\n      <keep-alive :include=\"cachedViews\">\n        <router-view :key=\"key\" />\n      </keep-alive>\n    </transition>\n  </section>\n</template>\n\n<script>\nexport default {\n  name: 'AppMain',\n  computed: {\n    cachedViews() {\n      return this.$store.state.tagsView.cachedViews\n    },\n    key() {\n      return this.$route.path\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-main {\n  /* 50= navbar  50  */\n  min-height: calc(100vh - 50px);\n  width: 100%;\n  position: relative;\n  overflow: hidden;\n}\n\n.fixed-header+.app-main {\n  padding-top: 50px;\n}\n\n.hasTagsView {\n  .app-main {\n    /* 84 = navbar + tags-view = 50 + 34 */\n    min-height: calc(100vh - 84px);\n  }\n\n  .fixed-header+.app-main {\n    padding-top: 84px;\n  }\n}\n</style>\n\n<style lang=\"scss\">\n// fix css style bug in open el-dialog\n.el-popup-parent--hidden {\n  .fixed-header {\n    padding-right: 15px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/Navbar.vue",
    "content": "<template>\n  <div class=\"navbar\">\n    <hamburger id=\"hamburger-container\" :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\n\n    <breadcrumb id=\"breadcrumb-container\" class=\"breadcrumb-container\" />\n\n    <div class=\"right-menu\">\n      <template v-if=\"device!=='mobile'\">\n        <search id=\"header-search\" class=\"right-menu-item\" />\n\n        <error-log class=\"errLog-container right-menu-item hover-effect\" />\n\n        <screenfull id=\"screenfull\" class=\"right-menu-item hover-effect\" />\n\n        <el-tooltip content=\"Global Size\" effect=\"dark\" placement=\"bottom\">\n          <size-select id=\"size-select\" class=\"right-menu-item hover-effect\" />\n        </el-tooltip>\n\n      </template>\n\n      <el-dropdown class=\"avatar-container right-menu-item hover-effect\" trigger=\"click\">\n        <div class=\"avatar-wrapper\">\n          <img :src=\"avatar+'?imageView2/1/w/80/h/80'\" class=\"user-avatar\">\n          <i class=\"el-icon-caret-bottom\" />\n        </div>\n        <el-dropdown-menu slot=\"dropdown\">\n          <router-link to=\"/profile/index\">\n            <el-dropdown-item>Profile</el-dropdown-item>\n          </router-link>\n          <router-link to=\"/\">\n            <el-dropdown-item>Dashboard</el-dropdown-item>\n          </router-link>\n          <a target=\"_blank\" href=\"https://github.com/PanJiaChen/vue-element-admin/\">\n            <el-dropdown-item>Github</el-dropdown-item>\n          </a>\n          <a target=\"_blank\" href=\"https://panjiachen.github.io/vue-element-admin-site/#/\">\n            <el-dropdown-item>Docs</el-dropdown-item>\n          </a>\n          <el-dropdown-item divided @click.native=\"logout\">\n            <span style=\"display:block;\">Log Out</span>\n          </el-dropdown-item>\n        </el-dropdown-menu>\n      </el-dropdown>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport Breadcrumb from '@/components/Breadcrumb'\nimport Hamburger from '@/components/Hamburger'\nimport ErrorLog from '@/components/ErrorLog'\nimport Screenfull from '@/components/Screenfull'\nimport SizeSelect from '@/components/SizeSelect'\nimport Search from '@/components/HeaderSearch'\n\nexport default {\n  components: {\n    Breadcrumb,\n    Hamburger,\n    ErrorLog,\n    Screenfull,\n    SizeSelect,\n    Search\n  },\n  computed: {\n    ...mapGetters([\n      'sidebar',\n      'avatar',\n      'device'\n    ])\n  },\n  methods: {\n    toggleSideBar() {\n      this.$store.dispatch('app/toggleSideBar')\n    },\n    async logout() {\n      await this.$store.dispatch('user/logout')\n      this.$router.push(`/login?redirect=${this.$route.fullPath}`)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.navbar {\n  height: 50px;\n  overflow: hidden;\n  position: relative;\n  background: #fff;\n  box-shadow: 0 1px 4px rgba(0,21,41,.08);\n\n  .hamburger-container {\n    line-height: 46px;\n    height: 100%;\n    float: left;\n    cursor: pointer;\n    transition: background .3s;\n    -webkit-tap-highlight-color:transparent;\n\n    &:hover {\n      background: rgba(0, 0, 0, .025)\n    }\n  }\n\n  .breadcrumb-container {\n    float: left;\n  }\n\n  .errLog-container {\n    display: inline-block;\n    vertical-align: top;\n  }\n\n  .right-menu {\n    float: right;\n    height: 100%;\n    line-height: 50px;\n\n    &:focus {\n      outline: none;\n    }\n\n    .right-menu-item {\n      display: inline-block;\n      padding: 0 8px;\n      height: 100%;\n      font-size: 18px;\n      color: #5a5e66;\n      vertical-align: text-bottom;\n\n      &.hover-effect {\n        cursor: pointer;\n        transition: background .3s;\n\n        &:hover {\n          background: rgba(0, 0, 0, .025)\n        }\n      }\n    }\n\n    .avatar-container {\n      margin-right: 30px;\n\n      .avatar-wrapper {\n        margin-top: 5px;\n        position: relative;\n\n        .user-avatar {\n          cursor: pointer;\n          width: 40px;\n          height: 40px;\n          border-radius: 10px;\n        }\n\n        .el-icon-caret-bottom {\n          cursor: pointer;\n          position: absolute;\n          right: -20px;\n          top: 25px;\n          font-size: 12px;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/Settings/index.vue",
    "content": "<template>\n  <div class=\"drawer-container\">\n    <div>\n      <h3 class=\"drawer-title\">Page style setting</h3>\n\n      <div class=\"drawer-item\">\n        <span>Theme Color</span>\n        <theme-picker style=\"float: right;height: 26px;margin: -3px 8px 0 0;\" @change=\"themeChange\" />\n      </div>\n\n      <div class=\"drawer-item\">\n        <span>Open Tags-View</span>\n        <el-switch v-model=\"tagsView\" class=\"drawer-switch\" />\n      </div>\n\n      <div class=\"drawer-item\">\n        <span>Fixed Header</span>\n        <el-switch v-model=\"fixedHeader\" class=\"drawer-switch\" />\n      </div>\n\n      <div class=\"drawer-item\">\n        <span>Sidebar Logo</span>\n        <el-switch v-model=\"sidebarLogo\" class=\"drawer-switch\" />\n      </div>\n\n    </div>\n  </div>\n</template>\n\n<script>\nimport ThemePicker from '@/components/ThemePicker'\n\nexport default {\n  components: { ThemePicker },\n  data() {\n    return {}\n  },\n  computed: {\n    fixedHeader: {\n      get() {\n        return this.$store.state.settings.fixedHeader\n      },\n      set(val) {\n        this.$store.dispatch('settings/changeSetting', {\n          key: 'fixedHeader',\n          value: val\n        })\n      }\n    },\n    tagsView: {\n      get() {\n        return this.$store.state.settings.tagsView\n      },\n      set(val) {\n        this.$store.dispatch('settings/changeSetting', {\n          key: 'tagsView',\n          value: val\n        })\n      }\n    },\n    sidebarLogo: {\n      get() {\n        return this.$store.state.settings.sidebarLogo\n      },\n      set(val) {\n        this.$store.dispatch('settings/changeSetting', {\n          key: 'sidebarLogo',\n          value: val\n        })\n      }\n    }\n  },\n  methods: {\n    themeChange(val) {\n      this.$store.dispatch('settings/changeSetting', {\n        key: 'theme',\n        value: val\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.drawer-container {\n  padding: 24px;\n  font-size: 14px;\n  line-height: 1.5;\n  word-wrap: break-word;\n\n  .drawer-title {\n    margin-bottom: 12px;\n    color: rgba(0, 0, 0, .85);\n    font-size: 14px;\n    line-height: 22px;\n  }\n\n  .drawer-item {\n    color: rgba(0, 0, 0, .65);\n    font-size: 14px;\n    padding: 12px 0;\n  }\n\n  .drawer-switch {\n    float: right\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/Sidebar/FixiOSBug.js",
    "content": "export default {\n  computed: {\n    device() {\n      return this.$store.state.app.device\n    }\n  },\n  mounted() {\n    // In order to fix the click on menu on the ios device will trigger the mouseleave bug\n    // https://github.com/PanJiaChen/vue-element-admin/issues/1135\n    this.fixBugIniOS()\n  },\n  methods: {\n    fixBugIniOS() {\n      const $subMenu = this.$refs.subMenu\n      if ($subMenu) {\n        const handleMouseleave = $subMenu.handleMouseleave\n        $subMenu.handleMouseleave = (e) => {\n          if (this.device === 'mobile') {\n            return\n          }\n          handleMouseleave(e)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/layout/components/Sidebar/Item.vue",
    "content": "<script>\nexport default {\n  name: 'MenuItem',\n  functional: true,\n  props: {\n    icon: {\n      type: String,\n      default: ''\n    },\n    title: {\n      type: String,\n      default: ''\n    }\n  },\n  render(h, context) {\n    const { icon, title } = context.props\n    const vnodes = []\n\n    if (icon) {\n      if (icon.includes('el-icon')) {\n        vnodes.push(<i class={[icon, 'sub-el-icon']} />)\n      } else {\n        vnodes.push(<svg-icon icon-class={icon}/>)\n      }\n    }\n\n    if (title) {\n      vnodes.push(<span slot='title'>{(title)}</span>)\n    }\n    return vnodes\n  }\n}\n</script>\n\n<style scoped>\n.sub-el-icon {\n  color: currentColor;\n  width: 1em;\n  height: 1em;\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/Sidebar/Link.vue",
    "content": "<template>\n  <component :is=\"type\" v-bind=\"linkProps(to)\">\n    <slot />\n  </component>\n</template>\n\n<script>\nimport { isExternal } from '@/utils/validate'\n\nexport default {\n  props: {\n    to: {\n      type: String,\n      required: true\n    }\n  },\n  computed: {\n    isExternal() {\n      return isExternal(this.to)\n    },\n    type() {\n      if (this.isExternal) {\n        return 'a'\n      }\n      return 'router-link'\n    }\n  },\n  methods: {\n    linkProps(to) {\n      if (this.isExternal) {\n        return {\n          href: to,\n          target: '_blank',\n          rel: 'noopener'\n        }\n      }\n      return {\n        to: to\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/layout/components/Sidebar/Logo.vue",
    "content": "<template>\n  <div class=\"sidebar-logo-container\" :class=\"{'collapse':collapse}\">\n    <transition name=\"sidebarLogoFade\">\n      <router-link v-if=\"collapse\" key=\"collapse\" class=\"sidebar-logo-link\" to=\"/\">\n        <img v-if=\"logo\" :src=\"logo\" class=\"sidebar-logo\">\n        <h1 v-else class=\"sidebar-title\">{{ title }} </h1>\n      </router-link>\n      <router-link v-else key=\"expand\" class=\"sidebar-logo-link\" to=\"/\">\n        <img v-if=\"logo\" :src=\"logo\" class=\"sidebar-logo\">\n        <h1 class=\"sidebar-title\">{{ title }} </h1>\n      </router-link>\n    </transition>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SidebarLogo',\n  props: {\n    collapse: {\n      type: Boolean,\n      required: true\n    }\n  },\n  data() {\n    return {\n      title: 'Vue Element Admin',\n      logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.sidebarLogoFade-enter-active {\n  transition: opacity 1.5s;\n}\n\n.sidebarLogoFade-enter,\n.sidebarLogoFade-leave-to {\n  opacity: 0;\n}\n\n.sidebar-logo-container {\n  position: relative;\n  width: 100%;\n  height: 50px;\n  line-height: 50px;\n  background: #2b2f3a;\n  text-align: center;\n  overflow: hidden;\n\n  & .sidebar-logo-link {\n    height: 100%;\n    width: 100%;\n\n    & .sidebar-logo {\n      width: 32px;\n      height: 32px;\n      vertical-align: middle;\n      margin-right: 12px;\n    }\n\n    & .sidebar-title {\n      display: inline-block;\n      margin: 0;\n      color: #fff;\n      font-weight: 600;\n      line-height: 50px;\n      font-size: 14px;\n      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;\n      vertical-align: middle;\n    }\n  }\n\n  &.collapse {\n    .sidebar-logo {\n      margin-right: 0px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/Sidebar/SidebarItem.vue",
    "content": "<template>\n  <div v-if=\"!item.hidden\">\n    <template v-if=\"hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow\">\n      <app-link v-if=\"onlyOneChild.meta\" :to=\"resolvePath(onlyOneChild.path)\">\n        <el-menu-item :index=\"resolvePath(onlyOneChild.path)\" :class=\"{'submenu-title-noDropdown':!isNest}\">\n          <item :icon=\"onlyOneChild.meta.icon||(item.meta&&item.meta.icon)\" :title=\"onlyOneChild.meta.title\" />\n        </el-menu-item>\n      </app-link>\n    </template>\n\n    <el-submenu v-else ref=\"subMenu\" :index=\"resolvePath(item.path)\" popper-append-to-body>\n      <template slot=\"title\">\n        <item v-if=\"item.meta\" :icon=\"item.meta && item.meta.icon\" :title=\"item.meta.title\" />\n      </template>\n      <sidebar-item\n        v-for=\"child in item.children\"\n        :key=\"child.path\"\n        :is-nest=\"true\"\n        :item=\"child\"\n        :base-path=\"resolvePath(child.path)\"\n        class=\"nest-menu\"\n      />\n    </el-submenu>\n  </div>\n</template>\n\n<script>\nimport path from 'path'\nimport { isExternal } from '@/utils/validate'\nimport Item from './Item'\nimport AppLink from './Link'\nimport FixiOSBug from './FixiOSBug'\n\nexport default {\n  name: 'SidebarItem',\n  components: { Item, AppLink },\n  mixins: [FixiOSBug],\n  props: {\n    // route object\n    item: {\n      type: Object,\n      required: true\n    },\n    isNest: {\n      type: Boolean,\n      default: false\n    },\n    basePath: {\n      type: String,\n      default: ''\n    }\n  },\n  data() {\n    // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237\n    // TODO: refactor with render function\n    this.onlyOneChild = null\n    return {}\n  },\n  methods: {\n    hasOneShowingChild(children = [], parent) {\n      const showingChildren = children.filter(item => {\n        if (item.hidden) {\n          return false\n        } else {\n          // Temp set(will be used if only has one showing child)\n          this.onlyOneChild = item\n          return true\n        }\n      })\n\n      // When there is only one child router, the child router is displayed by default\n      if (showingChildren.length === 1) {\n        return true\n      }\n\n      // Show parent if there are no child router to display\n      if (showingChildren.length === 0) {\n        this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }\n        return true\n      }\n\n      return false\n    },\n    resolvePath(routePath) {\n      if (isExternal(routePath)) {\n        return routePath\n      }\n      if (isExternal(this.basePath)) {\n        return this.basePath\n      }\n      return path.resolve(this.basePath, routePath)\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/layout/components/Sidebar/index.vue",
    "content": "<template>\n  <div :class=\"{'has-logo':showLogo}\">\n    <logo v-if=\"showLogo\" :collapse=\"isCollapse\" />\n    <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n      <el-menu\n        :default-active=\"activeMenu\"\n        :collapse=\"isCollapse\"\n        :background-color=\"variables.menuBg\"\n        :text-color=\"variables.menuText\"\n        :unique-opened=\"false\"\n        :active-text-color=\"variables.menuActiveText\"\n        :collapse-transition=\"false\"\n        mode=\"vertical\"\n      >\n        <sidebar-item v-for=\"route in permission_routes\" :key=\"route.path\" :item=\"route\" :base-path=\"route.path\" />\n      </el-menu>\n    </el-scrollbar>\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport Logo from './Logo'\nimport SidebarItem from './SidebarItem'\nimport variables from '@/styles/variables.scss'\n\nexport default {\n  components: { SidebarItem, Logo },\n  computed: {\n    ...mapGetters([\n      'permission_routes',\n      'sidebar'\n    ]),\n    activeMenu() {\n      const route = this.$route\n      const { meta, path } = route\n      // if set path, the sidebar will highlight the path you set\n      if (meta.activeMenu) {\n        return meta.activeMenu\n      }\n      return path\n    },\n    showLogo() {\n      return this.$store.state.settings.sidebarLogo\n    },\n    variables() {\n      return variables\n    },\n    isCollapse() {\n      return !this.sidebar.opened\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/layout/components/TagsView/ScrollPane.vue",
    "content": "<template>\n  <el-scrollbar ref=\"scrollContainer\" :vertical=\"false\" class=\"scroll-container\" @wheel.native.prevent=\"handleScroll\">\n    <slot />\n  </el-scrollbar>\n</template>\n\n<script>\nconst tagAndTagSpacing = 4 // tagAndTagSpacing\n\nexport default {\n  name: 'ScrollPane',\n  data() {\n    return {\n      left: 0\n    }\n  },\n  computed: {\n    scrollWrapper() {\n      return this.$refs.scrollContainer.$refs.wrap\n    }\n  },\n  mounted() {\n    this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)\n  },\n  beforeDestroy() {\n    this.scrollWrapper.removeEventListener('scroll', this.emitScroll)\n  },\n  methods: {\n    handleScroll(e) {\n      const eventDelta = e.wheelDelta || -e.deltaY * 40\n      const $scrollWrapper = this.scrollWrapper\n      $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4\n    },\n    emitScroll() {\n      this.$emit('scroll')\n    },\n    moveToTarget(currentTag) {\n      const $container = this.$refs.scrollContainer.$el\n      const $containerWidth = $container.offsetWidth\n      const $scrollWrapper = this.scrollWrapper\n      const tagList = this.$parent.$refs.tag\n\n      let firstTag = null\n      let lastTag = null\n\n      // find first tag and last tag\n      if (tagList.length > 0) {\n        firstTag = tagList[0]\n        lastTag = tagList[tagList.length - 1]\n      }\n\n      if (firstTag === currentTag) {\n        $scrollWrapper.scrollLeft = 0\n      } else if (lastTag === currentTag) {\n        $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth\n      } else {\n        // find preTag and nextTag\n        const currentIndex = tagList.findIndex(item => item === currentTag)\n        const prevTag = tagList[currentIndex - 1]\n        const nextTag = tagList[currentIndex + 1]\n\n        // the tag's offsetLeft after of nextTag\n        const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing\n\n        // the tag's offsetLeft before of prevTag\n        const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing\n\n        if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {\n          $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth\n        } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {\n          $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft\n        }\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.scroll-container {\n  white-space: nowrap;\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  ::v-deep {\n    .el-scrollbar__bar {\n      bottom: 0px;\n    }\n    .el-scrollbar__wrap {\n      height: 49px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/TagsView/index.vue",
    "content": "<template>\n  <div id=\"tags-view-container\" class=\"tags-view-container\">\n    <scroll-pane ref=\"scrollPane\" class=\"tags-view-wrapper\" @scroll=\"handleScroll\">\n      <router-link\n        v-for=\"tag in visitedViews\"\n        ref=\"tag\"\n        :key=\"tag.path\"\n        :class=\"isActive(tag)?'active':''\"\n        :to=\"{ path: tag.path, query: tag.query, fullPath: tag.fullPath }\"\n        tag=\"span\"\n        class=\"tags-view-item\"\n        @click.middle.native=\"!isAffix(tag)?closeSelectedTag(tag):''\"\n        @contextmenu.prevent.native=\"openMenu(tag,$event)\"\n      >\n        {{ tag.title }}\n        <span v-if=\"!isAffix(tag)\" class=\"el-icon-close\" @click.prevent.stop=\"closeSelectedTag(tag)\" />\n      </router-link>\n    </scroll-pane>\n    <ul v-show=\"visible\" :style=\"{left:left+'px',top:top+'px'}\" class=\"contextmenu\">\n      <li @click=\"refreshSelectedTag(selectedTag)\">Refresh</li>\n      <li v-if=\"!isAffix(selectedTag)\" @click=\"closeSelectedTag(selectedTag)\">Close</li>\n      <li @click=\"closeOthersTags\">Close Others</li>\n      <li @click=\"closeAllTags(selectedTag)\">Close All</li>\n    </ul>\n  </div>\n</template>\n\n<script>\nimport ScrollPane from './ScrollPane'\nimport path from 'path'\n\nexport default {\n  components: { ScrollPane },\n  data() {\n    return {\n      visible: false,\n      top: 0,\n      left: 0,\n      selectedTag: {},\n      affixTags: []\n    }\n  },\n  computed: {\n    visitedViews() {\n      return this.$store.state.tagsView.visitedViews\n    },\n    routes() {\n      return this.$store.state.permission.routes\n    }\n  },\n  watch: {\n    $route() {\n      this.addTags()\n      this.moveToCurrentTag()\n    },\n    visible(value) {\n      if (value) {\n        document.body.addEventListener('click', this.closeMenu)\n      } else {\n        document.body.removeEventListener('click', this.closeMenu)\n      }\n    }\n  },\n  mounted() {\n    this.initTags()\n    this.addTags()\n  },\n  methods: {\n    isActive(route) {\n      return route.path === this.$route.path\n    },\n    isAffix(tag) {\n      return tag.meta && tag.meta.affix\n    },\n    filterAffixTags(routes, basePath = '/') {\n      let tags = []\n      routes.forEach(route => {\n        if (route.meta && route.meta.affix) {\n          const tagPath = path.resolve(basePath, route.path)\n          tags.push({\n            fullPath: tagPath,\n            path: tagPath,\n            name: route.name,\n            meta: { ...route.meta }\n          })\n        }\n        if (route.children) {\n          const tempTags = this.filterAffixTags(route.children, route.path)\n          if (tempTags.length >= 1) {\n            tags = [...tags, ...tempTags]\n          }\n        }\n      })\n      return tags\n    },\n    initTags() {\n      const affixTags = this.affixTags = this.filterAffixTags(this.routes)\n      for (const tag of affixTags) {\n        // Must have tag name\n        if (tag.name) {\n          this.$store.dispatch('tagsView/addVisitedView', tag)\n        }\n      }\n    },\n    addTags() {\n      const { name } = this.$route\n      if (name) {\n        this.$store.dispatch('tagsView/addView', this.$route)\n      }\n      return false\n    },\n    moveToCurrentTag() {\n      const tags = this.$refs.tag\n      this.$nextTick(() => {\n        for (const tag of tags) {\n          if (tag.to.path === this.$route.path) {\n            this.$refs.scrollPane.moveToTarget(tag)\n            // when query is different then update\n            if (tag.to.fullPath !== this.$route.fullPath) {\n              this.$store.dispatch('tagsView/updateVisitedView', this.$route)\n            }\n            break\n          }\n        }\n      })\n    },\n    refreshSelectedTag(view) {\n      this.$store.dispatch('tagsView/delCachedView', view).then(() => {\n        const { fullPath } = view\n        this.$nextTick(() => {\n          this.$router.replace({\n            path: '/redirect' + fullPath\n          })\n        })\n      })\n    },\n    closeSelectedTag(view) {\n      this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {\n        if (this.isActive(view)) {\n          this.toLastView(visitedViews, view)\n        }\n      })\n    },\n    closeOthersTags() {\n      this.$router.push(this.selectedTag)\n      this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {\n        this.moveToCurrentTag()\n      })\n    },\n    closeAllTags(view) {\n      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {\n        if (this.affixTags.some(tag => tag.path === view.path)) {\n          return\n        }\n        this.toLastView(visitedViews, view)\n      })\n    },\n    toLastView(visitedViews, view) {\n      const latestView = visitedViews.slice(-1)[0]\n      if (latestView) {\n        this.$router.push(latestView.fullPath)\n      } else {\n        // now the default is to redirect to the home page if there is no tags-view,\n        // you can adjust it according to your needs.\n        if (view.name === 'Dashboard') {\n          // to reload home page\n          this.$router.replace({ path: '/redirect' + view.fullPath })\n        } else {\n          this.$router.push('/')\n        }\n      }\n    },\n    openMenu(tag, e) {\n      const menuMinWidth = 105\n      const offsetLeft = this.$el.getBoundingClientRect().left // container margin left\n      const offsetWidth = this.$el.offsetWidth // container width\n      const maxLeft = offsetWidth - menuMinWidth // left boundary\n      const left = e.clientX - offsetLeft + 15 // 15: margin right\n\n      if (left > maxLeft) {\n        this.left = maxLeft\n      } else {\n        this.left = left\n      }\n\n      this.top = e.clientY\n      this.visible = true\n      this.selectedTag = tag\n    },\n    closeMenu() {\n      this.visible = false\n    },\n    handleScroll() {\n      this.closeMenu()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.tags-view-container {\n  height: 34px;\n  width: 100%;\n  background: #fff;\n  border-bottom: 1px solid #d8dce5;\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);\n  .tags-view-wrapper {\n    .tags-view-item {\n      display: inline-block;\n      position: relative;\n      cursor: pointer;\n      height: 26px;\n      line-height: 26px;\n      border: 1px solid #d8dce5;\n      color: #495060;\n      background: #fff;\n      padding: 0 8px;\n      font-size: 12px;\n      margin-left: 5px;\n      margin-top: 4px;\n      &:first-of-type {\n        margin-left: 15px;\n      }\n      &:last-of-type {\n        margin-right: 15px;\n      }\n      &.active {\n        background-color: #42b983;\n        color: #fff;\n        border-color: #42b983;\n        &::before {\n          content: '';\n          background: #fff;\n          display: inline-block;\n          width: 8px;\n          height: 8px;\n          border-radius: 50%;\n          position: relative;\n          margin-right: 2px;\n        }\n      }\n    }\n  }\n  .contextmenu {\n    margin: 0;\n    background: #fff;\n    z-index: 3000;\n    position: absolute;\n    list-style-type: none;\n    padding: 5px 0;\n    border-radius: 4px;\n    font-size: 12px;\n    font-weight: 400;\n    color: #333;\n    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);\n    li {\n      margin: 0;\n      padding: 7px 16px;\n      cursor: pointer;\n      &:hover {\n        background: #eee;\n      }\n    }\n  }\n}\n</style>\n\n<style lang=\"scss\">\n//reset element css of el-icon-close\n.tags-view-wrapper {\n  .tags-view-item {\n    .el-icon-close {\n      width: 16px;\n      height: 16px;\n      vertical-align: 2px;\n      border-radius: 50%;\n      text-align: center;\n      transition: all .3s cubic-bezier(.645, .045, .355, 1);\n      transform-origin: 100% 50%;\n      &:before {\n        transform: scale(.6);\n        display: inline-block;\n        vertical-align: -3px;\n      }\n      &:hover {\n        background-color: #b4bccc;\n        color: #fff;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/layout/components/index.js",
    "content": "export { default as AppMain } from './AppMain'\nexport { default as Navbar } from './Navbar'\nexport { default as Settings } from './Settings'\nexport { default as Sidebar } from './Sidebar/index.vue'\nexport { default as TagsView } from './TagsView/index.vue'\n"
  },
  {
    "path": "src/layout/index.vue",
    "content": "<template>\n  <div :class=\"classObj\" class=\"app-wrapper\">\n    <div v-if=\"device==='mobile'&&sidebar.opened\" class=\"drawer-bg\" @click=\"handleClickOutside\" />\n    <sidebar class=\"sidebar-container\" />\n    <div :class=\"{hasTagsView:needTagsView}\" class=\"main-container\">\n      <div :class=\"{'fixed-header':fixedHeader}\">\n        <navbar />\n        <tags-view v-if=\"needTagsView\" />\n      </div>\n      <app-main />\n      <right-panel v-if=\"showSettings\">\n        <settings />\n      </right-panel>\n    </div>\n  </div>\n</template>\n\n<script>\nimport RightPanel from '@/components/RightPanel'\nimport { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'\nimport ResizeMixin from './mixin/ResizeHandler'\nimport { mapState } from 'vuex'\n\nexport default {\n  name: 'Layout',\n  components: {\n    AppMain,\n    Navbar,\n    RightPanel,\n    Settings,\n    Sidebar,\n    TagsView\n  },\n  mixins: [ResizeMixin],\n  computed: {\n    ...mapState({\n      sidebar: state => state.app.sidebar,\n      device: state => state.app.device,\n      showSettings: state => state.settings.showSettings,\n      needTagsView: state => state.settings.tagsView,\n      fixedHeader: state => state.settings.fixedHeader\n    }),\n    classObj() {\n      return {\n        hideSidebar: !this.sidebar.opened,\n        openSidebar: this.sidebar.opened,\n        withoutAnimation: this.sidebar.withoutAnimation,\n        mobile: this.device === 'mobile'\n      }\n    }\n  },\n  methods: {\n    handleClickOutside() {\n      this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  @import \"~@/styles/mixin.scss\";\n  @import \"~@/styles/variables.scss\";\n\n  .app-wrapper {\n    @include clearfix;\n    position: relative;\n    height: 100%;\n    width: 100%;\n\n    &.mobile.openSidebar {\n      position: fixed;\n      top: 0;\n    }\n  }\n\n  .drawer-bg {\n    background: #000;\n    opacity: 0.3;\n    width: 100%;\n    top: 0;\n    height: 100%;\n    position: absolute;\n    z-index: 999;\n  }\n\n  .fixed-header {\n    position: fixed;\n    top: 0;\n    right: 0;\n    z-index: 9;\n    width: calc(100% - #{$sideBarWidth});\n    transition: width 0.28s;\n  }\n\n  .hideSidebar .fixed-header {\n    width: calc(100% - 54px)\n  }\n\n  .mobile .fixed-header {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "src/layout/mixin/ResizeHandler.js",
    "content": "import store from '@/store'\n\nconst { body } = document\nconst WIDTH = 992 // refer to Bootstrap's responsive design\n\nexport default {\n  watch: {\n    $route(route) {\n      if (this.device === 'mobile' && this.sidebar.opened) {\n        store.dispatch('app/closeSideBar', { withoutAnimation: false })\n      }\n    }\n  },\n  beforeMount() {\n    window.addEventListener('resize', this.$_resizeHandler)\n  },\n  beforeDestroy() {\n    window.removeEventListener('resize', this.$_resizeHandler)\n  },\n  mounted() {\n    const isMobile = this.$_isMobile()\n    if (isMobile) {\n      store.dispatch('app/toggleDevice', 'mobile')\n      store.dispatch('app/closeSideBar', { withoutAnimation: true })\n    }\n  },\n  methods: {\n    // use $_ for mixins properties\n    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential\n    $_isMobile() {\n      const rect = body.getBoundingClientRect()\n      return rect.width - 1 < WIDTH\n    },\n    $_resizeHandler() {\n      if (!document.hidden) {\n        const isMobile = this.$_isMobile()\n        store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')\n\n        if (isMobile) {\n          store.dispatch('app/closeSideBar', { withoutAnimation: true })\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/main.js",
    "content": "import Vue from 'vue'\n\nimport Cookies from 'js-cookie'\n\nimport 'normalize.css/normalize.css' // a modern alternative to CSS resets\n\nimport Element from 'element-ui'\nimport './styles/element-variables.scss'\nimport enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持，无需额外引入，请删除该依赖\n\nimport '@/styles/index.scss' // global css\n\nimport App from './App'\nimport store from './store'\nimport router from './router'\n\nimport './icons' // icon\nimport './permission' // permission control\nimport './utils/error-log' // error log\n\nimport * as filters from './filters' // global filters\n\n/**\n * If you don't want to use mock-server\n * you want to use MockJs for mock api\n * you can execute: mockXHR()\n *\n * Currently MockJs will be used in the production environment,\n * please remove it before going online ! ! !\n */\nif (process.env.NODE_ENV === 'production') {\n  const { mockXHR } = require('../mock')\n  mockXHR()\n}\n\nVue.use(Element, {\n  size: Cookies.get('size') || 'medium', // set element-ui default size\n  locale: enLang // 如果使用中文，无需设置，请删除\n})\n\n// register global utility filters\nObject.keys(filters).forEach(key => {\n  Vue.filter(key, filters[key])\n})\n\nVue.config.productionTip = false\n\nnew Vue({\n  el: '#app',\n  router,\n  store,\n  render: h => h(App)\n})\n"
  },
  {
    "path": "src/permission.js",
    "content": "import router from './router'\nimport store from './store'\nimport { Message } from 'element-ui'\nimport NProgress from 'nprogress' // progress bar\nimport 'nprogress/nprogress.css' // progress bar style\nimport { getToken } from '@/utils/auth' // get token from cookie\nimport getPageTitle from '@/utils/get-page-title'\n\nNProgress.configure({ showSpinner: false }) // NProgress Configuration\n\nconst whiteList = ['/login', '/auth-redirect'] // no redirect whitelist\n\nrouter.beforeEach(async(to, from, next) => {\n  // start progress bar\n  NProgress.start()\n\n  // set page title\n  document.title = getPageTitle(to.meta.title)\n\n  // determine whether the user has logged in\n  const hasToken = getToken()\n\n  if (hasToken) {\n    if (to.path === '/login') {\n      // if is logged in, redirect to the home page\n      next({ path: '/' })\n      NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939\n    } else {\n      // determine whether the user has obtained his permission roles through getInfo\n      const hasRoles = store.getters.roles && store.getters.roles.length > 0\n      if (hasRoles) {\n        next()\n      } else {\n        try {\n          // get user info\n          // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']\n          const { roles } = await store.dispatch('user/getInfo')\n\n          // generate accessible routes map based on roles\n          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)\n\n          // dynamically add accessible routes\n          router.addRoutes(accessRoutes)\n\n          // hack method to ensure that addRoutes is complete\n          // set the replace: true, so the navigation will not leave a history record\n          next({ ...to, replace: true })\n        } catch (error) {\n          // remove token and go to login page to re-login\n          await store.dispatch('user/resetToken')\n          Message.error(error || 'Has Error')\n          next(`/login?redirect=${to.path}`)\n          NProgress.done()\n        }\n      }\n    }\n  } else {\n    /* has no token*/\n\n    if (whiteList.indexOf(to.path) !== -1) {\n      // in the free login whitelist, go directly\n      next()\n    } else {\n      // other pages that do not have permission to access are redirected to the login page.\n      next(`/login?redirect=${to.path}`)\n      NProgress.done()\n    }\n  }\n})\n\nrouter.afterEach(() => {\n  // finish progress bar\n  NProgress.done()\n})\n"
  },
  {
    "path": "src/router/index.js",
    "content": "import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n/* Layout */\nimport Layout from '@/layout'\n\n/* Router Modules */\nimport componentsRouter from './modules/components'\nimport chartsRouter from './modules/charts'\nimport tableRouter from './modules/table'\nimport nestedRouter from './modules/nested'\n\n/**\n * Note: sub-menu only appear when route children.length >= 1\n * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html\n *\n * hidden: true                   if set true, item will not show in the sidebar(default is false)\n * alwaysShow: true               if set true, will always show the root menu\n *                                if not set alwaysShow, when item has more than one children route,\n *                                it will becomes nested mode, otherwise not show the root menu\n * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb\n * name:'router-name'             the name is used by <keep-alive> (must set!!!)\n * meta : {\n    roles: ['admin','editor']    control the page roles (you can set multiple roles)\n    title: 'title'               the name show in sidebar and breadcrumb (recommend set)\n    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar\n    noCache: true                if set true, the page will no be cached(default is false)\n    affix: true                  if set true, the tag will affix in the tags-view\n    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)\n    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set\n  }\n */\n\n/**\n * constantRoutes\n * a base page that does not have permission requirements\n * all roles can be accessed\n */\nexport const constantRoutes = [\n  {\n    path: '/redirect',\n    component: Layout,\n    hidden: true,\n    children: [\n      {\n        path: '/redirect/:path(.*)',\n        component: () => import('@/views/redirect/index')\n      }\n    ]\n  },\n  {\n    path: '/login',\n    component: () => import('@/views/login/index'),\n    hidden: true\n  },\n  {\n    path: '/auth-redirect',\n    component: () => import('@/views/login/auth-redirect'),\n    hidden: true\n  },\n  {\n    path: '/404',\n    component: () => import('@/views/error-page/404'),\n    hidden: true\n  },\n  {\n    path: '/401',\n    component: () => import('@/views/error-page/401'),\n    hidden: true\n  },\n  {\n    path: '/',\n    component: Layout,\n    redirect: '/dashboard',\n    children: [\n      {\n        path: 'dashboard',\n        component: () => import('@/views/dashboard/index'),\n        name: 'Dashboard',\n        meta: { title: 'Dashboard', icon: 'dashboard', affix: true }\n      }\n    ]\n  },\n  {\n    path: '/documentation',\n    component: Layout,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/documentation/index'),\n        name: 'Documentation',\n        meta: { title: 'Documentation', icon: 'documentation', affix: true }\n      }\n    ]\n  },\n  {\n    path: '/guide',\n    component: Layout,\n    redirect: '/guide/index',\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/guide/index'),\n        name: 'Guide',\n        meta: { title: 'Guide', icon: 'guide', noCache: true }\n      }\n    ]\n  },\n  {\n    path: '/profile',\n    component: Layout,\n    redirect: '/profile/index',\n    hidden: true,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/profile/index'),\n        name: 'Profile',\n        meta: { title: 'Profile', icon: 'user', noCache: true }\n      }\n    ]\n  }\n]\n\n/**\n * asyncRoutes\n * the routes that need to be dynamically loaded based on user roles\n */\nexport const asyncRoutes = [\n  {\n    path: '/permission',\n    component: Layout,\n    redirect: '/permission/page',\n    alwaysShow: true, // will always show the root menu\n    name: 'Permission',\n    meta: {\n      title: 'Permission',\n      icon: 'lock',\n      roles: ['admin', 'editor'] // you can set roles in root nav\n    },\n    children: [\n      {\n        path: 'page',\n        component: () => import('@/views/permission/page'),\n        name: 'PagePermission',\n        meta: {\n          title: 'Page Permission',\n          roles: ['admin'] // or you can only set roles in sub nav\n        }\n      },\n      {\n        path: 'directive',\n        component: () => import('@/views/permission/directive'),\n        name: 'DirectivePermission',\n        meta: {\n          title: 'Directive Permission'\n          // if do not set roles, means: this page does not require permission\n        }\n      },\n      {\n        path: 'role',\n        component: () => import('@/views/permission/role'),\n        name: 'RolePermission',\n        meta: {\n          title: 'Role Permission',\n          roles: ['admin']\n        }\n      }\n    ]\n  },\n\n  {\n    path: '/icon',\n    component: Layout,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/icons/index'),\n        name: 'Icons',\n        meta: { title: 'Icons', icon: 'icon', noCache: true }\n      }\n    ]\n  },\n\n  /** when your routing map is too long, you can split it into small modules **/\n  componentsRouter,\n  chartsRouter,\n  nestedRouter,\n  tableRouter,\n\n  {\n    path: '/example',\n    component: Layout,\n    redirect: '/example/list',\n    name: 'Example',\n    meta: {\n      title: 'Example',\n      icon: 'el-icon-s-help'\n    },\n    children: [\n      {\n        path: 'create',\n        component: () => import('@/views/example/create'),\n        name: 'CreateArticle',\n        meta: { title: 'Create Article', icon: 'edit' }\n      },\n      {\n        path: 'edit/:id(\\\\d+)',\n        component: () => import('@/views/example/edit'),\n        name: 'EditArticle',\n        meta: { title: 'Edit Article', noCache: true, activeMenu: '/example/list' },\n        hidden: true\n      },\n      {\n        path: 'list',\n        component: () => import('@/views/example/list'),\n        name: 'ArticleList',\n        meta: { title: 'Article List', icon: 'list' }\n      }\n    ]\n  },\n\n  {\n    path: '/tab',\n    component: Layout,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/tab/index'),\n        name: 'Tab',\n        meta: { title: 'Tab', icon: 'tab' }\n      }\n    ]\n  },\n\n  {\n    path: '/error',\n    component: Layout,\n    redirect: 'noRedirect',\n    name: 'ErrorPages',\n    meta: {\n      title: 'Error Pages',\n      icon: '404'\n    },\n    children: [\n      {\n        path: '401',\n        component: () => import('@/views/error-page/401'),\n        name: 'Page401',\n        meta: { title: '401', noCache: true }\n      },\n      {\n        path: '404',\n        component: () => import('@/views/error-page/404'),\n        name: 'Page404',\n        meta: { title: '404', noCache: true }\n      }\n    ]\n  },\n\n  {\n    path: '/error-log',\n    component: Layout,\n    children: [\n      {\n        path: 'log',\n        component: () => import('@/views/error-log/index'),\n        name: 'ErrorLog',\n        meta: { title: 'Error Log', icon: 'bug' }\n      }\n    ]\n  },\n\n  {\n    path: '/excel',\n    component: Layout,\n    redirect: '/excel/export-excel',\n    name: 'Excel',\n    meta: {\n      title: 'Excel',\n      icon: 'excel'\n    },\n    children: [\n      {\n        path: 'export-excel',\n        component: () => import('@/views/excel/export-excel'),\n        name: 'ExportExcel',\n        meta: { title: 'Export Excel' }\n      },\n      {\n        path: 'export-selected-excel',\n        component: () => import('@/views/excel/select-excel'),\n        name: 'SelectExcel',\n        meta: { title: 'Export Selected' }\n      },\n      {\n        path: 'export-merge-header',\n        component: () => import('@/views/excel/merge-header'),\n        name: 'MergeHeader',\n        meta: { title: 'Merge Header' }\n      },\n      {\n        path: 'upload-excel',\n        component: () => import('@/views/excel/upload-excel'),\n        name: 'UploadExcel',\n        meta: { title: 'Upload Excel' }\n      }\n    ]\n  },\n\n  {\n    path: '/zip',\n    component: Layout,\n    redirect: '/zip/download',\n    alwaysShow: true,\n    name: 'Zip',\n    meta: { title: 'Zip', icon: 'zip' },\n    children: [\n      {\n        path: 'download',\n        component: () => import('@/views/zip/index'),\n        name: 'ExportZip',\n        meta: { title: 'Export Zip' }\n      }\n    ]\n  },\n\n  {\n    path: '/pdf',\n    component: Layout,\n    redirect: '/pdf/index',\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/pdf/index'),\n        name: 'PDF',\n        meta: { title: 'PDF', icon: 'pdf' }\n      }\n    ]\n  },\n  {\n    path: '/pdf/download',\n    component: () => import('@/views/pdf/download'),\n    hidden: true\n  },\n\n  {\n    path: '/theme',\n    component: Layout,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/theme/index'),\n        name: 'Theme',\n        meta: { title: 'Theme', icon: 'theme' }\n      }\n    ]\n  },\n\n  {\n    path: '/clipboard',\n    component: Layout,\n    children: [\n      {\n        path: 'index',\n        component: () => import('@/views/clipboard/index'),\n        name: 'ClipboardDemo',\n        meta: { title: 'Clipboard', icon: 'clipboard' }\n      }\n    ]\n  },\n\n  {\n    path: 'external-link',\n    component: Layout,\n    children: [\n      {\n        path: 'https://github.com/PanJiaChen/vue-element-admin',\n        meta: { title: 'External Link', icon: 'link' }\n      }\n    ]\n  },\n\n  // 404 page must be placed at the end !!!\n  { path: '*', redirect: '/404', hidden: true }\n]\n\nconst createRouter = () => new Router({\n  // mode: 'history', // require service support\n  scrollBehavior: () => ({ y: 0 }),\n  routes: constantRoutes\n})\n\nconst router = createRouter()\n\n// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465\nexport function resetRouter() {\n  const newRouter = createRouter()\n  router.matcher = newRouter.matcher // reset router\n}\n\nexport default router\n"
  },
  {
    "path": "src/router/modules/charts.js",
    "content": "/** When your routing table is too long, you can split it into small modules**/\n\nimport Layout from '@/layout'\n\nconst chartsRouter = {\n  path: '/charts',\n  component: Layout,\n  redirect: 'noRedirect',\n  name: 'Charts',\n  meta: {\n    title: 'Charts',\n    icon: 'chart'\n  },\n  children: [\n    {\n      path: 'keyboard',\n      component: () => import('@/views/charts/keyboard'),\n      name: 'KeyboardChart',\n      meta: { title: 'Keyboard Chart', noCache: true }\n    },\n    {\n      path: 'line',\n      component: () => import('@/views/charts/line'),\n      name: 'LineChart',\n      meta: { title: 'Line Chart', noCache: true }\n    },\n    {\n      path: 'mix-chart',\n      component: () => import('@/views/charts/mix-chart'),\n      name: 'MixChart',\n      meta: { title: 'Mix Chart', noCache: true }\n    }\n  ]\n}\n\nexport default chartsRouter\n"
  },
  {
    "path": "src/router/modules/components.js",
    "content": "/** When your routing table is too long, you can split it into small modules **/\n\nimport Layout from '@/layout'\n\nconst componentsRouter = {\n  path: '/components',\n  component: Layout,\n  redirect: 'noRedirect',\n  name: 'ComponentDemo',\n  meta: {\n    title: 'Components',\n    icon: 'component'\n  },\n  children: [\n    {\n      path: 'tinymce',\n      component: () => import('@/views/components-demo/tinymce'),\n      name: 'TinymceDemo',\n      meta: { title: 'Tinymce' }\n    },\n    {\n      path: 'markdown',\n      component: () => import('@/views/components-demo/markdown'),\n      name: 'MarkdownDemo',\n      meta: { title: 'Markdown' }\n    },\n    {\n      path: 'json-editor',\n      component: () => import('@/views/components-demo/json-editor'),\n      name: 'JsonEditorDemo',\n      meta: { title: 'JSON Editor' }\n    },\n    {\n      path: 'split-pane',\n      component: () => import('@/views/components-demo/split-pane'),\n      name: 'SplitpaneDemo',\n      meta: { title: 'SplitPane' }\n    },\n    {\n      path: 'avatar-upload',\n      component: () => import('@/views/components-demo/avatar-upload'),\n      name: 'AvatarUploadDemo',\n      meta: { title: 'Upload' }\n    },\n    {\n      path: 'dropzone',\n      component: () => import('@/views/components-demo/dropzone'),\n      name: 'DropzoneDemo',\n      meta: { title: 'Dropzone' }\n    },\n    {\n      path: 'sticky',\n      component: () => import('@/views/components-demo/sticky'),\n      name: 'StickyDemo',\n      meta: { title: 'Sticky' }\n    },\n    {\n      path: 'count-to',\n      component: () => import('@/views/components-demo/count-to'),\n      name: 'CountToDemo',\n      meta: { title: 'Count To' }\n    },\n    {\n      path: 'mixin',\n      component: () => import('@/views/components-demo/mixin'),\n      name: 'ComponentMixinDemo',\n      meta: { title: 'Component Mixin' }\n    },\n    {\n      path: 'back-to-top',\n      component: () => import('@/views/components-demo/back-to-top'),\n      name: 'BackToTopDemo',\n      meta: { title: 'Back To Top' }\n    },\n    {\n      path: 'drag-dialog',\n      component: () => import('@/views/components-demo/drag-dialog'),\n      name: 'DragDialogDemo',\n      meta: { title: 'Drag Dialog' }\n    },\n    {\n      path: 'drag-select',\n      component: () => import('@/views/components-demo/drag-select'),\n      name: 'DragSelectDemo',\n      meta: { title: 'Drag Select' }\n    },\n    {\n      path: 'dnd-list',\n      component: () => import('@/views/components-demo/dnd-list'),\n      name: 'DndListDemo',\n      meta: { title: 'Dnd List' }\n    },\n    {\n      path: 'drag-kanban',\n      component: () => import('@/views/components-demo/drag-kanban'),\n      name: 'DragKanbanDemo',\n      meta: { title: 'Drag Kanban' }\n    }\n  ]\n}\n\nexport default componentsRouter\n"
  },
  {
    "path": "src/router/modules/nested.js",
    "content": "/** When your routing table is too long, you can split it into small modules **/\n\nimport Layout from '@/layout'\n\nconst nestedRouter = {\n  path: '/nested',\n  component: Layout,\n  redirect: '/nested/menu1/menu1-1',\n  name: 'Nested',\n  meta: {\n    title: 'Nested Routes',\n    icon: 'nested'\n  },\n  children: [\n    {\n      path: 'menu1',\n      component: () => import('@/views/nested/menu1/index'), // Parent router-view\n      name: 'Menu1',\n      meta: { title: 'Menu 1' },\n      redirect: '/nested/menu1/menu1-1',\n      children: [\n        {\n          path: 'menu1-1',\n          component: () => import('@/views/nested/menu1/menu1-1'),\n          name: 'Menu1-1',\n          meta: { title: 'Menu 1-1' }\n        },\n        {\n          path: 'menu1-2',\n          component: () => import('@/views/nested/menu1/menu1-2'),\n          name: 'Menu1-2',\n          redirect: '/nested/menu1/menu1-2/menu1-2-1',\n          meta: { title: 'Menu 1-2' },\n          children: [\n            {\n              path: 'menu1-2-1',\n              component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),\n              name: 'Menu1-2-1',\n              meta: { title: 'Menu 1-2-1' }\n            },\n            {\n              path: 'menu1-2-2',\n              component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),\n              name: 'Menu1-2-2',\n              meta: { title: 'Menu 1-2-2' }\n            }\n          ]\n        },\n        {\n          path: 'menu1-3',\n          component: () => import('@/views/nested/menu1/menu1-3'),\n          name: 'Menu1-3',\n          meta: { title: 'Menu 1-3' }\n        }\n      ]\n    },\n    {\n      path: 'menu2',\n      name: 'Menu2',\n      component: () => import('@/views/nested/menu2/index'),\n      meta: { title: 'Menu 2' }\n    }\n  ]\n}\n\nexport default nestedRouter\n"
  },
  {
    "path": "src/router/modules/table.js",
    "content": "/** When your routing table is too long, you can split it into small modules **/\n\nimport Layout from '@/layout'\n\nconst tableRouter = {\n  path: '/table',\n  component: Layout,\n  redirect: '/table/complex-table',\n  name: 'Table',\n  meta: {\n    title: 'Table',\n    icon: 'table'\n  },\n  children: [\n    {\n      path: 'dynamic-table',\n      component: () => import('@/views/table/dynamic-table/index'),\n      name: 'DynamicTable',\n      meta: { title: 'Dynamic Table' }\n    },\n    {\n      path: 'drag-table',\n      component: () => import('@/views/table/drag-table'),\n      name: 'DragTable',\n      meta: { title: 'Drag Table' }\n    },\n    {\n      path: 'inline-edit-table',\n      component: () => import('@/views/table/inline-edit-table'),\n      name: 'InlineEditTable',\n      meta: { title: 'Inline Edit' }\n    },\n    {\n      path: 'complex-table',\n      component: () => import('@/views/table/complex-table'),\n      name: 'ComplexTable',\n      meta: { title: 'Complex Table' }\n    }\n  ]\n}\nexport default tableRouter\n"
  },
  {
    "path": "src/settings.js",
    "content": "module.exports = {\n  title: 'Vue Element Admin',\n\n  /**\n   * @type {boolean} true | false\n   * @description Whether show the settings right-panel\n   */\n  showSettings: true,\n\n  /**\n   * @type {boolean} true | false\n   * @description Whether need tagsView\n   */\n  tagsView: true,\n\n  /**\n   * @type {boolean} true | false\n   * @description Whether fix the header\n   */\n  fixedHeader: false,\n\n  /**\n   * @type {boolean} true | false\n   * @description Whether show the logo in sidebar\n   */\n  sidebarLogo: false,\n\n  /**\n   * @type {string | array} 'production' | ['production', 'development']\n   * @description Need show err logs component.\n   * The default is only used in the production env\n   * If you want to also use it in dev, you can pass ['production', 'development']\n   */\n  errorLog: 'production'\n}\n"
  },
  {
    "path": "src/store/getters.js",
    "content": "const getters = {\n  sidebar: state => state.app.sidebar,\n  size: state => state.app.size,\n  device: state => state.app.device,\n  visitedViews: state => state.tagsView.visitedViews,\n  cachedViews: state => state.tagsView.cachedViews,\n  token: state => state.user.token,\n  avatar: state => state.user.avatar,\n  name: state => state.user.name,\n  introduction: state => state.user.introduction,\n  roles: state => state.user.roles,\n  permission_routes: state => state.permission.routes,\n  errorLogs: state => state.errorLog.logs\n}\nexport default getters\n"
  },
  {
    "path": "src/store/index.js",
    "content": "import Vue from 'vue'\nimport Vuex from 'vuex'\nimport getters from './getters'\n\nVue.use(Vuex)\n\n// https://webpack.js.org/guides/dependency-management/#requirecontext\nconst modulesFiles = require.context('./modules', true, /\\.js$/)\n\n// you do not need `import app from './modules/app'`\n// it will auto require all vuex module from modules file\nconst modules = modulesFiles.keys().reduce((modules, modulePath) => {\n  // set './app.js' => 'app'\n  const moduleName = modulePath.replace(/^\\.\\/(.*)\\.\\w+$/, '$1')\n  const value = modulesFiles(modulePath)\n  modules[moduleName] = value.default\n  return modules\n}, {})\n\nconst store = new Vuex.Store({\n  modules,\n  getters\n})\n\nexport default store\n"
  },
  {
    "path": "src/store/modules/app.js",
    "content": "import Cookies from 'js-cookie'\n\nconst state = {\n  sidebar: {\n    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,\n    withoutAnimation: false\n  },\n  device: 'desktop',\n  size: Cookies.get('size') || 'medium'\n}\n\nconst mutations = {\n  TOGGLE_SIDEBAR: state => {\n    state.sidebar.opened = !state.sidebar.opened\n    state.sidebar.withoutAnimation = false\n    if (state.sidebar.opened) {\n      Cookies.set('sidebarStatus', 1)\n    } else {\n      Cookies.set('sidebarStatus', 0)\n    }\n  },\n  CLOSE_SIDEBAR: (state, withoutAnimation) => {\n    Cookies.set('sidebarStatus', 0)\n    state.sidebar.opened = false\n    state.sidebar.withoutAnimation = withoutAnimation\n  },\n  TOGGLE_DEVICE: (state, device) => {\n    state.device = device\n  },\n  SET_SIZE: (state, size) => {\n    state.size = size\n    Cookies.set('size', size)\n  }\n}\n\nconst actions = {\n  toggleSideBar({ commit }) {\n    commit('TOGGLE_SIDEBAR')\n  },\n  closeSideBar({ commit }, { withoutAnimation }) {\n    commit('CLOSE_SIDEBAR', withoutAnimation)\n  },\n  toggleDevice({ commit }, device) {\n    commit('TOGGLE_DEVICE', device)\n  },\n  setSize({ commit }, size) {\n    commit('SET_SIZE', size)\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n"
  },
  {
    "path": "src/store/modules/errorLog.js",
    "content": "const state = {\n  logs: []\n}\n\nconst mutations = {\n  ADD_ERROR_LOG: (state, log) => {\n    state.logs.push(log)\n  },\n  CLEAR_ERROR_LOG: (state) => {\n    state.logs.splice(0)\n  }\n}\n\nconst actions = {\n  addErrorLog({ commit }, log) {\n    commit('ADD_ERROR_LOG', log)\n  },\n  clearErrorLog({ commit }) {\n    commit('CLEAR_ERROR_LOG')\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n"
  },
  {
    "path": "src/store/modules/permission.js",
    "content": "import { asyncRoutes, constantRoutes } from '@/router'\n\n/**\n * Use meta.role to determine if the current user has permission\n * @param roles\n * @param route\n */\nfunction hasPermission(roles, route) {\n  if (route.meta && route.meta.roles) {\n    return roles.some(role => route.meta.roles.includes(role))\n  } else {\n    return true\n  }\n}\n\n/**\n * Filter asynchronous routing tables by recursion\n * @param routes asyncRoutes\n * @param roles\n */\nexport function filterAsyncRoutes(routes, roles) {\n  const res = []\n\n  routes.forEach(route => {\n    const tmp = { ...route }\n    if (hasPermission(roles, tmp)) {\n      if (tmp.children) {\n        tmp.children = filterAsyncRoutes(tmp.children, roles)\n      }\n      res.push(tmp)\n    }\n  })\n\n  return res\n}\n\nconst state = {\n  routes: [],\n  addRoutes: []\n}\n\nconst mutations = {\n  SET_ROUTES: (state, routes) => {\n    state.addRoutes = routes\n    state.routes = constantRoutes.concat(routes)\n  }\n}\n\nconst actions = {\n  generateRoutes({ commit }, roles) {\n    return new Promise(resolve => {\n      let accessedRoutes\n      if (roles.includes('admin')) {\n        accessedRoutes = asyncRoutes || []\n      } else {\n        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)\n      }\n      commit('SET_ROUTES', accessedRoutes)\n      resolve(accessedRoutes)\n    })\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n"
  },
  {
    "path": "src/store/modules/settings.js",
    "content": "import variables from '@/styles/element-variables.scss'\nimport defaultSettings from '@/settings'\n\nconst { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings\n\nconst state = {\n  theme: variables.theme,\n  showSettings: showSettings,\n  tagsView: tagsView,\n  fixedHeader: fixedHeader,\n  sidebarLogo: sidebarLogo\n}\n\nconst mutations = {\n  CHANGE_SETTING: (state, { key, value }) => {\n    // eslint-disable-next-line no-prototype-builtins\n    if (state.hasOwnProperty(key)) {\n      state[key] = value\n    }\n  }\n}\n\nconst actions = {\n  changeSetting({ commit }, data) {\n    commit('CHANGE_SETTING', data)\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n\n"
  },
  {
    "path": "src/store/modules/tagsView.js",
    "content": "const state = {\n  visitedViews: [],\n  cachedViews: []\n}\n\nconst mutations = {\n  ADD_VISITED_VIEW: (state, view) => {\n    if (state.visitedViews.some(v => v.path === view.path)) return\n    state.visitedViews.push(\n      Object.assign({}, view, {\n        title: view.meta.title || 'no-name'\n      })\n    )\n  },\n  ADD_CACHED_VIEW: (state, view) => {\n    if (state.cachedViews.includes(view.name)) return\n    if (!view.meta.noCache) {\n      state.cachedViews.push(view.name)\n    }\n  },\n\n  DEL_VISITED_VIEW: (state, view) => {\n    for (const [i, v] of state.visitedViews.entries()) {\n      if (v.path === view.path) {\n        state.visitedViews.splice(i, 1)\n        break\n      }\n    }\n  },\n  DEL_CACHED_VIEW: (state, view) => {\n    const index = state.cachedViews.indexOf(view.name)\n    index > -1 && state.cachedViews.splice(index, 1)\n  },\n\n  DEL_OTHERS_VISITED_VIEWS: (state, view) => {\n    state.visitedViews = state.visitedViews.filter(v => {\n      return v.meta.affix || v.path === view.path\n    })\n  },\n  DEL_OTHERS_CACHED_VIEWS: (state, view) => {\n    const index = state.cachedViews.indexOf(view.name)\n    if (index > -1) {\n      state.cachedViews = state.cachedViews.slice(index, index + 1)\n    } else {\n      // if index = -1, there is no cached tags\n      state.cachedViews = []\n    }\n  },\n\n  DEL_ALL_VISITED_VIEWS: state => {\n    // keep affix tags\n    const affixTags = state.visitedViews.filter(tag => tag.meta.affix)\n    state.visitedViews = affixTags\n  },\n  DEL_ALL_CACHED_VIEWS: state => {\n    state.cachedViews = []\n  },\n\n  UPDATE_VISITED_VIEW: (state, view) => {\n    for (let v of state.visitedViews) {\n      if (v.path === view.path) {\n        v = Object.assign(v, view)\n        break\n      }\n    }\n  }\n}\n\nconst actions = {\n  addView({ dispatch }, view) {\n    dispatch('addVisitedView', view)\n    dispatch('addCachedView', view)\n  },\n  addVisitedView({ commit }, view) {\n    commit('ADD_VISITED_VIEW', view)\n  },\n  addCachedView({ commit }, view) {\n    commit('ADD_CACHED_VIEW', view)\n  },\n\n  delView({ dispatch, state }, view) {\n    return new Promise(resolve => {\n      dispatch('delVisitedView', view)\n      dispatch('delCachedView', view)\n      resolve({\n        visitedViews: [...state.visitedViews],\n        cachedViews: [...state.cachedViews]\n      })\n    })\n  },\n  delVisitedView({ commit, state }, view) {\n    return new Promise(resolve => {\n      commit('DEL_VISITED_VIEW', view)\n      resolve([...state.visitedViews])\n    })\n  },\n  delCachedView({ commit, state }, view) {\n    return new Promise(resolve => {\n      commit('DEL_CACHED_VIEW', view)\n      resolve([...state.cachedViews])\n    })\n  },\n\n  delOthersViews({ dispatch, state }, view) {\n    return new Promise(resolve => {\n      dispatch('delOthersVisitedViews', view)\n      dispatch('delOthersCachedViews', view)\n      resolve({\n        visitedViews: [...state.visitedViews],\n        cachedViews: [...state.cachedViews]\n      })\n    })\n  },\n  delOthersVisitedViews({ commit, state }, view) {\n    return new Promise(resolve => {\n      commit('DEL_OTHERS_VISITED_VIEWS', view)\n      resolve([...state.visitedViews])\n    })\n  },\n  delOthersCachedViews({ commit, state }, view) {\n    return new Promise(resolve => {\n      commit('DEL_OTHERS_CACHED_VIEWS', view)\n      resolve([...state.cachedViews])\n    })\n  },\n\n  delAllViews({ dispatch, state }, view) {\n    return new Promise(resolve => {\n      dispatch('delAllVisitedViews', view)\n      dispatch('delAllCachedViews', view)\n      resolve({\n        visitedViews: [...state.visitedViews],\n        cachedViews: [...state.cachedViews]\n      })\n    })\n  },\n  delAllVisitedViews({ commit, state }) {\n    return new Promise(resolve => {\n      commit('DEL_ALL_VISITED_VIEWS')\n      resolve([...state.visitedViews])\n    })\n  },\n  delAllCachedViews({ commit, state }) {\n    return new Promise(resolve => {\n      commit('DEL_ALL_CACHED_VIEWS')\n      resolve([...state.cachedViews])\n    })\n  },\n\n  updateVisitedView({ commit }, view) {\n    commit('UPDATE_VISITED_VIEW', view)\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n"
  },
  {
    "path": "src/store/modules/user.js",
    "content": "import { login, logout, getInfo } from '@/api/user'\nimport { getToken, setToken, removeToken } from '@/utils/auth'\nimport router, { resetRouter } from '@/router'\n\nconst state = {\n  token: getToken(),\n  name: '',\n  avatar: '',\n  introduction: '',\n  roles: []\n}\n\nconst mutations = {\n  SET_TOKEN: (state, token) => {\n    state.token = token\n  },\n  SET_INTRODUCTION: (state, introduction) => {\n    state.introduction = introduction\n  },\n  SET_NAME: (state, name) => {\n    state.name = name\n  },\n  SET_AVATAR: (state, avatar) => {\n    state.avatar = avatar\n  },\n  SET_ROLES: (state, roles) => {\n    state.roles = roles\n  }\n}\n\nconst actions = {\n  // user login\n  login({ commit }, userInfo) {\n    const { username, password } = userInfo\n    return new Promise((resolve, reject) => {\n      login({ username: username.trim(), password: password }).then(response => {\n        const { data } = response\n        commit('SET_TOKEN', data.token)\n        setToken(data.token)\n        resolve()\n      }).catch(error => {\n        reject(error)\n      })\n    })\n  },\n\n  // get user info\n  getInfo({ commit, state }) {\n    return new Promise((resolve, reject) => {\n      getInfo(state.token).then(response => {\n        const { data } = response\n\n        if (!data) {\n          reject('Verification failed, please Login again.')\n        }\n\n        const { roles, name, avatar, introduction } = data\n\n        // roles must be a non-empty array\n        if (!roles || roles.length <= 0) {\n          reject('getInfo: roles must be a non-null array!')\n        }\n\n        commit('SET_ROLES', roles)\n        commit('SET_NAME', name)\n        commit('SET_AVATAR', avatar)\n        commit('SET_INTRODUCTION', introduction)\n        resolve(data)\n      }).catch(error => {\n        reject(error)\n      })\n    })\n  },\n\n  // user logout\n  logout({ commit, state, dispatch }) {\n    return new Promise((resolve, reject) => {\n      logout(state.token).then(() => {\n        commit('SET_TOKEN', '')\n        commit('SET_ROLES', [])\n        removeToken()\n        resetRouter()\n\n        // reset visited views and cached views\n        // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485\n        dispatch('tagsView/delAllViews', null, { root: true })\n\n        resolve()\n      }).catch(error => {\n        reject(error)\n      })\n    })\n  },\n\n  // remove token\n  resetToken({ commit }) {\n    return new Promise(resolve => {\n      commit('SET_TOKEN', '')\n      commit('SET_ROLES', [])\n      removeToken()\n      resolve()\n    })\n  },\n\n  // dynamically modify permissions\n  async changeRoles({ commit, dispatch }, role) {\n    const token = role + '-token'\n\n    commit('SET_TOKEN', token)\n    setToken(token)\n\n    const { roles } = await dispatch('getInfo')\n\n    resetRouter()\n\n    // generate accessible routes map based on roles\n    const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })\n    // dynamically add accessible routes\n    router.addRoutes(accessRoutes)\n\n    // reset visited views and cached views\n    dispatch('tagsView/delAllViews', null, { root: true })\n  }\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions\n}\n"
  },
  {
    "path": "src/styles/btn.scss",
    "content": "@import './variables.scss';\n\n@mixin colorBtn($color) {\n  background: $color;\n\n  &:hover {\n    color: $color;\n\n    &:before,\n    &:after {\n      background: $color;\n    }\n  }\n}\n\n.blue-btn {\n  @include colorBtn($blue)\n}\n\n.light-blue-btn {\n  @include colorBtn($light-blue)\n}\n\n.red-btn {\n  @include colorBtn($red)\n}\n\n.pink-btn {\n  @include colorBtn($pink)\n}\n\n.green-btn {\n  @include colorBtn($green)\n}\n\n.tiffany-btn {\n  @include colorBtn($tiffany)\n}\n\n.yellow-btn {\n  @include colorBtn($yellow)\n}\n\n.pan-btn {\n  font-size: 14px;\n  color: #fff;\n  padding: 14px 36px;\n  border-radius: 8px;\n  border: none;\n  outline: none;\n  transition: 600ms ease all;\n  position: relative;\n  display: inline-block;\n\n  &:hover {\n    background: #fff;\n\n    &:before,\n    &:after {\n      width: 100%;\n      transition: 600ms ease all;\n    }\n  }\n\n  &:before,\n  &:after {\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    height: 2px;\n    width: 0;\n    transition: 400ms ease all;\n  }\n\n  &::after {\n    right: inherit;\n    top: inherit;\n    left: 0;\n    bottom: 0;\n  }\n}\n\n.custom-button {\n  display: inline-block;\n  line-height: 1;\n  white-space: nowrap;\n  cursor: pointer;\n  background: #fff;\n  color: #fff;\n  -webkit-appearance: none;\n  text-align: center;\n  box-sizing: border-box;\n  outline: 0;\n  margin: 0;\n  padding: 10px 15px;\n  font-size: 14px;\n  border-radius: 4px;\n}\n"
  },
  {
    "path": "src/styles/element-ui.scss",
    "content": "// cover some element-ui styles\n\n.el-breadcrumb__inner,\n.el-breadcrumb__inner a {\n  font-weight: 400 !important;\n}\n\n.el-upload {\n  input[type=\"file\"] {\n    display: none !important;\n  }\n}\n\n.el-upload__input {\n  display: none;\n}\n\n.cell {\n  .el-tag {\n    margin-right: 0px;\n  }\n}\n\n.small-padding {\n  .cell {\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n.fixed-width {\n  .el-button--mini {\n    padding: 7px 10px;\n    min-width: 60px;\n  }\n}\n\n.status-col {\n  .cell {\n    padding: 0 10px;\n    text-align: center;\n\n    .el-tag {\n      margin-right: 0px;\n    }\n  }\n}\n\n// to fixed https://github.com/ElemeFE/element/issues/2461\n.el-dialog {\n  transform: none;\n  left: 0;\n  position: relative;\n  margin: 0 auto;\n}\n\n// refine element ui upload\n.upload-container {\n  .el-upload {\n    width: 100%;\n\n    .el-upload-dragger {\n      width: 100%;\n      height: 200px;\n    }\n  }\n}\n\n// dropdown\n.el-dropdown-menu {\n  a {\n    display: block\n  }\n}\n\n// fix date-picker ui bug in filter-item\n.el-range-editor.el-input__inner {\n  display: inline-flex !important;\n}\n\n// to fix el-date-picker css style\n.el-range-separator {\n  box-sizing: content-box;\n}\n"
  },
  {
    "path": "src/styles/element-variables.scss",
    "content": "/**\n* I think element-ui's default theme color is too light for long-term use.\n* So I modified the default color and you can modify it to your liking.\n**/\n\n/* theme color */\n$--color-primary: #1890ff;\n$--color-success: #13ce66;\n$--color-warning: #ffba00;\n$--color-danger: #ff4949;\n// $--color-info: #1E1E1E;\n\n$--button-font-weight: 400;\n\n// $--color-text-regular: #1f2d3d;\n\n$--border-color-light: #dfe4ed;\n$--border-color-lighter: #e6ebf5;\n\n$--table-border: 1px solid #dfe6ec;\n\n/* icon font path, required */\n$--font-path: \"~element-ui/lib/theme-chalk/fonts\";\n\n@import \"~element-ui/packages/theme-chalk/src/index\";\n\n// the :export directive is the magic sauce for webpack\n// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass\n:export {\n  theme: $--color-primary;\n}\n"
  },
  {
    "path": "src/styles/index.scss",
    "content": "@import './variables.scss';\n@import './mixin.scss';\n@import './transition.scss';\n@import './element-ui.scss';\n@import './sidebar.scss';\n@import './btn.scss';\n\nbody {\n  height: 100%;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;\n}\n\nlabel {\n  font-weight: 700;\n}\n\nhtml {\n  height: 100%;\n  box-sizing: border-box;\n}\n\n#app {\n  height: 100%;\n}\n\n*,\n*:before,\n*:after {\n  box-sizing: inherit;\n}\n\n.no-padding {\n  padding: 0px !important;\n}\n\n.padding-content {\n  padding: 4px 0;\n}\n\na:focus,\na:active {\n  outline: none;\n}\n\na,\na:focus,\na:hover {\n  cursor: pointer;\n  color: inherit;\n  text-decoration: none;\n}\n\ndiv:focus {\n  outline: none;\n}\n\n.fr {\n  float: right;\n}\n\n.fl {\n  float: left;\n}\n\n.pr-5 {\n  padding-right: 5px;\n}\n\n.pl-5 {\n  padding-left: 5px;\n}\n\n.block {\n  display: block;\n}\n\n.pointer {\n  cursor: pointer;\n}\n\n.inlineBlock {\n  display: block;\n}\n\n.clearfix {\n  &:after {\n    visibility: hidden;\n    display: block;\n    font-size: 0;\n    content: \" \";\n    clear: both;\n    height: 0;\n  }\n}\n\naside {\n  background: #eef1f6;\n  padding: 8px 24px;\n  margin-bottom: 20px;\n  border-radius: 2px;\n  display: block;\n  line-height: 32px;\n  font-size: 16px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n  color: #2c3e50;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  a {\n    color: #337ab7;\n    cursor: pointer;\n\n    &:hover {\n      color: rgb(32, 160, 255);\n    }\n  }\n}\n\n//main-container全局样式\n.app-container {\n  padding: 20px;\n}\n\n.components-container {\n  margin: 30px 50px;\n  position: relative;\n}\n\n.pagination-container {\n  margin-top: 30px;\n}\n\n.text-center {\n  text-align: center\n}\n\n.sub-navbar {\n  height: 50px;\n  line-height: 50px;\n  position: relative;\n  width: 100%;\n  text-align: right;\n  padding-right: 20px;\n  transition: 600ms ease position;\n  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);\n\n  .subtitle {\n    font-size: 20px;\n    color: #fff;\n  }\n\n  &.draft {\n    background: #d0d0d0;\n  }\n\n  &.deleted {\n    background: #d0d0d0;\n  }\n}\n\n.link-type,\n.link-type:focus {\n  color: #337ab7;\n  cursor: pointer;\n\n  &:hover {\n    color: rgb(32, 160, 255);\n  }\n}\n\n.filter-container {\n  padding-bottom: 10px;\n\n  .filter-item {\n    display: inline-block;\n    vertical-align: middle;\n    margin-bottom: 10px;\n  }\n}\n\n//refine vue-multiselect plugin\n.multiselect {\n  line-height: 16px;\n}\n\n.multiselect--active {\n  z-index: 1000 !important;\n}\n"
  },
  {
    "path": "src/styles/mixin.scss",
    "content": "@mixin clearfix {\n  &:after {\n    content: \"\";\n    display: table;\n    clear: both;\n  }\n}\n\n@mixin scrollBar {\n  &::-webkit-scrollbar-track-piece {\n    background: #d3dce6;\n  }\n\n  &::-webkit-scrollbar {\n    width: 6px;\n  }\n\n  &::-webkit-scrollbar-thumb {\n    background: #99a9bf;\n    border-radius: 20px;\n  }\n}\n\n@mixin relative {\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n@mixin pct($pct) {\n  width: #{$pct};\n  position: relative;\n  margin: 0 auto;\n}\n\n@mixin triangle($width, $height, $color, $direction) {\n  $width: $width/2;\n  $color-border-style: $height solid $color;\n  $transparent-border-style: $width solid transparent;\n  height: 0;\n  width: 0;\n\n  @if $direction==up {\n    border-bottom: $color-border-style;\n    border-left: $transparent-border-style;\n    border-right: $transparent-border-style;\n  }\n\n  @else if $direction==right {\n    border-left: $color-border-style;\n    border-top: $transparent-border-style;\n    border-bottom: $transparent-border-style;\n  }\n\n  @else if $direction==down {\n    border-top: $color-border-style;\n    border-left: $transparent-border-style;\n    border-right: $transparent-border-style;\n  }\n\n  @else if $direction==left {\n    border-right: $color-border-style;\n    border-top: $transparent-border-style;\n    border-bottom: $transparent-border-style;\n  }\n}\n"
  },
  {
    "path": "src/styles/sidebar.scss",
    "content": "#app {\n\n  .main-container {\n    min-height: 100%;\n    transition: margin-left .28s;\n    margin-left: $sideBarWidth;\n    position: relative;\n  }\n\n  .sidebar-container {\n    transition: width 0.28s;\n    width: $sideBarWidth !important;\n    background-color: $menuBg;\n    height: 100%;\n    position: fixed;\n    font-size: 0px;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 1001;\n    overflow: hidden;\n\n    // reset element-ui css\n    .horizontal-collapse-transition {\n      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;\n    }\n\n    .scrollbar-wrapper {\n      overflow-x: hidden !important;\n    }\n\n    .el-scrollbar__bar.is-vertical {\n      right: 0px;\n    }\n\n    .el-scrollbar {\n      height: 100%;\n    }\n\n    &.has-logo {\n      .el-scrollbar {\n        height: calc(100% - 50px);\n      }\n    }\n\n    .is-horizontal {\n      display: none;\n    }\n\n    a {\n      display: inline-block;\n      width: 100%;\n      overflow: hidden;\n    }\n\n    .svg-icon {\n      margin-right: 16px;\n    }\n\n    .sub-el-icon {\n      margin-right: 12px;\n      margin-left: -2px;\n    }\n\n    .el-menu {\n      border: none;\n      height: 100%;\n      width: 100% !important;\n    }\n\n    // menu hover\n    .submenu-title-noDropdown,\n    .el-submenu__title {\n      &:hover {\n        background-color: $menuHover !important;\n      }\n    }\n\n    .is-active>.el-submenu__title {\n      color: $subMenuActiveText !important;\n    }\n\n    & .nest-menu .el-submenu>.el-submenu__title,\n    & .el-submenu .el-menu-item {\n      min-width: $sideBarWidth !important;\n      background-color: $subMenuBg !important;\n\n      &:hover {\n        background-color: $subMenuHover !important;\n      }\n    }\n  }\n\n  .hideSidebar {\n    .sidebar-container {\n      width: 54px !important;\n    }\n\n    .main-container {\n      margin-left: 54px;\n    }\n\n    .submenu-title-noDropdown {\n      padding: 0 !important;\n      position: relative;\n\n      .el-tooltip {\n        padding: 0 !important;\n\n        .svg-icon {\n          margin-left: 20px;\n        }\n\n        .sub-el-icon {\n          margin-left: 19px;\n        }\n      }\n    }\n\n    .el-submenu {\n      overflow: hidden;\n\n      &>.el-submenu__title {\n        padding: 0 !important;\n\n        .svg-icon {\n          margin-left: 20px;\n        }\n\n        .sub-el-icon {\n          margin-left: 19px;\n        }\n\n        .el-submenu__icon-arrow {\n          display: none;\n        }\n      }\n    }\n\n    .el-menu--collapse {\n      .el-submenu {\n        &>.el-submenu__title {\n          &>span {\n            height: 0;\n            width: 0;\n            overflow: hidden;\n            visibility: hidden;\n            display: inline-block;\n          }\n        }\n      }\n    }\n  }\n\n  .el-menu--collapse .el-menu .el-submenu {\n    min-width: $sideBarWidth !important;\n  }\n\n  // mobile responsive\n  .mobile {\n    .main-container {\n      margin-left: 0px;\n    }\n\n    .sidebar-container {\n      transition: transform .28s;\n      width: $sideBarWidth !important;\n    }\n\n    &.hideSidebar {\n      .sidebar-container {\n        pointer-events: none;\n        transition-duration: 0.3s;\n        transform: translate3d(-$sideBarWidth, 0, 0);\n      }\n    }\n  }\n\n  .withoutAnimation {\n\n    .main-container,\n    .sidebar-container {\n      transition: none;\n    }\n  }\n}\n\n// when menu collapsed\n.el-menu--vertical {\n  &>.el-menu {\n    .svg-icon {\n      margin-right: 16px;\n    }\n    .sub-el-icon {\n      margin-right: 12px;\n      margin-left: -2px;\n    }\n  }\n\n  .nest-menu .el-submenu>.el-submenu__title,\n  .el-menu-item {\n    &:hover {\n      // you can use $subMenuHover\n      background-color: $menuHover !important;\n    }\n  }\n\n  // the scroll bar appears when the subMenu is too long\n  >.el-menu--popup {\n    max-height: 100vh;\n    overflow-y: auto;\n\n    &::-webkit-scrollbar-track-piece {\n      background: #d3dce6;\n    }\n\n    &::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    &::-webkit-scrollbar-thumb {\n      background: #99a9bf;\n      border-radius: 20px;\n    }\n  }\n}\n"
  },
  {
    "path": "src/styles/transition.scss",
    "content": "// global transition css\n\n/* fade */\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.28s;\n}\n\n.fade-enter,\n.fade-leave-active {\n  opacity: 0;\n}\n\n/* fade-transform */\n.fade-transform-leave-active,\n.fade-transform-enter-active {\n  transition: all .5s;\n}\n\n.fade-transform-enter {\n  opacity: 0;\n  transform: translateX(-30px);\n}\n\n.fade-transform-leave-to {\n  opacity: 0;\n  transform: translateX(30px);\n}\n\n/* breadcrumb transition */\n.breadcrumb-enter-active,\n.breadcrumb-leave-active {\n  transition: all .5s;\n}\n\n.breadcrumb-enter,\n.breadcrumb-leave-active {\n  opacity: 0;\n  transform: translateX(20px);\n}\n\n.breadcrumb-move {\n  transition: all .5s;\n}\n\n.breadcrumb-leave-active {\n  position: absolute;\n}\n"
  },
  {
    "path": "src/styles/variables.scss",
    "content": "// base color\n$blue:#324157;\n$light-blue:#3A71A8;\n$red:#C03639;\n$pink: #E65D6E;\n$green: #30B08F;\n$tiffany: #4AB7BD;\n$yellow:#FEC171;\n$panGreen: #30B08F;\n\n// sidebar\n$menuText:#bfcbd9;\n$menuActiveText:#409EFF;\n$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951\n\n$menuBg:#304156;\n$menuHover:#263445;\n\n$subMenuBg:#1f2d3d;\n$subMenuHover:#001528;\n\n$sideBarWidth: 210px;\n\n// the :export directive is the magic sauce for webpack\n// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass\n:export {\n  menuText: $menuText;\n  menuActiveText: $menuActiveText;\n  subMenuActiveText: $subMenuActiveText;\n  menuBg: $menuBg;\n  menuHover: $menuHover;\n  subMenuBg: $subMenuBg;\n  subMenuHover: $subMenuHover;\n  sideBarWidth: $sideBarWidth;\n}\n"
  },
  {
    "path": "src/utils/auth.js",
    "content": "import Cookies from 'js-cookie'\n\nconst TokenKey = 'Admin-Token'\n\nexport function getToken() {\n  return Cookies.get(TokenKey)\n}\n\nexport function setToken(token) {\n  return Cookies.set(TokenKey, token)\n}\n\nexport function removeToken() {\n  return Cookies.remove(TokenKey)\n}\n"
  },
  {
    "path": "src/utils/clipboard.js",
    "content": "import Vue from 'vue'\nimport Clipboard from 'clipboard'\n\nfunction clipboardSuccess() {\n  Vue.prototype.$message({\n    message: 'Copy successfully',\n    type: 'success',\n    duration: 1500\n  })\n}\n\nfunction clipboardError() {\n  Vue.prototype.$message({\n    message: 'Copy failed',\n    type: 'error'\n  })\n}\n\nexport default function handleClipboard(text, event) {\n  const clipboard = new Clipboard(event.target, {\n    text: () => text\n  })\n  clipboard.on('success', () => {\n    clipboardSuccess()\n    clipboard.destroy()\n  })\n  clipboard.on('error', () => {\n    clipboardError()\n    clipboard.destroy()\n  })\n  clipboard.onClick(event)\n}\n"
  },
  {
    "path": "src/utils/error-log.js",
    "content": "import Vue from 'vue'\nimport store from '@/store'\nimport { isString, isArray } from '@/utils/validate'\nimport settings from '@/settings'\n\n// you can set in settings.js\n// errorLog:'production' | ['production', 'development']\nconst { errorLog: needErrorLog } = settings\n\nfunction checkNeed() {\n  const env = process.env.NODE_ENV\n  if (isString(needErrorLog)) {\n    return env === needErrorLog\n  }\n  if (isArray(needErrorLog)) {\n    return needErrorLog.includes(env)\n  }\n  return false\n}\n\nif (checkNeed()) {\n  Vue.config.errorHandler = function(err, vm, info, a) {\n  // Don't ask me why I use Vue.nextTick, it just a hack.\n  // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500\n    Vue.nextTick(() => {\n      store.dispatch('errorLog/addErrorLog', {\n        err,\n        vm,\n        info,\n        url: window.location.href\n      })\n      console.error(err, info)\n    })\n  }\n}\n"
  },
  {
    "path": "src/utils/get-page-title.js",
    "content": "import defaultSettings from '@/settings'\n\nconst title = defaultSettings.title || 'Vue Element Admin'\n\nexport default function getPageTitle(pageTitle) {\n  if (pageTitle) {\n    return `${pageTitle} - ${title}`\n  }\n  return `${title}`\n}\n"
  },
  {
    "path": "src/utils/index.js",
    "content": "/**\n * Created by PanJiaChen on 16/11/18.\n */\n\n/**\n * Parse the time to string\n * @param {(Object|string|number)} time\n * @param {string} cFormat\n * @returns {string | null}\n */\nexport function parseTime(time, cFormat) {\n  if (arguments.length === 0 || !time) {\n    return null\n  }\n  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n  let date\n  if (typeof time === 'object') {\n    date = time\n  } else {\n    if ((typeof time === 'string')) {\n      if ((/^[0-9]+$/.test(time))) {\n        // support \"1548221490638\"\n        time = parseInt(time)\n      } else {\n        // support safari\n        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari\n        time = time.replace(new RegExp(/-/gm), '/')\n      }\n    }\n\n    if ((typeof time === 'number') && (time.toString().length === 10)) {\n      time = time * 1000\n    }\n    date = new Date(time)\n  }\n  const formatObj = {\n    y: date.getFullYear(),\n    m: date.getMonth() + 1,\n    d: date.getDate(),\n    h: date.getHours(),\n    i: date.getMinutes(),\n    s: date.getSeconds(),\n    a: date.getDay()\n  }\n  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {\n    const value = formatObj[key]\n    // Note: getDay() returns 0 on Sunday\n    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }\n    return value.toString().padStart(2, '0')\n  })\n  return time_str\n}\n\n/**\n * @param {number} time\n * @param {string} option\n * @returns {string}\n */\nexport function formatTime(time, option) {\n  if (('' + time).length === 10) {\n    time = parseInt(time) * 1000\n  } else {\n    time = +time\n  }\n  const d = new Date(time)\n  const now = Date.now()\n\n  const diff = (now - d) / 1000\n\n  if (diff < 30) {\n    return '刚刚'\n  } else if (diff < 3600) {\n    // less 1 hour\n    return Math.ceil(diff / 60) + '分钟前'\n  } else if (diff < 3600 * 24) {\n    return Math.ceil(diff / 3600) + '小时前'\n  } else if (diff < 3600 * 24 * 2) {\n    return '1天前'\n  }\n  if (option) {\n    return parseTime(time, option)\n  } else {\n    return (\n      d.getMonth() +\n      1 +\n      '月' +\n      d.getDate() +\n      '日' +\n      d.getHours() +\n      '时' +\n      d.getMinutes() +\n      '分'\n    )\n  }\n}\n\n/**\n * @param {string} url\n * @returns {Object}\n */\nexport function getQueryObject(url) {\n  url = url == null ? window.location.href : url\n  const search = url.substring(url.lastIndexOf('?') + 1)\n  const obj = {}\n  const reg = /([^?&=]+)=([^?&=]*)/g\n  search.replace(reg, (rs, $1, $2) => {\n    const name = decodeURIComponent($1)\n    let val = decodeURIComponent($2)\n    val = String(val)\n    obj[name] = val\n    return rs\n  })\n  return obj\n}\n\n/**\n * @param {string} input value\n * @returns {number} output value\n */\nexport function byteLength(str) {\n  // returns the byte length of an utf8 string\n  let s = str.length\n  for (var i = str.length - 1; i >= 0; i--) {\n    const code = str.charCodeAt(i)\n    if (code > 0x7f && code <= 0x7ff) s++\n    else if (code > 0x7ff && code <= 0xffff) s += 2\n    if (code >= 0xDC00 && code <= 0xDFFF) i--\n  }\n  return s\n}\n\n/**\n * @param {Array} actual\n * @returns {Array}\n */\nexport function cleanArray(actual) {\n  const newArray = []\n  for (let i = 0; i < actual.length; i++) {\n    if (actual[i]) {\n      newArray.push(actual[i])\n    }\n  }\n  return newArray\n}\n\n/**\n * @param {Object} json\n * @returns {Array}\n */\nexport function param(json) {\n  if (!json) return ''\n  return cleanArray(\n    Object.keys(json).map(key => {\n      if (json[key] === undefined) return ''\n      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])\n    })\n  ).join('&')\n}\n\n/**\n * @param {string} url\n * @returns {Object}\n */\nexport function param2Obj(url) {\n  const search = decodeURIComponent(url.split('?')[1]).replace(/\\+/g, ' ')\n  if (!search) {\n    return {}\n  }\n  const obj = {}\n  const searchArr = search.split('&')\n  searchArr.forEach(v => {\n    const index = v.indexOf('=')\n    if (index !== -1) {\n      const name = v.substring(0, index)\n      const val = v.substring(index + 1, v.length)\n      obj[name] = val\n    }\n  })\n  return obj\n}\n\n/**\n * @param {string} val\n * @returns {string}\n */\nexport function html2Text(val) {\n  const div = document.createElement('div')\n  div.innerHTML = val\n  return div.textContent || div.innerText\n}\n\n/**\n * Merges two objects, giving the last one precedence\n * @param {Object} target\n * @param {(Object|Array)} source\n * @returns {Object}\n */\nexport function objectMerge(target, source) {\n  if (typeof target !== 'object') {\n    target = {}\n  }\n  if (Array.isArray(source)) {\n    return source.slice()\n  }\n  Object.keys(source).forEach(property => {\n    const sourceProperty = source[property]\n    if (typeof sourceProperty === 'object') {\n      target[property] = objectMerge(target[property], sourceProperty)\n    } else {\n      target[property] = sourceProperty\n    }\n  })\n  return target\n}\n\n/**\n * @param {HTMLElement} element\n * @param {string} className\n */\nexport function toggleClass(element, className) {\n  if (!element || !className) {\n    return\n  }\n  let classString = element.className\n  const nameIndex = classString.indexOf(className)\n  if (nameIndex === -1) {\n    classString += '' + className\n  } else {\n    classString =\n      classString.substr(0, nameIndex) +\n      classString.substr(nameIndex + className.length)\n  }\n  element.className = classString\n}\n\n/**\n * @param {string} type\n * @returns {Date}\n */\nexport function getTime(type) {\n  if (type === 'start') {\n    return new Date().getTime() - 3600 * 1000 * 24 * 90\n  } else {\n    return new Date(new Date().toDateString())\n  }\n}\n\n/**\n * @param {Function} func\n * @param {number} wait\n * @param {boolean} immediate\n * @return {*}\n */\nexport function debounce(func, wait, immediate) {\n  let timeout, args, context, timestamp, result\n\n  const later = function() {\n    // 据上一次触发时间间隔\n    const last = +new Date() - timestamp\n\n    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait\n    if (last < wait && last > 0) {\n      timeout = setTimeout(later, wait - last)\n    } else {\n      timeout = null\n      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用\n      if (!immediate) {\n        result = func.apply(context, args)\n        if (!timeout) context = args = null\n      }\n    }\n  }\n\n  return function(...args) {\n    context = this\n    timestamp = +new Date()\n    const callNow = immediate && !timeout\n    // 如果延时不存在，重新设定延时\n    if (!timeout) timeout = setTimeout(later, wait)\n    if (callNow) {\n      result = func.apply(context, args)\n      context = args = null\n    }\n\n    return result\n  }\n}\n\n/**\n * This is just a simple version of deep copy\n * Has a lot of edge cases bug\n * If you want to use a perfect deep copy, use lodash's _.cloneDeep\n * @param {Object} source\n * @returns {Object}\n */\nexport function deepClone(source) {\n  if (!source && typeof source !== 'object') {\n    throw new Error('error arguments', 'deepClone')\n  }\n  const targetObj = source.constructor === Array ? [] : {}\n  Object.keys(source).forEach(keys => {\n    if (source[keys] && typeof source[keys] === 'object') {\n      targetObj[keys] = deepClone(source[keys])\n    } else {\n      targetObj[keys] = source[keys]\n    }\n  })\n  return targetObj\n}\n\n/**\n * @param {Array} arr\n * @returns {Array}\n */\nexport function uniqueArr(arr) {\n  return Array.from(new Set(arr))\n}\n\n/**\n * @returns {string}\n */\nexport function createUniqueString() {\n  const timestamp = +new Date() + ''\n  const randomNum = parseInt((1 + Math.random()) * 65536) + ''\n  return (+(randomNum + timestamp)).toString(32)\n}\n\n/**\n * Check if an element has a class\n * @param {HTMLElement} elm\n * @param {string} cls\n * @returns {boolean}\n */\nexport function hasClass(ele, cls) {\n  return !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'))\n}\n\n/**\n * Add class to element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport function addClass(ele, cls) {\n  if (!hasClass(ele, cls)) ele.className += ' ' + cls\n}\n\n/**\n * Remove class from element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport function removeClass(ele, cls) {\n  if (hasClass(ele, cls)) {\n    const reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)')\n    ele.className = ele.className.replace(reg, ' ')\n  }\n}\n"
  },
  {
    "path": "src/utils/open-window.js",
    "content": "/**\n *Created by PanJiaChen on 16/11/29.\n * @param {Sting} url\n * @param {Sting} title\n * @param {Number} w\n * @param {Number} h\n */\nexport default function openWindow(url, title, w, h) {\n  // Fixes dual-screen position                            Most browsers       Firefox\n  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left\n  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top\n\n  const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width\n  const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height\n\n  const left = ((width / 2) - (w / 2)) + dualScreenLeft\n  const top = ((height / 2) - (h / 2)) + dualScreenTop\n  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)\n\n  // Puts focus on the newWindow\n  if (window.focus) {\n    newWindow.focus()\n  }\n}\n\n"
  },
  {
    "path": "src/utils/permission.js",
    "content": "import store from '@/store'\n\n/**\n * @param {Array} value\n * @returns {Boolean}\n * @example see @/views/permission/directive.vue\n */\nexport default function checkPermission(value) {\n  if (value && value instanceof Array && value.length > 0) {\n    const roles = store.getters && store.getters.roles\n    const permissionRoles = value\n\n    const hasPermission = roles.some(role => {\n      return permissionRoles.includes(role)\n    })\n    return hasPermission\n  } else {\n    console.error(`need roles! Like v-permission=\"['admin','editor']\"`)\n    return false\n  }\n}\n"
  },
  {
    "path": "src/utils/request.js",
    "content": "import axios from 'axios'\nimport { MessageBox, Message } from 'element-ui'\nimport store from '@/store'\nimport { getToken } from '@/utils/auth'\n\n// create an axios instance\nconst service = axios.create({\n  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url\n  // withCredentials: true, // send cookies when cross-domain requests\n  timeout: 5000 // request timeout\n})\n\n// request interceptor\nservice.interceptors.request.use(\n  config => {\n    // do something before request is sent\n\n    if (store.getters.token) {\n      // let each request carry token\n      // ['X-Token'] is a custom headers key\n      // please modify it according to the actual situation\n      config.headers['X-Token'] = getToken()\n    }\n    return config\n  },\n  error => {\n    // do something with request error\n    console.log(error) // for debug\n    return Promise.reject(error)\n  }\n)\n\n// response interceptor\nservice.interceptors.response.use(\n  /**\n   * If you want to get http information such as headers or status\n   * Please return  response => response\n  */\n\n  /**\n   * Determine the request status by custom code\n   * Here is just an example\n   * You can also judge the status by HTTP Status Code\n   */\n  response => {\n    const res = response.data\n\n    // if the custom code is not 20000, it is judged as an error.\n    if (res.code !== 20000) {\n      Message({\n        message: res.message || 'Error',\n        type: 'error',\n        duration: 5 * 1000\n      })\n\n      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;\n      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {\n        // to re-login\n        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {\n          confirmButtonText: 'Re-Login',\n          cancelButtonText: 'Cancel',\n          type: 'warning'\n        }).then(() => {\n          store.dispatch('user/resetToken').then(() => {\n            location.reload()\n          })\n        })\n      }\n      return Promise.reject(new Error(res.message || 'Error'))\n    } else {\n      return res\n    }\n  },\n  error => {\n    console.log('err' + error) // for debug\n    Message({\n      message: error.message,\n      type: 'error',\n      duration: 5 * 1000\n    })\n    return Promise.reject(error)\n  }\n)\n\nexport default service\n"
  },
  {
    "path": "src/utils/scroll-to.js",
    "content": "Math.easeInOutQuad = function(t, b, c, d) {\n  t /= d / 2\n  if (t < 1) {\n    return c / 2 * t * t + b\n  }\n  t--\n  return -c / 2 * (t * (t - 2) - 1) + b\n}\n\n// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts\nvar requestAnimFrame = (function() {\n  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }\n})()\n\n/**\n * Because it's so fucking difficult to detect the scrolling element, just move them all\n * @param {number} amount\n */\nfunction move(amount) {\n  document.documentElement.scrollTop = amount\n  document.body.parentNode.scrollTop = amount\n  document.body.scrollTop = amount\n}\n\nfunction position() {\n  return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop\n}\n\n/**\n * @param {number} to\n * @param {number} duration\n * @param {Function} callback\n */\nexport function scrollTo(to, duration, callback) {\n  const start = position()\n  const change = to - start\n  const increment = 20\n  let currentTime = 0\n  duration = (typeof (duration) === 'undefined') ? 500 : duration\n  var animateScroll = function() {\n    // increment the time\n    currentTime += increment\n    // find the value with the quadratic in-out easing function\n    var val = Math.easeInOutQuad(currentTime, start, change, duration)\n    // move the document.body\n    move(val)\n    // do the animation unless its over\n    if (currentTime < duration) {\n      requestAnimFrame(animateScroll)\n    } else {\n      if (callback && typeof (callback) === 'function') {\n        // the animation is done so lets callback\n        callback()\n      }\n    }\n  }\n  animateScroll()\n}\n"
  },
  {
    "path": "src/utils/validate.js",
    "content": "/**\n * Created by PanJiaChen on 16/11/18.\n */\n\n/**\n * @param {string} path\n * @returns {Boolean}\n */\nexport function isExternal(path) {\n  return /^(https?:|mailto:|tel:)/.test(path)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validUsername(str) {\n  const valid_map = ['admin', 'editor']\n  return valid_map.indexOf(str.trim()) >= 0\n}\n\n/**\n * @param {string} url\n * @returns {Boolean}\n */\nexport function validURL(url) {\n  const reg = /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/\n  return reg.test(url)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validLowerCase(str) {\n  const reg = /^[a-z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validUpperCase(str) {\n  const reg = /^[A-Z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function validAlphabets(str) {\n  const reg = /^[A-Za-z]+$/\n  return reg.test(str)\n}\n\n/**\n * @param {string} email\n * @returns {Boolean}\n */\nexport function validEmail(email) {\n  const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n  return reg.test(email)\n}\n\n/**\n * @param {string} str\n * @returns {Boolean}\n */\nexport function isString(str) {\n  if (typeof str === 'string' || str instanceof String) {\n    return true\n  }\n  return false\n}\n\n/**\n * @param {Array} arg\n * @returns {Boolean}\n */\nexport function isArray(arg) {\n  if (typeof Array.isArray === 'undefined') {\n    return Object.prototype.toString.call(arg) === '[object Array]'\n  }\n  return Array.isArray(arg)\n}\n"
  },
  {
    "path": "src/vendor/Export2Excel.js",
    "content": "/* eslint-disable */\nimport { saveAs } from 'file-saver'\nimport XLSX from 'xlsx'\n\nfunction generateArray(table) {\n  var out = [];\n  var rows = table.querySelectorAll('tr');\n  var ranges = [];\n  for (var R = 0; R < rows.length; ++R) {\n    var outRow = [];\n    var row = rows[R];\n    var columns = row.querySelectorAll('td');\n    for (var C = 0; C < columns.length; ++C) {\n      var cell = columns[C];\n      var colspan = cell.getAttribute('colspan');\n      var rowspan = cell.getAttribute('rowspan');\n      var cellValue = cell.innerText;\n      if (cellValue !== \"\" && cellValue == +cellValue) cellValue = +cellValue;\n\n      //Skip ranges\n      ranges.forEach(function (range) {\n        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {\n          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);\n        }\n      });\n\n      //Handle Row Span\n      if (rowspan || colspan) {\n        rowspan = rowspan || 1;\n        colspan = colspan || 1;\n        ranges.push({\n          s: {\n            r: R,\n            c: outRow.length\n          },\n          e: {\n            r: R + rowspan - 1,\n            c: outRow.length + colspan - 1\n          }\n        });\n      };\n\n      //Handle Value\n      outRow.push(cellValue !== \"\" ? cellValue : null);\n\n      //Handle Colspan\n      if (colspan)\n        for (var k = 0; k < colspan - 1; ++k) outRow.push(null);\n    }\n    out.push(outRow);\n  }\n  return [out, ranges];\n};\n\nfunction datenum(v, date1904) {\n  if (date1904) v += 1462;\n  var epoch = Date.parse(v);\n  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n}\n\nfunction sheet_from_array_of_arrays(data, opts) {\n  var ws = {};\n  var range = {\n    s: {\n      c: 10000000,\n      r: 10000000\n    },\n    e: {\n      c: 0,\n      r: 0\n    }\n  };\n  for (var R = 0; R != data.length; ++R) {\n    for (var C = 0; C != data[R].length; ++C) {\n      if (range.s.r > R) range.s.r = R;\n      if (range.s.c > C) range.s.c = C;\n      if (range.e.r < R) range.e.r = R;\n      if (range.e.c < C) range.e.c = C;\n      var cell = {\n        v: data[R][C]\n      };\n      if (cell.v == null) continue;\n      var cell_ref = XLSX.utils.encode_cell({\n        c: C,\n        r: R\n      });\n\n      if (typeof cell.v === 'number') cell.t = 'n';\n      else if (typeof cell.v === 'boolean') cell.t = 'b';\n      else if (cell.v instanceof Date) {\n        cell.t = 'n';\n        cell.z = XLSX.SSF._table[14];\n        cell.v = datenum(cell.v);\n      } else cell.t = 's';\n\n      ws[cell_ref] = cell;\n    }\n  }\n  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);\n  return ws;\n}\n\nfunction Workbook() {\n  if (!(this instanceof Workbook)) return new Workbook();\n  this.SheetNames = [];\n  this.Sheets = {};\n}\n\nfunction s2ab(s) {\n  var buf = new ArrayBuffer(s.length);\n  var view = new Uint8Array(buf);\n  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\n  return buf;\n}\n\nexport function export_table_to_excel(id) {\n  var theTable = document.getElementById(id);\n  var oo = generateArray(theTable);\n  var ranges = oo[1];\n\n  /* original data */\n  var data = oo[0];\n  var ws_name = \"SheetJS\";\n\n  var wb = new Workbook(),\n    ws = sheet_from_array_of_arrays(data);\n\n  /* add ranges to worksheet */\n  // ws['!cols'] = ['apple', 'banan'];\n  ws['!merges'] = ranges;\n\n  /* add worksheet to workbook */\n  wb.SheetNames.push(ws_name);\n  wb.Sheets[ws_name] = ws;\n\n  var wbout = XLSX.write(wb, {\n    bookType: 'xlsx',\n    bookSST: false,\n    type: 'binary'\n  });\n\n  saveAs(new Blob([s2ab(wbout)], {\n    type: \"application/octet-stream\"\n  }), \"test.xlsx\")\n}\n\nexport function export_json_to_excel({\n  multiHeader = [],\n  header,\n  data,\n  filename,\n  merges = [],\n  autoWidth = true,\n  bookType = 'xlsx'\n} = {}) {\n  /* original data */\n  filename = filename || 'excel-list'\n  data = [...data]\n  data.unshift(header);\n\n  for (let i = multiHeader.length - 1; i > -1; i--) {\n    data.unshift(multiHeader[i])\n  }\n\n  var ws_name = \"SheetJS\";\n  var wb = new Workbook(),\n    ws = sheet_from_array_of_arrays(data);\n\n  if (merges.length > 0) {\n    if (!ws['!merges']) ws['!merges'] = [];\n    merges.forEach(item => {\n      ws['!merges'].push(XLSX.utils.decode_range(item))\n    })\n  }\n\n  if (autoWidth) {\n    /*设置worksheet每列的最大宽度*/\n    const colWidth = data.map(row => row.map(val => {\n      /*先判断是否为null/undefined*/\n      if (val == null) {\n        return {\n          'wch': 10\n        };\n      }\n      /*再判断是否为中文*/\n      else if (val.toString().charCodeAt(0) > 255) {\n        return {\n          'wch': val.toString().length * 2\n        };\n      } else {\n        return {\n          'wch': val.toString().length\n        };\n      }\n    }))\n    /*以第一行为初始值*/\n    let result = colWidth[0];\n    for (let i = 1; i < colWidth.length; i++) {\n      for (let j = 0; j < colWidth[i].length; j++) {\n        if (result[j]['wch'] < colWidth[i][j]['wch']) {\n          result[j]['wch'] = colWidth[i][j]['wch'];\n        }\n      }\n    }\n    ws['!cols'] = result;\n  }\n\n  /* add worksheet to workbook */\n  wb.SheetNames.push(ws_name);\n  wb.Sheets[ws_name] = ws;\n\n  var wbout = XLSX.write(wb, {\n    bookType: bookType,\n    bookSST: false,\n    type: 'binary'\n  });\n  saveAs(new Blob([s2ab(wbout)], {\n    type: \"application/octet-stream\"\n  }), `${filename}.${bookType}`);\n}\n"
  },
  {
    "path": "src/vendor/Export2Zip.js",
    "content": "/* eslint-disable */\nimport { saveAs } from 'file-saver'\nimport JSZip from 'jszip'\n\nexport function export_txt_to_zip(th, jsonData, txtName, zipName) {\n  const zip = new JSZip()\n  const txt_name = txtName || 'file'\n  const zip_name = zipName || 'file'\n  const data = jsonData\n  let txtData = `${th}\\r\\n`\n  data.forEach((row) => {\n    let tempStr = ''\n    tempStr = row.toString()\n    txtData += `${tempStr}\\r\\n`\n  })\n  zip.file(`${txt_name}.txt`, txtData)\n  zip.generateAsync({\n    type: \"blob\"\n  }).then((blob) => {\n    saveAs(blob, `${zip_name}.zip`)\n  }, (err) => {\n    alert('导出失败')\n  })\n}\n"
  },
  {
    "path": "src/views/charts/keyboard.vue",
    "content": "<template>\n  <div class=\"chart-container\">\n    <chart height=\"100%\" width=\"100%\" />\n  </div>\n</template>\n\n<script>\nimport Chart from '@/components/Charts/Keyboard'\n\nexport default {\n  name: 'KeyboardChart',\n  components: { Chart }\n}\n</script>\n\n<style scoped>\n.chart-container{\n  position: relative;\n  width: 100%;\n  height: calc(100vh - 84px);\n}\n</style>\n\n"
  },
  {
    "path": "src/views/charts/line.vue",
    "content": "<template>\n  <div class=\"chart-container\">\n    <chart height=\"100%\" width=\"100%\" />\n  </div>\n</template>\n\n<script>\nimport Chart from '@/components/Charts/LineMarker'\n\nexport default {\n  name: 'LineChart',\n  components: { Chart }\n}\n</script>\n\n<style scoped>\n.chart-container{\n  position: relative;\n  width: 100%;\n  height: calc(100vh - 84px);\n}\n</style>\n\n"
  },
  {
    "path": "src/views/charts/mix-chart.vue",
    "content": "<template>\n  <div class=\"chart-container\">\n    <chart height=\"100%\" width=\"100%\" />\n  </div>\n</template>\n\n<script>\nimport Chart from '@/components/Charts/MixChart'\n\nexport default {\n  name: 'MixChart',\n  components: { Chart }\n}\n</script>\n\n<style scoped>\n.chart-container{\n  position: relative;\n  width: 100%;\n  height: calc(100vh - 84px);\n}\n</style>\n\n"
  },
  {
    "path": "src/views/clipboard/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-tabs v-model=\"activeName\">\n      <el-tab-pane label=\"use clipboard  directly\" name=\"directly\">\n        <el-input v-model=\"inputData\" placeholder=\"Please input\" style=\"width:400px;max-width:100%;\" />\n        <el-button type=\"primary\" icon=\"el-icon-document\" @click=\"handleCopy(inputData,$event)\">\n          copy\n        </el-button>\n      </el-tab-pane>\n      <el-tab-pane label=\"use clipboard by v-directive\" name=\"v-directive\">\n        <el-input v-model=\"inputData\" placeholder=\"Please input\" style=\"width:400px;max-width:100%;\" />\n        <el-button v-clipboard:copy=\"inputData\" v-clipboard:success=\"clipboardSuccess\" type=\"primary\" icon=\"el-icon-document\">\n          copy\n        </el-button>\n      </el-tab-pane>\n    </el-tabs>\n  </div>\n</template>\n\n<script>\nimport clip from '@/utils/clipboard' // use clipboard directly\nimport clipboard from '@/directive/clipboard/index.js' // use clipboard by v-directive\n\nexport default {\n  name: 'ClipboardDemo',\n  directives: {\n    clipboard\n  },\n  data() {\n    return {\n      activeName: 'directly',\n      inputData: 'https://github.com/PanJiaChen/vue-element-admin'\n    }\n  },\n  methods: {\n    handleCopy(text, event) {\n      clip(text, event)\n    },\n    clipboardSuccess() {\n      this.$message({\n        message: 'Copy successfully',\n        type: 'success',\n        duration: 1500\n      })\n    }\n  }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/components-demo/avatar-upload.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>This is based on\n      <a class=\"link-type\" href=\"//github.com/dai-siki/vue-image-crop-upload\"> vue-image-crop-upload</a>.\n      Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.\n    </aside>\n\n    <pan-thumb :image=\"image\" />\n\n    <el-button type=\"primary\" icon=\"el-icon-upload\" style=\"position: absolute;bottom: 15px;margin-left: 40px;\" @click=\"imagecropperShow=true\">\n      Change Avatar\n    </el-button>\n\n    <image-cropper\n      v-show=\"imagecropperShow\"\n      :key=\"imagecropperKey\"\n      :width=\"300\"\n      :height=\"300\"\n      url=\"https://httpbin.org/post\"\n      lang-type=\"en\"\n      @close=\"close\"\n      @crop-upload-success=\"cropSuccess\"\n    />\n  </div>\n</template>\n\n<script>\nimport ImageCropper from '@/components/ImageCropper'\nimport PanThumb from '@/components/PanThumb'\n\nexport default {\n  name: 'AvatarUploadDemo',\n  components: { ImageCropper, PanThumb },\n  data() {\n    return {\n      imagecropperShow: false,\n      imagecropperKey: 0,\n      image: 'https://wpimg.wallstcn.com/577965b9-bb9e-4e02-9f0c-095b41417191'\n    }\n  },\n  methods: {\n    cropSuccess(resData) {\n      this.imagecropperShow = false\n      this.imagecropperKey = this.imagecropperKey + 1\n      this.image = resData.files.avatar\n    },\n    close() {\n      this.imagecropperShow = false\n    }\n  }\n}\n</script>\n\n<style scoped>\n  .avatar{\n    width: 200px;\n    height: 200px;\n    border-radius: 50%;\n  }\n</style>\n\n"
  },
  {
    "path": "src/views/components-demo/back-to-top.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>\n      When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner\n    </aside>\n    <aside>\n      You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally\n    </aside>\n    <div class=\"placeholder-container\">\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n    </div>\n    <!-- you can add element-ui's tooltip -->\n    <el-tooltip placement=\"top\" content=\"tooltip\">\n      <back-to-top :custom-style=\"myBackToTopStyle\" :visibility-height=\"300\" :back-position=\"50\" transition-name=\"fade\" />\n    </el-tooltip>\n  </div>\n</template>\n\n<script>\nimport BackToTop from '@/components/BackToTop'\n\nexport default {\n  name: 'BackToTopDemo',\n  components: { BackToTop },\n  data() {\n    return {\n      // customizable button style, show/hide critical point, return position\n      myBackToTopStyle: {\n        right: '50px',\n        bottom: '50px',\n        width: '40px',\n        height: '40px',\n        'border-radius': '4px',\n        'line-height': '45px', // 请保持与高度一致以垂直居中 Please keep consistent with height to center vertically\n        background: '#e7eaf1'// 按钮的背景颜色 The background color of the button\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n.placeholder-container div {\n  margin: 10px;\n}\n</style>\n"
  },
  {
    "path": "src/views/components-demo/count-to.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>\n      <a href=\"https://github.com/PanJiaChen/vue-countTo\" target=\"_blank\">countTo-component</a>\n    </aside>\n    <count-to\n      ref=\"example\"\n      :start-val=\"_startVal\"\n      :end-val=\"_endVal\"\n      :duration=\"_duration\"\n      :decimals=\"_decimals\"\n      :separator=\"_separator\"\n      :prefix=\"_prefix\"\n      :suffix=\"_suffix\"\n      :autoplay=\"false\"\n      class=\"example\"\n    />\n    <div style=\"margin-left: 25%;margin-top: 40px;\">\n      <label class=\"label\" for=\"startValInput\">startVal:\n        <input v-model.number=\"setStartVal\" type=\"number\" name=\"startValInput\">\n      </label>\n      <label class=\"label\" for=\"endValInput\">endVal:\n        <input v-model.number=\"setEndVal\" type=\"number\" name=\"endVaInput\">\n      </label>\n      <label class=\"label\" for=\"durationInput\">duration:\n        <input v-model.number=\"setDuration\" type=\"number\" name=\"durationInput\">\n      </label>\n      <div class=\"startBtn example-btn\" @click=\"start\">\n        Start\n      </div>\n      <div class=\"pause-resume-btn example-btn\" @click=\"pauseResume\">\n        pause/resume\n      </div>\n      <br>\n      <label class=\"label\" for=\"decimalsInput\">decimals:\n        <input v-model.number=\"setDecimals\" type=\"number\" name=\"decimalsInput\">\n      </label>\n      <label class=\"label\" for=\"separatorInput\">separator:\n        <input v-model=\"setSeparator\" name=\"separatorInput\">\n      </label>\n      <label class=\"label\" for=\"prefixInput\">prefix:\n        <input v-model=\"setPrefix\" name=\"prefixInput\">\n      </label>\n      <label class=\"label\" for=\"suffixInput\">suffix:\n        <input v-model=\"setSuffix\" name=\"suffixInput\">\n      </label>\n    </div>\n    <aside>&lt;count-to :start-val=&#x27;{{ _startVal }}&#x27; :end-val=&#x27;{{ _endVal }}&#x27; :duration=&#x27;{{ _duration }}&#x27;\n      :decimals=&#x27;{{ _decimals }}&#x27; :separator=&#x27;{{ _separator }}&#x27; :prefix=&#x27;{{ _prefix }}&#x27; :suffix=&#x27;{{ _suffix }}&#x27;\n      :autoplay=false&gt;</aside>\n  </div>\n</template>\n\n<script>\nimport countTo from 'vue-count-to'\n\nexport default {\n  name: 'CountToDemo',\n  components: { countTo },\n  data() {\n    return {\n      setStartVal: 0,\n      setEndVal: 2017,\n      setDuration: 4000,\n      setDecimals: 0,\n      setSeparator: ',',\n      setSuffix: ' rmb',\n      setPrefix: '¥ '\n    }\n  },\n  computed: {\n    _startVal() {\n      if (this.setStartVal) {\n        return this.setStartVal\n      } else {\n        return 0\n      }\n    },\n    _endVal() {\n      if (this.setEndVal) {\n        return this.setEndVal\n      } else {\n        return 0\n      }\n    },\n    _duration() {\n      if (this.setDuration) {\n        return this.setDuration\n      } else {\n        return 100\n      }\n    },\n    _decimals() {\n      if (this.setDecimals) {\n        if (this.setDecimals < 0 || this.setDecimals > 20) {\n          alert('digits argument must be between 0 and 20')\n          return 0\n        }\n        return this.setDecimals\n      } else {\n        return 0\n      }\n    },\n    _separator() {\n      return this.setSeparator\n    },\n    _suffix() {\n      return this.setSuffix\n    },\n    _prefix() {\n      return this.setPrefix\n    }\n  },\n  methods: {\n    start() {\n      this.$refs.example.start()\n    },\n    pauseResume() {\n      this.$refs.example.pauseResume()\n    }\n  }\n}\n</script>\n\n<style scoped>\n.example-btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: 500;\n  text-align: center;\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  line-height: 1.5;\n  padding: 4px 15px;\n  font-size: 12px;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);\n  transition: all .3s cubic-bezier(.645, .045, .355, 1);\n  position: relative;\n  color: rgba(0, 0, 0, .65);\n  background-color: #fff;\n  border-color: #d9d9d9;\n}\n\n.example-btn:hover {\n  color: #4AB7BD;\n  background-color: #fff;\n  border-color: #4AB7BD;\n}\n.example {\n  font-size: 50px;\n  color: #F6416C;\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n  font-size: 80px;\n  font-weight: 500;\n}\n\n.label {\n  color: #2f4f4f;\n  font-size: 16px;\n  display: inline-block;\n  margin: 15px 30px 15px 0;\n}\n\ninput {\n  position: relative;\n  display: inline-block;\n  padding: 4px 7px;\n  width: 70px;\n  height: 28px;\n  cursor: text;\n  font-size: 12px;\n  line-height: 1.5;\n  color: rgba(0, 0, 0, .65);\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #d9d9d9;\n  border-radius: 4px;\n  -webkit-transition: all .3s;\n  transition: all .3s;\n}\n\n.startBtn {\n  margin-left: 20px;\n  font-size: 20px;\n  color: #30B08F;\n  background-color: #fff;\n}\n\n.startBtn:hover {\n  background-color: #30B08F;\n  color: #fff;\n  border-color: #30B08F;\n}\n\n.pause-resume-btn {\n  font-size: 20px;\n  color: #E65D6E;\n  background-color: #fff;\n}\n\n.pause-resume-btn:hover {\n  background-color: #E65D6E;\n  color: #fff;\n  border-color: #E65D6E;\n}\n</style>\n\n"
  },
  {
    "path": "src/views/components-demo/dnd-list.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>drag-list base on\n      <a href=\"https://github.com/SortableJS/Vue.Draggable\" target=\"_blank\">Vue.Draggable</a>\n    </aside>\n    <div class=\"editor-container\">\n      <dnd-list :list1=\"list1\" :list2=\"list2\" list1-title=\"List\" list2-title=\"Article pool\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport DndList from '@/components/DndList'\nimport { fetchList } from '@/api/article'\n\nexport default {\n  name: 'DndListDemo',\n  components: { DndList },\n  data() {\n    return {\n      list1: [],\n      list2: []\n    }\n  },\n  created() {\n    this.getData()\n  },\n  methods: {\n    getData() {\n      this.listLoading = true\n      fetchList().then(response => {\n        this.list1 = response.data.items.splice(0, 5)\n        this.list2 = response.data.items\n      })\n    }\n  }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/components-demo/drag-dialog.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <el-button type=\"primary\" @click=\"dialogTableVisible = true\">\n      open a Drag Dialog\n    </el-button>\n    <el-dialog v-el-drag-dialog :visible.sync=\"dialogTableVisible\" title=\"Shipping address\" @dragDialog=\"handleDrag\">\n      <el-select ref=\"select\" v-model=\"value\" placeholder=\"请选择\">\n        <el-option v-for=\"item in options\" :key=\"item.value\" :label=\"item.label\" :value=\"item.value\" />\n      </el-select>\n      <el-table :data=\"gridData\">\n        <el-table-column property=\"date\" label=\"Date\" width=\"150\" />\n        <el-table-column property=\"name\" label=\"Name\" width=\"200\" />\n        <el-table-column property=\"address\" label=\"Address\" />\n      </el-table>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport elDragDialog from '@/directive/el-drag-dialog' // base on element-ui\n\nexport default {\n  name: 'DragDialogDemo',\n  directives: { elDragDialog },\n  data() {\n    return {\n      dialogTableVisible: false,\n      options: [\n        { value: '选项1', label: '黄金糕' },\n        { value: '选项2', label: '双皮奶' },\n        { value: '选项3', label: '蚵仔煎' },\n        { value: '选项4', label: '龙须面' }\n      ],\n      value: '',\n      gridData: [{\n        date: '2016-05-02',\n        name: 'John Smith',\n        address: 'No.1518,  Jinshajiang Road, Putuo District'\n      }, {\n        date: '2016-05-04',\n        name: 'John Smith',\n        address: 'No.1518,  Jinshajiang Road, Putuo District'\n      }, {\n        date: '2016-05-01',\n        name: 'John Smith',\n        address: 'No.1518,  Jinshajiang Road, Putuo District'\n      }, {\n        date: '2016-05-03',\n        name: 'John Smith',\n        address: 'No.1518,  Jinshajiang Road, Putuo District'\n      }]\n    }\n  },\n  methods: {\n    // v-el-drag-dialog onDrag callback function\n    handleDrag() {\n      this.$refs.select.blur()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/components-demo/drag-kanban.vue",
    "content": "<template>\n  <div class=\"components-container board\">\n    <Kanban :key=\"1\" :list=\"list1\" :group=\"group\" class=\"kanban todo\" header-text=\"Todo\" />\n    <Kanban :key=\"2\" :list=\"list2\" :group=\"group\" class=\"kanban working\" header-text=\"Working\" />\n    <Kanban :key=\"3\" :list=\"list3\" :group=\"group\" class=\"kanban done\" header-text=\"Done\" />\n  </div>\n</template>\n<script>\nimport Kanban from '@/components/Kanban'\n\nexport default {\n  name: 'DragKanbanDemo',\n  components: {\n    Kanban\n  },\n  data() {\n    return {\n      group: 'mission',\n      list1: [\n        { name: 'Mission', id: 1 },\n        { name: 'Mission', id: 2 },\n        { name: 'Mission', id: 3 },\n        { name: 'Mission', id: 4 }\n      ],\n      list2: [\n        { name: 'Mission', id: 5 },\n        { name: 'Mission', id: 6 },\n        { name: 'Mission', id: 7 }\n      ],\n      list3: [\n        { name: 'Mission', id: 8 },\n        { name: 'Mission', id: 9 },\n        { name: 'Mission', id: 10 }\n      ]\n    }\n  }\n}\n</script>\n<style lang=\"scss\">\n.board {\n  width: 1000px;\n  margin-left: 20px;\n  display: flex;\n  justify-content: space-around;\n  flex-direction: row;\n  align-items: flex-start;\n}\n.kanban {\n  &.todo {\n    .board-column-header {\n      background: #4A9FF9;\n    }\n  }\n  &.working {\n    .board-column-header {\n      background: #f9944a;\n    }\n  }\n  &.done {\n    .board-column-header {\n      background: #2ac06d;\n    }\n  }\n}\n</style>\n\n"
  },
  {
    "path": "src/views/components-demo/drag-select.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <el-drag-select v-model=\"value\" style=\"width:500px;\" multiple placeholder=\"请选择\">\n      <el-option v-for=\"item in options\" :key=\"item.value\" :label=\"item.label\" :value=\"item.value\" />\n    </el-drag-select>\n\n    <div style=\"margin-top:30px;\">\n      <el-tag v-for=\"item of value\" :key=\"item\" style=\"margin-right:15px;\">\n        {{ item }}\n      </el-tag>\n    </div>\n  </div>\n</template>\n\n<script>\nimport ElDragSelect from '@/components/DragSelect' // base on element-ui\n\nexport default {\n  name: 'DragSelectDemo',\n  components: { ElDragSelect },\n  data() {\n    return {\n      value: ['Apple', 'Banana', 'Orange'],\n      options: [{\n        value: 'Apple',\n        label: 'Apple'\n      }, {\n        value: 'Banana',\n        label: 'Banana'\n      }, {\n        value: 'Orange',\n        label: 'Orange'\n      }, {\n        value: 'Pear',\n        label: 'Pear'\n      }, {\n        value: 'Strawberry',\n        label: 'Strawberry'\n      }]\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/components-demo/dropzone.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>\n      Based on <a class=\"link-type\" href=\"https://github.com/rowanwins/vue-dropzone\"> dropzone </a>.\n      Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.\n    </aside>\n    <div class=\"editor-container\">\n      <dropzone id=\"myVueDropzone\" url=\"https://httpbin.org/post\" @dropzone-removedFile=\"dropzoneR\" @dropzone-success=\"dropzoneS\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport Dropzone from '@/components/Dropzone'\n\nexport default {\n  name: 'DropzoneDemo',\n  components: { Dropzone },\n  methods: {\n    dropzoneS(file) {\n      console.log(file)\n      this.$message({ message: 'Upload success', type: 'success' })\n    },\n    dropzoneR(file) {\n      console.log(file)\n      this.$message({ message: 'Delete success', type: 'success' })\n    }\n  }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/components-demo/json-editor.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>Json-Editor is base on <a href=\"https://github.com/codemirror/CodeMirror\" target=\"_blank\">CodeMirrorr</a>. Lint\n      base on <a\n        href=\"https://github.com/codemirror/CodeMirror/blob/master/addon/lint/json-lint.js\"\n        target=\"_blank\"\n      >json-lint</a>.</aside>\n    <div class=\"editor-container\">\n      <json-editor ref=\"jsonEditor\" v-model=\"value\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport JsonEditor from '@/components/JsonEditor'\n\nconst jsonData = '[{\"items\":[{\"market_type\":\"forexdata\",\"symbol\":\"XAUUSD\"},{\"market_type\":\"forexdata\",\"symbol\":\"UKOIL\"},{\"market_type\":\"forexdata\",\"symbol\":\"CORN\"}],\"name\":\"\"},{\"items\":[{\"market_type\":\"forexdata\",\"symbol\":\"XAUUSD\"},{\"market_type\":\"forexdata\",\"symbol\":\"XAGUSD\"},{\"market_type\":\"forexdata\",\"symbol\":\"AUTD\"},{\"market_type\":\"forexdata\",\"symbol\":\"AGTD\"}],\"name\":\"贵金属\"},{\"items\":[{\"market_type\":\"forexdata\",\"symbol\":\"CORN\"},{\"market_type\":\"forexdata\",\"symbol\":\"WHEAT\"},{\"market_type\":\"forexdata\",\"symbol\":\"SOYBEAN\"},{\"market_type\":\"forexdata\",\"symbol\":\"SUGAR\"}],\"name\":\"农产品\"},{\"items\":[{\"market_type\":\"forexdata\",\"symbol\":\"UKOIL\"},{\"market_type\":\"forexdata\",\"symbol\":\"USOIL\"},{\"market_type\":\"forexdata\",\"symbol\":\"NGAS\"}],\"name\":\"能源化工\"}]'\n\nexport default {\n  name: 'JsonEditorDemo',\n  components: { JsonEditor },\n  data() {\n    return {\n      value: JSON.parse(jsonData)\n    }\n  }\n}\n</script>\n\n<style scoped>\n.editor-container{\n  position: relative;\n  height: 100%;\n}\n</style>\n\n"
  },
  {
    "path": "src/views/components-demo/markdown.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>Markdown is based on\n      <a href=\"https://github.com/nhnent/tui.editor\" target=\"_blank\">tui.editor</a> ，simply wrapped with Vue.\n      <a\n        target=\"_blank\"\n        href=\"https://panjiachen.github.io/vue-element-admin-site/feature/component/markdown-editor.html\"\n      >\n        Documentation </a>\n    </aside>\n\n    <div class=\"editor-container\">\n      <el-tag class=\"tag-title\">\n        Basic:\n      </el-tag>\n      <markdown-editor v-model=\"content1\" height=\"300px\" />\n    </div>\n\n    <div class=\"editor-container\">\n      <el-tag class=\"tag-title\">\n        Markdown Mode:\n      </el-tag>\n      <markdown-editor ref=\"markdownEditor\" v-model=\"content2\" :options=\"{hideModeSwitch:true,previewStyle:'tab'}\" height=\"200px\" />\n    </div>\n\n    <div class=\"editor-container\">\n      <el-tag class=\"tag-title\">\n        Customize Toolbar:\n      </el-tag>\n      <markdown-editor v-model=\"content3\" :options=\"{ toolbarItems: ['heading','bold','italic']}\" />\n    </div>\n\n    <div class=\"editor-container\">\n      <el-tag class=\"tag-title\">\n        I18n:\n      </el-tag>\n      <el-alert\n        :closable=\"false\"\n        title=\"You can change the language of the admin system to see the effect\"\n        type=\"success\"\n      />\n      <markdown-editor ref=\"markdownEditor\" v-model=\"content4\" :language=\"language\" height=\"300px\" />\n    </div>\n\n    <el-button style=\"margin-top:80px;\" type=\"primary\" icon=\"el-icon-document\" @click=\"getHtml\">\n      Get HTML\n    </el-button>\n    <div v-html=\"html\" />\n  </div>\n</template>\n\n<script>\nimport MarkdownEditor from '@/components/MarkdownEditor'\n\nconst content = `\n**This is test**\n\n* vue\n* element\n* webpack\n\n`\nexport default {\n  name: 'MarkdownDemo',\n  components: { MarkdownEditor },\n  data() {\n    return {\n      content1: content,\n      content2: content,\n      content3: content,\n      content4: content,\n      html: '',\n      languageTypeList: {\n        'en': 'en_US',\n        'zh': 'zh_CN',\n        'es': 'es_ES'\n      }\n    }\n  },\n  computed: {\n    language() {\n      return this.languageTypeList['en']\n    }\n  },\n  methods: {\n    getHtml() {\n      this.html = this.$refs.markdownEditor.getHtml()\n      console.log(this.html)\n    }\n  }\n}\n</script>\n\n<style scoped>\n.editor-container{\n  margin-bottom: 30px;\n}\n.tag-title{\n  margin-bottom: 5px;\n}\n</style>\n"
  },
  {
    "path": "src/views/components-demo/mixin.vue",
    "content": "<template>\n  <div class=\"mixin-components-container\">\n    <el-row>\n      <el-card class=\"box-card\">\n        <div slot=\"header\" class=\"clearfix\">\n          <span>Buttons</span>\n        </div>\n        <div style=\"margin-bottom:50px;\">\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn blue-btn\" to=\"/documentation/index\">\n              Documentation\n            </router-link>\n          </el-col>\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn light-blue-btn\" to=\"/icon/index\">\n              Icons\n            </router-link>\n          </el-col>\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn pink-btn\" to=\"/excel/export-excel\">\n              Excel\n            </router-link>\n          </el-col>\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn green-btn\" to=\"/table/complex-table\">\n              Table\n            </router-link>\n          </el-col>\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn tiffany-btn\" to=\"/example/create\">\n              Form\n            </router-link>\n          </el-col>\n          <el-col :span=\"4\" class=\"text-center\">\n            <router-link class=\"pan-btn yellow-btn\" to=\"/theme/index\">\n              Theme\n            </router-link>\n          </el-col>\n        </div>\n      </el-card>\n    </el-row>\n\n    <el-row :gutter=\"20\" style=\"margin-top:50px;\">\n      <el-col :span=\"6\">\n        <el-card class=\"box-card\">\n          <div slot=\"header\" class=\"clearfix\">\n            <span>Material Design 的input</span>\n          </div>\n          <div style=\"height:100px;\">\n            <el-form :model=\"demo\" :rules=\"demoRules\">\n              <el-form-item prop=\"title\">\n                <md-input v-model=\"demo.title\" icon=\"el-icon-search\" name=\"title\" placeholder=\"输入标题\">\n                  标题\n                </md-input>\n              </el-form-item>\n            </el-form>\n          </div>\n        </el-card>\n      </el-col>\n\n      <el-col :span=\"6\">\n        <el-card class=\"box-card\">\n          <div slot=\"header\" class=\"clearfix\">\n            <span>图片hover效果</span>\n          </div>\n          <div class=\"component-item\">\n            <pan-thumb width=\"100px\" height=\"100px\" image=\"https://wpimg.wallstcn.com/577965b9-bb9e-4e02-9f0c-095b41417191\">\n              vue-element-admin\n            </pan-thumb>\n          </div>\n        </el-card>\n      </el-col>\n\n      <el-col :span=\"6\">\n        <el-card class=\"box-card\">\n          <div slot=\"header\" class=\"clearfix\">\n            <span>水波纹 waves v-directive</span>\n          </div>\n          <div class=\"component-item\">\n            <el-button v-waves type=\"primary\">\n              水波纹效果\n            </el-button>\n          </div>\n        </el-card>\n      </el-col>\n\n      <el-col :span=\"6\">\n        <el-card class=\"box-card\">\n          <div slot=\"header\" class=\"clearfix\">\n            <span>hover text</span>\n          </div>\n          <div class=\"component-item\">\n            <mallki class-name=\"mallki-text\" text=\"vue-element-admin\" />\n          </div>\n        </el-card>\n      </el-col>\n    </el-row>\n\n    <el-row :gutter=\"20\" style=\"margin-top:50px;\">\n      <el-col :span=\"8\">\n        <el-card class=\"box-card\">\n          <div slot=\"header\" class=\"clearfix\">\n            <span>Share</span>\n          </div>\n          <div class=\"component-item\" style=\"height:420px;\">\n            <dropdown-menu :items=\"articleList\" style=\"margin:0 auto;\" title=\"系列文章\" />\n          </div>\n        </el-card>\n      </el-col>\n    </el-row>\n  </div>\n</template>\n\n<script>\nimport PanThumb from '@/components/PanThumb'\nimport MdInput from '@/components/MDinput'\nimport Mallki from '@/components/TextHoverEffect/Mallki'\nimport DropdownMenu from '@/components/Share/DropdownMenu'\nimport waves from '@/directive/waves/index.js' // 水波纹指令\n\nexport default {\n  name: 'ComponentMixinDemo',\n  components: {\n    PanThumb,\n    MdInput,\n    Mallki,\n    DropdownMenu\n  },\n  directives: {\n    waves\n  },\n  data() {\n    const validate = (rule, value, callback) => {\n      if (value.length !== 6) {\n        callback(new Error('请输入六个字符'))\n      } else {\n        callback()\n      }\n    }\n    return {\n      demo: {\n        title: ''\n      },\n      demoRules: {\n        title: [{ required: true, trigger: 'change', validator: validate }]\n      },\n      articleList: [\n        { title: '基础篇', href: 'https://juejin.im/post/59097cd7a22b9d0065fb61d2' },\n        { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' },\n        { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' },\n        { title: 'vue-admin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' },\n        { title: 'v4.0 篇', href: 'https://juejin.im/post/5c92ff94f265da6128275a85' },\n        { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' }\n      ]\n    }\n  }\n}\n</script>\n\n<style scoped>\n.mixin-components-container {\n  background-color: #f0f2f5;\n  padding: 30px;\n  min-height: calc(100vh - 84px);\n}\n.component-item{\n  min-height: 100px;\n}\n</style>\n"
  },
  {
    "path": "src/views/components-demo/split-pane.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside><strong>SplitPane</strong> If you've used\n      <a href=\"https://codepen.io/\" target=\"_blank\"> codepen</a>,\n      <a href=\"https://jsfiddle.net/\" target=\"_blank\"> jsfiddle </a>will not be unfamiliar.\n      <a href=\"https://github.com/PanJiaChen/vue-split-pane\" target=\"_blank\"> Github repository</a>\n    </aside>\n    <split-pane split=\"vertical\" @resize=\"resize\">\n      <template slot=\"paneL\">\n        <div class=\"left-container\" />\n      </template>\n      <template slot=\"paneR\">\n        <split-pane split=\"horizontal\">\n          <template slot=\"paneL\">\n            <div class=\"top-container\" />\n          </template>\n          <template slot=\"paneR\">\n            <div class=\"bottom-container\" />\n          </template>\n        </split-pane>\n      </template>\n    </split-pane>\n  </div>\n</template>\n\n<script>\nimport splitPane from 'vue-splitpane'\n\nexport default {\n  name: 'SplitpaneDemo',\n  components: { splitPane },\n  methods: {\n    resize() {\n      console.log('resize')\n    }\n  }\n}\n</script>\n\n<style  scoped>\n  .components-container {\n    position: relative;\n    height: 100vh;\n  }\n\n  .left-container {\n    background-color: #F38181;\n    height: 100%;\n  }\n\n  .right-container {\n    background-color: #FCE38A;\n    height: 200px;\n  }\n\n  .top-container {\n    background-color: #FCE38A;\n    width: 100%;\n    height: 100%;\n  }\n\n  .bottom-container {\n    width: 100%;\n    background-color: #95E1D3;\n    height: 100%;\n  }\n</style>\n"
  },
  {
    "path": "src/views/components-demo/sticky.vue",
    "content": "<template>\n  <div>\n    <sticky :z-index=\"10\" class-name=\"sub-navbar\">\n      <el-dropdown trigger=\"click\">\n        <el-button plain>\n          Platform<i class=\"el-icon-caret-bottom el-icon--right\" />\n        </el-button>\n        <el-dropdown-menu slot=\"dropdown\" class=\"no-border\">\n          <el-checkbox-group v-model=\"platforms\" style=\"padding: 5px 15px;\">\n            <el-checkbox v-for=\"item in platformsOptions\" :key=\"item.key\" :label=\"item.key\">\n              {{ item.name }}\n            </el-checkbox>\n          </el-checkbox-group>\n        </el-dropdown-menu>\n      </el-dropdown>\n\n      <el-dropdown trigger=\"click\">\n        <el-button plain>\n          Link<i class=\"el-icon-caret-bottom el-icon--right\" />\n        </el-button>\n        <el-dropdown-menu slot=\"dropdown\" class=\"no-padding no-border\" style=\"width:300px\">\n          <el-input v-model=\"url\" placeholder=\"Please enter the content\">\n            <template slot=\"prepend\">\n              Url\n            </template>\n          </el-input>\n        </el-dropdown-menu>\n      </el-dropdown>\n\n      <div class=\"time-container\">\n        <el-date-picker v-model=\"time\" type=\"datetime\" format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"Release time\" />\n      </div>\n\n      <el-button style=\"margin-left: 10px;\" type=\"success\">\n        publish\n      </el-button>\n    </sticky>\n\n    <div class=\"components-container\">\n      <aside>\n        Sticky header, When the page is scrolled to the preset position will be sticky on the top.\n      </aside>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <sticky :sticky-top=\"200\">\n        <el-button type=\"primary\"> placeholder</el-button>\n      </sticky>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n      <div>placeholder</div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Sticky from '@/components/Sticky'\n\nexport default {\n  name: 'StickyDemo',\n  components: { Sticky },\n  data() {\n    return {\n      time: '',\n      url: '',\n      platforms: ['a-platform'],\n      platformsOptions: [\n        { key: 'a-platform', name: 'platformA' },\n        { key: 'b-platform', name: 'platformB' },\n        { key: 'c-platform', name: 'platformC' }\n      ],\n      pickerOptions: {\n        disabledDate(time) {\n          return time.getTime() > Date.now()\n        }\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n.components-container div {\n  margin: 10px;\n}\n\n.time-container {\n  display: inline-block;\n}\n</style>\n"
  },
  {
    "path": "src/views/components-demo/tinymce.vue",
    "content": "<template>\n  <div class=\"components-container\">\n    <aside>\n      Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction.\n      <a target=\"_blank\" class=\"link-type\" href=\"https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html\">Documentation</a>\n    </aside>\n    <div>\n      <tinymce v-model=\"content\" :height=\"300\" />\n    </div>\n    <div class=\"editor-content\" v-html=\"content\" />\n  </div>\n</template>\n\n<script>\nimport Tinymce from '@/components/Tinymce'\n\nexport default {\n  name: 'TinymceDemo',\n  components: { Tinymce },\n  data() {\n    return {\n      content:\n      `<h1 style=\"text-align: center;\">Welcome to the TinyMCE demo!</h1><p style=\"text-align: center; font-size: 15px;\"><img title=\"TinyMCE Logo\" src=\"//www.tinymce.com/images/glyph-tinymce@2x.png\" alt=\"TinyMCE Logo\" width=\"110\" height=\"97\" /><ul>\n        <li>Our <a href=\"//www.tinymce.com/docs/\">documentation</a> is a great resource for learning how to configure TinyMCE.</li><li>Have a specific question? Visit the <a href=\"https://community.tinymce.com/forum/\">Community Forum</a>.</li><li>We also offer enterprise grade support as part of <a href=\"https://tinymce.com/pricing\">TinyMCE premium subscriptions</a>.</li>\n      </ul>`\n    }\n  }\n}\n</script>\n\n<style scoped>\n.editor-content{\n  margin-top: 20px;\n}\n</style>\n\n"
  },
  {
    "path": "src/views/dashboard/admin/components/BarChart.vue",
    "content": "<template>\n  <div :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nrequire('echarts/theme/macarons') // echarts theme\nimport resize from './mixins/resize'\n\nconst animationDuration = 6000\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '100%'\n    },\n    height: {\n      type: String,\n      default: '300px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.$nextTick(() => {\n      this.initChart()\n    })\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(this.$el, 'macarons')\n\n      this.chart.setOption({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: { // 坐标轴指示器，坐标轴触发有效\n            type: 'shadow' // 默认为直线，可选为：'line' | 'shadow'\n          }\n        },\n        grid: {\n          top: 10,\n          left: '2%',\n          right: '2%',\n          bottom: '3%',\n          containLabel: true\n        },\n        xAxis: [{\n          type: 'category',\n          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n          axisTick: {\n            alignWithLabel: true\n          }\n        }],\n        yAxis: [{\n          type: 'value',\n          axisTick: {\n            show: false\n          }\n        }],\n        series: [{\n          name: 'pageA',\n          type: 'bar',\n          stack: 'vistors',\n          barWidth: '60%',\n          data: [79, 52, 200, 334, 390, 330, 220],\n          animationDuration\n        }, {\n          name: 'pageB',\n          type: 'bar',\n          stack: 'vistors',\n          barWidth: '60%',\n          data: [80, 52, 200, 334, 390, 330, 220],\n          animationDuration\n        }, {\n          name: 'pageC',\n          type: 'bar',\n          stack: 'vistors',\n          barWidth: '60%',\n          data: [30, 52, 200, 334, 390, 330, 220],\n          animationDuration\n        }]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/BoxCard.vue",
    "content": "<template>\n  <el-card class=\"box-card-component\" style=\"margin-left:8px;\">\n    <div slot=\"header\" class=\"box-card-header\">\n      <img src=\"https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png\">\n    </div>\n    <div style=\"position:relative;\">\n      <pan-thumb :image=\"avatar\" class=\"panThumb\" />\n      <mallki class-name=\"mallki-text\" text=\"vue-element-admin\" />\n      <div style=\"padding-top:35px;\" class=\"progress-item\">\n        <span>Vue</span>\n        <el-progress :percentage=\"70\" />\n      </div>\n      <div class=\"progress-item\">\n        <span>JavaScript</span>\n        <el-progress :percentage=\"18\" />\n      </div>\n      <div class=\"progress-item\">\n        <span>CSS</span>\n        <el-progress :percentage=\"12\" />\n      </div>\n      <div class=\"progress-item\">\n        <span>ESLint</span>\n        <el-progress :percentage=\"100\" status=\"success\" />\n      </div>\n    </div>\n  </el-card>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport PanThumb from '@/components/PanThumb'\nimport Mallki from '@/components/TextHoverEffect/Mallki'\n\nexport default {\n  components: { PanThumb, Mallki },\n\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        success: 'success',\n        pending: 'danger'\n      }\n      return statusMap[status]\n    }\n  },\n  data() {\n    return {\n      statisticsData: {\n        article_count: 1024,\n        pageviews_count: 1024\n      }\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'name',\n      'avatar',\n      'roles'\n    ])\n  }\n}\n</script>\n\n<style lang=\"scss\" >\n.box-card-component{\n  .el-card__header {\n    padding: 0px!important;\n  }\n}\n</style>\n<style lang=\"scss\" scoped>\n.box-card-component {\n  .box-card-header {\n    position: relative;\n    height: 220px;\n    img {\n      width: 100%;\n      height: 100%;\n      transition: all 0.2s linear;\n      &:hover {\n        transform: scale(1.1, 1.1);\n        filter: contrast(130%);\n      }\n    }\n  }\n  .mallki-text {\n    position: absolute;\n    top: 0px;\n    right: 0px;\n    font-size: 20px;\n    font-weight: bold;\n  }\n  .panThumb {\n    z-index: 100;\n    height: 70px!important;\n    width: 70px!important;\n    position: absolute!important;\n    top: -45px;\n    left: 0px;\n    border: 5px solid #ffffff;\n    background-color: #fff;\n    margin: auto;\n    box-shadow: none!important;\n    ::v-deep .pan-info {\n      box-shadow: none!important;\n    }\n  }\n  .progress-item {\n    margin-bottom: 10px;\n    font-size: 14px;\n  }\n  @media only screen and (max-width: 1510px){\n    .mallki-text{\n      display: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/LineChart.vue",
    "content": "<template>\n  <div :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nrequire('echarts/theme/macarons') // echarts theme\nimport resize from './mixins/resize'\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '100%'\n    },\n    height: {\n      type: String,\n      default: '350px'\n    },\n    autoResize: {\n      type: Boolean,\n      default: true\n    },\n    chartData: {\n      type: Object,\n      required: true\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  watch: {\n    chartData: {\n      deep: true,\n      handler(val) {\n        this.setOptions(val)\n      }\n    }\n  },\n  mounted() {\n    this.$nextTick(() => {\n      this.initChart()\n    })\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(this.$el, 'macarons')\n      this.setOptions(this.chartData)\n    },\n    setOptions({ expectedData, actualData } = {}) {\n      this.chart.setOption({\n        xAxis: {\n          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n          boundaryGap: false,\n          axisTick: {\n            show: false\n          }\n        },\n        grid: {\n          left: 10,\n          right: 10,\n          bottom: 20,\n          top: 30,\n          containLabel: true\n        },\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'cross'\n          },\n          padding: [5, 10]\n        },\n        yAxis: {\n          axisTick: {\n            show: false\n          }\n        },\n        legend: {\n          data: ['expected', 'actual']\n        },\n        series: [{\n          name: 'expected', itemStyle: {\n            normal: {\n              color: '#FF005A',\n              lineStyle: {\n                color: '#FF005A',\n                width: 2\n              }\n            }\n          },\n          smooth: true,\n          type: 'line',\n          data: expectedData,\n          animationDuration: 2800,\n          animationEasing: 'cubicInOut'\n        },\n        {\n          name: 'actual',\n          smooth: true,\n          type: 'line',\n          itemStyle: {\n            normal: {\n              color: '#3888fa',\n              lineStyle: {\n                color: '#3888fa',\n                width: 2\n              },\n              areaStyle: {\n                color: '#f3f8ff'\n              }\n            }\n          },\n          data: actualData,\n          animationDuration: 2800,\n          animationEasing: 'quadraticOut'\n        }]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/PanelGroup.vue",
    "content": "<template>\n  <el-row :gutter=\"40\" class=\"panel-group\">\n    <el-col :xs=\"12\" :sm=\"12\" :lg=\"6\" class=\"card-panel-col\">\n      <div class=\"card-panel\" @click=\"handleSetLineChartData('newVisitis')\">\n        <div class=\"card-panel-icon-wrapper icon-people\">\n          <svg-icon icon-class=\"peoples\" class-name=\"card-panel-icon\" />\n        </div>\n        <div class=\"card-panel-description\">\n          <div class=\"card-panel-text\">\n            New Visits\n          </div>\n          <count-to :start-val=\"0\" :end-val=\"102400\" :duration=\"2600\" class=\"card-panel-num\" />\n        </div>\n      </div>\n    </el-col>\n    <el-col :xs=\"12\" :sm=\"12\" :lg=\"6\" class=\"card-panel-col\">\n      <div class=\"card-panel\" @click=\"handleSetLineChartData('messages')\">\n        <div class=\"card-panel-icon-wrapper icon-message\">\n          <svg-icon icon-class=\"message\" class-name=\"card-panel-icon\" />\n        </div>\n        <div class=\"card-panel-description\">\n          <div class=\"card-panel-text\">\n            Messages\n          </div>\n          <count-to :start-val=\"0\" :end-val=\"81212\" :duration=\"3000\" class=\"card-panel-num\" />\n        </div>\n      </div>\n    </el-col>\n    <el-col :xs=\"12\" :sm=\"12\" :lg=\"6\" class=\"card-panel-col\">\n      <div class=\"card-panel\" @click=\"handleSetLineChartData('purchases')\">\n        <div class=\"card-panel-icon-wrapper icon-money\">\n          <svg-icon icon-class=\"money\" class-name=\"card-panel-icon\" />\n        </div>\n        <div class=\"card-panel-description\">\n          <div class=\"card-panel-text\">\n            Purchases\n          </div>\n          <count-to :start-val=\"0\" :end-val=\"9280\" :duration=\"3200\" class=\"card-panel-num\" />\n        </div>\n      </div>\n    </el-col>\n    <el-col :xs=\"12\" :sm=\"12\" :lg=\"6\" class=\"card-panel-col\">\n      <div class=\"card-panel\" @click=\"handleSetLineChartData('shoppings')\">\n        <div class=\"card-panel-icon-wrapper icon-shopping\">\n          <svg-icon icon-class=\"shopping\" class-name=\"card-panel-icon\" />\n        </div>\n        <div class=\"card-panel-description\">\n          <div class=\"card-panel-text\">\n            Shoppings\n          </div>\n          <count-to :start-val=\"0\" :end-val=\"13600\" :duration=\"3600\" class=\"card-panel-num\" />\n        </div>\n      </div>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport CountTo from 'vue-count-to'\n\nexport default {\n  components: {\n    CountTo\n  },\n  methods: {\n    handleSetLineChartData(type) {\n      this.$emit('handleSetLineChartData', type)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.panel-group {\n  margin-top: 18px;\n\n  .card-panel-col {\n    margin-bottom: 32px;\n  }\n\n  .card-panel {\n    height: 108px;\n    cursor: pointer;\n    font-size: 12px;\n    position: relative;\n    overflow: hidden;\n    color: #666;\n    background: #fff;\n    box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);\n    border-color: rgba(0, 0, 0, .05);\n\n    &:hover {\n      .card-panel-icon-wrapper {\n        color: #fff;\n      }\n\n      .icon-people {\n        background: #40c9c6;\n      }\n\n      .icon-message {\n        background: #36a3f7;\n      }\n\n      .icon-money {\n        background: #f4516c;\n      }\n\n      .icon-shopping {\n        background: #34bfa3\n      }\n    }\n\n    .icon-people {\n      color: #40c9c6;\n    }\n\n    .icon-message {\n      color: #36a3f7;\n    }\n\n    .icon-money {\n      color: #f4516c;\n    }\n\n    .icon-shopping {\n      color: #34bfa3\n    }\n\n    .card-panel-icon-wrapper {\n      float: left;\n      margin: 14px 0 0 14px;\n      padding: 16px;\n      transition: all 0.38s ease-out;\n      border-radius: 6px;\n    }\n\n    .card-panel-icon {\n      float: left;\n      font-size: 48px;\n    }\n\n    .card-panel-description {\n      float: right;\n      font-weight: bold;\n      margin: 26px;\n      margin-left: 0px;\n\n      .card-panel-text {\n        line-height: 18px;\n        color: rgba(0, 0, 0, 0.45);\n        font-size: 16px;\n        margin-bottom: 12px;\n      }\n\n      .card-panel-num {\n        font-size: 20px;\n      }\n    }\n  }\n}\n\n@media (max-width:550px) {\n  .card-panel-description {\n    display: none;\n  }\n\n  .card-panel-icon-wrapper {\n    float: none !important;\n    width: 100%;\n    height: 100%;\n    margin: 0 !important;\n\n    .svg-icon {\n      display: block;\n      margin: 14px auto !important;\n      float: none !important;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/PieChart.vue",
    "content": "<template>\n  <div :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nrequire('echarts/theme/macarons') // echarts theme\nimport resize from './mixins/resize'\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '100%'\n    },\n    height: {\n      type: String,\n      default: '300px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.$nextTick(() => {\n      this.initChart()\n    })\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(this.$el, 'macarons')\n\n      this.chart.setOption({\n        tooltip: {\n          trigger: 'item',\n          formatter: '{a} <br/>{b} : {c} ({d}%)'\n        },\n        legend: {\n          left: 'center',\n          bottom: '10',\n          data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts']\n        },\n        series: [\n          {\n            name: 'WEEKLY WRITE ARTICLES',\n            type: 'pie',\n            roseType: 'radius',\n            radius: [15, 95],\n            center: ['50%', '38%'],\n            data: [\n              { value: 320, name: 'Industries' },\n              { value: 240, name: 'Technology' },\n              { value: 149, name: 'Forex' },\n              { value: 100, name: 'Gold' },\n              { value: 59, name: 'Forecasts' }\n            ],\n            animationEasing: 'cubicInOut',\n            animationDuration: 2600\n          }\n        ]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/RaddarChart.vue",
    "content": "<template>\n  <div :class=\"className\" :style=\"{height:height,width:width}\" />\n</template>\n\n<script>\nimport echarts from 'echarts'\nrequire('echarts/theme/macarons') // echarts theme\nimport resize from './mixins/resize'\n\nconst animationDuration = 3000\n\nexport default {\n  mixins: [resize],\n  props: {\n    className: {\n      type: String,\n      default: 'chart'\n    },\n    width: {\n      type: String,\n      default: '100%'\n    },\n    height: {\n      type: String,\n      default: '300px'\n    }\n  },\n  data() {\n    return {\n      chart: null\n    }\n  },\n  mounted() {\n    this.$nextTick(() => {\n      this.initChart()\n    })\n  },\n  beforeDestroy() {\n    if (!this.chart) {\n      return\n    }\n    this.chart.dispose()\n    this.chart = null\n  },\n  methods: {\n    initChart() {\n      this.chart = echarts.init(this.$el, 'macarons')\n\n      this.chart.setOption({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: { // 坐标轴指示器，坐标轴触发有效\n            type: 'shadow' // 默认为直线，可选为：'line' | 'shadow'\n          }\n        },\n        radar: {\n          radius: '66%',\n          center: ['50%', '42%'],\n          splitNumber: 8,\n          splitArea: {\n            areaStyle: {\n              color: 'rgba(127,95,132,.3)',\n              opacity: 1,\n              shadowBlur: 45,\n              shadowColor: 'rgba(0,0,0,.5)',\n              shadowOffsetX: 0,\n              shadowOffsetY: 15\n            }\n          },\n          indicator: [\n            { name: 'Sales', max: 10000 },\n            { name: 'Administration', max: 20000 },\n            { name: 'Information Technology', max: 20000 },\n            { name: 'Customer Support', max: 20000 },\n            { name: 'Development', max: 20000 },\n            { name: 'Marketing', max: 20000 }\n          ]\n        },\n        legend: {\n          left: 'center',\n          bottom: '10',\n          data: ['Allocated Budget', 'Expected Spending', 'Actual Spending']\n        },\n        series: [{\n          type: 'radar',\n          symbolSize: 0,\n          areaStyle: {\n            normal: {\n              shadowBlur: 13,\n              shadowColor: 'rgba(0,0,0,.2)',\n              shadowOffsetX: 0,\n              shadowOffsetY: 10,\n              opacity: 1\n            }\n          },\n          data: [\n            {\n              value: [5000, 7000, 12000, 11000, 15000, 14000],\n              name: 'Allocated Budget'\n            },\n            {\n              value: [4000, 9000, 15000, 15000, 13000, 11000],\n              name: 'Expected Spending'\n            },\n            {\n              value: [5500, 11000, 12000, 15000, 12000, 12000],\n              name: 'Actual Spending'\n            }\n          ],\n          animationDuration: animationDuration\n        }]\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/TodoList/Todo.vue",
    "content": "<template>\n  <li :class=\"{ completed: todo.done, editing: editing }\" class=\"todo\">\n    <div class=\"view\">\n      <input\n        :checked=\"todo.done\"\n        class=\"toggle\"\n        type=\"checkbox\"\n        @change=\"toggleTodo( todo)\"\n      >\n      <label @dblclick=\"editing = true\" v-text=\"todo.text\" />\n      <button class=\"destroy\" @click=\"deleteTodo( todo )\" />\n    </div>\n    <input\n      v-show=\"editing\"\n      v-focus=\"editing\"\n      :value=\"todo.text\"\n      class=\"edit\"\n      @keyup.enter=\"doneEdit\"\n      @keyup.esc=\"cancelEdit\"\n      @blur=\"doneEdit\"\n    >\n  </li>\n</template>\n\n<script>\nexport default {\n  name: 'Todo',\n  directives: {\n    focus(el, { value }, { context }) {\n      if (value) {\n        context.$nextTick(() => {\n          el.focus()\n        })\n      }\n    }\n  },\n  props: {\n    todo: {\n      type: Object,\n      default: function() {\n        return {}\n      }\n    }\n  },\n  data() {\n    return {\n      editing: false\n    }\n  },\n  methods: {\n    deleteTodo(todo) {\n      this.$emit('deleteTodo', todo)\n    },\n    editTodo({ todo, value }) {\n      this.$emit('editTodo', { todo, value })\n    },\n    toggleTodo(todo) {\n      this.$emit('toggleTodo', todo)\n    },\n    doneEdit(e) {\n      const value = e.target.value.trim()\n      const { todo } = this\n      if (!value) {\n        this.deleteTodo({\n          todo\n        })\n      } else if (this.editing) {\n        this.editTodo({\n          todo,\n          value\n        })\n        this.editing = false\n      }\n    },\n    cancelEdit(e) {\n      e.target.value = this.todo.text\n      this.editing = false\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/TodoList/index.scss",
    "content": ".todoapp {\n  font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  line-height: 1.4em;\n  color: #4d4d4d;\n  min-width: 230px;\n  max-width: 550px;\n  margin: 0 auto ;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-weight: 300;\n  background: #fff;\n  z-index: 1;\n  position: relative;\n  button {\n    margin: 0;\n    padding: 0;\n    border: 0;\n    background: none;\n    font-size: 100%;\n    vertical-align: baseline;\n    font-family: inherit;\n    font-weight: inherit;\n    color: inherit;\n    -webkit-appearance: none;\n    appearance: none;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n  :focus {\n    outline: 0;\n  }\n  .hidden {\n    display: none;\n  }\n  .todoapp {\n    background: #fff;\n    margin: 130px 0 40px 0;\n    position: relative;\n    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);\n  }\n  .todoapp input::-webkit-input-placeholder {\n    font-style: italic;\n    font-weight: 300;\n    color: #e6e6e6;\n  }\n  .todoapp input::-moz-placeholder {\n    font-style: italic;\n    font-weight: 300;\n    color: #e6e6e6;\n  }\n  .todoapp input::input-placeholder {\n    font-style: italic;\n    font-weight: 300;\n    color: #e6e6e6;\n  }\n  .todoapp h1 {\n    position: absolute;\n    top: -155px;\n    width: 100%;\n    font-size: 100px;\n    font-weight: 100;\n    text-align: center;\n    color: rgba(175, 47, 47, 0.15);\n    -webkit-text-rendering: optimizeLegibility;\n    -moz-text-rendering: optimizeLegibility;\n    text-rendering: optimizeLegibility;\n  }\n  .new-todo,\n  .edit {\n    position: relative;\n    margin: 0;\n    width: 100%;\n    font-size: 18px;\n    font-family: inherit;\n    font-weight: inherit;\n    line-height: 1.4em;\n    border: 0;\n    color: inherit;\n    padding: 6px;\n    border: 1px solid #999;\n    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);\n    box-sizing: border-box;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n  .new-todo {\n    padding: 10px 16px 16px 60px;\n    border: none;\n    background: rgba(0, 0, 0, 0.003);\n    box-shadow: inset 0 -2px 1px rgba(0, 0, 0, 0.03);\n  }\n  .main {\n    position: relative;\n    z-index: 2;\n    border-top: 1px solid #e6e6e6;\n  }\n  .toggle-all {\n    text-align: center;\n    border: none;\n    /* Mobile Safari */\n    opacity: 0;\n    position: absolute;\n  }\n  .toggle-all+label {\n    width: 60px;\n    height: 34px;\n    font-size: 0;\n    position: absolute;\n    top: -52px;\n    left: -13px;\n    -webkit-transform: rotate(90deg);\n    transform: rotate(90deg);\n  }\n  .toggle-all+label:before {\n    content: '❯';\n    font-size: 22px;\n    color: #e6e6e6;\n    padding: 10px 27px 10px 27px;\n  }\n  .toggle-all:checked+label:before {\n    color: #737373;\n  }\n  .todo-list {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n  }\n  .todo-list li {\n    position: relative;\n    font-size: 24px;\n    border-bottom: 1px solid #ededed;\n  }\n  .todo-list li:last-child {\n    border-bottom: none;\n  }\n  .todo-list li.editing {\n    border-bottom: none;\n    padding: 0;\n  }\n  .todo-list li.editing .edit {\n    display: block;\n    width: 506px;\n    padding: 12px 16px;\n    margin: 0 0 0 43px;\n  }\n  .todo-list li.editing .view {\n    display: none;\n  }\n  .todo-list li .toggle {\n    text-align: center;\n    width: 40px;\n    /* auto, since non-WebKit browsers doesn't support input styling */\n    height: auto;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    margin: auto 0;\n    border: none;\n    /* Mobile Safari */\n    -webkit-appearance: none;\n    appearance: none;\n  }\n  .todo-list li .toggle {\n    opacity: 0;\n  }\n  .todo-list li .toggle+label {\n    /*\n    Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433\n    IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/\n  */\n    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');\n    background-repeat: no-repeat;\n    background-position: center left;\n    background-size: 36px;\n  }\n  .todo-list li .toggle:checked+label {\n    background-size: 36px;\n    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');\n  }\n  .todo-list li label {\n    word-break: break-all;\n    padding: 15px 15px 15px 50px;\n    display: block;\n    line-height: 1.0;\n        font-size: 14px;\n    transition: color 0.4s;\n  }\n  .todo-list li.completed label {\n    color: #d9d9d9;\n    text-decoration: line-through;\n  }\n  .todo-list li .destroy {\n    display: none;\n    position: absolute;\n    top: 0;\n    right: 10px;\n    bottom: 0;\n    width: 40px;\n    height: 40px;\n    margin: auto 0;\n    font-size: 30px;\n    color: #cc9a9a;\n    transition: color 0.2s ease-out;\n    cursor: pointer;\n  }\n  .todo-list li .destroy:hover {\n    color: #af5b5e;\n  }\n  .todo-list li .destroy:after {\n    content: '×';\n  }\n  .todo-list li:hover .destroy {\n    display: block;\n  }\n  .todo-list li .edit {\n    display: none;\n  }\n  .todo-list li.editing:last-child {\n    margin-bottom: -1px;\n  }\n  .footer {\n    color: #777;\n    position: relative;\n    padding: 10px 15px;\n    height: 40px;\n    text-align: center;\n    border-top: 1px solid #e6e6e6;\n  }\n  .footer:before {\n    content: '';\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    height: 40px;\n    overflow: hidden;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 8px 0 -3px #f6f6f6, 0 9px 1px -3px rgba(0, 0, 0, 0.2), 0 16px 0 -6px #f6f6f6, 0 17px 2px -6px rgba(0, 0, 0, 0.2);\n  }\n  .todo-count {\n    float: left;\n    text-align: left;\n  }\n  .todo-count strong {\n    font-weight: 300;\n  }\n  .filters {\n    margin: 0;\n    padding: 0;\n    position: relative;\n    z-index: 1;\n    list-style: none;\n  }\n  .filters li {\n    display: inline;\n  }\n  .filters li a {\n    color: inherit;\n    font-size: 12px;\n    padding: 3px 7px;\n    text-decoration: none;\n    border: 1px solid transparent;\n    border-radius: 3px;\n  }\n  .filters li a:hover {\n    border-color: rgba(175, 47, 47, 0.1);\n  }\n  .filters li a.selected {\n    border-color: rgba(175, 47, 47, 0.2);\n  }\n  .clear-completed,\n  html .clear-completed:active {\n    float: right;\n    position: relative;\n    line-height: 20px;\n    text-decoration: none;\n    cursor: pointer;\n  }\n  .clear-completed:hover {\n    text-decoration: underline;\n  }\n  .info {\n    margin: 65px auto 0;\n    color: #bfbfbf;\n    font-size: 10px;\n    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n    text-align: center;\n  }\n  .info p {\n    line-height: 1;\n  }\n  .info a {\n    color: inherit;\n    text-decoration: none;\n    font-weight: 400;\n  }\n  .info a:hover {\n    text-decoration: underline;\n  }\n  /*\n  Hack to remove background from Mobile Safari.\n  Can't use it globally since it destroys checkboxes in Firefox\n*/\n  @media screen and (-webkit-min-device-pixel-ratio:0) {\n    .toggle-all,\n    .todo-list li .toggle {\n      background: none;\n    }\n    .todo-list li .toggle {\n      height: 40px;\n    }\n  }\n  @media (max-width: 430px) {\n    .footer {\n      height: 50px;\n    }\n    .filters {\n      bottom: 10px;\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/dashboard/admin/components/TodoList/index.vue",
    "content": "<template>\n  <section class=\"todoapp\">\n    <!-- header -->\n    <header class=\"header\">\n      <input class=\"new-todo\" autocomplete=\"off\" placeholder=\"Todo List\" @keyup.enter=\"addTodo\">\n    </header>\n    <!-- main section -->\n    <section v-show=\"todos.length\" class=\"main\">\n      <input id=\"toggle-all\" :checked=\"allChecked\" class=\"toggle-all\" type=\"checkbox\" @change=\"toggleAll({ done: !allChecked })\">\n      <label for=\"toggle-all\" />\n      <ul class=\"todo-list\">\n        <todo\n          v-for=\"(todo, index) in filteredTodos\"\n          :key=\"index\"\n          :todo=\"todo\"\n          @toggleTodo=\"toggleTodo\"\n          @editTodo=\"editTodo\"\n          @deleteTodo=\"deleteTodo\"\n        />\n      </ul>\n    </section>\n    <!-- footer -->\n    <footer v-show=\"todos.length\" class=\"footer\">\n      <span class=\"todo-count\">\n        <strong>{{ remaining }}</strong>\n        {{ remaining | pluralize('item') }} left\n      </span>\n      <ul class=\"filters\">\n        <li v-for=\"(val, key) in filters\" :key=\"key\">\n          <a :class=\"{ selected: visibility === key }\" @click.prevent=\"visibility = key\">{{ key | capitalize }}</a>\n        </li>\n      </ul>\n      <!-- <button class=\"clear-completed\" v-show=\"todos.length > remaining\" @click=\"clearCompleted\">\n        Clear completed\n      </button> -->\n    </footer>\n  </section>\n</template>\n\n<script>\nimport Todo from './Todo.vue'\n\nconst STORAGE_KEY = 'todos'\nconst filters = {\n  all: todos => todos,\n  active: todos => todos.filter(todo => !todo.done),\n  completed: todos => todos.filter(todo => todo.done)\n}\nconst defalutList = [\n  { text: 'star this repository', done: false },\n  { text: 'fork this repository', done: false },\n  { text: 'follow author', done: false },\n  { text: 'vue-element-admin', done: true },\n  { text: 'vue', done: true },\n  { text: 'element-ui', done: true },\n  { text: 'axios', done: true },\n  { text: 'webpack', done: true }\n]\nexport default {\n  components: { Todo },\n  filters: {\n    pluralize: (n, w) => n === 1 ? w : w + 's',\n    capitalize: s => s.charAt(0).toUpperCase() + s.slice(1)\n  },\n  data() {\n    return {\n      visibility: 'all',\n      filters,\n      // todos: JSON.parse(window.localStorage.getItem(STORAGE_KEY)) || defalutList\n      todos: defalutList\n    }\n  },\n  computed: {\n    allChecked() {\n      return this.todos.every(todo => todo.done)\n    },\n    filteredTodos() {\n      return filters[this.visibility](this.todos)\n    },\n    remaining() {\n      return this.todos.filter(todo => !todo.done).length\n    }\n  },\n  methods: {\n    setLocalStorage() {\n      window.localStorage.setItem(STORAGE_KEY, JSON.stringify(this.todos))\n    },\n    addTodo(e) {\n      const text = e.target.value\n      if (text.trim()) {\n        this.todos.push({\n          text,\n          done: false\n        })\n        this.setLocalStorage()\n      }\n      e.target.value = ''\n    },\n    toggleTodo(val) {\n      val.done = !val.done\n      this.setLocalStorage()\n    },\n    deleteTodo(todo) {\n      this.todos.splice(this.todos.indexOf(todo), 1)\n      this.setLocalStorage()\n    },\n    editTodo({ todo, value }) {\n      todo.text = value\n      this.setLocalStorage()\n    },\n    clearCompleted() {\n      this.todos = this.todos.filter(todo => !todo.done)\n      this.setLocalStorage()\n    },\n    toggleAll({ done }) {\n      this.todos.forEach(todo => {\n        todo.done = done\n        this.setLocalStorage()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n  @import './index.scss';\n</style>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/TransactionTable.vue",
    "content": "<template>\n  <el-table :data=\"list\" style=\"width: 100%;padding-top: 15px;\">\n    <el-table-column label=\"Order_No\" min-width=\"200\">\n      <template slot-scope=\"scope\">\n        {{ scope.row.order_no | orderNoFilter }}\n      </template>\n    </el-table-column>\n    <el-table-column label=\"Price\" width=\"195\" align=\"center\">\n      <template slot-scope=\"scope\">\n        ¥{{ scope.row.price | toThousandFilter }}\n      </template>\n    </el-table-column>\n    <el-table-column label=\"Status\" width=\"100\" align=\"center\">\n      <template slot-scope=\"{row}\">\n        <el-tag :type=\"row.status | statusFilter\">\n          {{ row.status }}\n        </el-tag>\n      </template>\n    </el-table-column>\n  </el-table>\n</template>\n\n<script>\nimport { transactionList } from '@/api/remote-search'\n\nexport default {\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        success: 'success',\n        pending: 'danger'\n      }\n      return statusMap[status]\n    },\n    orderNoFilter(str) {\n      return str.substring(0, 30)\n    }\n  },\n  data() {\n    return {\n      list: null\n    }\n  },\n  created() {\n    this.fetchData()\n  },\n  methods: {\n    fetchData() {\n      transactionList().then(response => {\n        this.list = response.data.items.slice(0, 8)\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/dashboard/admin/components/mixins/resize.js",
    "content": "import { debounce } from '@/utils'\n\nexport default {\n  data() {\n    return {\n      $_sidebarElm: null,\n      $_resizeHandler: null\n    }\n  },\n  mounted() {\n    this.$_resizeHandler = debounce(() => {\n      if (this.chart) {\n        this.chart.resize()\n      }\n    }, 100)\n    this.$_initResizeEvent()\n    this.$_initSidebarResizeEvent()\n  },\n  beforeDestroy() {\n    this.$_destroyResizeEvent()\n    this.$_destroySidebarResizeEvent()\n  },\n  // to fixed bug when cached by keep-alive\n  // https://github.com/PanJiaChen/vue-element-admin/issues/2116\n  activated() {\n    this.$_initResizeEvent()\n    this.$_initSidebarResizeEvent()\n  },\n  deactivated() {\n    this.$_destroyResizeEvent()\n    this.$_destroySidebarResizeEvent()\n  },\n  methods: {\n    // use $_ for mixins properties\n    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential\n    $_initResizeEvent() {\n      window.addEventListener('resize', this.$_resizeHandler)\n    },\n    $_destroyResizeEvent() {\n      window.removeEventListener('resize', this.$_resizeHandler)\n    },\n    $_sidebarResizeHandler(e) {\n      if (e.propertyName === 'width') {\n        this.$_resizeHandler()\n      }\n    },\n    $_initSidebarResizeEvent() {\n      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]\n      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)\n    },\n    $_destroySidebarResizeEvent() {\n      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/dashboard/admin/index.vue",
    "content": "<template>\n  <div class=\"dashboard-editor-container\">\n    <github-corner class=\"github-corner\" />\n\n    <panel-group @handleSetLineChartData=\"handleSetLineChartData\" />\n\n    <el-row style=\"background:#fff;padding:16px 16px 0;margin-bottom:32px;\">\n      <line-chart :chart-data=\"lineChartData\" />\n    </el-row>\n\n    <el-row :gutter=\"32\">\n      <el-col :xs=\"24\" :sm=\"24\" :lg=\"8\">\n        <div class=\"chart-wrapper\">\n          <raddar-chart />\n        </div>\n      </el-col>\n      <el-col :xs=\"24\" :sm=\"24\" :lg=\"8\">\n        <div class=\"chart-wrapper\">\n          <pie-chart />\n        </div>\n      </el-col>\n      <el-col :xs=\"24\" :sm=\"24\" :lg=\"8\">\n        <div class=\"chart-wrapper\">\n          <bar-chart />\n        </div>\n      </el-col>\n    </el-row>\n\n    <el-row :gutter=\"8\">\n      <el-col :xs=\"{span: 24}\" :sm=\"{span: 24}\" :md=\"{span: 24}\" :lg=\"{span: 12}\" :xl=\"{span: 12}\" style=\"padding-right:8px;margin-bottom:30px;\">\n        <transaction-table />\n      </el-col>\n      <el-col :xs=\"{span: 24}\" :sm=\"{span: 12}\" :md=\"{span: 12}\" :lg=\"{span: 6}\" :xl=\"{span: 6}\" style=\"margin-bottom:30px;\">\n        <todo-list />\n      </el-col>\n      <el-col :xs=\"{span: 24}\" :sm=\"{span: 12}\" :md=\"{span: 12}\" :lg=\"{span: 6}\" :xl=\"{span: 6}\" style=\"margin-bottom:30px;\">\n        <box-card />\n      </el-col>\n    </el-row>\n  </div>\n</template>\n\n<script>\nimport GithubCorner from '@/components/GithubCorner'\nimport PanelGroup from './components/PanelGroup'\nimport LineChart from './components/LineChart'\nimport RaddarChart from './components/RaddarChart'\nimport PieChart from './components/PieChart'\nimport BarChart from './components/BarChart'\nimport TransactionTable from './components/TransactionTable'\nimport TodoList from './components/TodoList'\nimport BoxCard from './components/BoxCard'\n\nconst lineChartData = {\n  newVisitis: {\n    expectedData: [100, 120, 161, 134, 105, 160, 165],\n    actualData: [120, 82, 91, 154, 162, 140, 145]\n  },\n  messages: {\n    expectedData: [200, 192, 120, 144, 160, 130, 140],\n    actualData: [180, 160, 151, 106, 145, 150, 130]\n  },\n  purchases: {\n    expectedData: [80, 100, 121, 104, 105, 90, 100],\n    actualData: [120, 90, 100, 138, 142, 130, 130]\n  },\n  shoppings: {\n    expectedData: [130, 140, 141, 142, 145, 150, 160],\n    actualData: [120, 82, 91, 154, 162, 140, 130]\n  }\n}\n\nexport default {\n  name: 'DashboardAdmin',\n  components: {\n    GithubCorner,\n    PanelGroup,\n    LineChart,\n    RaddarChart,\n    PieChart,\n    BarChart,\n    TransactionTable,\n    TodoList,\n    BoxCard\n  },\n  data() {\n    return {\n      lineChartData: lineChartData.newVisitis\n    }\n  },\n  methods: {\n    handleSetLineChartData(type) {\n      this.lineChartData = lineChartData[type]\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dashboard-editor-container {\n  padding: 32px;\n  background-color: rgb(240, 242, 245);\n  position: relative;\n\n  .github-corner {\n    position: absolute;\n    top: 0px;\n    border: 0;\n    right: 0;\n  }\n\n  .chart-wrapper {\n    background: #fff;\n    padding: 16px 16px 0;\n    margin-bottom: 32px;\n  }\n}\n\n@media (max-width:1024px) {\n  .chart-wrapper {\n    padding: 8px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/dashboard/editor/index.vue",
    "content": "<template>\n  <div class=\"dashboard-editor-container\">\n    <div class=\" clearfix\">\n      <pan-thumb :image=\"avatar\" style=\"float: left\">\n        Your roles:\n        <span v-for=\"item in roles\" :key=\"item\" class=\"pan-info-roles\">{{ item }}</span>\n      </pan-thumb>\n      <github-corner style=\"position: absolute; top: 0px; border: 0; right: 0;\" />\n      <div class=\"info-container\">\n        <span class=\"display_name\">{{ name }}</span>\n        <span style=\"font-size:20px;padding-top:20px;display:inline-block;\">Editor's Dashboard</span>\n      </div>\n    </div>\n    <div>\n      <img :src=\"emptyGif\" class=\"emptyGif\">\n    </div>\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport PanThumb from '@/components/PanThumb'\nimport GithubCorner from '@/components/GithubCorner'\n\nexport default {\n  name: 'DashboardEditor',\n  components: { PanThumb, GithubCorner },\n  data() {\n    return {\n      emptyGif: 'https://wpimg.wallstcn.com/0e03b7da-db9e-4819-ba10-9016ddfdaed3'\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'name',\n      'avatar',\n      'roles'\n    ])\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .emptyGif {\n    display: block;\n    width: 45%;\n    margin: 0 auto;\n  }\n\n  .dashboard-editor-container {\n    background-color: #e3e3e3;\n    min-height: 100vh;\n    padding: 50px 60px 0px;\n    .pan-info-roles {\n      font-size: 12px;\n      font-weight: 700;\n      color: #333;\n      display: block;\n    }\n    .info-container {\n      position: relative;\n      margin-left: 190px;\n      height: 150px;\n      line-height: 200px;\n      .display_name {\n        font-size: 48px;\n        line-height: 48px;\n        color: #212121;\n        position: absolute;\n        top: 25px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/dashboard/index.vue",
    "content": "<template>\n  <div class=\"dashboard-container\">\n    <component :is=\"currentRole\" />\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport adminDashboard from './admin'\nimport editorDashboard from './editor'\n\nexport default {\n  name: 'Dashboard',\n  components: { adminDashboard, editorDashboard },\n  data() {\n    return {\n      currentRole: 'adminDashboard'\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'roles'\n    ])\n  },\n  created() {\n    if (!this.roles.includes('admin')) {\n      this.currentRole = 'editorDashboard'\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/documentation/index.vue",
    "content": "<template>\n  <div class=\"app-container documentation-container\">\n    <a class=\"document-btn\" target=\"_blank\" href=\"https://store.akveo.com/products/vue-java-admin-dashboard-spring?utm_campaign=akveo_store-Vue-Vue_demo%2Fgithub&utm_source=vue_admin&utm_medium=referral&utm_content=demo_English_button\">Java backend integration</a>\n    <a class=\"document-btn\" target=\"_blank\" href=\"https://panjiachen.github.io/vue-element-admin-site/\">Documentation</a>\n    <a class=\"document-btn\" target=\"_blank\" href=\"https://github.com/PanJiaChen/vue-element-admin/\">Github Repository</a>\n    <a class=\"document-btn\" target=\"_blank\" href=\"https://panjiachen.gitee.io/vue-element-admin-site/zh/\">国内文档</a>\n    <dropdown-menu class=\"document-btn\" :items=\"articleList\" title=\"系列文章\" />\n    <a class=\"document-btn\" target=\"_blank\" href=\"https://panjiachen.github.io/vue-element-admin-site/zh/job/\">内推招聘</a>\n  </div>\n</template>\n\n<script>\nimport DropdownMenu from '@/components/Share/DropdownMenu'\n\nexport default {\n  name: 'Documentation',\n  components: { DropdownMenu },\n  data() {\n    return {\n      articleList: [\n        { title: '基础篇', href: 'https://juejin.im/post/59097cd7a22b9d0065fb61d2' },\n        { title: '登录权限篇', href: 'https://juejin.im/post/591aa14f570c35006961acac' },\n        { title: '实战篇', href: 'https://juejin.im/post/593121aa0ce4630057f70d35' },\n        { title: 'vue-admin-template 篇', href: 'https://juejin.im/post/595b4d776fb9a06bbe7dba56' },\n        { title: 'v4.0 篇', href: 'https://juejin.im/post/5c92ff94f265da6128275a85' },\n        { title: '自行封装 component', href: 'https://segmentfault.com/a/1190000009090836' },\n        { title: '优雅的使用 icon', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },\n        { title: 'webpack4（上）', href: 'https://juejin.im/post/59bb864b5188257e7a427c09' },\n        { title: 'webpack4（下）', href: 'https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc' }\n      ]\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.documentation-container {\n  margin: 50px;\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n\n  .document-btn {\n    flex-shrink: 0;\n    display: block;\n    cursor: pointer;\n    background: black;\n    color: white;\n    height: 60px;\n    padding: 0 16px;\n    margin: 16px;\n    line-height: 60px;\n    font-size: 20px;\n    text-align: center;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/error-log/components/ErrorTestA.vue",
    "content": "<template>\n  <div>\n    <!--error code-->\n    {{ a.a }}\n    <!--error code-->\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ErrorTestA'\n}\n</script>\n"
  },
  {
    "path": "src/views/error-log/components/ErrorTestB.vue",
    "content": "<template>\n  <div />\n</template>\n\n<script>\nexport default {\n  created() {\n    this.b = b // eslint-disable-line\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/error-log/index.vue",
    "content": "<template>\n  <div class=\"errPage-container\">\n    <ErrorA />\n    <ErrorB />\n    <h3>Please click the bug icon in the upper right corner</h3>\n    <aside>\n      Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.\n      <a target=\"_blank\" class=\"link-type\" href=\"https://panjiachen.github.io/vue-element-admin-site/guide/advanced/error.html\">\n        Document introduction\n      </a>\n    </aside>\n    <a href=\"#\">\n      <img src=\"https://wpimg.wallstcn.com/360e4842-4db5-42d0-b078-f9a84a825546.gif\">\n    </a>\n  </div>\n</template>\n\n<script>\nimport ErrorA from './components/ErrorTestA'\nimport ErrorB from './components/ErrorTestB'\n\nexport default {\n  name: 'ErrorLog',\n  components: { ErrorA, ErrorB }\n}\n</script>\n\n<style scoped>\n  .errPage-container {\n    padding: 30px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/error-page/401.vue",
    "content": "<template>\n  <div class=\"errPage-container\">\n    <el-button icon=\"el-icon-arrow-left\" class=\"pan-back-btn\" @click=\"back\">\n      返回\n    </el-button>\n    <el-row>\n      <el-col :span=\"12\">\n        <h1 class=\"text-jumbo text-ginormous\">\n          Oops!\n        </h1>\n        gif来源<a href=\"https://zh.airbnb.com/\" target=\"_blank\">airbnb</a> 页面\n        <h2>你没有权限去该页面</h2>\n        <h6>如有不满请联系你领导</h6>\n        <ul class=\"list-unstyled\">\n          <li>或者你可以去:</li>\n          <li class=\"link-type\">\n            <router-link to=\"/dashboard\">\n              回首页\n            </router-link>\n          </li>\n          <li class=\"link-type\">\n            <a href=\"https://www.taobao.com/\">随便看看</a>\n          </li>\n          <li><a href=\"#\" @click.prevent=\"dialogVisible=true\">点我看图</a></li>\n        </ul>\n      </el-col>\n      <el-col :span=\"12\">\n        <img :src=\"errGif\" width=\"313\" height=\"428\" alt=\"Girl has dropped her ice cream.\">\n      </el-col>\n    </el-row>\n    <el-dialog :visible.sync=\"dialogVisible\" title=\"随便看\">\n      <img :src=\"ewizardClap\" class=\"pan-img\">\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport errGif from '@/assets/401_images/401.gif'\n\nexport default {\n  name: 'Page401',\n  data() {\n    return {\n      errGif: errGif + '?' + +new Date(),\n      ewizardClap: 'https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646',\n      dialogVisible: false\n    }\n  },\n  methods: {\n    back() {\n      if (this.$route.query.noGoBack) {\n        this.$router.push({ path: '/dashboard' })\n      } else {\n        this.$router.go(-1)\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .errPage-container {\n    width: 800px;\n    max-width: 100%;\n    margin: 100px auto;\n    .pan-back-btn {\n      background: #008489;\n      color: #fff;\n      border: none!important;\n    }\n    .pan-gif {\n      margin: 0 auto;\n      display: block;\n    }\n    .pan-img {\n      display: block;\n      margin: 0 auto;\n      width: 100%;\n    }\n    .text-jumbo {\n      font-size: 60px;\n      font-weight: 700;\n      color: #484848;\n    }\n    .list-unstyled {\n      font-size: 14px;\n      li {\n        padding-bottom: 5px;\n      }\n      a {\n        color: #008489;\n        text-decoration: none;\n        &:hover {\n          text-decoration: underline;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/error-page/404.vue",
    "content": "<template>\n  <div class=\"wscn-http404-container\">\n    <div class=\"wscn-http404\">\n      <div class=\"pic-404\">\n        <img class=\"pic-404__parent\" src=\"@/assets/404_images/404.png\" alt=\"404\">\n        <img class=\"pic-404__child left\" src=\"@/assets/404_images/404_cloud.png\" alt=\"404\">\n        <img class=\"pic-404__child mid\" src=\"@/assets/404_images/404_cloud.png\" alt=\"404\">\n        <img class=\"pic-404__child right\" src=\"@/assets/404_images/404_cloud.png\" alt=\"404\">\n      </div>\n      <div class=\"bullshit\">\n        <div class=\"bullshit__oops\">OOPS!</div>\n        <div class=\"bullshit__info\">All rights reserved\n          <a style=\"color:#20a0ff\" href=\"https://wallstreetcn.com\" target=\"_blank\">wallstreetcn</a>\n        </div>\n        <div class=\"bullshit__headline\">{{ message }}</div>\n        <div class=\"bullshit__info\">Please check that the URL you entered is correct, or click the button below to return to the homepage.</div>\n        <a href=\"\" class=\"bullshit__return-home\">Back to home</a>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: 'Page404',\n  computed: {\n    message() {\n      return 'The webmaster said that you can not enter this page...'\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.wscn-http404-container{\n  transform: translate(-50%,-50%);\n  position: absolute;\n  top: 40%;\n  left: 50%;\n}\n.wscn-http404 {\n  position: relative;\n  width: 1200px;\n  padding: 0 50px;\n  overflow: hidden;\n  .pic-404 {\n    position: relative;\n    float: left;\n    width: 600px;\n    overflow: hidden;\n    &__parent {\n      width: 100%;\n    }\n    &__child {\n      position: absolute;\n      &.left {\n        width: 80px;\n        top: 17px;\n        left: 220px;\n        opacity: 0;\n        animation-name: cloudLeft;\n        animation-duration: 2s;\n        animation-timing-function: linear;\n        animation-fill-mode: forwards;\n        animation-delay: 1s;\n      }\n      &.mid {\n        width: 46px;\n        top: 10px;\n        left: 420px;\n        opacity: 0;\n        animation-name: cloudMid;\n        animation-duration: 2s;\n        animation-timing-function: linear;\n        animation-fill-mode: forwards;\n        animation-delay: 1.2s;\n      }\n      &.right {\n        width: 62px;\n        top: 100px;\n        left: 500px;\n        opacity: 0;\n        animation-name: cloudRight;\n        animation-duration: 2s;\n        animation-timing-function: linear;\n        animation-fill-mode: forwards;\n        animation-delay: 1s;\n      }\n      @keyframes cloudLeft {\n        0% {\n          top: 17px;\n          left: 220px;\n          opacity: 0;\n        }\n        20% {\n          top: 33px;\n          left: 188px;\n          opacity: 1;\n        }\n        80% {\n          top: 81px;\n          left: 92px;\n          opacity: 1;\n        }\n        100% {\n          top: 97px;\n          left: 60px;\n          opacity: 0;\n        }\n      }\n      @keyframes cloudMid {\n        0% {\n          top: 10px;\n          left: 420px;\n          opacity: 0;\n        }\n        20% {\n          top: 40px;\n          left: 360px;\n          opacity: 1;\n        }\n        70% {\n          top: 130px;\n          left: 180px;\n          opacity: 1;\n        }\n        100% {\n          top: 160px;\n          left: 120px;\n          opacity: 0;\n        }\n      }\n      @keyframes cloudRight {\n        0% {\n          top: 100px;\n          left: 500px;\n          opacity: 0;\n        }\n        20% {\n          top: 120px;\n          left: 460px;\n          opacity: 1;\n        }\n        80% {\n          top: 180px;\n          left: 340px;\n          opacity: 1;\n        }\n        100% {\n          top: 200px;\n          left: 300px;\n          opacity: 0;\n        }\n      }\n    }\n  }\n  .bullshit {\n    position: relative;\n    float: left;\n    width: 300px;\n    padding: 30px 0;\n    overflow: hidden;\n    &__oops {\n      font-size: 32px;\n      font-weight: bold;\n      line-height: 40px;\n      color: #1482f0;\n      opacity: 0;\n      margin-bottom: 20px;\n      animation-name: slideUp;\n      animation-duration: 0.5s;\n      animation-fill-mode: forwards;\n    }\n    &__headline {\n      font-size: 20px;\n      line-height: 24px;\n      color: #222;\n      font-weight: bold;\n      opacity: 0;\n      margin-bottom: 10px;\n      animation-name: slideUp;\n      animation-duration: 0.5s;\n      animation-delay: 0.1s;\n      animation-fill-mode: forwards;\n    }\n    &__info {\n      font-size: 13px;\n      line-height: 21px;\n      color: grey;\n      opacity: 0;\n      margin-bottom: 30px;\n      animation-name: slideUp;\n      animation-duration: 0.5s;\n      animation-delay: 0.2s;\n      animation-fill-mode: forwards;\n    }\n    &__return-home {\n      display: block;\n      float: left;\n      width: 110px;\n      height: 36px;\n      background: #1482f0;\n      border-radius: 100px;\n      text-align: center;\n      color: #ffffff;\n      opacity: 0;\n      font-size: 14px;\n      line-height: 36px;\n      cursor: pointer;\n      animation-name: slideUp;\n      animation-duration: 0.5s;\n      animation-delay: 0.3s;\n      animation-fill-mode: forwards;\n    }\n    @keyframes slideUp {\n      0% {\n        transform: translateY(60px);\n        opacity: 0;\n      }\n      100% {\n        transform: translateY(0);\n        opacity: 1;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/example/components/ArticleDetail.vue",
    "content": "<template>\n  <div class=\"createPost-container\">\n    <el-form ref=\"postForm\" :model=\"postForm\" :rules=\"rules\" class=\"form-container\">\n\n      <sticky :z-index=\"10\" :class-name=\"'sub-navbar '+postForm.status\">\n        <CommentDropdown v-model=\"postForm.comment_disabled\" />\n        <PlatformDropdown v-model=\"postForm.platforms\" />\n        <SourceUrlDropdown v-model=\"postForm.source_uri\" />\n        <el-button v-loading=\"loading\" style=\"margin-left: 10px;\" type=\"success\" @click=\"submitForm\">\n          Publish\n        </el-button>\n        <el-button v-loading=\"loading\" type=\"warning\" @click=\"draftForm\">\n          Draft\n        </el-button>\n      </sticky>\n\n      <div class=\"createPost-main-container\">\n        <el-row>\n          <Warning />\n\n          <el-col :span=\"24\">\n            <el-form-item style=\"margin-bottom: 40px;\" prop=\"title\">\n              <MDinput v-model=\"postForm.title\" :maxlength=\"100\" name=\"name\" required>\n                Title\n              </MDinput>\n            </el-form-item>\n\n            <div class=\"postInfo-container\">\n              <el-row>\n                <el-col :span=\"8\">\n                  <el-form-item label-width=\"60px\" label=\"Author:\" class=\"postInfo-container-item\">\n                    <el-select v-model=\"postForm.author\" :remote-method=\"getRemoteUserList\" filterable default-first-option remote placeholder=\"Search user\">\n                      <el-option v-for=\"(item,index) in userListOptions\" :key=\"item+index\" :label=\"item\" :value=\"item\" />\n                    </el-select>\n                  </el-form-item>\n                </el-col>\n\n                <el-col :span=\"10\">\n                  <el-form-item label-width=\"120px\" label=\"Publish Time:\" class=\"postInfo-container-item\">\n                    <el-date-picker v-model=\"displayTime\" type=\"datetime\" format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"Select date and time\" />\n                  </el-form-item>\n                </el-col>\n\n                <el-col :span=\"6\">\n                  <el-form-item label-width=\"90px\" label=\"Importance:\" class=\"postInfo-container-item\">\n                    <el-rate\n                      v-model=\"postForm.importance\"\n                      :max=\"3\"\n                      :colors=\"['#99A9BF', '#F7BA2A', '#FF9900']\"\n                      :low-threshold=\"1\"\n                      :high-threshold=\"3\"\n                      style=\"display:inline-block\"\n                    />\n                  </el-form-item>\n                </el-col>\n              </el-row>\n            </div>\n          </el-col>\n        </el-row>\n\n        <el-form-item style=\"margin-bottom: 40px;\" label-width=\"70px\" label=\"Summary:\">\n          <el-input v-model=\"postForm.content_short\" :rows=\"1\" type=\"textarea\" class=\"article-textarea\" autosize placeholder=\"Please enter the content\" />\n          <span v-show=\"contentShortLength\" class=\"word-counter\">{{ contentShortLength }}words</span>\n        </el-form-item>\n\n        <el-form-item prop=\"content\" style=\"margin-bottom: 30px;\">\n          <Tinymce ref=\"editor\" v-model=\"postForm.content\" :height=\"400\" />\n        </el-form-item>\n\n        <el-form-item prop=\"image_uri\" style=\"margin-bottom: 30px;\">\n          <Upload v-model=\"postForm.image_uri\" />\n        </el-form-item>\n      </div>\n    </el-form>\n  </div>\n</template>\n\n<script>\nimport Tinymce from '@/components/Tinymce'\nimport Upload from '@/components/Upload/SingleImage3'\nimport MDinput from '@/components/MDinput'\nimport Sticky from '@/components/Sticky' // 粘性header组件\nimport { validURL } from '@/utils/validate'\nimport { fetchArticle } from '@/api/article'\nimport { searchUser } from '@/api/remote-search'\nimport Warning from './Warning'\nimport { CommentDropdown, PlatformDropdown, SourceUrlDropdown } from './Dropdown'\n\nconst defaultForm = {\n  status: 'draft',\n  title: '', // 文章题目\n  content: '', // 文章内容\n  content_short: '', // 文章摘要\n  source_uri: '', // 文章外链\n  image_uri: '', // 文章图片\n  display_time: undefined, // 前台展示时间\n  id: undefined,\n  platforms: ['a-platform'],\n  comment_disabled: false,\n  importance: 0\n}\n\nexport default {\n  name: 'ArticleDetail',\n  components: { Tinymce, MDinput, Upload, Sticky, Warning, CommentDropdown, PlatformDropdown, SourceUrlDropdown },\n  props: {\n    isEdit: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    const validateRequire = (rule, value, callback) => {\n      if (value === '') {\n        this.$message({\n          message: rule.field + '为必传项',\n          type: 'error'\n        })\n        callback(new Error(rule.field + '为必传项'))\n      } else {\n        callback()\n      }\n    }\n    const validateSourceUri = (rule, value, callback) => {\n      if (value) {\n        if (validURL(value)) {\n          callback()\n        } else {\n          this.$message({\n            message: '外链url填写不正确',\n            type: 'error'\n          })\n          callback(new Error('外链url填写不正确'))\n        }\n      } else {\n        callback()\n      }\n    }\n    return {\n      postForm: Object.assign({}, defaultForm),\n      loading: false,\n      userListOptions: [],\n      rules: {\n        image_uri: [{ validator: validateRequire }],\n        title: [{ validator: validateRequire }],\n        content: [{ validator: validateRequire }],\n        source_uri: [{ validator: validateSourceUri, trigger: 'blur' }]\n      },\n      tempRoute: {}\n    }\n  },\n  computed: {\n    contentShortLength() {\n      return this.postForm.content_short.length\n    },\n    displayTime: {\n      // set and get is useful when the data\n      // returned by the back end api is different from the front end\n      // back end return => \"2013-06-25 06:59:25\"\n      // front end need timestamp => 1372114765000\n      get() {\n        return (+new Date(this.postForm.display_time))\n      },\n      set(val) {\n        this.postForm.display_time = new Date(val)\n      }\n    }\n  },\n  created() {\n    if (this.isEdit) {\n      const id = this.$route.params && this.$route.params.id\n      this.fetchData(id)\n    }\n\n    // Why need to make a copy of this.$route here?\n    // Because if you enter this page and quickly switch tag, may be in the execution of the setTagsViewTitle function, this.$route is no longer pointing to the current page\n    // https://github.com/PanJiaChen/vue-element-admin/issues/1221\n    this.tempRoute = Object.assign({}, this.$route)\n  },\n  methods: {\n    fetchData(id) {\n      fetchArticle(id).then(response => {\n        this.postForm = response.data\n\n        // just for test\n        this.postForm.title += `   Article Id:${this.postForm.id}`\n        this.postForm.content_short += `   Article Id:${this.postForm.id}`\n\n        // set tagsview title\n        this.setTagsViewTitle()\n\n        // set page title\n        this.setPageTitle()\n      }).catch(err => {\n        console.log(err)\n      })\n    },\n    setTagsViewTitle() {\n      const title = 'Edit Article'\n      const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` })\n      this.$store.dispatch('tagsView/updateVisitedView', route)\n    },\n    setPageTitle() {\n      const title = 'Edit Article'\n      document.title = `${title} - ${this.postForm.id}`\n    },\n    submitForm() {\n      console.log(this.postForm)\n      this.$refs.postForm.validate(valid => {\n        if (valid) {\n          this.loading = true\n          this.$notify({\n            title: '成功',\n            message: '发布文章成功',\n            type: 'success',\n            duration: 2000\n          })\n          this.postForm.status = 'published'\n          this.loading = false\n        } else {\n          console.log('error submit!!')\n          return false\n        }\n      })\n    },\n    draftForm() {\n      if (this.postForm.content.length === 0 || this.postForm.title.length === 0) {\n        this.$message({\n          message: '请填写必要的标题和内容',\n          type: 'warning'\n        })\n        return\n      }\n      this.$message({\n        message: '保存成功',\n        type: 'success',\n        showClose: true,\n        duration: 1000\n      })\n      this.postForm.status = 'draft'\n    },\n    getRemoteUserList(query) {\n      searchUser(query).then(response => {\n        if (!response.data.items) return\n        this.userListOptions = response.data.items.map(v => v.name)\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"~@/styles/mixin.scss\";\n\n.createPost-container {\n  position: relative;\n\n  .createPost-main-container {\n    padding: 40px 45px 20px 50px;\n\n    .postInfo-container {\n      position: relative;\n      @include clearfix;\n      margin-bottom: 10px;\n\n      .postInfo-container-item {\n        float: left;\n      }\n    }\n  }\n\n  .word-counter {\n    width: 40px;\n    position: absolute;\n    right: 10px;\n    top: 0px;\n  }\n}\n\n.article-textarea ::v-deep {\n  textarea {\n    padding-right: 40px;\n    resize: none;\n    border: none;\n    border-radius: 0px;\n    border-bottom: 1px solid #bfcbd9;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/example/components/Dropdown/Comment.vue",
    "content": "<template>\n  <el-dropdown :show-timeout=\"100\" trigger=\"click\">\n    <el-button plain>\n      {{ !comment_disabled?'Comment: opened':'Comment: closed' }}\n      <i class=\"el-icon-caret-bottom el-icon--right\" />\n    </el-button>\n    <el-dropdown-menu slot=\"dropdown\" class=\"no-padding\">\n      <el-dropdown-item>\n        <el-radio-group v-model=\"comment_disabled\" style=\"padding: 10px;\">\n          <el-radio :label=\"true\">\n            Close comment\n          </el-radio>\n          <el-radio :label=\"false\">\n            Open comment\n          </el-radio>\n        </el-radio-group>\n      </el-dropdown-item>\n    </el-dropdown-menu>\n  </el-dropdown>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      type: Boolean,\n      default: false\n    }\n  },\n  computed: {\n    comment_disabled: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/example/components/Dropdown/Platform.vue",
    "content": "<template>\n  <el-dropdown :hide-on-click=\"false\" :show-timeout=\"100\" trigger=\"click\">\n    <el-button plain>\n      Platfroms({{ platforms.length }})\n      <i class=\"el-icon-caret-bottom el-icon--right\" />\n    </el-button>\n    <el-dropdown-menu slot=\"dropdown\" class=\"no-border\">\n      <el-checkbox-group v-model=\"platforms\" style=\"padding: 5px 15px;\">\n        <el-checkbox v-for=\"item in platformsOptions\" :key=\"item.key\" :label=\"item.key\">\n          {{ item.name }}\n        </el-checkbox>\n      </el-checkbox-group>\n    </el-dropdown-menu>\n  </el-dropdown>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      required: true,\n      default: () => [],\n      type: Array\n    }\n  },\n  data() {\n    return {\n      platformsOptions: [\n        { key: 'a-platform', name: 'a-platform' },\n        { key: 'b-platform', name: 'b-platform' },\n        { key: 'c-platform', name: 'c-platform' }\n      ]\n    }\n  },\n  computed: {\n    platforms: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/example/components/Dropdown/SourceUrl.vue",
    "content": "<template>\n  <el-dropdown :show-timeout=\"100\" trigger=\"click\">\n    <el-button plain>\n      Link\n      <i class=\"el-icon-caret-bottom el-icon--right\" />\n    </el-button>\n    <el-dropdown-menu slot=\"dropdown\" class=\"no-padding no-border\" style=\"width:400px\">\n      <el-form-item label-width=\"0px\" style=\"margin-bottom: 0px\" prop=\"source_uri\">\n        <el-input v-model=\"source_uri\" placeholder=\"Please enter the content\">\n          <template slot=\"prepend\">\n            URL\n          </template>\n        </el-input>\n      </el-form-item>\n    </el-dropdown-menu>\n  </el-dropdown>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      type: String,\n      default: ''\n    }\n  },\n  computed: {\n    source_uri: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/example/components/Dropdown/index.js",
    "content": "export { default as CommentDropdown } from './Comment'\nexport { default as PlatformDropdown } from './Platform'\nexport { default as SourceUrlDropdown } from './SourceUrl'\n"
  },
  {
    "path": "src/views/example/components/Warning.vue",
    "content": "<template>\n  <aside>\n    Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support\n    caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching\n    effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all\n    pages directly. See details\n    <a\n      href=\"https://panjiachen.github.io/vue-element-admin-site/guide/essentials/tags-view.html\"\n      target=\"_blank\"\n    >Document</a>\n  </aside>\n</template>\n\n"
  },
  {
    "path": "src/views/example/create.vue",
    "content": "<template>\n  <article-detail :is-edit=\"false\" />\n</template>\n\n<script>\nimport ArticleDetail from './components/ArticleDetail'\n\nexport default {\n  name: 'CreateArticle',\n  components: { ArticleDetail }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/example/edit.vue",
    "content": "<template>\n  <article-detail :is-edit=\"true\" />\n</template>\n\n<script>\nimport ArticleDetail from './components/ArticleDetail'\n\nexport default {\n  name: 'EditForm',\n  components: { ArticleDetail }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/example/list.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-table v-loading=\"listLoading\" :data=\"list\" border fit highlight-current-row style=\"width: 100%\">\n      <el-table-column align=\"center\" label=\"ID\" width=\"80\">\n        <template slot-scope=\"scope\">\n          <span>{{ scope.row.id }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"180px\" align=\"center\" label=\"Date\">\n        <template slot-scope=\"scope\">\n          <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"120px\" align=\"center\" label=\"Author\">\n        <template slot-scope=\"scope\">\n          <span>{{ scope.row.author }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"100px\" label=\"Importance\">\n        <template slot-scope=\"scope\">\n          <svg-icon v-for=\"n in +scope.row.importance\" :key=\"n\" icon-class=\"star\" class=\"meta-item__icon\" />\n        </template>\n      </el-table-column>\n\n      <el-table-column class-name=\"status-col\" label=\"Status\" width=\"110\">\n        <template slot-scope=\"{row}\">\n          <el-tag :type=\"row.status | statusFilter\">\n            {{ row.status }}\n          </el-tag>\n        </template>\n      </el-table-column>\n\n      <el-table-column min-width=\"300px\" label=\"Title\">\n        <template slot-scope=\"{row}\">\n          <router-link :to=\"'/example/edit/'+row.id\" class=\"link-type\">\n            <span>{{ row.title }}</span>\n          </router-link>\n        </template>\n      </el-table-column>\n\n      <el-table-column align=\"center\" label=\"Actions\" width=\"120\">\n        <template slot-scope=\"scope\">\n          <router-link :to=\"'/example/edit/'+scope.row.id\">\n            <el-button type=\"primary\" size=\"small\" icon=\"el-icon-edit\">\n              Edit\n            </el-button>\n          </router-link>\n        </template>\n      </el-table-column>\n    </el-table>\n\n    <pagination v-show=\"total>0\" :total=\"total\" :page.sync=\"listQuery.page\" :limit.sync=\"listQuery.limit\" @pagination=\"getList\" />\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\nimport Pagination from '@/components/Pagination' // Secondary package based on el-pagination\n\nexport default {\n  name: 'ArticleList',\n  components: { Pagination },\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    }\n  },\n  data() {\n    return {\n      list: null,\n      total: 0,\n      listLoading: true,\n      listQuery: {\n        page: 1,\n        limit: 20\n      }\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    getList() {\n      this.listLoading = true\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.total = response.data.total\n        this.listLoading = false\n      })\n    }\n  }\n}\n</script>\n\n<style scoped>\n.edit-input {\n  padding-right: 100px;\n}\n.cancel-btn {\n  position: absolute;\n  right: 15px;\n  top: 10px;\n}\n</style>\n"
  },
  {
    "path": "src/views/excel/components/AutoWidthOption.vue",
    "content": "<template>\n  <div style=\"display:inline-block;\">\n    <label class=\"radio-label\">Cell Auto-Width: </label>\n    <el-radio-group v-model=\"autoWidth\">\n      <el-radio :label=\"true\" border>\n        True\n      </el-radio>\n      <el-radio :label=\"false\" border>\n        False\n      </el-radio>\n    </el-radio-group>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      type: Boolean,\n      default: true\n    }\n  },\n  computed: {\n    autoWidth: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/excel/components/BookTypeOption.vue",
    "content": "<template>\n  <div style=\"display:inline-block;\">\n    <label class=\"radio-label\">Book Type: </label>\n    <el-select v-model=\"bookType\" style=\"width:120px;\">\n      <el-option\n        v-for=\"item in options\"\n        :key=\"item\"\n        :label=\"item\"\n        :value=\"item\"\n      />\n    </el-select>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      type: String,\n      default: 'xlsx'\n    }\n  },\n  data() {\n    return {\n      options: ['xlsx', 'csv', 'txt']\n    }\n  },\n  computed: {\n    bookType: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/excel/components/FilenameOption.vue",
    "content": "<template>\n  <div style=\"display:inline-block;\">\n    <label class=\"radio-label\" style=\"padding-left:0;\">Filename: </label>\n    <el-input v-model=\"filename\" placeholder=\"Please enter the file name (default excel-list)\" style=\"width:345px;\" prefix-icon=\"el-icon-document\" />\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    value: {\n      type: String,\n      default: ''\n    }\n  },\n  computed: {\n    filename: {\n      get() {\n        return this.value\n      },\n      set(val) {\n        this.$emit('input', val)\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/excel/export-excel.vue",
    "content": "<template>\n  <div class=\"app-container\">\n\n    <div>\n      <FilenameOption v-model=\"filename\" />\n      <AutoWidthOption v-model=\"autoWidth\" />\n      <BookTypeOption v-model=\"bookType\" />\n      <el-button :loading=\"downloadLoading\" style=\"margin:0 0 20px 20px;\" type=\"primary\" icon=\"el-icon-document\" @click=\"handleDownload\">\n        Export Excel\n      </el-button>\n      <a href=\"https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html\" target=\"_blank\" style=\"margin-left:15px;\">\n        <el-tag type=\"info\">Documentation</el-tag>\n      </a>\n    </div>\n\n    <el-table v-loading=\"listLoading\" :data=\"list\" element-loading-text=\"Loading...\" border fit highlight-current-row>\n      <el-table-column align=\"center\" label=\"Id\" width=\"95\">\n        <template slot-scope=\"scope\">\n          {{ scope.$index }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Title\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.title }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Author\" width=\"110\" align=\"center\">\n        <template slot-scope=\"scope\">\n          <el-tag>{{ scope.row.author }}</el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Readings\" width=\"115\" align=\"center\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.pageviews }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"Date\" width=\"220\">\n        <template slot-scope=\"scope\">\n          <i class=\"el-icon-time\" />\n          <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\nimport { parseTime } from '@/utils'\n// options components\nimport FilenameOption from './components/FilenameOption'\nimport AutoWidthOption from './components/AutoWidthOption'\nimport BookTypeOption from './components/BookTypeOption'\n\nexport default {\n  name: 'ExportExcel',\n  components: { FilenameOption, AutoWidthOption, BookTypeOption },\n  data() {\n    return {\n      list: null,\n      listLoading: true,\n      downloadLoading: false,\n      filename: '',\n      autoWidth: true,\n      bookType: 'xlsx'\n    }\n  },\n  created() {\n    this.fetchData()\n  },\n  methods: {\n    fetchData() {\n      this.listLoading = true\n      fetchList().then(response => {\n        this.list = response.data.items\n        this.listLoading = false\n      })\n    },\n    handleDownload() {\n      this.downloadLoading = true\n      import('@/vendor/Export2Excel').then(excel => {\n        const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']\n        const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']\n        const list = this.list\n        const data = this.formatJson(filterVal, list)\n        excel.export_json_to_excel({\n          header: tHeader,\n          data,\n          filename: this.filename,\n          autoWidth: this.autoWidth,\n          bookType: this.bookType\n        })\n        this.downloadLoading = false\n      })\n    },\n    formatJson(filterVal, jsonData) {\n      return jsonData.map(v => filterVal.map(j => {\n        if (j === 'timestamp') {\n          return parseTime(v[j])\n        } else {\n          return v[j]\n        }\n      }))\n    }\n  }\n}\n</script>\n\n<style>\n.radio-label {\n  font-size: 14px;\n  color: #606266;\n  line-height: 40px;\n  padding: 0 12px 0 30px;\n}\n</style>\n"
  },
  {
    "path": "src/views/excel/merge-header.vue",
    "content": "<template>\n  <div class=\"app-container\">\n\n    <el-button :loading=\"downloadLoading\" style=\"margin-bottom:20px\" type=\"primary\" icon=\"el-icon-document\" @click=\"handleDownload\">Export</el-button>\n\n    <el-table\n      ref=\"multipleTable\"\n      v-loading=\"listLoading\"\n      :data=\"list\"\n      element-loading-text=\"Loading\"\n      border\n      fit\n      highlight-current-row\n    >\n      <el-table-column align=\"center\" label=\"Id\" width=\"95\">\n        <template slot-scope=\"scope\">\n          {{ scope.$index }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Main Information\" align=\"center\">\n        <el-table-column label=\"Title\">\n          <template slot-scope=\"scope\">\n            {{ scope.row.title }}\n          </template>\n        </el-table-column>\n        <el-table-column label=\"Author\" width=\"110\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-tag>{{ scope.row.author }}</el-tag>\n          </template>\n        </el-table-column>\n        <el-table-column label=\"Readings\" width=\"115\" align=\"center\">\n          <template slot-scope=\"scope\">\n            {{ scope.row.pageviews }}\n          </template>\n        </el-table-column>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"Date\" width=\"220\">\n        <template slot-scope=\"scope\">\n          <i class=\"el-icon-time\" />\n          <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n    </el-table>\n\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\nimport { parseTime } from '@/utils'\n\nexport default {\n  name: 'MergeHeader',\n  data() {\n    return {\n      list: null,\n      listLoading: true,\n      downloadLoading: false\n    }\n  },\n  created() {\n    this.fetchData()\n  },\n  methods: {\n    fetchData() {\n      this.listLoading = true\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.listLoading = false\n      })\n    },\n    handleDownload() {\n      this.downloadLoading = true\n      import('@/vendor/Export2Excel').then(excel => {\n        const multiHeader = [['Id', 'Main Information', '', '', 'Date']]\n        const header = ['', 'Title', 'Author', 'Readings', '']\n        const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']\n        const list = this.list\n        const data = this.formatJson(filterVal, list)\n        const merges = ['A1:A2', 'B1:D1', 'E1:E2']\n        excel.export_json_to_excel({\n          multiHeader,\n          header,\n          merges,\n          data\n        })\n        this.downloadLoading = false\n      })\n    },\n    formatJson(filterVal, jsonData) {\n      return jsonData.map(v => filterVal.map(j => {\n        if (j === 'timestamp') {\n          return parseTime(v[j])\n        } else {\n          return v[j]\n        }\n      }))\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/excel/select-excel.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-input v-model=\"filename\" placeholder=\"Please enter the file name (default excel-list)\" style=\"width:350px;\" prefix-icon=\"el-icon-document\" />\n    <el-button :loading=\"downloadLoading\" style=\"margin-bottom:20px\" type=\"primary\" icon=\"el-icon-document\" @click=\"handleDownload\">\n      Export Selected Items\n    </el-button>\n    <a href=\"https://panjiachen.github.io/vue-element-admin-site/feature/component/excel.html\" target=\"_blank\" style=\"margin-left:15px;\">\n      <el-tag type=\"info\">Documentation</el-tag>\n    </a>\n    <el-table\n      ref=\"multipleTable\"\n      v-loading=\"listLoading\"\n      :data=\"list\"\n      element-loading-text=\"拼命加载中\"\n      border\n      fit\n      highlight-current-row\n      @selection-change=\"handleSelectionChange\"\n    >\n      <el-table-column type=\"selection\" align=\"center\" />\n      <el-table-column align=\"center\" label=\"Id\" width=\"95\">\n        <template slot-scope=\"scope\">\n          {{ scope.$index }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Title\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.title }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Author\" width=\"110\" align=\"center\">\n        <template slot-scope=\"scope\">\n          <el-tag>{{ scope.row.author }}</el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Readings\" width=\"115\" align=\"center\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.pageviews }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"PDate\" width=\"220\">\n        <template slot-scope=\"scope\">\n          <i class=\"el-icon-time\" />\n          <span>{{ scope.row.display_time }}</span>\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\n\nexport default {\n  name: 'SelectExcel',\n  data() {\n    return {\n      list: null,\n      listLoading: true,\n      multipleSelection: [],\n      downloadLoading: false,\n      filename: ''\n    }\n  },\n  created() {\n    this.fetchData()\n  },\n  methods: {\n    fetchData() {\n      this.listLoading = true\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.listLoading = false\n      })\n    },\n    handleSelectionChange(val) {\n      this.multipleSelection = val\n    },\n    handleDownload() {\n      if (this.multipleSelection.length) {\n        this.downloadLoading = true\n        import('@/vendor/Export2Excel').then(excel => {\n          const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']\n          const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']\n          const list = this.multipleSelection\n          const data = this.formatJson(filterVal, list)\n          excel.export_json_to_excel({\n            header: tHeader,\n            data,\n            filename: this.filename\n          })\n          this.$refs.multipleTable.clearSelection()\n          this.downloadLoading = false\n        })\n      } else {\n        this.$message({\n          message: 'Please select at least one item',\n          type: 'warning'\n        })\n      }\n    },\n    formatJson(filterVal, jsonData) {\n      return jsonData.map(v => filterVal.map(j => v[j]))\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/excel/upload-excel.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <upload-excel-component :on-success=\"handleSuccess\" :before-upload=\"beforeUpload\" />\n    <el-table :data=\"tableData\" border highlight-current-row style=\"width: 100%;margin-top:20px;\">\n      <el-table-column v-for=\"item of tableHeader\" :key=\"item\" :prop=\"item\" :label=\"item\" />\n    </el-table>\n  </div>\n</template>\n\n<script>\nimport UploadExcelComponent from '@/components/UploadExcel/index.vue'\n\nexport default {\n  name: 'UploadExcel',\n  components: { UploadExcelComponent },\n  data() {\n    return {\n      tableData: [],\n      tableHeader: []\n    }\n  },\n  methods: {\n    beforeUpload(file) {\n      const isLt1M = file.size / 1024 / 1024 < 1\n\n      if (isLt1M) {\n        return true\n      }\n\n      this.$message({\n        message: 'Please do not upload files larger than 1m in size.',\n        type: 'warning'\n      })\n      return false\n    },\n    handleSuccess({ results, header }) {\n      this.tableData = results\n      this.tableHeader = header\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/guide/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <aside>\n      The guide page is useful for some people who entered the project for the first time. You can briefly introduce the\n      features of the project. Demo is based on\n      <a href=\"https://github.com/kamranahmedse/driver.js\" target=\"_blank\">driver.js.</a>\n    </aside>\n    <el-button icon=\"el-icon-question\" type=\"primary\" @click.prevent.stop=\"guide\">\n      Show Guide\n    </el-button>\n  </div>\n</template>\n\n<script>\nimport Driver from 'driver.js' // import driver.js\nimport 'driver.js/dist/driver.min.css' // import driver.js css\nimport steps from './steps'\n\nexport default {\n  name: 'Guide',\n  data() {\n    return {\n      driver: null\n    }\n  },\n  mounted() {\n    this.driver = new Driver()\n  },\n  methods: {\n    guide() {\n      this.driver.defineSteps(steps)\n      this.driver.start()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/guide/steps.js",
    "content": "const steps = [\n  {\n    element: '#hamburger-container',\n    popover: {\n      title: 'Hamburger',\n      description: 'Open && Close sidebar',\n      position: 'bottom'\n    }\n  },\n  {\n    element: '#breadcrumb-container',\n    popover: {\n      title: 'Breadcrumb',\n      description: 'Indicate the current page location',\n      position: 'bottom'\n    }\n  },\n  {\n    element: '#header-search',\n    popover: {\n      title: 'Page Search',\n      description: 'Page search, quick navigation',\n      position: 'left'\n    }\n  },\n  {\n    element: '#screenfull',\n    popover: {\n      title: 'Screenfull',\n      description: 'Set the page into fullscreen',\n      position: 'left'\n    }\n  },\n  {\n    element: '#size-select',\n    popover: {\n      title: 'Switch Size',\n      description: 'Switch the system size',\n      position: 'left'\n    }\n  },\n  {\n    element: '#tags-view-container',\n    popover: {\n      title: 'Tags view',\n      description: 'The history of the page you visited',\n      position: 'bottom'\n    },\n    padding: 0\n  }\n]\n\nexport default steps\n"
  },
  {
    "path": "src/views/icons/element-icons.js",
    "content": "const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']\n\nexport default elementIcons\n"
  },
  {
    "path": "src/views/icons/index.vue",
    "content": "<template>\n  <div class=\"icons-container\">\n    <aside>\n      <a href=\"https://panjiachen.github.io/vue-element-admin-site/guide/advanced/icon.html\" target=\"_blank\">Add and use\n      </a>\n    </aside>\n    <el-tabs type=\"border-card\">\n      <el-tab-pane label=\"Icons\">\n        <div class=\"grid\">\n          <div v-for=\"item of svgIcons\" :key=\"item\" @click=\"handleClipboard(generateIconCode(item),$event)\">\n            <el-tooltip placement=\"top\">\n              <div slot=\"content\">\n                {{ generateIconCode(item) }}\n              </div>\n              <div class=\"icon-item\">\n                <svg-icon :icon-class=\"item\" class-name=\"disabled\" />\n                <span>{{ item }}</span>\n              </div>\n            </el-tooltip>\n          </div>\n        </div>\n      </el-tab-pane>\n      <el-tab-pane label=\"Element-UI Icons\">\n        <div class=\"grid\">\n          <div v-for=\"item of elementIcons\" :key=\"item\" @click=\"handleClipboard(generateElementIconCode(item),$event)\">\n            <el-tooltip placement=\"top\">\n              <div slot=\"content\">\n                {{ generateElementIconCode(item) }}\n              </div>\n              <div class=\"icon-item\">\n                <i :class=\"'el-icon-' + item\" />\n                <span>{{ item }}</span>\n              </div>\n            </el-tooltip>\n          </div>\n        </div>\n      </el-tab-pane>\n    </el-tabs>\n  </div>\n</template>\n\n<script>\nimport clipboard from '@/utils/clipboard'\nimport svgIcons from './svg-icons'\nimport elementIcons from './element-icons'\n\nexport default {\n  name: 'Icons',\n  data() {\n    return {\n      svgIcons,\n      elementIcons\n    }\n  },\n  methods: {\n    generateIconCode(symbol) {\n      return `<svg-icon icon-class=\"${symbol}\" />`\n    },\n    generateElementIconCode(symbol) {\n      return `<i class=\"el-icon-${symbol}\" />`\n    },\n    handleClipboard(text, event) {\n      clipboard(text, event)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.icons-container {\n  margin: 10px 20px 0;\n  overflow: hidden;\n\n  .grid {\n    position: relative;\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n  }\n\n  .icon-item {\n    margin: 20px;\n    height: 85px;\n    text-align: center;\n    width: 100px;\n    float: left;\n    font-size: 30px;\n    color: #24292e;\n    cursor: pointer;\n  }\n\n  span {\n    display: block;\n    font-size: 16px;\n    margin-top: 10px;\n  }\n\n  .disabled {\n    pointer-events: none;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/icons/svg-icons.js",
    "content": "const req = require.context('../../icons/svg', false, /\\.svg$/)\nconst requireAll = requireContext => requireContext.keys()\n\nconst re = /\\.\\/(.*)\\.svg/\n\nconst svgIcons = requireAll(req).map(i => {\n  return i.match(re)[1]\n})\n\nexport default svgIcons\n"
  },
  {
    "path": "src/views/login/auth-redirect.vue",
    "content": "<script>\nexport default {\n  name: 'AuthRedirect',\n  created() {\n    const hash = window.location.search.slice(1)\n    if (window.localStorage) {\n      window.localStorage.setItem('x-admin-oauth-code', hash)\n      window.close()\n    }\n  },\n  render: function(h) {\n    return h() // avoid warning message\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/login/components/SocialSignin.vue",
    "content": "<template>\n  <div class=\"social-signup-container\">\n    <div class=\"sign-btn\" @click=\"wechatHandleClick('wechat')\">\n      <span class=\"wx-svg-container\"><svg-icon icon-class=\"wechat\" class=\"icon\" /></span>\n      WeChat\n    </div>\n    <div class=\"sign-btn\" @click=\"tencentHandleClick('tencent')\">\n      <span class=\"qq-svg-container\"><svg-icon icon-class=\"qq\" class=\"icon\" /></span>\n      QQ\n    </div>\n  </div>\n</template>\n\n<script>\n// import openWindow from '@/utils/open-window'\n\nexport default {\n  name: 'SocialSignin',\n  methods: {\n    wechatHandleClick(thirdpart) {\n      alert('ok')\n      // this.$store.commit('SET_AUTH_TYPE', thirdpart)\n      // const appid = 'xxxxx'\n      // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')\n      // const url = 'https://open.weixin.qq.com/connect/qrconnect?appid=' + appid + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_login#wechat_redirect'\n      // openWindow(url, thirdpart, 540, 540)\n    },\n    tencentHandleClick(thirdpart) {\n      alert('ok')\n      // this.$store.commit('SET_AUTH_TYPE', thirdpart)\n      // const client_id = 'xxxxx'\n      // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')\n      // const url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + client_id + '&redirect_uri=' + redirect_uri\n      // openWindow(url, thirdpart, 540, 540)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .social-signup-container {\n    margin: 20px 0;\n    .sign-btn {\n      display: inline-block;\n      cursor: pointer;\n    }\n    .icon {\n      color: #fff;\n      font-size: 24px;\n      margin-top: 8px;\n    }\n    .wx-svg-container,\n    .qq-svg-container {\n      display: inline-block;\n      width: 40px;\n      height: 40px;\n      line-height: 40px;\n      text-align: center;\n      padding-top: 1px;\n      border-radius: 4px;\n      margin-bottom: 20px;\n      margin-right: 5px;\n    }\n    .wx-svg-container {\n      background-color: #24da70;\n    }\n    .qq-svg-container {\n      background-color: #6BA2D6;\n      margin-left: 50px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/login/index.vue",
    "content": "<template>\n  <div class=\"login-container\">\n    <el-form ref=\"loginForm\" :model=\"loginForm\" :rules=\"loginRules\" class=\"login-form\" autocomplete=\"on\" label-position=\"left\">\n\n      <div class=\"title-container\">\n        <h3 class=\"title\">Login Form</h3>\n      </div>\n\n      <el-form-item prop=\"username\">\n        <span class=\"svg-container\">\n          <svg-icon icon-class=\"user\" />\n        </span>\n        <el-input\n          ref=\"username\"\n          v-model=\"loginForm.username\"\n          placeholder=\"Username\"\n          name=\"username\"\n          type=\"text\"\n          tabindex=\"1\"\n          autocomplete=\"on\"\n        />\n      </el-form-item>\n\n      <el-tooltip v-model=\"capsTooltip\" content=\"Caps lock is On\" placement=\"right\" manual>\n        <el-form-item prop=\"password\">\n          <span class=\"svg-container\">\n            <svg-icon icon-class=\"password\" />\n          </span>\n          <el-input\n            :key=\"passwordType\"\n            ref=\"password\"\n            v-model=\"loginForm.password\"\n            :type=\"passwordType\"\n            placeholder=\"Password\"\n            name=\"password\"\n            tabindex=\"2\"\n            autocomplete=\"on\"\n            @keyup.native=\"checkCapslock\"\n            @blur=\"capsTooltip = false\"\n            @keyup.enter.native=\"handleLogin\"\n          />\n          <span class=\"show-pwd\" @click=\"showPwd\">\n            <svg-icon :icon-class=\"passwordType === 'password' ? 'eye' : 'eye-open'\" />\n          </span>\n        </el-form-item>\n      </el-tooltip>\n\n      <el-button :loading=\"loading\" type=\"primary\" style=\"width:100%;margin-bottom:30px;\" @click.native.prevent=\"handleLogin\">Login</el-button>\n\n      <div style=\"position:relative\">\n        <div class=\"tips\">\n          <span>Username : admin</span>\n          <span>Password : any</span>\n        </div>\n        <div class=\"tips\">\n          <span style=\"margin-right:18px;\">Username : editor</span>\n          <span>Password : any</span>\n        </div>\n\n        <el-button class=\"thirdparty-button\" type=\"primary\" @click=\"showDialog=true\">\n          Or connect with\n        </el-button>\n      </div>\n    </el-form>\n\n    <el-dialog title=\"Or connect with\" :visible.sync=\"showDialog\">\n      Can not be simulated on local, so please combine you own business simulation! ! !\n      <br>\n      <br>\n      <br>\n      <social-sign />\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport { validUsername } from '@/utils/validate'\nimport SocialSign from './components/SocialSignin'\n\nexport default {\n  name: 'Login',\n  components: { SocialSign },\n  data() {\n    const validateUsername = (rule, value, callback) => {\n      if (!validUsername(value)) {\n        callback(new Error('Please enter the correct user name'))\n      } else {\n        callback()\n      }\n    }\n    const validatePassword = (rule, value, callback) => {\n      if (value.length < 6) {\n        callback(new Error('The password can not be less than 6 digits'))\n      } else {\n        callback()\n      }\n    }\n    return {\n      loginForm: {\n        username: 'admin',\n        password: '111111'\n      },\n      loginRules: {\n        username: [{ required: true, trigger: 'blur', validator: validateUsername }],\n        password: [{ required: true, trigger: 'blur', validator: validatePassword }]\n      },\n      passwordType: 'password',\n      capsTooltip: false,\n      loading: false,\n      showDialog: false,\n      redirect: undefined,\n      otherQuery: {}\n    }\n  },\n  watch: {\n    $route: {\n      handler: function(route) {\n        const query = route.query\n        if (query) {\n          this.redirect = query.redirect\n          this.otherQuery = this.getOtherQuery(query)\n        }\n      },\n      immediate: true\n    }\n  },\n  created() {\n    // window.addEventListener('storage', this.afterQRScan)\n  },\n  mounted() {\n    if (this.loginForm.username === '') {\n      this.$refs.username.focus()\n    } else if (this.loginForm.password === '') {\n      this.$refs.password.focus()\n    }\n  },\n  destroyed() {\n    // window.removeEventListener('storage', this.afterQRScan)\n  },\n  methods: {\n    checkCapslock(e) {\n      const { key } = e\n      this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')\n    },\n    showPwd() {\n      if (this.passwordType === 'password') {\n        this.passwordType = ''\n      } else {\n        this.passwordType = 'password'\n      }\n      this.$nextTick(() => {\n        this.$refs.password.focus()\n      })\n    },\n    handleLogin() {\n      this.$refs.loginForm.validate(valid => {\n        if (valid) {\n          this.loading = true\n          this.$store.dispatch('user/login', this.loginForm)\n            .then(() => {\n              this.$router.push({ path: this.redirect || '/', query: this.otherQuery })\n              this.loading = false\n            })\n            .catch(() => {\n              this.loading = false\n            })\n        } else {\n          console.log('error submit!!')\n          return false\n        }\n      })\n    },\n    getOtherQuery(query) {\n      return Object.keys(query).reduce((acc, cur) => {\n        if (cur !== 'redirect') {\n          acc[cur] = query[cur]\n        }\n        return acc\n      }, {})\n    }\n    // afterQRScan() {\n    //   if (e.key === 'x-admin-oauth-code') {\n    //     const code = getQueryObject(e.newValue)\n    //     const codeMap = {\n    //       wechat: 'code',\n    //       tencent: 'code'\n    //     }\n    //     const type = codeMap[this.auth_type]\n    //     const codeName = code[type]\n    //     if (codeName) {\n    //       this.$store.dispatch('LoginByThirdparty', codeName).then(() => {\n    //         this.$router.push({ path: this.redirect || '/' })\n    //       })\n    //     } else {\n    //       alert('第三方登录失败')\n    //     }\n    //   }\n    // }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n/* 修复input 背景不协调 和光标变色 */\n/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */\n\n$bg:#283443;\n$light_gray:#fff;\n$cursor: #fff;\n\n@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {\n  .login-container .el-input input {\n    color: $cursor;\n  }\n}\n\n/* reset element-ui css */\n.login-container {\n  .el-input {\n    display: inline-block;\n    height: 47px;\n    width: 85%;\n\n    input {\n      background: transparent;\n      border: 0px;\n      -webkit-appearance: none;\n      border-radius: 0px;\n      padding: 12px 5px 12px 15px;\n      color: $light_gray;\n      height: 47px;\n      caret-color: $cursor;\n\n      &:-webkit-autofill {\n        box-shadow: 0 0 0px 1000px $bg inset !important;\n        -webkit-text-fill-color: $cursor !important;\n      }\n    }\n  }\n\n  .el-form-item {\n    border: 1px solid rgba(255, 255, 255, 0.1);\n    background: rgba(0, 0, 0, 0.1);\n    border-radius: 5px;\n    color: #454545;\n  }\n}\n</style>\n\n<style lang=\"scss\" scoped>\n$bg:#2d3a4b;\n$dark_gray:#889aa4;\n$light_gray:#eee;\n\n.login-container {\n  min-height: 100%;\n  width: 100%;\n  background-color: $bg;\n  overflow: hidden;\n\n  .login-form {\n    position: relative;\n    width: 520px;\n    max-width: 100%;\n    padding: 160px 35px 0;\n    margin: 0 auto;\n    overflow: hidden;\n  }\n\n  .tips {\n    font-size: 14px;\n    color: #fff;\n    margin-bottom: 10px;\n\n    span {\n      &:first-of-type {\n        margin-right: 16px;\n      }\n    }\n  }\n\n  .svg-container {\n    padding: 6px 5px 6px 15px;\n    color: $dark_gray;\n    vertical-align: middle;\n    width: 30px;\n    display: inline-block;\n  }\n\n  .title-container {\n    position: relative;\n\n    .title {\n      font-size: 26px;\n      color: $light_gray;\n      margin: 0px auto 40px auto;\n      text-align: center;\n      font-weight: bold;\n    }\n  }\n\n  .show-pwd {\n    position: absolute;\n    right: 10px;\n    top: 7px;\n    font-size: 16px;\n    color: $dark_gray;\n    cursor: pointer;\n    user-select: none;\n  }\n\n  .thirdparty-button {\n    position: absolute;\n    right: 0;\n    bottom: 6px;\n  }\n\n  @media only screen and (max-width: 470px) {\n    .thirdparty-button {\n      display: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/nested/menu1/index.vue",
    "content": "<template>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1\">\n      <router-view />\n    </el-alert>\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu1/menu1-1/index.vue",
    "content": "<template>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1-1\" type=\"success\">\n      <router-view />\n    </el-alert>\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu1/menu1-2/index.vue",
    "content": "<template>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1-2\" type=\"success\">\n      <router-view />\n    </el-alert>\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu1/menu1-2/menu1-2-1/index.vue",
    "content": "<template functional>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1-2-1\" type=\"warning\" />\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu1/menu1-2/menu1-2-2/index.vue",
    "content": "<template functional>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1-2-2\" type=\"warning\" />\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu1/menu1-3/index.vue",
    "content": "<template functional>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 1-3\" type=\"success\" />\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/nested/menu2/index.vue",
    "content": "<template>\n  <div style=\"padding:30px;\">\n    <el-alert :closable=\"false\" title=\"menu 2\" />\n  </div>\n</template>\n"
  },
  {
    "path": "src/views/pdf/content.js",
    "content": "const title = 'Plans for the Next Iteration of Vue.js'\n\nconst content = `<p>Last week at<a href=\"https://vuejs.london/summary\" rel=\"nofollow\">Vue.js London</a>I gave a brief sneak peek of what’s coming in the next major version of Vue. This post provides an in-depth overview of the plan.</p>\n<p><img class=\" wscnph\" src=\"https://wpimg.wallstcn.com/b8a1d7be-0b73-41b8-be8c-7c01c93cab66.png\" data-wscntype=\"image\" data-wscnh=\"742\" data-wscnw=\"692\" /></p>\n<h3>Why a new majorversion?</h3>\n<p>Vue 2.0 was released<a href=\"https://medium.com/the-vue-point/vue-2-0-is-here-ef1f26acf4b8\" rel=\"nofollow\">exactly two years ago</a>(how time flies!). During this period, the core has remained backwards compatible with five minor releases. We’ve accumulated a number of ideas that would bring improvements, but they were held off because they would result in breaking changes. At the same time, the JavaScript ecosystem and the language itself has been evolving rapidly. There are greatly improved tools that could enhance our workflow, and many new language features that could unlock simpler, more complete, and more efficient solutions to the problems Vue is trying to solve. What’s more exciting is that we are seeing ES2015 support becoming a baseline for all major evergreen browsers. Vue 3.0 aims to leverage these new language features to make Vue core smaller, faster, and more powerful.</p>\n<p>Vue 3.0 is currently in prototyping phase, and we have already implemented a runtime close to feature-parity with 2.x.<strong>Many of the items listed below are either already implemented, or confirmed to be feasible. Ones that are not yet implemented or still in exploration phase are marked with a *.</strong></p>\n<h3>The Details</h3>\n<h4>High-Level APIChanges</h4>\n<blockquote>TL;DR: Everything except render function API and scoped-slots syntax will either remain the same or can be made 2.x compatible via a compatibility build.</blockquote>\n<p>Since it’s a new major, there is going to be some breaking changes. However, we take backwards compatibility seriously, so we want to start communicating these changes as soon as possible. Here’s the currently planned public API changes:</p>\n<ul><li>Template syntax will remain 99% the same. There may be small tweaks in scoped slots syntax, but other than that we have no plans to change anything else for templates.</li><li>3.0 will support class-based components natively, with the aim to provide an API that is pleasant to use in native ES2015 without requiring any transpilation or stage-x features. Most current options will have a reasonable mapping in the class-based API. Stage-x features such as class fields and decorators can still be used optionally to enhance the authoring experience. In addition, the API is designed with TypeScript type inference in mind. The 3.x codebase will itself be written in TypeScript, and providing improved TypeScript support. (That said, usage of TypeScript in an application is still entirely optional.)</li><li>The 2.x object-based component format will still be supported by internally transforming the object to a corresponding class.</li><li>Mixins will still be supported.*</li><li>Top level APIs will likely receive an overhaul to avoid globally mutating the Vue runtime when installing plugins. Instead, plugins will be applied and scoped to a component tree. This will make it easier to test components that rely on specific plugins, and also make it possible to mount multiple Vue applications on the same page with different plugins, but using the same Vue runtime.*</li><li>Functional components can finally be plain functions —however, async components will now need to be explicitly created via a helper function.</li><li>The part that will receive the most changes is the Virtual DOM format used in render functions. We are currently collecting feedback from major library authors and will be sharing more details as we are more confident of the changes, but as long as you don’t heavily rely on hand-written (non-JSX) render functions in your app, upgrading should be a reasonably straightforward process.</li></ul>\n<h4>Source Code Architecture</h4>\n<blockquote>TL;DR: better decoupled internal modules, TypeScript, and a codebase that is easier to contribute to.</blockquote>\n<p>We are re-writing 3.0 from the ground up for a cleaner and more maintainable architecture, in particular trying to make it easier to contribute to. We are breaking some internal functionalities into individual packages in order to isolate the scope of complexity. For example, the observer module will become its own package, with its own public API and tests. Note this does not affect framework-level API— you will not have to manually import individual bits from multiple packages in order to use Vue. Instead, the final Vue package is assembled using these internal packages.</p>\n<p>The codebase is also now written in TypeScript. Although this will make proficiency in TypeScript a pre-requisite for contributing to the new codebase, we believe the type information and IDE support will actually make it easier for a new contributor to make meaningful contributions.</p>\n<p>Decoupling the observer and scheduler into separate packages also allows us to easily experiment with alternative implementations of these parts. For example, we can implement an IE11 compatible observer implementation with the same API, or an alternative scheduler that leverages<code>requestIdleCallback</code>to yield to the browser during long updates.*</p>\n<p><img class=\" wscnph\" src=\"https://wpimg.wallstcn.com/4d0b5fb2-d7f9-48fd-8f1b-03362b534dd9.png\" data-wscntype=\"image\" data-wscnh=\"716\" data-wscnw=\"460\" /></p>\n<h4>Observation Mechanism</h4>\n<blockquote>TL;DR: more complete, precise, efficient and debuggable reactivity tracking &amp; API for creating observables.</blockquote>\n<p>3.0 will ship with a Proxy-based observer implementation that provides reactivity tracking with full language coverage. This eliminates a number of limitations of Vue 2’s current implementation based on<code>Object.defineProperty</code>:</p>\n<p>The new observer also features the following:</p>\n<p>Easily understand why a component is re-rendering</p>\n<p><img class=\" wscnph\" src=\"https://wpimg.wallstcn.com/a0c9d811-1ef9-4628-8976-f7c1aaa66da0.png\" data-wscntype=\"image\" data-wscnh=\"540\" data-wscnw=\"789\" /></p>\n<h4>Other Runtime Improvements</h4>\n<blockquote>TL;DR: smaller, faster, tree-shakable features, fragments &amp; portals, custom renderer API.</blockquote>\n<h4>Compiler Improvements*</h4>\n<blockquote>TL;DR: tree-shaking friendly output, more AOT optimizations, parser with better error info and source map support.</blockquote>\n<h4>IE11 Support*</h4>\n<blockquote>TL;DR: it will be supported, but in a separate build with the same reactivity limitations of Vue 2.x.</blockquote>\n<p>The new codebase currently targets evergreen browsers only and assumes baseline native ES2015 support. But alas, we know a lot of our users still need to support IE11 for the foreseeable future. Most of the ES2015 features used can be transpiled / polyfilled for IE11, with the exception for Proxies. Our plan is to implement an alternative observer with the same API, but using the good old ES5<code>Object.defineProperty</code>API. A separate build of Vue 3.x will be distributed using this observer implementation. However, this build will be subject to the same change detection caveats of Vue 2.x and thus not fully compatible with the “modern” build of 3.x. We are aware that this imposes some inconvenience for library authors as they will need to be aware of compatibility for two different builds, but we will make sure to provide clear guidelines on this when we reach that stage.</p>\n<h3>How Do We GetThere</h3>\n<p>First of all, although we are announcing it today, we do not have a definitive timeline yet. What we do know at the moment is the steps we will be taking to get there:</p>\n<h4>1. Internal Feedback for the Runtime Prototype</h4>\n<p>This is the phase we are in right now. Currently, we already have a working runtime prototype that includes the new observer, Virtual DOM and component implementation. We have invited a group of authors of influential community projects to provide feedback for the internal changes, and would like to make sure they are comfortable with the changes before moving forward. We want to ensure that important libraries in the ecosystem will be ready at the same time when we release 3.0, so that users relying on those projects can upgrade easily.</p>\n<h4>2. Public Feedback viaRFCs</h4>\n<p>Once we gain a certain level of confidence in the new design, for each breaking change we will be opening a dedicated RFC issue which includes:</p>\n<p>We will anticipate public feedback from the wider community to help us consolidate these ideas.</p>\n<h4>3. Introduce Compatible Features in 2.x &amp;2.x-next</h4>\n<p>We are not forgetting about 2.x! In fact, we plan to use 2.x to progressively accustom users to the new changes. We will be gradually introducing confirmed API changes into 2.x via opt-in adaptors, and 2.x-next will allow users to try out the new Proxy-based observer.</p>\n<p>The last minor release in 2.x will become LTS and continue to receive bug and security fixes for 18 months when 3.0 is released.</p>\n<h4>4. AlphaPhase</h4>\n<p>Next, we will finish up the compiler and server-side rendering parts of 3.0 and start making alpha releases. These will mostly be for stability testing purposes in small greenfield apps.</p>\n<h4>5. BetaPhase</h4>\n<p>During beta phase, our main goal is updating support libraries and tools like Vue Router, Vuex, Vue CLI, Vue DevTools and make sure they work smoothly with the new core. We will also be working with major library authors from the community to help them get ready for 3.0.</p>\n<h4>6. RCPhase</h4>\n<p>Once we consider the API and codebase stable, we will enter RC phase with API freeze. During this phase we will also work on a “compat build”: a build of 3.0 that includes compatibility layers for 2.x API. This build will also ship with a flag you can turn on to emit deprecation warnings for 2.x API usage in your app. The compat build can be used as a guide to upgrade your app to 3.0.</p>\n<h4>7. IE11build</h4>\n<p>The last task before the final release will be the IE11 compatibility build as mentioned above.</p>\n<h4>8. FinalRelease</h4>\n<p>In all honesty, we don’t know when this will happen yet, but likely in 2019. Again, we care more about shipping something that is solid and stable rather than hitting specific dates. There is a lot of work to be done, but we are excited for what’s coming next!</p>`\n\nconst data = {\n  title,\n  content\n}\n\nexport default data\n"
  },
  {
    "path": "src/views/pdf/download.vue",
    "content": "<template>\n  <div v-loading.fullscreen.lock=\"fullscreenLoading\" class=\"main-article\" element-loading-text=\"Efforts to generate PDF\">\n    <div class=\"article__heading\">\n      <div class=\"article__heading__title\">\n        {{ article.title }}\n      </div>\n    </div>\n    <div style=\"color: #ccc;\">\n      This article is from Evan You on <a target=\"_blank\" href=\"https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf\">medium</a>\n    </div>\n    <div ref=\"content\" class=\"node-article-content\" v-html=\"article.content\" />\n  </div>\n</template>\n\n<script>\n\nexport default {\n  data() {\n    return {\n      article: '',\n      fullscreenLoading: true\n    }\n  },\n  mounted() {\n    this.fetchData()\n  },\n  methods: {\n    fetchData() {\n      import('./content.js').then(data => {\n        const { title } = data.default\n        document.title = title\n        this.article = data.default\n        setTimeout(() => {\n          this.fullscreenLoading = false\n          this.$nextTick(() => {\n            window.print()\n          })\n        }, 3000)\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n@mixin clearfix {\n  &:before {\n    display: table;\n    content: '';\n    clear: both;\n  }\n\n  &:after {\n    display: table;\n    content: '';\n    clear: both;\n  }\n}\n\n.main-article {\n  padding: 20px;\n  margin: 0 auto;\n  display: block;\n  width: 740px;\n  background: #fff;\n}\n\n.article__heading {\n  position: relative;\n  padding: 0 0 20px;\n  overflow: hidden;\n}\n\n.article__heading__title {\n  display: block;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  line-clamp: 2;\n  word-wrap: break-word;\n  overflow-wrap: break-word;\n  font-size: 32px;\n  line-height: 48px;\n  font-weight: 600;\n  color: #333;\n  overflow: hidden;\n}\n\n.node-article-content {\n  margin: 20px 0 0;\n  @include clearfix;\n  font-size: 16px;\n  color: #333;\n  letter-spacing: 0.5px;\n  line-height: 28px;\n  margin-bottom: 30px;\n  font-family: medium-content-serif-font, Georgia, Cambria, \"Times New Roman\", Times, serif;\n\n  &> :last-child {\n    margin-bottom: 0;\n  }\n\n  b,\n  strong {\n    font-weight: inherit;\n    font-weight: bolder;\n  }\n\n  img {\n    max-width: 100%;\n    display: block;\n    margin: 0 auto;\n  }\n\n  p {\n    font-weight: 400;\n    font-style: normal;\n    font-size: 21px;\n    line-height: 1.58;\n    letter-spacing: -.003em;\n\n  }\n\n  ul {\n    margin-bottom: 30px;\n  }\n\n  li {\n    --x-height-multiplier: 0.375;\n    --baseline-multiplier: 0.17;\n\n    letter-spacing: .01rem;\n    font-weight: 400;\n    font-style: normal;\n    font-size: 21px;\n    line-height: 1.58;\n    letter-spacing: -.003em;\n    margin-left: 30px;\n    margin-bottom: 14px;\n  }\n\n  a {\n    text-decoration: none;\n    background-repeat: repeat-x;\n    background-image: linear-gradient(to right, rgba(0, 0, 0, .84) 100%, rgba(0, 0, 0, 0) 0);\n    background-size: 1px 1px;\n    background-position: 0 calc(1em + 1px);\n    padding: 0 6px;\n  }\n\n  code {\n    background: rgba(0, 0, 0, .05);\n    padding: 3px 4px;\n    margin: 0 2px;\n    font-size: 16px;\n    display: inline-block;\n  }\n\n  img {\n    border: 0;\n  }\n\n  /* 解决 IE6-7 图片缩放锯齿问题 */\n  img {\n    -ms-interpolation-mode: bicubic;\n  }\n\n  blockquote {\n    --x-height-multiplier: 0.375;\n    --baseline-multiplier: 0.17;\n    font-family: medium-content-serif-font, Georgia, Cambria, \"Times New Roman\", Times, serif;\n    letter-spacing: .01rem;\n    font-weight: 400;\n    font-style: italic;\n    font-size: 21px;\n    line-height: 1.58;\n    letter-spacing: -.003em;\n    border-left: 3px solid rgba(0, 0, 0, .84);\n    padding-left: 20px;\n    margin-left: -23px;\n    padding-bottom: 2px;\n  }\n\n  a {\n    text-decoration: none;\n  }\n\n  h2,\n  h3,\n  h4 {\n    font-size: 34px;\n    line-height: 1.15;\n    letter-spacing: -.015em;\n    margin: 53px 0 0;\n  }\n\n  h4 {\n    font-size: 26px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/pdf/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <aside style=\"margin-top:15px;\">\n      Here we use window.print() to implement the feature of downloading PDF.\n    </aside>\n    <router-link target=\"_blank\" to=\"/pdf/download\">\n      <el-button type=\"primary\">\n        Click to download PDF\n      </el-button>\n    </router-link>\n  </div>\n</template>\n\n"
  },
  {
    "path": "src/views/permission/components/SwitchRoles.vue",
    "content": "<template>\n  <div>\n    <div style=\"margin-bottom:15px;\">\n      Your roles: {{ roles }}\n    </div>\n    Switch roles:\n    <el-radio-group v-model=\"switchRoles\">\n      <el-radio-button label=\"editor\" />\n      <el-radio-button label=\"admin\" />\n    </el-radio-group>\n  </div>\n</template>\n\n<script>\nexport default {\n  computed: {\n    roles() {\n      return this.$store.getters.roles\n    },\n    switchRoles: {\n      get() {\n        return this.roles[0]\n      },\n      set(val) {\n        this.$store.dispatch('user/changeRoles', val).then(() => {\n          this.$emit('change')\n        })\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/permission/directive.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <switch-roles @change=\"handleRolesChange\" />\n    <div :key=\"key\" style=\"margin-top:30px;\">\n      <div>\n        <span v-permission=\"['admin']\" class=\"permission-alert\">\n          Only\n          <el-tag class=\"permission-tag\" size=\"small\">admin</el-tag> can see this\n        </span>\n        <el-tag v-permission=\"['admin']\" class=\"permission-sourceCode\" type=\"info\">\n          v-permission=\"['admin']\"\n        </el-tag>\n      </div>\n\n      <div>\n        <span v-permission=\"['editor']\" class=\"permission-alert\">\n          Only\n          <el-tag class=\"permission-tag\" size=\"small\">editor</el-tag> can see this\n        </span>\n        <el-tag v-permission=\"['editor']\" class=\"permission-sourceCode\" type=\"info\">\n          v-permission=\"['editor']\"\n        </el-tag>\n      </div>\n\n      <div>\n        <span v-permission=\"['admin','editor']\" class=\"permission-alert\">\n          Both\n          <el-tag class=\"permission-tag\" size=\"small\">admin</el-tag> and\n          <el-tag class=\"permission-tag\" size=\"small\">editor</el-tag> can see this\n        </span>\n        <el-tag v-permission=\"['admin','editor']\" class=\"permission-sourceCode\" type=\"info\">\n          v-permission=\"['admin','editor']\"\n        </el-tag>\n      </div>\n    </div>\n\n    <div :key=\"'checkPermission'+key\" style=\"margin-top:60px;\">\n      <aside>\n        In some cases, using v-permission will have no effect. For example: Element-UI's Tab component or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.\n        <br> e.g.\n      </aside>\n\n      <el-tabs type=\"border-card\" style=\"width:550px;\">\n        <el-tab-pane v-if=\"checkPermission(['admin'])\" label=\"Admin\">\n          Admin can see this\n          <el-tag class=\"permission-sourceCode\" type=\"info\">\n            v-if=\"checkPermission(['admin'])\"\n          </el-tag>\n        </el-tab-pane>\n\n        <el-tab-pane v-if=\"checkPermission(['editor'])\" label=\"Editor\">\n          Editor can see this\n          <el-tag class=\"permission-sourceCode\" type=\"info\">\n            v-if=\"checkPermission(['editor'])\"\n          </el-tag>\n        </el-tab-pane>\n\n        <el-tab-pane v-if=\"checkPermission(['admin','editor'])\" label=\"Admin-OR-Editor\">\n          Both admin or editor can see this\n          <el-tag class=\"permission-sourceCode\" type=\"info\">\n            v-if=\"checkPermission(['admin','editor'])\"\n          </el-tag>\n        </el-tab-pane>\n      </el-tabs>\n    </div>\n  </div>\n</template>\n\n<script>\nimport permission from '@/directive/permission/index.js' // 权限判断指令\nimport checkPermission from '@/utils/permission' // 权限判断函数\nimport SwitchRoles from './components/SwitchRoles'\n\nexport default {\n  name: 'DirectivePermission',\n  components: { SwitchRoles },\n  directives: { permission },\n  data() {\n    return {\n      key: 1 // 为了能每次切换权限的时候重新初始化指令\n    }\n  },\n  methods: {\n    checkPermission,\n    handleRolesChange() {\n      this.key++\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-container {\n  ::v-deep .permission-alert {\n    width: 320px;\n    margin-top: 15px;\n    background-color: #f0f9eb;\n    color: #67c23a;\n    padding: 8px 16px;\n    border-radius: 4px;\n    display: inline-block;\n  }\n  ::v-deep .permission-sourceCode {\n    margin-left: 15px;\n  }\n  ::v-deep .permission-tag {\n    background-color: #ecf5ff;\n  }\n}\n</style>\n\n"
  },
  {
    "path": "src/views/permission/page.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <switch-roles @change=\"handleRolesChange\" />\n  </div>\n</template>\n\n<script>\nimport SwitchRoles from './components/SwitchRoles'\n\nexport default {\n  name: 'PagePermission',\n  components: { SwitchRoles },\n  methods: {\n    handleRolesChange() {\n      this.$router.push({ path: '/permission/index?' + +new Date() })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/permission/role.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-button type=\"primary\" @click=\"handleAddRole\">New Role</el-button>\n\n    <el-table :data=\"rolesList\" style=\"width: 100%;margin-top:30px;\" border>\n      <el-table-column align=\"center\" label=\"Role Key\" width=\"220\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.key }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"Role Name\" width=\"220\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.name }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"header-center\" label=\"Description\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.description }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"Operations\">\n        <template slot-scope=\"scope\">\n          <el-button type=\"primary\" size=\"small\" @click=\"handleEdit(scope)\">Edit</el-button>\n          <el-button type=\"danger\" size=\"small\" @click=\"handleDelete(scope)\">Delete</el-button>\n        </template>\n      </el-table-column>\n    </el-table>\n\n    <el-dialog :visible.sync=\"dialogVisible\" :title=\"dialogType==='edit'?'Edit Role':'New Role'\">\n      <el-form :model=\"role\" label-width=\"80px\" label-position=\"left\">\n        <el-form-item label=\"Name\">\n          <el-input v-model=\"role.name\" placeholder=\"Role Name\" />\n        </el-form-item>\n        <el-form-item label=\"Desc\">\n          <el-input\n            v-model=\"role.description\"\n            :autosize=\"{ minRows: 2, maxRows: 4}\"\n            type=\"textarea\"\n            placeholder=\"Role Description\"\n          />\n        </el-form-item>\n        <el-form-item label=\"Menus\">\n          <el-tree\n            ref=\"tree\"\n            :check-strictly=\"checkStrictly\"\n            :data=\"routesData\"\n            :props=\"defaultProps\"\n            show-checkbox\n            node-key=\"path\"\n            class=\"permission-tree\"\n          />\n        </el-form-item>\n      </el-form>\n      <div style=\"text-align:right;\">\n        <el-button type=\"danger\" @click=\"dialogVisible=false\">Cancel</el-button>\n        <el-button type=\"primary\" @click=\"confirmRole\">Confirm</el-button>\n      </div>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport path from 'path'\nimport { deepClone } from '@/utils'\nimport { getRoutes, getRoles, addRole, deleteRole, updateRole } from '@/api/role'\n\nconst defaultRole = {\n  key: '',\n  name: '',\n  description: '',\n  routes: []\n}\n\nexport default {\n  data() {\n    return {\n      role: Object.assign({}, defaultRole),\n      routes: [],\n      rolesList: [],\n      dialogVisible: false,\n      dialogType: 'new',\n      checkStrictly: false,\n      defaultProps: {\n        children: 'children',\n        label: 'title'\n      }\n    }\n  },\n  computed: {\n    routesData() {\n      return this.routes\n    }\n  },\n  created() {\n    // Mock: get all routes and roles list from server\n    this.getRoutes()\n    this.getRoles()\n  },\n  methods: {\n    async getRoutes() {\n      const res = await getRoutes()\n      this.serviceRoutes = res.data\n      this.routes = this.generateRoutes(res.data)\n    },\n    async getRoles() {\n      const res = await getRoles()\n      this.rolesList = res.data\n    },\n\n    // Reshape the routes structure so that it looks the same as the sidebar\n    generateRoutes(routes, basePath = '/') {\n      const res = []\n\n      for (let route of routes) {\n        // skip some route\n        if (route.hidden) { continue }\n\n        const onlyOneShowingChild = this.onlyOneShowingChild(route.children, route)\n\n        if (route.children && onlyOneShowingChild && !route.alwaysShow) {\n          route = onlyOneShowingChild\n        }\n\n        const data = {\n          path: path.resolve(basePath, route.path),\n          title: route.meta && route.meta.title\n\n        }\n\n        // recursive child routes\n        if (route.children) {\n          data.children = this.generateRoutes(route.children, data.path)\n        }\n        res.push(data)\n      }\n      return res\n    },\n    generateArr(routes) {\n      let data = []\n      routes.forEach(route => {\n        data.push(route)\n        if (route.children) {\n          const temp = this.generateArr(route.children)\n          if (temp.length > 0) {\n            data = [...data, ...temp]\n          }\n        }\n      })\n      return data\n    },\n    handleAddRole() {\n      this.role = Object.assign({}, defaultRole)\n      if (this.$refs.tree) {\n        this.$refs.tree.setCheckedNodes([])\n      }\n      this.dialogType = 'new'\n      this.dialogVisible = true\n    },\n    handleEdit(scope) {\n      this.dialogType = 'edit'\n      this.dialogVisible = true\n      this.checkStrictly = true\n      this.role = deepClone(scope.row)\n      this.$nextTick(() => {\n        const routes = this.generateRoutes(this.role.routes)\n        this.$refs.tree.setCheckedNodes(this.generateArr(routes))\n        // set checked state of a node not affects its father and child nodes\n        this.checkStrictly = false\n      })\n    },\n    handleDelete({ $index, row }) {\n      this.$confirm('Confirm to remove the role?', 'Warning', {\n        confirmButtonText: 'Confirm',\n        cancelButtonText: 'Cancel',\n        type: 'warning'\n      })\n        .then(async() => {\n          await deleteRole(row.key)\n          this.rolesList.splice($index, 1)\n          this.$message({\n            type: 'success',\n            message: 'Delete succed!'\n          })\n        })\n        .catch(err => { console.error(err) })\n    },\n    generateTree(routes, basePath = '/', checkedKeys) {\n      const res = []\n\n      for (const route of routes) {\n        const routePath = path.resolve(basePath, route.path)\n\n        // recursive child routes\n        if (route.children) {\n          route.children = this.generateTree(route.children, routePath, checkedKeys)\n        }\n\n        if (checkedKeys.includes(routePath) || (route.children && route.children.length >= 1)) {\n          res.push(route)\n        }\n      }\n      return res\n    },\n    async confirmRole() {\n      const isEdit = this.dialogType === 'edit'\n\n      const checkedKeys = this.$refs.tree.getCheckedKeys()\n      this.role.routes = this.generateTree(deepClone(this.serviceRoutes), '/', checkedKeys)\n\n      if (isEdit) {\n        await updateRole(this.role.key, this.role)\n        for (let index = 0; index < this.rolesList.length; index++) {\n          if (this.rolesList[index].key === this.role.key) {\n            this.rolesList.splice(index, 1, Object.assign({}, this.role))\n            break\n          }\n        }\n      } else {\n        const { data } = await addRole(this.role)\n        this.role.key = data.key\n        this.rolesList.push(this.role)\n      }\n\n      const { description, key, name } = this.role\n      this.dialogVisible = false\n      this.$notify({\n        title: 'Success',\n        dangerouslyUseHTMLString: true,\n        message: `\n            <div>Role Key: ${key}</div>\n            <div>Role Name: ${name}</div>\n            <div>Description: ${description}</div>\n          `,\n        type: 'success'\n      })\n    },\n    // reference: src/view/layout/components/Sidebar/SidebarItem.vue\n    onlyOneShowingChild(children = [], parent) {\n      let onlyOneChild = null\n      const showingChildren = children.filter(item => !item.hidden)\n\n      // When there is only one child route, the child route is displayed by default\n      if (showingChildren.length === 1) {\n        onlyOneChild = showingChildren[0]\n        onlyOneChild.path = path.resolve(parent.path, onlyOneChild.path)\n        return onlyOneChild\n      }\n\n      // Show parent if there are no child route to display\n      if (showingChildren.length === 0) {\n        onlyOneChild = { ... parent, path: '', noShowingChildren: true }\n        return onlyOneChild\n      }\n\n      return false\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-container {\n  .roles-table {\n    margin-top: 30px;\n  }\n  .permission-tree {\n    margin-bottom: 30px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/profile/components/Account.vue",
    "content": "<template>\n  <el-form>\n    <el-form-item label=\"Name\">\n      <el-input v-model.trim=\"user.name\" />\n    </el-form-item>\n    <el-form-item label=\"Email\">\n      <el-input v-model.trim=\"user.email\" />\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submit\">Update</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nexport default {\n  props: {\n    user: {\n      type: Object,\n      default: () => {\n        return {\n          name: '',\n          email: ''\n        }\n      }\n    }\n  },\n  methods: {\n    submit() {\n      this.$message({\n        message: 'User information has been updated successfully',\n        type: 'success',\n        duration: 5 * 1000\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/profile/components/Activity.vue",
    "content": "<template>\n  <div class=\"user-activity\">\n    <div class=\"post\">\n      <div class=\"user-block\">\n        <img class=\"img-circle\" :src=\"'https://wpimg.wallstcn.com/57ed425a-c71e-4201-9428-68760c0537c4.jpg'+avatarPrefix\">\n        <span class=\"username text-muted\">Iron Man</span>\n        <span class=\"description\">Shared publicly - 7:30 PM today</span>\n      </div>\n      <p>\n        Lorem ipsum represents a long-held tradition for designers,\n        typographers and the like. Some people hate it and argue for\n        its demise, but others ignore the hate as they create awesome\n        tools to help create filler text for everyone from bacon lovers\n        to Charlie Sheen fans.\n      </p>\n      <ul class=\"list-inline\">\n        <li>\n          <span class=\"link-black text-sm\">\n            <i class=\"el-icon-share\" />\n            Share\n          </span>\n        </li>\n        <li>\n          <span class=\"link-black text-sm\">\n            <svg-icon icon-class=\"like\" />\n            Like\n          </span>\n        </li>\n      </ul>\n    </div>\n    <div class=\"post\">\n      <div class=\"user-block\">\n        <img class=\"img-circle\" :src=\"'https://wpimg.wallstcn.com/9e2a5d0a-bd5b-457f-ac8e-86554616c87b.jpg'+avatarPrefix\">\n        <span class=\"username text-muted\">Captain American</span>\n        <span class=\"description\">Sent you a message - yesterday</span>\n      </div>\n      <p>\n        Lorem ipsum represents a long-held tradition for designers,\n        typographers and the like. Some people hate it and argue for\n        its demise, but others ignore the hate as they create awesome\n        tools to help create filler text for everyone from bacon lovers\n        to Charlie Sheen fans.\n      </p>\n      <ul class=\"list-inline\">\n        <li>\n          <span class=\"link-black text-sm\">\n            <i class=\"el-icon-share\" />\n            Share\n          </span>\n        </li>\n        <li>\n          <span class=\"link-black text-sm\">\n            <svg-icon icon-class=\"like\" />\n            Like\n          </span>\n        </li>\n      </ul>\n    </div>\n    <div class=\"post\">\n      <div class=\"user-block\">\n        <img class=\"img-circle\" :src=\"'https://wpimg.wallstcn.com/fb57f689-e1ab-443c-af12-8d4066e202e2.jpg'+avatarPrefix\">\n        <span class=\"username\">Spider Man</span>\n        <span class=\"description\">Posted 4 photos - 2 days ago</span>\n      </div>\n      <div class=\"user-images\">\n        <el-carousel :interval=\"6000\" type=\"card\" height=\"220px\">\n          <el-carousel-item v-for=\"item in carouselImages\" :key=\"item\">\n            <img :src=\"item+carouselPrefix\" class=\"image\">\n          </el-carousel-item>\n        </el-carousel>\n      </div>\n      <ul class=\"list-inline\">\n        <li><span class=\"link-black text-sm\"><i class=\"el-icon-share\" /> Share</span></li>\n        <li>\n          <span class=\"link-black text-sm\">\n            <svg-icon icon-class=\"like\" /> Like</span>\n        </li>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script>\nconst avatarPrefix = '?imageView2/1/w/80/h/80'\nconst carouselPrefix = '?imageView2/2/h/440'\n\nexport default {\n  data() {\n    return {\n      carouselImages: [\n        'https://wpimg.wallstcn.com/9679ffb0-9e0b-4451-9916-e21992218054.jpg',\n        'https://wpimg.wallstcn.com/bcce3734-0837-4b9f-9261-351ef384f75a.jpg',\n        'https://wpimg.wallstcn.com/d1d7b033-d75e-4cd6-ae39-fcd5f1c0a7c5.jpg',\n        'https://wpimg.wallstcn.com/50530061-851b-4ca5-9dc5-2fead928a939.jpg'\n      ],\n      avatarPrefix,\n      carouselPrefix\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.user-activity {\n  .user-block {\n\n    .username,\n    .description {\n      display: block;\n      margin-left: 50px;\n      padding: 2px 0;\n    }\n\n    .username{\n      font-size: 16px;\n      color: #000;\n    }\n\n    :after {\n      clear: both;\n    }\n\n    .img-circle {\n      border-radius: 50%;\n      width: 40px;\n      height: 40px;\n      float: left;\n    }\n\n    span {\n      font-weight: 500;\n      font-size: 12px;\n    }\n  }\n\n  .post {\n    font-size: 14px;\n    border-bottom: 1px solid #d2d6de;\n    margin-bottom: 15px;\n    padding-bottom: 15px;\n    color: #666;\n\n    .image {\n      width: 100%;\n      height: 100%;\n\n    }\n\n    .user-images {\n      padding-top: 20px;\n    }\n  }\n\n  .list-inline {\n    padding-left: 0;\n    margin-left: -5px;\n    list-style: none;\n\n    li {\n      display: inline-block;\n      padding-right: 5px;\n      padding-left: 5px;\n      font-size: 13px;\n    }\n\n    .link-black {\n\n      &:hover,\n      &:focus {\n        color: #999;\n      }\n    }\n  }\n\n}\n\n.box-center {\n  margin: 0 auto;\n  display: table;\n}\n\n.text-muted {\n  color: #777;\n}\n</style>\n"
  },
  {
    "path": "src/views/profile/components/Timeline.vue",
    "content": "<template>\n  <div class=\"block\">\n    <el-timeline>\n      <el-timeline-item v-for=\"(item,index) of timeline\" :key=\"index\" :timestamp=\"item.timestamp\" placement=\"top\">\n        <el-card>\n          <h4>{{ item.title }}</h4>\n          <p>{{ item.content }}</p>\n        </el-card>\n      </el-timeline-item>\n    </el-timeline>\n  </div>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      timeline: [\n        {\n          timestamp: '2019/4/20',\n          title: 'Update Github template',\n          content: 'PanJiaChen committed 2019/4/20 20:46'\n        },\n        {\n          timestamp: '2019/4/21',\n          title: 'Update Github template',\n          content: 'PanJiaChen committed 2019/4/21 20:46'\n        },\n        {\n          timestamp: '2019/4/22',\n          title: 'Build Template',\n          content: 'PanJiaChen committed 2019/4/22 20:46'\n        },\n        {\n          timestamp: '2019/4/23',\n          title: 'Release New Version',\n          content: 'PanJiaChen committed 2019/4/23 20:46'\n        }\n      ]\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/profile/components/UserCard.vue",
    "content": "<template>\n  <el-card style=\"margin-bottom:20px;\">\n    <div slot=\"header\" class=\"clearfix\">\n      <span>About me</span>\n    </div>\n\n    <div class=\"user-profile\">\n      <div class=\"box-center\">\n        <pan-thumb :image=\"user.avatar\" :height=\"'100px'\" :width=\"'100px'\" :hoverable=\"false\">\n          <div>Hello</div>\n          {{ user.role }}\n        </pan-thumb>\n      </div>\n      <div class=\"box-center\">\n        <div class=\"user-name text-center\">{{ user.name }}</div>\n        <div class=\"user-role text-center text-muted\">{{ user.role | uppercaseFirst }}</div>\n      </div>\n    </div>\n\n    <div class=\"user-bio\">\n      <div class=\"user-education user-bio-section\">\n        <div class=\"user-bio-section-header\"><svg-icon icon-class=\"education\" /><span>Education</span></div>\n        <div class=\"user-bio-section-body\">\n          <div class=\"text-muted\">\n            JS in Computer Science from the University of Technology\n          </div>\n        </div>\n      </div>\n\n      <div class=\"user-skills user-bio-section\">\n        <div class=\"user-bio-section-header\"><svg-icon icon-class=\"skill\" /><span>Skills</span></div>\n        <div class=\"user-bio-section-body\">\n          <div class=\"progress-item\">\n            <span>Vue</span>\n            <el-progress :percentage=\"70\" />\n          </div>\n          <div class=\"progress-item\">\n            <span>JavaScript</span>\n            <el-progress :percentage=\"18\" />\n          </div>\n          <div class=\"progress-item\">\n            <span>Css</span>\n            <el-progress :percentage=\"12\" />\n          </div>\n          <div class=\"progress-item\">\n            <span>ESLint</span>\n            <el-progress :percentage=\"100\" status=\"success\" />\n          </div>\n        </div>\n      </div>\n    </div>\n  </el-card>\n</template>\n\n<script>\nimport PanThumb from '@/components/PanThumb'\n\nexport default {\n  components: { PanThumb },\n  props: {\n    user: {\n      type: Object,\n      default: () => {\n        return {\n          name: '',\n          email: '',\n          avatar: '',\n          role: ''\n        }\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.box-center {\n  margin: 0 auto;\n  display: table;\n}\n\n.text-muted {\n  color: #777;\n}\n\n.user-profile {\n  .user-name {\n    font-weight: bold;\n  }\n\n  .box-center {\n    padding-top: 10px;\n  }\n\n  .user-role {\n    padding-top: 10px;\n    font-weight: 400;\n    font-size: 14px;\n  }\n\n  .box-social {\n    padding-top: 30px;\n\n    .el-table {\n      border-top: 1px solid #dfe6ec;\n    }\n  }\n\n  .user-follow {\n    padding-top: 20px;\n  }\n}\n\n.user-bio {\n  margin-top: 20px;\n  color: #606266;\n\n  span {\n    padding-left: 4px;\n  }\n\n  .user-bio-section {\n    font-size: 14px;\n    padding: 15px 0;\n\n    .user-bio-section-header {\n      border-bottom: 1px solid #dfe6ec;\n      padding-bottom: 10px;\n      margin-bottom: 10px;\n      font-weight: bold;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/profile/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <div v-if=\"user\">\n      <el-row :gutter=\"20\">\n\n        <el-col :span=\"6\" :xs=\"24\">\n          <user-card :user=\"user\" />\n        </el-col>\n\n        <el-col :span=\"18\" :xs=\"24\">\n          <el-card>\n            <el-tabs v-model=\"activeTab\">\n              <el-tab-pane label=\"Activity\" name=\"activity\">\n                <activity />\n              </el-tab-pane>\n              <el-tab-pane label=\"Timeline\" name=\"timeline\">\n                <timeline />\n              </el-tab-pane>\n              <el-tab-pane label=\"Account\" name=\"account\">\n                <account :user=\"user\" />\n              </el-tab-pane>\n            </el-tabs>\n          </el-card>\n        </el-col>\n\n      </el-row>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport UserCard from './components/UserCard'\nimport Activity from './components/Activity'\nimport Timeline from './components/Timeline'\nimport Account from './components/Account'\n\nexport default {\n  name: 'Profile',\n  components: { UserCard, Activity, Timeline, Account },\n  data() {\n    return {\n      user: {},\n      activeTab: 'activity'\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'name',\n      'avatar',\n      'roles'\n    ])\n  },\n  created() {\n    this.getUser()\n  },\n  methods: {\n    getUser() {\n      this.user = {\n        name: this.name,\n        role: this.roles.join(' | '),\n        email: 'admin@test.com',\n        avatar: this.avatar\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/qiniu/upload.vue",
    "content": "<template>\n  <el-upload :data=\"dataObj\" :multiple=\"true\" :before-upload=\"beforeUpload\" action=\"https://upload.qbox.me\" drag>\n    <i class=\"el-icon-upload\" />\n    <div class=\"el-upload__text\">\n      将文件拖到此处，或<em>点击上传</em>\n    </div>\n  </el-upload>\n</template>\n\n<script>\nimport { getToken } from '@/api/qiniu'\n// 获取七牛token 后端通过Access Key,Secret Key,bucket等生成token\n// 七牛官方sdk https://developer.qiniu.com/sdk#official-sdk\n\nexport default {\n  data() {\n    return {\n      dataObj: { token: '', key: '' },\n      image_uri: [],\n      fileList: []\n    }\n  },\n  methods: {\n    beforeUpload() {\n      const _self = this\n      return new Promise((resolve, reject) => {\n        getToken().then(response => {\n          const key = response.data.qiniu_key\n          const token = response.data.qiniu_token\n          _self._data.dataObj.token = token\n          _self._data.dataObj.key = key\n          resolve(true)\n        }).catch(err => {\n          console.log(err)\n          reject(false)\n        })\n      })\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/redirect/index.vue",
    "content": "<script>\nexport default {\n  created() {\n    const { params, query } = this.$route\n    const { path } = params\n    this.$router.replace({ path: '/' + path, query })\n  },\n  render: function(h) {\n    return h() // avoid warning message\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/tab/components/TabPane.vue",
    "content": "<template>\n  <el-table :data=\"list\" border fit highlight-current-row style=\"width: 100%\">\n    <el-table-column\n      v-loading=\"loading\"\n      align=\"center\"\n      label=\"ID\"\n      width=\"65\"\n      element-loading-text=\"请给我点时间！\"\n    >\n      <template slot-scope=\"scope\">\n        <span>{{ scope.row.id }}</span>\n      </template>\n    </el-table-column>\n\n    <el-table-column width=\"180px\" align=\"center\" label=\"Date\">\n      <template slot-scope=\"scope\">\n        <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n      </template>\n    </el-table-column>\n\n    <el-table-column min-width=\"300px\" label=\"Title\">\n      <template slot-scope=\"{row}\">\n        <span>{{ row.title }}</span>\n        <el-tag>{{ row.type }}</el-tag>\n      </template>\n    </el-table-column>\n\n    <el-table-column width=\"110px\" align=\"center\" label=\"Author\">\n      <template slot-scope=\"scope\">\n        <span>{{ scope.row.author }}</span>\n      </template>\n    </el-table-column>\n\n    <el-table-column width=\"120px\" label=\"Importance\">\n      <template slot-scope=\"scope\">\n        <svg-icon v-for=\"n in +scope.row.importance\" :key=\"n\" icon-class=\"star\" />\n      </template>\n    </el-table-column>\n\n    <el-table-column align=\"center\" label=\"Readings\" width=\"95\">\n      <template slot-scope=\"scope\">\n        <span>{{ scope.row.pageviews }}</span>\n      </template>\n    </el-table-column>\n\n    <el-table-column class-name=\"status-col\" label=\"Status\" width=\"110\">\n      <template slot-scope=\"{row}\">\n        <el-tag :type=\"row.status | statusFilter\">\n          {{ row.status }}\n        </el-tag>\n      </template>\n    </el-table-column>\n  </el-table>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\n\nexport default {\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    }\n  },\n  props: {\n    type: {\n      type: String,\n      default: 'CN'\n    }\n  },\n  data() {\n    return {\n      list: null,\n      listQuery: {\n        page: 1,\n        limit: 5,\n        type: this.type,\n        sort: '+id'\n      },\n      loading: false\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    getList() {\n      this.loading = true\n      this.$emit('create') // for test\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.loading = false\n      })\n    }\n  }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/tab/index.vue",
    "content": "<template>\n  <div class=\"tab-container\">\n    <el-tag>mounted times ：{{ createdTimes }}</el-tag>\n    <el-alert :closable=\"false\" style=\"width:200px;display:inline-block;vertical-align: middle;margin-left:30px;\" title=\"Tab with keep-alive\" type=\"success\" />\n    <el-tabs v-model=\"activeName\" style=\"margin-top:15px;\" type=\"border-card\">\n      <el-tab-pane v-for=\"item in tabMapOptions\" :key=\"item.key\" :label=\"item.label\" :name=\"item.key\">\n        <keep-alive>\n          <tab-pane v-if=\"activeName==item.key\" :type=\"item.key\" @create=\"showCreatedTimes\" />\n        </keep-alive>\n      </el-tab-pane>\n    </el-tabs>\n  </div>\n</template>\n\n<script>\nimport TabPane from './components/TabPane'\n\nexport default {\n  name: 'Tab',\n  components: { TabPane },\n  data() {\n    return {\n      tabMapOptions: [\n        { label: 'China', key: 'CN' },\n        { label: 'USA', key: 'US' },\n        { label: 'Japan', key: 'JP' },\n        { label: 'Eurozone', key: 'EU' }\n      ],\n      activeName: 'CN',\n      createdTimes: 0\n    }\n  },\n  watch: {\n    activeName(val) {\n      this.$router.push(`${this.$route.path}?tab=${val}`)\n    }\n  },\n  created() {\n    // init the default selected tab\n    const tab = this.$route.query.tab\n    if (tab) {\n      this.activeName = tab\n    }\n  },\n  methods: {\n    showCreatedTimes() {\n      this.createdTimes = this.createdTimes + 1\n    }\n  }\n}\n</script>\n\n<style scoped>\n  .tab-container {\n    margin: 30px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/table/complex-table.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <div class=\"filter-container\">\n      <el-input v-model=\"listQuery.title\" placeholder=\"Title\" style=\"width: 200px;\" class=\"filter-item\" @keyup.enter.native=\"handleFilter\" />\n      <el-select v-model=\"listQuery.importance\" placeholder=\"Imp\" clearable style=\"width: 90px\" class=\"filter-item\">\n        <el-option v-for=\"item in importanceOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\n      </el-select>\n      <el-select v-model=\"listQuery.type\" placeholder=\"Type\" clearable class=\"filter-item\" style=\"width: 130px\">\n        <el-option v-for=\"item in calendarTypeOptions\" :key=\"item.key\" :label=\"item.display_name+'('+item.key+')'\" :value=\"item.key\" />\n      </el-select>\n      <el-select v-model=\"listQuery.sort\" style=\"width: 140px\" class=\"filter-item\" @change=\"handleFilter\">\n        <el-option v-for=\"item in sortOptions\" :key=\"item.key\" :label=\"item.label\" :value=\"item.key\" />\n      </el-select>\n      <el-button v-waves class=\"filter-item\" type=\"primary\" icon=\"el-icon-search\" @click=\"handleFilter\">\n        Search\n      </el-button>\n      <el-button class=\"filter-item\" style=\"margin-left: 10px;\" type=\"primary\" icon=\"el-icon-edit\" @click=\"handleCreate\">\n        Add\n      </el-button>\n      <el-button v-waves :loading=\"downloadLoading\" class=\"filter-item\" type=\"primary\" icon=\"el-icon-download\" @click=\"handleDownload\">\n        Export\n      </el-button>\n      <el-checkbox v-model=\"showReviewer\" class=\"filter-item\" style=\"margin-left:15px;\" @change=\"tableKey=tableKey+1\">\n        reviewer\n      </el-checkbox>\n    </div>\n\n    <el-table\n      :key=\"tableKey\"\n      v-loading=\"listLoading\"\n      :data=\"list\"\n      border\n      fit\n      highlight-current-row\n      style=\"width: 100%;\"\n      @sort-change=\"sortChange\"\n    >\n      <el-table-column label=\"ID\" prop=\"id\" sortable=\"custom\" align=\"center\" width=\"80\" :class-name=\"getSortClass('id')\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.id }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Date\" width=\"150px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Title\" min-width=\"150px\">\n        <template slot-scope=\"{row}\">\n          <span class=\"link-type\" @click=\"handleUpdate(row)\">{{ row.title }}</span>\n          <el-tag>{{ row.type | typeFilter }}</el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Author\" width=\"110px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.author }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column v-if=\"showReviewer\" label=\"Reviewer\" width=\"110px\" align=\"center\">\n        <template slot-scope=\"{row}\">\n          <span style=\"color:red;\">{{ row.reviewer }}</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Imp\" width=\"80px\">\n        <template slot-scope=\"{row}\">\n          <svg-icon v-for=\"n in + row.importance\" :key=\"n\" icon-class=\"star\" class=\"meta-item__icon\" />\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Readings\" align=\"center\" width=\"95\">\n        <template slot-scope=\"{row}\">\n          <span v-if=\"row.pageviews\" class=\"link-type\" @click=\"handleFetchPv(row.pageviews)\">{{ row.pageviews }}</span>\n          <span v-else>0</span>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Status\" class-name=\"status-col\" width=\"100\">\n        <template slot-scope=\"{row}\">\n          <el-tag :type=\"row.status | statusFilter\">\n            {{ row.status }}\n          </el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Actions\" align=\"center\" width=\"230\" class-name=\"small-padding fixed-width\">\n        <template slot-scope=\"{row,$index}\">\n          <el-button type=\"primary\" size=\"mini\" @click=\"handleUpdate(row)\">\n            Edit\n          </el-button>\n          <el-button v-if=\"row.status!='published'\" size=\"mini\" type=\"success\" @click=\"handleModifyStatus(row,'published')\">\n            Publish\n          </el-button>\n          <el-button v-if=\"row.status!='draft'\" size=\"mini\" @click=\"handleModifyStatus(row,'draft')\">\n            Draft\n          </el-button>\n          <el-button v-if=\"row.status!='deleted'\" size=\"mini\" type=\"danger\" @click=\"handleDelete(row,$index)\">\n            Delete\n          </el-button>\n        </template>\n      </el-table-column>\n    </el-table>\n\n    <pagination v-show=\"total>0\" :total=\"total\" :page.sync=\"listQuery.page\" :limit.sync=\"listQuery.limit\" @pagination=\"getList\" />\n\n    <el-dialog :title=\"textMap[dialogStatus]\" :visible.sync=\"dialogFormVisible\">\n      <el-form ref=\"dataForm\" :rules=\"rules\" :model=\"temp\" label-position=\"left\" label-width=\"70px\" style=\"width: 400px; margin-left:50px;\">\n        <el-form-item label=\"Type\" prop=\"type\">\n          <el-select v-model=\"temp.type\" class=\"filter-item\" placeholder=\"Please select\">\n            <el-option v-for=\"item in calendarTypeOptions\" :key=\"item.key\" :label=\"item.display_name\" :value=\"item.key\" />\n          </el-select>\n        </el-form-item>\n        <el-form-item label=\"Date\" prop=\"timestamp\">\n          <el-date-picker v-model=\"temp.timestamp\" type=\"datetime\" placeholder=\"Please pick a date\" />\n        </el-form-item>\n        <el-form-item label=\"Title\" prop=\"title\">\n          <el-input v-model=\"temp.title\" />\n        </el-form-item>\n        <el-form-item label=\"Status\">\n          <el-select v-model=\"temp.status\" class=\"filter-item\" placeholder=\"Please select\">\n            <el-option v-for=\"item in statusOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\n          </el-select>\n        </el-form-item>\n        <el-form-item label=\"Imp\">\n          <el-rate v-model=\"temp.importance\" :colors=\"['#99A9BF', '#F7BA2A', '#FF9900']\" :max=\"3\" style=\"margin-top:8px;\" />\n        </el-form-item>\n        <el-form-item label=\"Remark\">\n          <el-input v-model=\"temp.remark\" :autosize=\"{ minRows: 2, maxRows: 4}\" type=\"textarea\" placeholder=\"Please input\" />\n        </el-form-item>\n      </el-form>\n      <div slot=\"footer\" class=\"dialog-footer\">\n        <el-button @click=\"dialogFormVisible = false\">\n          Cancel\n        </el-button>\n        <el-button type=\"primary\" @click=\"dialogStatus==='create'?createData():updateData()\">\n          Confirm\n        </el-button>\n      </div>\n    </el-dialog>\n\n    <el-dialog :visible.sync=\"dialogPvVisible\" title=\"Reading statistics\">\n      <el-table :data=\"pvData\" border fit highlight-current-row style=\"width: 100%\">\n        <el-table-column prop=\"key\" label=\"Channel\" />\n        <el-table-column prop=\"pv\" label=\"Pv\" />\n      </el-table>\n      <span slot=\"footer\" class=\"dialog-footer\">\n        <el-button type=\"primary\" @click=\"dialogPvVisible = false\">Confirm</el-button>\n      </span>\n    </el-dialog>\n  </div>\n</template>\n\n<script>\nimport { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'\nimport waves from '@/directive/waves' // waves directive\nimport { parseTime } from '@/utils'\nimport Pagination from '@/components/Pagination' // secondary package based on el-pagination\n\nconst calendarTypeOptions = [\n  { key: 'CN', display_name: 'China' },\n  { key: 'US', display_name: 'USA' },\n  { key: 'JP', display_name: 'Japan' },\n  { key: 'EU', display_name: 'Eurozone' }\n]\n\n// arr to obj, such as { CN : \"China\", US : \"USA\" }\nconst calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {\n  acc[cur.key] = cur.display_name\n  return acc\n}, {})\n\nexport default {\n  name: 'ComplexTable',\n  components: { Pagination },\n  directives: { waves },\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    },\n    typeFilter(type) {\n      return calendarTypeKeyValue[type]\n    }\n  },\n  data() {\n    return {\n      tableKey: 0,\n      list: null,\n      total: 0,\n      listLoading: true,\n      listQuery: {\n        page: 1,\n        limit: 20,\n        importance: undefined,\n        title: undefined,\n        type: undefined,\n        sort: '+id'\n      },\n      importanceOptions: [1, 2, 3],\n      calendarTypeOptions,\n      sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }],\n      statusOptions: ['published', 'draft', 'deleted'],\n      showReviewer: false,\n      temp: {\n        id: undefined,\n        importance: 1,\n        remark: '',\n        timestamp: new Date(),\n        title: '',\n        type: '',\n        status: 'published'\n      },\n      dialogFormVisible: false,\n      dialogStatus: '',\n      textMap: {\n        update: 'Edit',\n        create: 'Create'\n      },\n      dialogPvVisible: false,\n      pvData: [],\n      rules: {\n        type: [{ required: true, message: 'type is required', trigger: 'change' }],\n        timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }],\n        title: [{ required: true, message: 'title is required', trigger: 'blur' }]\n      },\n      downloadLoading: false\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    getList() {\n      this.listLoading = true\n      fetchList(this.listQuery).then(response => {\n        this.list = response.data.items\n        this.total = response.data.total\n\n        // Just to simulate the time of the request\n        setTimeout(() => {\n          this.listLoading = false\n        }, 1.5 * 1000)\n      })\n    },\n    handleFilter() {\n      this.listQuery.page = 1\n      this.getList()\n    },\n    handleModifyStatus(row, status) {\n      this.$message({\n        message: '操作Success',\n        type: 'success'\n      })\n      row.status = status\n    },\n    sortChange(data) {\n      const { prop, order } = data\n      if (prop === 'id') {\n        this.sortByID(order)\n      }\n    },\n    sortByID(order) {\n      if (order === 'ascending') {\n        this.listQuery.sort = '+id'\n      } else {\n        this.listQuery.sort = '-id'\n      }\n      this.handleFilter()\n    },\n    resetTemp() {\n      this.temp = {\n        id: undefined,\n        importance: 1,\n        remark: '',\n        timestamp: new Date(),\n        title: '',\n        status: 'published',\n        type: ''\n      }\n    },\n    handleCreate() {\n      this.resetTemp()\n      this.dialogStatus = 'create'\n      this.dialogFormVisible = true\n      this.$nextTick(() => {\n        this.$refs['dataForm'].clearValidate()\n      })\n    },\n    createData() {\n      this.$refs['dataForm'].validate((valid) => {\n        if (valid) {\n          this.temp.id = parseInt(Math.random() * 100) + 1024 // mock a id\n          this.temp.author = 'vue-element-admin'\n          createArticle(this.temp).then(() => {\n            this.list.unshift(this.temp)\n            this.dialogFormVisible = false\n            this.$notify({\n              title: 'Success',\n              message: 'Created Successfully',\n              type: 'success',\n              duration: 2000\n            })\n          })\n        }\n      })\n    },\n    handleUpdate(row) {\n      this.temp = Object.assign({}, row) // copy obj\n      this.temp.timestamp = new Date(this.temp.timestamp)\n      this.dialogStatus = 'update'\n      this.dialogFormVisible = true\n      this.$nextTick(() => {\n        this.$refs['dataForm'].clearValidate()\n      })\n    },\n    updateData() {\n      this.$refs['dataForm'].validate((valid) => {\n        if (valid) {\n          const tempData = Object.assign({}, this.temp)\n          tempData.timestamp = +new Date(tempData.timestamp) // change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464\n          updateArticle(tempData).then(() => {\n            const index = this.list.findIndex(v => v.id === this.temp.id)\n            this.list.splice(index, 1, this.temp)\n            this.dialogFormVisible = false\n            this.$notify({\n              title: 'Success',\n              message: 'Update Successfully',\n              type: 'success',\n              duration: 2000\n            })\n          })\n        }\n      })\n    },\n    handleDelete(row, index) {\n      this.$notify({\n        title: 'Success',\n        message: 'Delete Successfully',\n        type: 'success',\n        duration: 2000\n      })\n      this.list.splice(index, 1)\n    },\n    handleFetchPv(pv) {\n      fetchPv(pv).then(response => {\n        this.pvData = response.data.pvData\n        this.dialogPvVisible = true\n      })\n    },\n    handleDownload() {\n      this.downloadLoading = true\n      import('@/vendor/Export2Excel').then(excel => {\n        const tHeader = ['timestamp', 'title', 'type', 'importance', 'status']\n        const filterVal = ['timestamp', 'title', 'type', 'importance', 'status']\n        const data = this.formatJson(filterVal)\n        excel.export_json_to_excel({\n          header: tHeader,\n          data,\n          filename: 'table-list'\n        })\n        this.downloadLoading = false\n      })\n    },\n    formatJson(filterVal) {\n      return this.list.map(v => filterVal.map(j => {\n        if (j === 'timestamp') {\n          return parseTime(v[j])\n        } else {\n          return v[j]\n        }\n      }))\n    },\n    getSortClass: function(key) {\n      const sort = this.listQuery.sort\n      return sort === `+${key}` ? 'ascending' : 'descending'\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/table/drag-table.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <!-- Note that row-key is necessary to get a correct row order. -->\n    <el-table ref=\"dragTable\" v-loading=\"listLoading\" :data=\"list\" row-key=\"id\" border fit highlight-current-row style=\"width: 100%\">\n      <el-table-column align=\"center\" label=\"ID\" width=\"65\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.id }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"180px\" align=\"center\" label=\"Date\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column min-width=\"300px\" label=\"Title\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.title }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"110px\" align=\"center\" label=\"Author\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.author }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"100px\" label=\"Importance\">\n        <template slot-scope=\"{row}\">\n          <svg-icon v-for=\"n in + row.importance\" :key=\"n\" icon-class=\"star\" class=\"icon-star\" />\n        </template>\n      </el-table-column>\n\n      <el-table-column align=\"center\" label=\"Readings\" width=\"95\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.pageviews }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column class-name=\"status-col\" label=\"Status\" width=\"110\">\n        <template slot-scope=\"{row}\">\n          <el-tag :type=\"row.status | statusFilter\">\n            {{ row.status }}\n          </el-tag>\n        </template>\n      </el-table-column>\n\n      <el-table-column align=\"center\" label=\"Drag\" width=\"80\">\n        <template slot-scope=\"{}\">\n          <svg-icon class=\"drag-handler\" icon-class=\"drag\" />\n        </template>\n      </el-table-column>\n    </el-table>\n    <div class=\"show-d\">\n      <el-tag>The default order :</el-tag> {{ oldList }}\n    </div>\n    <div class=\"show-d\">\n      <el-tag>The after dragging order :</el-tag> {{ newList }}\n    </div>\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\nimport Sortable from 'sortablejs'\n\nexport default {\n  name: 'DragTable',\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    }\n  },\n  data() {\n    return {\n      list: null,\n      total: null,\n      listLoading: true,\n      listQuery: {\n        page: 1,\n        limit: 10\n      },\n      sortable: null,\n      oldList: [],\n      newList: []\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    async getList() {\n      this.listLoading = true\n      const { data } = await fetchList(this.listQuery)\n      this.list = data.items\n      this.total = data.total\n      this.listLoading = false\n      this.oldList = this.list.map(v => v.id)\n      this.newList = this.oldList.slice()\n      this.$nextTick(() => {\n        this.setSort()\n      })\n    },\n    setSort() {\n      const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]\n      this.sortable = Sortable.create(el, {\n        ghostClass: 'sortable-ghost', // Class name for the drop placeholder,\n        setData: function(dataTransfer) {\n          // to avoid Firefox bug\n          // Detail see : https://github.com/RubaXa/Sortable/issues/1012\n          dataTransfer.setData('Text', '')\n        },\n        onEnd: evt => {\n          const targetRow = this.list.splice(evt.oldIndex, 1)[0]\n          this.list.splice(evt.newIndex, 0, targetRow)\n\n          // for show the changes, you can delete in you code\n          const tempIndex = this.newList.splice(evt.oldIndex, 1)[0]\n          this.newList.splice(evt.newIndex, 0, tempIndex)\n        }\n      })\n    }\n  }\n}\n</script>\n\n<style>\n.sortable-ghost{\n  opacity: .8;\n  color: #fff!important;\n  background: #42b983!important;\n}\n</style>\n\n<style scoped>\n.icon-star{\n  margin-right:2px;\n}\n.drag-handler{\n  width: 20px;\n  height: 20px;\n  cursor: pointer;\n}\n.show-d{\n  margin-top: 15px;\n}\n</style>\n"
  },
  {
    "path": "src/views/table/dynamic-table/components/FixedThead.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <div class=\"filter-container\">\n      <el-checkbox-group v-model=\"checkboxVal\">\n        <el-checkbox label=\"apple\">\n          apple\n        </el-checkbox>\n        <el-checkbox label=\"banana\">\n          banana\n        </el-checkbox>\n        <el-checkbox label=\"orange\">\n          orange\n        </el-checkbox>\n      </el-checkbox-group>\n    </div>\n\n    <el-table :key=\"key\" :data=\"tableData\" border fit highlight-current-row style=\"width: 100%\">\n      <el-table-column prop=\"name\" label=\"fruitName\" width=\"180\" />\n      <el-table-column v-for=\"fruit in formThead\" :key=\"fruit\" :label=\"fruit\">\n        <template slot-scope=\"scope\">\n          {{ scope.row[fruit] }}\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nconst defaultFormThead = ['apple', 'banana']\n\nexport default {\n  data() {\n    return {\n      tableData: [\n        {\n          name: 'fruit-1',\n          apple: 'apple-10',\n          banana: 'banana-10',\n          orange: 'orange-10'\n        },\n        {\n          name: 'fruit-2',\n          apple: 'apple-20',\n          banana: 'banana-20',\n          orange: 'orange-20'\n        }\n      ],\n      key: 1, // table key\n      formTheadOptions: ['apple', 'banana', 'orange'],\n      checkboxVal: defaultFormThead, // checkboxVal\n      formThead: defaultFormThead // 默认表头 Default header\n    }\n  },\n  watch: {\n    checkboxVal(valArr) {\n      this.formThead = this.formTheadOptions.filter(i => valArr.indexOf(i) >= 0)\n      this.key = this.key + 1// 为了保证table 每次都会重渲 In order to ensure the table will be re-rendered each time\n    }\n  }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/table/dynamic-table/components/UnfixedThead.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <div class=\"filter-container\">\n      <el-checkbox-group v-model=\"formThead\">\n        <el-checkbox label=\"apple\">\n          apple\n        </el-checkbox>\n        <el-checkbox label=\"banana\">\n          banana\n        </el-checkbox>\n        <el-checkbox label=\"orange\">\n          orange\n        </el-checkbox>\n      </el-checkbox-group>\n    </div>\n\n    <el-table :data=\"tableData\" border fit highlight-current-row style=\"width: 100%\">\n      <el-table-column prop=\"name\" label=\"fruitName\" width=\"180\" />\n      <el-table-column v-for=\"fruit in formThead\" :key=\"fruit\" :label=\"fruit\">\n        <template slot-scope=\"scope\">\n          {{ scope.row[fruit] }}\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      tableData: [\n        {\n          name: 'fruit-1',\n          apple: 'apple-10',\n          banana: 'banana-10',\n          orange: 'orange-10'\n        },\n        {\n          name: 'fruit-2',\n          apple: 'apple-20',\n          banana: 'banana-20',\n          orange: 'orange-20'\n        }\n      ],\n      formThead: ['apple', 'banana']\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/table/dynamic-table/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <div style=\"margin:0 0 5px 20px\">\n      Fixed header, sorted by header order,\n    </div>\n    <fixed-thead />\n\n    <div style=\"margin:30px 0 5px 20px\">\n      Not fixed header, sorted by click order\n    </div>\n    <unfixed-thead />\n  </div>\n</template>\n\n<script>\nimport FixedThead from './components/FixedThead'\nimport UnfixedThead from './components/UnfixedThead'\n\nexport default {\n  name: 'DynamicTable',\n  components: { FixedThead, UnfixedThead }\n}\n</script>\n\n"
  },
  {
    "path": "src/views/table/inline-edit-table.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-table v-loading=\"listLoading\" :data=\"list\" border fit highlight-current-row style=\"width: 100%\">\n      <el-table-column align=\"center\" label=\"ID\" width=\"80\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.id }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"180px\" align=\"center\" label=\"Date\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"120px\" align=\"center\" label=\"Author\">\n        <template slot-scope=\"{row}\">\n          <span>{{ row.author }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column width=\"100px\" label=\"Importance\">\n        <template slot-scope=\"{row}\">\n          <svg-icon v-for=\"n in + row.importance\" :key=\"n\" icon-class=\"star\" class=\"meta-item__icon\" />\n        </template>\n      </el-table-column>\n\n      <el-table-column class-name=\"status-col\" label=\"Status\" width=\"110\">\n        <template slot-scope=\"{row}\">\n          <el-tag :type=\"row.status | statusFilter\">\n            {{ row.status }}\n          </el-tag>\n        </template>\n      </el-table-column>\n\n      <el-table-column min-width=\"300px\" label=\"Title\">\n        <template slot-scope=\"{row}\">\n          <template v-if=\"row.edit\">\n            <el-input v-model=\"row.title\" class=\"edit-input\" size=\"small\" />\n            <el-button\n              class=\"cancel-btn\"\n              size=\"small\"\n              icon=\"el-icon-refresh\"\n              type=\"warning\"\n              @click=\"cancelEdit(row)\"\n            >\n              cancel\n            </el-button>\n          </template>\n          <span v-else>{{ row.title }}</span>\n        </template>\n      </el-table-column>\n\n      <el-table-column align=\"center\" label=\"Actions\" width=\"120\">\n        <template slot-scope=\"{row}\">\n          <el-button\n            v-if=\"row.edit\"\n            type=\"success\"\n            size=\"small\"\n            icon=\"el-icon-circle-check-outline\"\n            @click=\"confirmEdit(row)\"\n          >\n            Ok\n          </el-button>\n          <el-button\n            v-else\n            type=\"primary\"\n            size=\"small\"\n            icon=\"el-icon-edit\"\n            @click=\"row.edit=!row.edit\"\n          >\n            Edit\n          </el-button>\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\n\nexport default {\n  name: 'InlineEditTable',\n  filters: {\n    statusFilter(status) {\n      const statusMap = {\n        published: 'success',\n        draft: 'info',\n        deleted: 'danger'\n      }\n      return statusMap[status]\n    }\n  },\n  data() {\n    return {\n      list: null,\n      listLoading: true,\n      listQuery: {\n        page: 1,\n        limit: 10\n      }\n    }\n  },\n  created() {\n    this.getList()\n  },\n  methods: {\n    async getList() {\n      this.listLoading = true\n      const { data } = await fetchList(this.listQuery)\n      const items = data.items\n      this.list = items.map(v => {\n        this.$set(v, 'edit', false) // https://vuejs.org/v2/guide/reactivity.html\n        v.originalTitle = v.title //  will be used when user click the cancel botton\n        return v\n      })\n      this.listLoading = false\n    },\n    cancelEdit(row) {\n      row.title = row.originalTitle\n      row.edit = false\n      this.$message({\n        message: 'The title has been restored to the original value',\n        type: 'warning'\n      })\n    },\n    confirmEdit(row) {\n      row.edit = false\n      row.originalTitle = row.title\n      this.$message({\n        message: 'The title has been edited',\n        type: 'success'\n      })\n    }\n  }\n}\n</script>\n\n<style scoped>\n.edit-input {\n  padding-right: 100px;\n}\n.cancel-btn {\n  position: absolute;\n  right: 15px;\n  top: 10px;\n}\n</style>\n"
  },
  {
    "path": "src/views/theme/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-card class=\"box-card\">\n      <div slot=\"header\">\n        <a class=\"link-type link-title\" target=\"_blank\" href=\"https://panjiachen.github.io/vue-element-admin-site/guide/advanced/theme.html\">\n          Theme documentation\n        </a>\n      </div>\n      <div class=\"box-item\">\n        <span class=\"field-label\">Change Theme : </span>\n        <el-switch v-model=\"theme\" />\n        <aside style=\"margin-top:15px;\">\n          Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.\n        </aside>\n      </div>\n    </el-card>\n\n    <div class=\"block\">\n      <el-button type=\"primary\">\n        Primary\n      </el-button>\n      <el-button type=\"success\">\n        Success\n      </el-button>\n      <el-button type=\"info\">\n        Info\n      </el-button>\n      <el-button type=\"warning\">\n        Warning\n      </el-button>\n      <el-button type=\"danger\">\n        Danger\n      </el-button>\n    </div>\n\n    <div class=\"block\">\n      <el-button type=\"primary\" icon=\"el-icon-edit\" />\n      <el-button type=\"primary\" icon=\"el-icon-share\" />\n      <el-button type=\"primary\" icon=\"el-icon-delete\" />\n      <el-button type=\"primary\" icon=\"el-icon-search\">\n        Search\n      </el-button>\n      <el-button type=\"primary\">\n        Upload\n        <i class=\"el-icon-upload el-icon-right\" />\n      </el-button>\n    </div>\n\n    <div class=\"block\">\n      <el-tag v-for=\"tag in tags\" :key=\"tag.type\" :type=\"tag.type\" class=\"tag-item\">\n        {{ tag.name }}\n      </el-tag>\n    </div>\n\n    <div class=\"block\">\n      <el-radio-group v-model=\"radio\">\n        <el-radio :label=\"3\">\n          Option A\n        </el-radio>\n        <el-radio :label=\"6\">\n          Option B\n        </el-radio>\n        <el-radio :label=\"9\">\n          Option C\n        </el-radio>\n      </el-radio-group>\n    </div>\n\n    <div class=\"block\">\n      <el-slider v-model=\"slideValue\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport { toggleClass } from '@/utils'\nimport '@/assets/custom-theme/index.css' // the theme changed version element-ui css\n\nexport default {\n  name: 'Theme',\n  data() {\n    return {\n      theme: false,\n      tags: [\n        { name: 'Tag One', type: '' },\n        { name: 'Tag Two', type: 'info' },\n        { name: 'Tag Three', type: 'success' },\n        { name: 'Tag Four', type: 'warning' },\n        { name: 'Tag Five', type: 'danger' }\n      ],\n      slideValue: 50,\n      radio: 3\n    }\n  },\n  watch: {\n    theme() {\n      toggleClass(document.body, 'custom-theme')\n    }\n  }\n}\n</script>\n\n<style scoped>\n.field-label{\n  vertical-align: middle;\n}\n.box-card {\n  width: 400px;\n  max-width: 100%;\n  margin: 20px auto;\n}\n\n.block {\n  padding: 30px 24px;\n}\n\n.tag-item {\n  margin-right: 15px;\n}\n</style>\n"
  },
  {
    "path": "src/views/zip/index.vue",
    "content": "<template>\n  <div class=\"app-container\">\n    <el-input v-model=\"filename\" placeholder=\"Please enter the file name (default file)\" style=\"width:300px;\" prefix-icon=\"el-icon-document\" />\n    <el-button :loading=\"downloadLoading\" style=\"margin-bottom:20px;\" type=\"primary\" icon=\"el-icon-document\" @click=\"handleDownload\">\n      Export Zip\n    </el-button>\n    <el-table v-loading=\"listLoading\" :data=\"list\" element-loading-text=\"拼命加载中\" border fit highlight-current-row>\n      <el-table-column align=\"center\" label=\"ID\" width=\"95\">\n        <template slot-scope=\"scope\">\n          {{ scope.$index }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Title\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.title }}\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Author\" width=\"95\" align=\"center\">\n        <template slot-scope=\"scope\">\n          <el-tag>{{ scope.row.author }}</el-tag>\n        </template>\n      </el-table-column>\n      <el-table-column label=\"Readings\" width=\"115\" align=\"center\">\n        <template slot-scope=\"scope\">\n          {{ scope.row.pageviews }}\n        </template>\n      </el-table-column>\n      <el-table-column align=\"center\" label=\"Date\" width=\"220\">\n        <template slot-scope=\"scope\">\n          <i class=\"el-icon-time\" />\n          <span>{{ scope.row.display_time }}</span>\n        </template>\n      </el-table-column>\n    </el-table>\n  </div>\n</template>\n\n<script>\nimport { fetchList } from '@/api/article'\n\nexport default {\n  name: 'ExportZip',\n  data() {\n    return {\n      list: null,\n      listLoading: true,\n      downloadLoading: false,\n      filename: ''\n    }\n  },\n  created() {\n    this.fetchData()\n  },\n  methods: {\n    async fetchData() {\n      this.listLoading = true\n      const { data } = await fetchList()\n      this.list = data.items\n      this.listLoading = false\n    },\n    handleDownload() {\n      this.downloadLoading = true\n      import('@/vendor/Export2Zip').then(zip => {\n        const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']\n        const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']\n        const list = this.list\n        const data = this.formatJson(filterVal, list)\n        zip.export_txt_to_zip(tHeader, data, this.filename, this.filename)\n        this.downloadLoading = false\n      })\n    },\n    formatJson(filterVal, jsonData) {\n      return jsonData.map(v => filterVal.map(j => v[j]))\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "tests/unit/.eslintrc.js",
    "content": "module.exports = {\n  env: {\n    jest: true\n  }\n}\n"
  },
  {
    "path": "tests/unit/components/Hamburger.spec.js",
    "content": "import { shallowMount } from '@vue/test-utils'\nimport Hamburger from '@/components/Hamburger/index.vue'\ndescribe('Hamburger.vue', () => {\n  it('toggle click', () => {\n    const wrapper = shallowMount(Hamburger)\n    const mockFn = jest.fn()\n    wrapper.vm.$on('toggleClick', mockFn)\n    wrapper.find('.hamburger').trigger('click')\n    expect(mockFn).toBeCalled()\n  })\n  it('prop isActive', () => {\n    const wrapper = shallowMount(Hamburger)\n    wrapper.setProps({ isActive: true })\n    expect(wrapper.contains('.is-active')).toBe(true)\n    wrapper.setProps({ isActive: false })\n    expect(wrapper.contains('.is-active')).toBe(false)\n  })\n})\n"
  },
  {
    "path": "tests/unit/components/SvgIcon.spec.js",
    "content": "import { shallowMount } from '@vue/test-utils'\nimport SvgIcon from '@/components/SvgIcon/index.vue'\ndescribe('SvgIcon.vue', () => {\n  it('iconClass', () => {\n    const wrapper = shallowMount(SvgIcon, {\n      propsData: {\n        iconClass: 'test'\n      }\n    })\n    expect(wrapper.find('use').attributes().href).toBe('#icon-test')\n  })\n  it('className', () => {\n    const wrapper = shallowMount(SvgIcon, {\n      propsData: {\n        iconClass: 'test'\n      }\n    })\n    expect(wrapper.classes().length).toBe(1)\n    wrapper.setProps({ className: 'test' })\n    expect(wrapper.classes().includes('test')).toBe(true)\n  })\n})\n"
  },
  {
    "path": "tests/unit/utils/formatTime.spec.js",
    "content": "import { formatTime } from '@/utils/index.js'\ndescribe('Utils:formatTime', () => {\n  const d = new Date('2018-07-13 17:54:01') // \"2018-07-13 17:54:01\"\n  const retrofit = 5 * 1000\n\n  it('ten digits timestamp', () => {\n    expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分')\n  })\n  it('test now', () => {\n    expect(formatTime(+new Date() - 1)).toBe('刚刚')\n  })\n  it('less two minute', () => {\n    expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前')\n  })\n  it('less two hour', () => {\n    expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前')\n  })\n  it('less one day', () => {\n    expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前')\n  })\n  it('more than one day', () => {\n    expect(formatTime(d)).toBe('7月13日17时54分')\n  })\n  it('format', () => {\n    expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')\n    expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')\n    expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')\n  })\n})\n"
  },
  {
    "path": "tests/unit/utils/param2Obj.spec.js",
    "content": "import { param2Obj } from '@/utils/index.js'\ndescribe('Utils:param2Obj', () => {\n  const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95'\n\n  it('param2Obj test', () => {\n    expect(param2Obj(url)).toEqual({\n      name: 'bill',\n      age: '29',\n      sex: '1',\n      field: window.btoa('test'),\n      key: '测试'\n    })\n  })\n})\n"
  },
  {
    "path": "tests/unit/utils/parseTime.spec.js",
    "content": "import { parseTime } from '@/utils/index.js'\n\ndescribe('Utils:parseTime', () => {\n  const d = new Date('2018-07-13 17:54:01') // \"2018-07-13 17:54:01\"\n  it('timestamp', () => {\n    expect(parseTime(d)).toBe('2018-07-13 17:54:01')\n  })\n\n  it('timestamp string', () => {\n    expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01')\n  })\n\n  it('ten digits timestamp', () => {\n    expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01')\n  })\n  it('new Date', () => {\n    expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01')\n  })\n  it('format', () => {\n    expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')\n    expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')\n    expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')\n  })\n  it('get the day of the week', () => {\n    expect(parseTime(d, '{a}')).toBe('五') // 星期五\n  })\n  it('get the day of the week', () => {\n    expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日\n  })\n  it('empty argument', () => {\n    expect(parseTime()).toBeNull()\n  })\n\n  it('null', () => {\n    expect(parseTime(null)).toBeNull()\n  })\n})\n"
  },
  {
    "path": "tests/unit/utils/validate.spec.js",
    "content": "import { validUsername, validURL, validLowerCase, validUpperCase, validAlphabets } from '@/utils/validate.js'\ndescribe('Utils:validate', () => {\n  it('validUsername', () => {\n    expect(validUsername('admin')).toBe(true)\n    expect(validUsername('editor')).toBe(true)\n    expect(validUsername('xxxx')).toBe(false)\n  })\n  it('validURL', () => {\n    expect(validURL('https://github.com/PanJiaChen/vue-element-admin')).toBe(true)\n    expect(validURL('http://github.com/PanJiaChen/vue-element-admin')).toBe(true)\n    expect(validURL('github.com/PanJiaChen/vue-element-admin')).toBe(false)\n  })\n  it('validLowerCase', () => {\n    expect(validLowerCase('abc')).toBe(true)\n    expect(validLowerCase('Abc')).toBe(false)\n    expect(validLowerCase('123abc')).toBe(false)\n  })\n  it('validUpperCase', () => {\n    expect(validUpperCase('ABC')).toBe(true)\n    expect(validUpperCase('Abc')).toBe(false)\n    expect(validUpperCase('123ABC')).toBe(false)\n  })\n  it('validAlphabets', () => {\n    expect(validAlphabets('ABC')).toBe(true)\n    expect(validAlphabets('Abc')).toBe(true)\n    expect(validAlphabets('123aBC')).toBe(false)\n  })\n})\n"
  },
  {
    "path": "vue.config.js",
    "content": "'use strict'\nconst path = require('path')\nconst defaultSettings = require('./src/settings.js')\n\nfunction resolve(dir) {\n  return path.join(__dirname, dir)\n}\n\nconst name = defaultSettings.title || 'vue Element Admin' // page title\n\n// If your port is set to 80,\n// use administrator privileges to execute the command line.\n// For example, Mac: sudo npm run\n// You can change the port by the following method:\n// port = 9527 npm run dev OR npm run dev --port = 9527\nconst port = process.env.port || process.env.npm_config_port || 9527 // dev port\n\n// All configuration item explanations can be find in https://cli.vuejs.org/config/\nmodule.exports = {\n  /**\n   * You will need to set publicPath if you plan to deploy your site under a sub path,\n   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,\n   * then publicPath should be set to \"/bar/\".\n   * In most cases please use '/' !!!\n   * Detail: https://cli.vuejs.org/config/#publicpath\n   */\n  publicPath: '/',\n  outputDir: 'dist',\n  assetsDir: 'static',\n  lintOnSave: process.env.NODE_ENV === 'development',\n  productionSourceMap: false,\n  devServer: {\n    port: port,\n    open: true,\n    overlay: {\n      warnings: false,\n      errors: true\n    },\n    before: require('./mock/mock-server.js')\n  },\n  configureWebpack: {\n    // provide the app's title in webpack's name field, so that\n    // it can be accessed in index.html to inject the correct title.\n    name: name,\n    resolve: {\n      alias: {\n        '@': resolve('src')\n      }\n    }\n  },\n  chainWebpack(config) {\n    // it can improve the speed of the first screen, it is recommended to turn on preload\n    // it can improve the speed of the first screen, it is recommended to turn on preload\n    config.plugin('preload').tap(() => [\n      {\n        rel: 'preload',\n        // to ignore runtime.js\n        // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171\n        fileBlacklist: [/\\.map$/, /hot-update\\.js$/, /runtime\\..*\\.js$/],\n        include: 'initial'\n      }\n    ])\n\n    // when there are many pages, it will cause too many meaningless requests\n    config.plugins.delete('prefetch')\n\n    // set svg-sprite-loader\n    config.module\n      .rule('svg')\n      .exclude.add(resolve('src/icons'))\n      .end()\n    config.module\n      .rule('icons')\n      .test(/\\.svg$/)\n      .include.add(resolve('src/icons'))\n      .end()\n      .use('svg-sprite-loader')\n      .loader('svg-sprite-loader')\n      .options({\n        symbolId: 'icon-[name]'\n      })\n      .end()\n\n    config\n      .when(process.env.NODE_ENV !== 'development',\n        config => {\n          config\n            .plugin('ScriptExtHtmlWebpackPlugin')\n            .after('html')\n            .use('script-ext-html-webpack-plugin', [{\n            // `runtime` must same as runtimeChunk name. default is `runtime`\n              inline: /runtime\\..*\\.js$/\n            }])\n            .end()\n          config\n            .optimization.splitChunks({\n              chunks: 'all',\n              cacheGroups: {\n                libs: {\n                  name: 'chunk-libs',\n                  test: /[\\\\/]node_modules[\\\\/]/,\n                  priority: 10,\n                  chunks: 'initial' // only package third parties that are initially dependent\n                },\n                elementUI: {\n                  name: 'chunk-elementUI', // split elementUI into a single package\n                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app\n                  test: /[\\\\/]node_modules[\\\\/]_?element-ui(.*)/ // in order to adapt to cnpm\n                },\n                commons: {\n                  name: 'chunk-commons',\n                  test: resolve('src/components'), // can customize your rules\n                  minChunks: 3, //  minimum common number\n                  priority: 5,\n                  reuseExistingChunk: true\n                }\n              }\n            })\n          // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk\n          config.optimization.runtimeChunk('single')\n        }\n      )\n  }\n}\n"
  }
]