[
  {
    "path": ".editorconfig",
    "content": "# http://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": ".gitignore",
    "content": ".DS_Store\nnode_modules/\ndist/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n**/*.log\n\ntest/unit/coverage\ntest/e2e/reports\nselenium-debug.log\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n\npackage-lock.json\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.md",
    "content": "<p align=\"center\">\n  <a href=\"https://github.com/vuejs/vue\">\n    <img src=\"https://img.shields.io/badge/vue-2.5.17-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.4.6-brightgreen.svg\" alt=\"element-ui\">\n  </a>\n  <a href=\"https://travis-ci.org/umi-soft/element-admin\" rel=\"nofollow\">\n    <img src=\"https://travis-ci.org/umi-soft/element-admin.svg?branch=master\" alt=\"Build Status\">\n  </a>\n  <a href=\"https://github.com/umi-soft/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/umi-soft/element-admin/releases\">\n    <img src=\"https://img.shields.io/github/release/umi-soft/element-admin.svg\" alt=\"GitHub release\">\n  </a>\n</p>\n\n## Getting started\n\n```bash\n# clone the project\ngit clone https://github.com/umi-soft/element-admin.git\n\n# install dependency\nnpm install\n\n# develop\nnpm run dev\n```\n\n## Build\n\n```bash\n# build for test environment\nnpm run build:sit\n\n# build for production environment\nnpm run build:prod\n```\n\n## Online\n[Preview](http://umi-soft.github.io/element-admin)\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\" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png\" alt=\"Firefox\" width=\"24px\" height=\"24px\" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png\" alt=\"Chrome\" width=\"24px\" height=\"24px\" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src=\"https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png\" alt=\"Safari\" width=\"24px\" height=\"24px\" />](http://godban.github.io/browsers-support-badges/)</br>Safari |\n| --------- | --------- | --------- | --------- |\n| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions\n\n## 2.x计划\n\n- 提供更多的页面布局模板，目前仅一种模板\n- 提供后端spring-boot开源工程\n- 微调数据库字段设计，比如废弃state字段，flag字段调整为deleted，增加后端API安全资源表等等\n- 升级vue-cli至3.x\n\n## License\n\n[MIT](https://github.com/umi-soft/element-admin/blob/master/LICENSE)\n\nCopyright (c) 2018-present [一路向北](https://umi-soft.github.com)\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    '@vue/app'\n  ]\n}\n"
  },
  {
    "path": "deploy.sh",
    "content": "#!/usr/bin/env sh\n\n# 确保脚本抛出遇到的错误\nset -e\n\n# 生成静态文件\nnpm run build:prod\n\n# 进入生成的文件夹\ncd dist\n\n#创建.nojekyll 防止Github Pages build错误\ntouch .nojekyll\n\ngit init\ngit add -A\ngit commit -m 'deploy'\n\ngit push -f \"https://github.com/umi-soft/element-admin.git\" master:gh-pages\n\ncd -\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"element-admin\",\n  \"version\": \"1.0.5\",\n  \"description\": \"基础\",\n  \"author\": \"胡杰<hujie@umisoft.cn>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"serve\": \"vue-cli-service serve\",\n    \"build\": \"vue-cli-service build\",\n    \"lint\": \"vue-cli-service lint\",\n    \"svgo\": \"svgo -f src/icons/svg --config=src/icons/svgo.yml\"\n  },\n  \"lint-staged\": {\n    \"src/**/*.{js,vue}\": [\n      \"eslint --fix\",\n      \"git add\"\n    ]\n  },\n  \"keywords\": [\n    \"vue\",\n    \"element-ui\",\n    \"admin\",\n    \"element-admin\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/umi-soft/element-admin.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/umi-soft/element-admin/issues\"\n  },\n  \"dependencies\": {\n    \"axios\": \"0.18.0\",\n    \"clipboard\": \"1.7.1\",\n    \"element-ui\": \"2.4.6\",\n    \"es6-uuid\": \"^1.0.1\",\n    \"js-cookie\": \"2.2.0\",\n    \"lodash\": \"^4.17.11\",\n    \"mockjs\": \"1.0.1-beta3\",\n    \"normalize.css\": \"7.0.0\",\n    \"nprogress\": \"0.2.0\",\n    \"path-to-regexp\": \"^2.4.0\",\n    \"qs\": \"^6.6.0\",\n    \"screenfull\": \"3.3.3\",\n    \"svg-sprite-loader\": \"^4.1.3\",\n    \"svgo\": \"1.0.5\",\n    \"vue\": \"^2.5.22\",\n    \"vue-count-to\": \"1.0.13\",\n    \"vue-router\": \"3.0.1\",\n    \"vue-splitpane\": \"1.0.2\",\n    \"vuex\": \"3.0.1\"\n  },\n  \"devDependencies\": {\n    \"@vue/cli-plugin-babel\": \"^3.4.0\",\n    \"@vue/cli-plugin-eslint\": \"^3.4.0\",\n    \"@vue/cli-service\": \"^3.4.0\",\n    \"babel-eslint\": \"^10.0.1\",\n    \"eslint\": \"^5.8.0\",\n    \"eslint-plugin-vue\": \"^5.0.0\",\n    \"node-sass\": \"^4.11.0\",\n    \"sass-loader\": \"^7.1.0\",\n    \"vue-template-compiler\": \"^2.5.21\"\n  },\n  \"eslintConfig\": {\n    \"root\": true,\n    \"env\": {\n      \"node\": true\n    },\n    \"extends\": [\n      \"plugin:vue/essential\",\n      \"eslint:recommended\"\n    ],\n    \"rules\": {\n      \"no-console\": \"off\",\n      \"vue/no-use-v-if-with-v-for\": \"off\"\n    },\n    \"parserOptions\": {\n      \"parser\": \"babel-eslint\"\n    }\n  },\n  \"postcss\": {\n    \"plugins\": {\n      \"autoprefixer\": {}\n    }\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\",\n    \"npm\": \">= 3.0.0\"\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    <title>UMI-SOFT</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\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/login.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/auth/'\n\nexport function captcha() {\n  return request({\n    url: base_url + 'captcha',\n    method: 'get'\n  })\n}\n\nexport function loginByLoginName(data) {\n  return request({\n    url: base_url + 'login',\n    method: 'post',\n    data\n  })\n}\n\nexport function getUserInfo(token) {\n  return request({\n    url: base_url + 'user-authorities',\n    method: 'get',\n    data: { token }\n  })\n}\n\nexport function getRouterRoles(token) {\n  return request({\n    url: base_url + 'system-authorities',\n    method: 'get',\n    data: { token }\n  })\n}\n\nexport function logout(token) {\n  return request({\n    url: base_url + 'logout',\n    method: 'get',\n    data: { token }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/dept.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/dept/'\n\nexport function queryAllDepts(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryAllTreeDepts(id) {\n  return request({\n    url: base_url + 'query-all-tree',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryDeptById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function addDept(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function editDept(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function delDept(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n\nexport function queryAllDeptUsers(id) {\n  return request({\n    url: base_url + 'all-users',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllDeptRoles(id) {\n  return request({\n    url: base_url + 'all-roles',\n    method: 'get',\n    data: { id }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/deptRole.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/dept-role/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/dictionary.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/dictionary/'\n\nexport function queryPageDictionaries(data) {\n  return request({\n    url: base_url + 'query-page',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryAllDictionaries(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryDictionaryById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function addDictionary(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function editDictionary(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function delDictionary(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/group.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/group/'\n\nexport function queryPageGroups(data) {\n  return request({\n    url: base_url + 'query-page',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryAllGroups(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryGroupById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function addGroup(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function editGroup(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function delGroup(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleGroupUsers(id) {\n  return request({\n    url: base_url + 'all-role-group-users',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllUserGroupUsers(id) {\n  return request({\n    url: base_url + 'all-user-group-users',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleGroups(id) {\n  return request({\n    url: base_url + 'all-role-groups',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllUserGroups(id) {\n  return request({\n    url: base_url + 'all-user-groups',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllGroupRoles(id) {\n  return request({\n    url: base_url + 'all-roles',\n    method: 'get',\n    data: { id }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/menu.js",
    "content": "import request from '@/utils/request'\n\nimport { asyncMenuMap } from '@/router'\n\nconst base_url = '/admin/menu/'\n\nfunction createMenu(router, parentId, menus) {\n  const menu = {}\n  menu.id = router.name\n  menu.parentId = parentId\n  menu.deleted = 0\n  menu.sortNum = router.meta.sortNum\n  menu.name = router.meta.title\n  menu.icon = router.meta.icon\n  menu.remark = null\n\n  if (router.children && router.children.length > 0) {\n    router.children.forEach(children => {\n      createMenu(children, router.name, menus)\n    })\n  }\n  menus.push(menu)\n}\n\n// ####################################Menu工具方法####################################\n/**\n *\n * @param allMenus 数据库查询可用的所有菜单数组\n * @param router 前端路由表中的一个路由\n * @param parentId 上级ID\n */\nexport function createMenuTree(allMenus, router, parentId) {\n  const menu = {}\n  let remoteMenu = null\n  const remoteMenuIndex = allMenus.findIndex(item => { return item.id === router.name })\n  if (remoteMenuIndex === -1) { // 需要同步，本次构建从本地路由中构建\n    menu.id = router.name\n    menu.parentId = parentId\n    menu.deleted = 0\n    menu.sortNum = router.meta.sortNum\n    menu.name = router.meta.title\n    menu.icon = router.meta.icon\n    menu.remark = null\n    menu.createdBy = null\n    menu.createdDate = null\n    menu.modifiedBy = null\n    menu.modifiedDate = null\n  } else { // 不需要同步，本次构建从远端服务器构建\n    remoteMenu = allMenus[remoteMenuIndex]\n    menu.id = remoteMenu.id\n    menu.parentId = parentId\n    menu.deleted = 0\n    menu.sortNum = remoteMenu.sortNum\n    menu.name = remoteMenu.name\n    menu.icon = remoteMenu.icon\n    menu.remark = remoteMenu.remark\n    menu.createdBy = remoteMenu.createdBy\n    menu.createdDate = remoteMenu.createdDate\n    menu.modifiedBy = remoteMenu.modifiedBy\n    menu.modifiedDate = remoteMenu.modifiedDate\n  }\n\n  menu.children = []\n  if (router.children && router.children.length > 0) {\n    router.children.forEach(children => {\n      menu.children.push(createMenuTree(allMenus, children, menu.id))\n    })\n  }\n  return menu\n}\n/**\n * 判断菜单树中的某个节点及其子节点是否都在服务端\n * @param allMenus 数据库查询可用的所有菜单数组\n * @param menu 经过上述createMenuTree方法构建的菜单*树*中的一个节点\n * @returns {boolean}\n */\nexport function syncMenuVoter(allMenus, menu) {\n  const remoteMenuIndex = allMenus.findIndex(item => { return item.id === menu.id })\n  if (remoteMenuIndex === -1) { // menu不在allMenus中，终止递归，说明需要同步\n    return true\n  }\n  if (menu.children && menu.children.length > 0) {\n    return menu.children.some(children => {\n      return syncMenuVoter(allMenus, children)\n    })\n  }\n  return false\n}\n\n// ####################################Menu主表API####################################\nexport function queryAllMenus(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryMenuById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function syncMenus() {\n  const menus = []\n  asyncMenuMap.forEach(router => createMenu(router, null, menus))\n  return request({\n    url: base_url + 'sync',\n    method: 'post',\n    data: menus\n  })\n}\n\nexport function queryAllMenuSecurities(id) {\n  return request({\n    url: base_url + 'all-securities',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllMenuRole(id) {\n  return request({\n    url: base_url + 'all-roles',\n    method: 'get',\n    data: { id }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/menuRole.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/menu-role/'\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/menuSecurity.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/menu-security/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/role.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/role/'\n\nexport function queryPageRoles(data) {\n  return request({\n    url: base_url + 'query-page',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryAllRoles(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryRoleById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function addRole(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function editRole(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function delRole(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleMenus(id) {\n  return request({\n    url: base_url + 'all-menus',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleUsers(id) {\n  return request({\n    url: base_url + 'all-users',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleDepts(id) {\n  return request({\n    url: base_url + 'all-depts',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function queryAllRoleGroups(id) {\n  return request({\n    url: base_url + 'all-role-groups',\n    method: 'get',\n    data: { id }\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/roleGroup.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/role-group/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/security.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/security/'\n\nexport function queryPage(data) {\n  return request({\n    url: base_url + 'query-page',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryAll(data) {\n  return request({\n    url: base_url + 'query-all',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function edit(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function del(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n\n"
  },
  {
    "path": "src/api/system-management/user.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user/'\n\nexport function queryPageUsers(data) {\n  return request({\n    url: base_url + 'query-page',\n    method: 'post',\n    data\n  })\n}\n\nexport function queryUserById(id) {\n  return request({\n    url: base_url + 'query-by-id',\n    method: 'get',\n    data: { id }\n  })\n}\n\nexport function checkLoginName(data) {\n  return request({\n    url: base_url + 'check-login-name',\n    method: 'post',\n    data\n  })\n}\n\nexport const uploadAvatar = base_url + 'upload-avatar'\nexport const previewAvatar = base_url + 'avatar/'\n\nexport function addUser(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function editUser(data) {\n  return request({\n    url: base_url + 'edit',\n    method: 'post',\n    data\n  })\n}\n\nexport function editUserPassword(data) {\n  return request({\n    url: base_url + 'edit-password',\n    method: 'post',\n    data\n  })\n}\n\nexport function delUser(id) {\n  return request({\n    url: base_url + 'del',\n    method: 'post',\n    data: { id }\n  })\n}\n\nexport function queryAllUserRoles(params) {\n  return request({\n    url: base_url + 'all-roles',\n    method: 'get',\n    data: params\n  })\n}\n\nexport function queryAllUserDepts(params) {\n  return request({\n    url: base_url + 'all-depts',\n    method: 'get',\n    data: params\n  })\n}\n\nexport function queryAllUserGroups(params) {\n  return request({\n    url: base_url + 'all-user-groups',\n    method: 'get',\n    data: params\n  })\n}\n\nexport function queryAllUserRoleGroups(params) {\n  return request({\n    url: base_url + 'all-role-groups',\n    method: 'get',\n    data: params\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/userDept.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user-dept/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/userGroup.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user-group/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/userGroupRoleGroup.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user-group-role-group/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/userRole.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user-role/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\n  })\n}\n"
  },
  {
    "path": "src/api/system-management/userRoleGroup.js",
    "content": "import request from '@/utils/request'\n\nconst base_url = '/admin/user-role-group/'\n\nexport function add(data) {\n  return request({\n    url: base_url + 'add',\n    method: 'post',\n    data\n  })\n}\n\nexport function reset(data) {\n  return request({\n    url: base_url + 'reset',\n    method: 'post',\n    data\n  })\n}\n\nexport function delByEntityMapping(data) {\n  return request({\n    url: base_url + 'del-by-entity-mapping',\n    method: 'post',\n    data\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/Abbreviation/index.vue",
    "content": "<template>\n  <el-popover :placement=\"placement\" :width=\"width\" :trigger=\"trigger\">\n    <span slot=\"reference\">{{ abbr }}</span>\n    <span class=\"break-word\">{{ content }}</span>\n  </el-popover>\n</template>\n\n<script>\nexport default {\n  props: {\n    content: {\n      required: false,\n      type: String,\n      default: ''\n    },\n    size: {\n      required: false,\n      type: Number,\n      default: 10\n    },\n    placement: {\n      required: false,\n      type: String,\n      default: 'top-start'\n    },\n    width: {\n      required: false,\n      type: Number,\n      default: 200\n    },\n    trigger: {\n      required: false,\n      type: String,\n      default: 'hover'\n    }\n  },\n  data() {\n    let abbr = ''\n    if (this.content) {\n      abbr = this.content.substring(0, this.size)\n    }\n    return {\n      abbr: abbr\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.break-word {\n  word-wrap: break-word;\n  word-break: break-all;\n  white-space: pre-wrap !important;\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\" v-if=\"item.meta.title\" :key=\"item.path\">\n        <span v-if=\"item.redirect==='noredirect'||index==levelList.length-1\" class=\"no-redirect\">{{ item.meta.title }}</span>\n        <router-link v-else :to=\"item.redirect||item.path\">{{ item.meta.title }}</router-link>\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() {\n      this.getBreadcrumb()\n    }\n  },\n  created() {\n    this.getBreadcrumb()\n  },\n  methods: {\n    getBreadcrumb() {\n      const { params } = this.$route\n      const matched = this.$route.matched.filter(item => {\n        if (item.name) {\n          var toPath = pathToRegexp.compile(item.path)\n          item.path = toPath(params)\n          return true\n        }\n      })\n      this.levelList = matched\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n  .app-breadcrumb.el-breadcrumb {\n    display: inline-block;\n    font-size: 14px;\n    line-height: 50px;\n    margin-left: 10px;\n    .no-redirect {\n      color: #97a8be;\n      cursor: text;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/components/ErrorPage/401.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/images/404.png\">\n        <img class=\"pic-404__child left\" src=\"@/assets/images/404_cloud.png\">\n        <img class=\"pic-404__child mid\" src=\"@/assets/images/404_cloud.png\">\n        <img class=\"pic-404__child right\" src=\"@/assets/images/404_cloud.png\">\n      </div>\n      <div class=\"bullshit\">\n        <div class=\"bullshit__oops\">Error!</div>\n        <div class=\"bullshit__info\"/>\n        <div class=\"bullshit__headline\">401权限不足</div>\n        <div class=\"bullshit__info\">没有权限访问该页面，请点击以下按钮返回主页或者发送错误报告</div>\n        <a href=\"\" class=\"bullshit__return-home\">返回首页</a>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style rel=\"stylesheet/scss\" 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/components/ErrorPage/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/images/404.png\">\n        <img class=\"pic-404__child left\" src=\"@/assets/images/404_cloud.png\">\n        <img class=\"pic-404__child mid\" src=\"@/assets/images/404_cloud.png\">\n        <img class=\"pic-404__child right\" src=\"@/assets/images/404_cloud.png\">\n      </div>\n      <div class=\"bullshit\">\n        <div class=\"bullshit__oops\">Error!</div>\n        <div class=\"bullshit__info\"/>\n        <div class=\"bullshit__headline\">404页面找不到</div>\n        <div class=\"bullshit__info\">请检查您输入的网址是否正确，请点击以下按钮返回主页或者发送错误报告</div>\n        <a href=\"\" class=\"bullshit__return-home\">返回首页</a>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style rel=\"stylesheet/scss\" 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/components/Hamburger/index.vue",
    "content": "<template>\n  <div>\n    <svg\n      :class=\"{'is-active':isActive}\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n      version=\"1.1\"\n      t=\"1492500959545\"\n      p-id=\"1691\"\n      class=\"hamburger\"\n      style=\"\"\n      viewBox=\"0 0 1024 1024\"\n      width=\"64\"\n      height=\"64\"\n      @click=\"toggleClick\">\n      <path d=\"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z\" p-id=\"1692\"/>\n      <path d=\"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z\" p-id=\"1693\"/>\n      <path d=\"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z\" p-id=\"1694\"/>\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    toggleClick: {\n      type: Function,\n      default: null\n    }\n  }\n}\n</script>\n\n<style scoped>\n.hamburger {\n  display: inline-block;\n  cursor: pointer;\n  width: 20px;\n  height: 20px;\n  transform: rotate(90deg);\n  transition: .38s;\n  transform-origin: 50% 50%;\n}\n.hamburger.is-active {\n  transform: rotate(0deg);\n}\n</style>\n"
  },
  {
    "path": "src/components/Redirect/index.vue",
    "content": "<script>\nexport default {\n  beforeCreate() {\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/components/Screenfull/index.vue",
    "content": "<template>\n  <div>\n    <svg\n      t=\"1508738709248\"\n      class=\"screenfull-svg\"\n      viewBox=\"0 0 1024 1024\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      p-id=\"2069\"\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n      width=\"32\"\n      height=\"32\"\n      @click=\"click\">\n      <path\n        d=\"M333.493443 428.647617 428.322206 333.832158 262.572184 168.045297 366.707916 64.444754 64.09683 64.444754 63.853283 366.570793 167.283957 262.460644Z\"\n        p-id=\"2070\"/>\n      <path\n        d=\"M854.845439 760.133334 688.61037 593.95864 593.805144 688.764889 759.554142 854.56096 655.44604 958.161503 958.055079 958.161503 958.274066 656.035464Z\"\n        p-id=\"2071\"/>\n      <path\n        d=\"M688.535669 428.550403 854.31025 262.801405 957.935352 366.921787 957.935352 64.34754 655.809313 64.081481 759.919463 167.535691 593.70793 333.731874Z\"\n        p-id=\"2072\"/>\n      <path\n        d=\"M333.590658 594.033341 167.8171 759.804852 64.218604 655.67219 64.218604 958.270996 366.342596 958.502263 262.234493 855.071589 428.421466 688.86108Z\"\n        p-id=\"2073\"/>\n    </svg>\n  </div>\n</template>\n\n<script>\nimport screenfull from 'screenfull'\n\nexport default {\n  name: 'Screenfull',\n  props: {\n    width: {\n      type: Number,\n      default: 22\n    },\n    height: {\n      type: Number,\n      default: 22\n    },\n    fill: {\n      type: String,\n      default: '#48576a'\n    }\n  },\n  data() {\n    return {\n      isFullscreen: false\n    }\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  }\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/ScrollPane/index.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>\nexport default {\n  name: 'ScrollPane',\n  data() {\n    return {\n      left: 0\n    }\n  },\n  methods: {\n    handleScroll(e) {\n      const eventDelta = e.wheelDelta || -e.deltaY * 40\n      const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap\n      $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n  .scroll-container {\n    white-space: nowrap;\n    position: relative;\n    overflow: hidden;\n    width: 100%;\n    /deep/ {\n      .el-scrollbar__bar {\n        bottom: 0px;\n      }\n      .el-scrollbar__wrap {\n        height: 49px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/components/SvgIcon/index.vue",
    "content": "<template>\n  <svg :class=\"svgClass\" aria-hidden=\"true\">\n    <use :xlink:href=\"iconName\"/>\n  </svg>\n</template>\n\n<script>\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    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  }\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</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-dragDialog/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-dragDialog/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/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": "\nimport store from '@/store'\n\nexport default{\n  inserted(el, binding, vnode) {\n    const { value } = binding\n    const roles = store.getters && store.getters.roles\n\n    if (value && value instanceof Array && 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    } else {\n      throw new Error('权限不足')\n    }\n  }\n}\n"
  },
  {
    "path": "src/filters/index.js",
    "content": "import StoreDictionaries from '@/store/modules/dictionaries'\n\n// set function parseTime,formatTime to filter\nexport { parseTime, formatTime } from '@/utils'\n\n/**\n * @param number\n * @param prefix 单位 ，如minute\n * @param suffix 复数单位结尾，默认是's'\n * @returns 为数值增加单位\n */\nfunction pluralize(number, prefix, suffix = 's') {\n  if (number === 1) {\n    return number + prefix\n  }\n  return number + prefix + suffix\n}\n\n/**\n * @param date 秒数（通常为后端时间戳）或Date对象\n * @returns {计算与当前时间差，并增加单位}\n */\nexport function timeAgo(date) {\n  let time = date\n  if (typeof date === 'object') {\n    time = date.getTime() / 1000\n  }\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 *\n * @param num\n * @param digits\n * @returns {string} 数字格式化\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 + 0.1).toFixed(digits).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol\n    }\n  }\n  return num.toString()\n}\n\nexport function toThousandFilter(num) {\n  return (+num || 0).toString().replace(/^-?\\d+/g, m => m.replace(/(?=(?!\\b)(\\d{3})+$)/g, ','))\n}\n\nexport function translateTrueOrFalse(state) {\n  const dictionaries = StoreDictionaries.state.trueOrFalse\n  const index = dictionaries.findIndex(item => { return '' + state === item.key + '' })\n  return index === -1 ? '' : dictionaries[index].value\n}\n\nexport function translateGender(state) {\n  const dictionaries = StoreDictionaries.state.gender\n  const index = dictionaries.findIndex(item => { return '' + state === item.key + '' })\n  return index === -1 ? '' : dictionaries[index].value\n}\n\nexport function translateDicCategory(category) {\n  const dictionaries = StoreDictionaries.state.dictionaryCategory\n  const index = dictionaries.findIndex(item => { return '' + category === item.key + '' })\n  return index === -1 ? '' : dictionaries[index].value\n}\n"
  },
  {
    "path": "src/icons/index.js",
    "content": "import Vue from 'vue'\nimport SvgIcon from '@/components/SvgIcon'// svg组件\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/main.js",
    "content": "import Vue from 'vue'\n\nimport 'normalize.css/normalize.css'\n\nimport Element from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\n\nimport '@/styles/index.scss'\n\nimport App from './App'\nimport router from './router'\nimport store from './store'\n\nimport './icons'\nimport './permission'\nimport './mock'\n\nimport components from './views/common'\nimport * as filters from './filters'\n\nVue.use(Element, {\n  size: 'small'\n})\n\n// 全局注册组件\nObject.keys(components).forEach(key => {\n  Vue.component(key, components[key])\n})\n\n// 全局注册指令\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/mock/MockDB.js",
    "content": "import Mock from 'mockjs'\nimport Utils from './utils'\n\nexport const deptMockConfig = {\n  'id|1': Utils.id,\n  'parentId|1': Utils.id, // 父级机构\n  'deleted|1': Utils.deleted, // 是否删除\n  sortNum: '@increment', // 机构序号\n  'type|1': ['政府机构', '国有企业', '民营企业'], // 机构类型\n  name: '@cword(5, 10)', // 机构名称\n  remark: '@cparagraph(1, 3)', // 机构描述\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n\nexport const dictionaryMockConfig = {\n  'id|1': Utils.id,\n  'parentId': null, // 上级ID\n  'deleted|1': Utils.deleted, // 是否删除\n  'category|1': [1, 2, 3], // 类型： 1：业务字典类型, 2：单级业务字典, 3：多级业务字典\n  'type|1': Utils.id, // 字典类型ID\n  name: '@cword(5, 10)', // 名称\n  'code|1': Utils.id, // 规则码\n  'sortNum': '@increment', // 编号\n  remark: '@cparagraph(1, 3)', // 备注\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n\nexport const groupMockConfig = {\n  'id|1': Utils.id,\n  'deleted|1': Utils.deleted, // 是否删除\n  sortNum: '@increment', // 编号\n  category: 1, // 分组类型，可面向用户1、角色2等\n  name: '@cword(5, 10)', // 名称\n  remark: '@cparagraph(1, 3)', // 备注\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n\nexport const securityMockConfig = {\n  'id|1': Utils.id,\n  'deleted|1': Utils.deleted, // 是否删除\n  securityDef: '@url', // 定义，通常为url或url正则等\n  name: '@cword(5, 10)', // 名称\n  remark: '@cparagraph(1, 3)', // 备注\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n\nexport const menuMockConfig = {\n  id: '',\n  parentId: '', // 上级ID\n  deleted: 0, // 是否删除\n  sortNum: '', // 菜单序号\n  name: '', // 名称\n  icon: '', // 图标\n  remark: '', // 备注\n  createdBy: '', // 创建人\n  createdDate: '', // 创建时间\n  modifiedBy: '', // 最后修改人\n  modifiedDate: '' // 最后修改时间\n}\n\nexport const roleMockConfig = {\n  'id|1': Utils.id,\n  'deleted|1': Utils.deleted, // 是否删除\n  sortNum: '@increment', // 序号\n  name: '@cword(5, 10)', // 名称\n  remark: '@cparagraph(1, 3)', // 描述\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n\nexport const userMockConfig = {\n  'id|1': Utils.id, // 主键\n  'deleted|1': Utils.deleted, // 是否删除\n  'disabled|1': Utils.state, // 是否启用\n  sortNum: '@increment', // 序号\n  'loginName': /[a-z][A-Z][0-9]/, // 登录ID\n  'password': '@id', // 密码\n  'name': '@cname', // 姓名\n  'nickName': '@cname', // 昵称\n  'avatar': '', // 肖像地址\n  'idNumber': /^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$/, // 证件号码\n  'gender|1': [0, 1], // 性别\n  'birthday': '@date(\"yyyy-MM-dd\")', // 出生日期\n  'phone': /^1[34578]\\d{9}$/, // 联系电话\n  'email': '@email', // 联系邮箱\n  'address': '@county(true)', // 住址\n  'tag': '@cword(5, 10)', // 用户标签\n  'remark': '@cparagraph(1, 3)', // 描述\n  createdBy: '@increment', // 创建人\n  createdDate: +Mock.Random.date('T'), // 创建时间\n  modifiedBy: '@increment', // 最后修改人\n  modifiedDate: +Mock.Random.date('T') // 最后修改时间\n}\n// 用户\nexport const users = []\n// 部门，数组\nexport const depts = []\n// 部门，Tree\nexport const deptsTree = []\n// 单级、多级字典、字典类别\nexport const dictionaries = []\n// 用户分组、角色分组\nexport const groups = []\n// 菜单\nexport const menus = []\n// 资源定义\nexport const securities = []\n// 菜单与资源\nexport const menuSecurities = []\n// 角色\nexport const roles = []\n// 角色与菜单中间表\nexport const roleMenus = []\n// 角色与角色组中间表\nexport const roleGroups = []\n// 用户与角色中间表\nexport const userRoles = []\n// 用户与角色组中间表\nexport const userRoleGroups = []\n// 用户组与角色组中间表\nexport const userGroupRoleGroups = []\n// 用户与用户组\nexport const userGroups = []\n// 用户与部门中间表\nexport const deptUsers = []\n// 部门与角色中间表\nexport const deptRoles = []\n\nexport const admin = {}\n\nexport const simple = {}\n\n//  随机生成tree\nfunction createDeptTree(dept) {\n  dept.children = []\n  if (Mock.mock('@boolean')) {\n    const children = Mock.mock(deptMockConfig)\n    depts.push(children)\n    children.parentId = dept.id\n    dept.children.push(children)\n    createDeptTree(children)\n  }\n  return dept\n}\n\n//  主表mock数据\nconst length = Mock.mock('@integer(10, 20)')\nfor (let i = 0; i < length; i++) {\n  //  用户\n  const tempUser = Mock.mock(userMockConfig)\n  users.push(tempUser)\n  //  用户分组\n  const tempUserGroup = Mock.mock(groupMockConfig)\n  tempUserGroup.category = 1\n  groups.push(tempUserGroup)\n  //  角色分组\n  const tempRoleGroup = Mock.mock(groupMockConfig)\n  tempRoleGroup.category = 2\n  groups.push(tempRoleGroup)\n  //  角色\n  const tempRole = Mock.mock(roleMockConfig)\n  roles.push(tempRole)\n  //  部门，数组\n  const tempDept = Mock.mock(deptMockConfig)\n  depts.push(tempDept)\n  //  部门，tree结构\n  deptsTree.push(tempDept)\n  createDeptTree(tempDept)\n  //  资源定义\n  securities.push(Mock.mock(securityMockConfig))\n\n  //  中间表数据关系\n  //  用户与角色\n  userRoles.push({ userId: tempUser.id, roleId: tempRole.id })\n  //  用户与用户组\n  userGroups.push({ userId: tempUser.id, groupId: tempUserGroup.id })\n  //  用户与角色组\n  userRoleGroups.push({ userId: tempUser.id, roleGroupId: tempRoleGroup.id })\n  //  角色与角色组\n  roleGroups.push({ roleId: tempRole.id, roleGroupId: tempRoleGroup.id })\n  //  用户组与角色组中间表\n  userGroupRoleGroups.push({ userGroupId: tempUserGroup.id, roleGroupId: tempRoleGroup.id })\n  //  用户与部门中间表\n  deptUsers.push({ userId: tempUser.id, deptId: tempDept.id })\n  // 部门与角色\n  deptRoles.push({ deptId: tempDept.id, roleId: tempRole.id })\n}\n\n//  字典类别\nconst dictionary = Mock.mock(dictionaryMockConfig)\ndictionary.type = null\ndictionary.category = 1\ndictionary.parentId = 'root'\ndictionary.deleted = 0\ndictionaries.push(dictionary)\n//  单级字典\nfor (let i = 0; i < 13; i++) {\n  const item = Mock.mock(dictionaryMockConfig)\n  item.category = 2\n  item.parentId = 'root'\n  item.type = dictionary.id\n  dictionaries.push(item)\n}\n//  多级字典\nfor (let i = 0; i < 11; i++) {\n  const item = Mock.mock(dictionaryMockConfig)\n  item.category = 3\n  item.parentId = 'root'\n  item.type = dictionary.id\n  dictionaries.push(item)\n}\n\nlet temp = Mock.mock(userMockConfig)\ntemp.name = 'admin'\ntemp.loginName = 'admin'\ntemp.password = 'admin'\ntemp.avatar = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'\nusers.push(temp)\nadmin.token = 'admin'\nadmin.roles = ['admin']\nadmin.user = temp\n\ntemp = Mock.mock(userMockConfig)\ntemp.name = 'simple'\ntemp.loginName = 'simple'\ntemp.password = 'simple'\ntemp.avatar = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'\nusers.push(temp)\nsimple.token = 'simple'\nsimple.roles = ['simple']\nsimple.user = temp\n"
  },
  {
    "path": "src/mock/index.js",
    "content": "import Mock from 'mockjs'\n// import loginAPI from './login'\n//\n// import groupAPI from './system-management/group'\n// import userAPI from './system-management/user'\n// import roleAPI from './system-management/role'\n// import deptAPI from './system-management/dept'\n// import dictionaryAPI from './system-management/dictionary'\n// import menuAPI from './system-management/menu'\n// import userRoleGroupAPI from './system-management/userRoleGroup'\n// import userGroupRoleGroupAPI from './system-management/userGroupRoleGroup'\n// import userRoleAPI from './system-management/userRole'\n// import securityAPI from './system-management/security'\n// import menuRoleAPI from './system-management/menuRole'\n// import roleGroupAPI from './system-management/roleGroup'\n// import userGroupAPI from './system-management/userGroup'\n// import userDeptAPI from './system-management/userDept'\n// import menuSecurityAPI from './system-management/menuSecurity'\n// import deptRoleAPI from './system-management/deptRole'\n\n// 修复在使用 MockJS 情况下，设置 withCredentials = true，且未被拦截的跨域请求丢失 Cookies 的问题\n// https://github.com/nuysoft/Mock/issues/300\nMock.XHR.prototype.proxy_send = Mock.XHR.prototype.send\nMock.XHR.prototype.send = function() {\n  if (this.custom.xhr) {\n    this.custom.xhr.withCredentials = this.withCredentials || false\n  }\n  this.proxy_send(...arguments)\n}\n\nMock.setup({\n  timeout: '350-600'\n})\n\n// 登录相关\n// Mock.mock(/\\/admin\\/auth\\/captcha/, 'get', loginAPI.captcha)\n// Mock.mock(/\\/admin\\/auth\\/login/, 'post', loginAPI.loginByLoginName)\n// Mock.mock(/\\/admin\\/auth\\/user-authorities/, 'get', loginAPI.getUserInfo)\n// Mock.mock(/\\/admin\\/auth\\/system-authorities/, 'get', loginAPI.getRouterRoles)\n// Mock.mock(/\\/admin\\/auth\\/logout/, 'get', loginAPI.logout)\n\n//  系统设置相关---用户分组\n// Mock.mock(/\\/admin\\/group\\/query-all/, 'post', groupAPI.queryAll)\n// Mock.mock(/\\/admin\\/group\\/query-page/, 'post', groupAPI.queryPage)\n// Mock.mock(/\\/admin\\/group\\/query-by-id/, 'get', groupAPI.queryById)\n// Mock.mock(/\\/admin\\/group\\/add/, 'post', groupAPI.add)\n// Mock.mock(/\\/admin\\/group\\/edit/, 'post', groupAPI.edit)\n// Mock.mock(/\\/admin\\/group\\/del/, 'post', groupAPI.del)\n// Mock.mock(/\\/admin\\/group\\/all-role-group-users/, 'get', groupAPI.queryAllRoleGroupUsers)\n// Mock.mock(/\\/admin\\/group\\/all-user-group-users/, 'get', groupAPI.queryAllUserGroupUsers)\n// Mock.mock(/\\/admin\\/group\\/all-role-groups/, 'get', groupAPI.queryAllRoleGroups)\n// Mock.mock(/\\/admin\\/group\\/all-user-groups/, 'get', groupAPI.queryAllUserGroups)\n// Mock.mock(/\\/admin\\/group\\/all-roles/, 'get', groupAPI.queryAllGroupRoles)\n\n//  系统设置相关---用户\n// Mock.mock(/\\/admin\\/user\\/query-page/, 'post', userAPI.queryPage)\n// Mock.mock(/\\/admin\\/user\\/query-by-id/, 'get', userAPI.queryById)\n// Mock.mock(/\\/admin\\/user\\/check-login-name/, 'post', userAPI.checkLoginName)\n// Mock.mock(/\\/admin\\/user\\/upload-avatar/, 'post', userAPI.uploadAvatar)\n// Mock.mock(/\\/admin\\/user\\/add/, 'post', userAPI.add)\n// Mock.mock(/\\/admin\\/user\\/edit/, 'post', userAPI.edit)\n// Mock.mock(/\\/admin\\/user\\/edit-password/, 'post', userAPI.editUserPassword)\n// Mock.mock(/\\/admin\\/user\\/del/, 'post', userAPI.del)\n// Mock.mock(/\\/admin\\/user\\/all-roles/, 'get', userAPI.queryAllUserRoles)\n// Mock.mock(/\\/admin\\/user\\/all-depts/, 'get', userAPI.queryAllUserDepts)\n// Mock.mock(/\\/admin\\/user\\/all-groups/, 'get', userAPI.queryAllUserGroups)\n// Mock.mock(/\\/admin\\/user\\/all-role-groups/, 'get', userAPI.queryAllUserRoleGroups)\n\n//  系统设置相关---角色\n// Mock.mock(/\\/admin\\/role\\/query-all/, 'post', roleAPI.queryAll)\n// Mock.mock(/\\/admin\\/role\\/query-page/, 'post', roleAPI.queryPage)\n// Mock.mock(/\\/admin\\/role\\/query-by-id/, 'get', roleAPI.queryById)\n// Mock.mock(/\\/admin\\/role\\/add/, 'post', roleAPI.add)\n// Mock.mock(/\\/admin\\/role\\/edit/, 'post', roleAPI.edit)\n// Mock.mock(/\\/admin\\/role\\/del/, 'post', roleAPI.del)\n// Mock.mock(/\\/admin\\/role\\/all-menus/, 'get', roleAPI.queryAllRoleMenus)\n// Mock.mock(/\\/admin\\/role\\/all-users/, 'get', roleAPI.queryAllRoleUsers)\n// Mock.mock(/\\/admin\\/role\\/all-groups/, 'get', roleAPI.queryAllRoleGroups)\n// Mock.mock(/\\/admin\\/role\\/all-depts/, 'get', roleAPI.queryAllRoleDepts)\n\n//  系统设置相关---部门\n// Mock.mock(/\\/admin\\/dept\\/query-all-tree/, 'get', deptAPI.queryAllTree)\n// Mock.mock(/\\/admin\\/dept\\/query-all/, 'post', deptAPI.queryAll)\n// Mock.mock(/\\/admin\\/dept\\/query-by-id/, 'get', deptAPI.queryById)\n// Mock.mock(/\\/admin\\/dept\\/add/, 'post', deptAPI.add)\n// Mock.mock(/\\/admin\\/dept\\/edit/, 'post', deptAPI.edit)\n// Mock.mock(/\\/admin\\/dept\\/del/, 'post', deptAPI.del)\n// Mock.mock(/\\/admin\\/dept\\/all-users/, 'get', deptAPI.queryAllDeptUsers)\n// Mock.mock(/\\/admin\\/dept\\/all-roles/, 'get', deptAPI.queryAllDeptRoles)\n\n//  系统设置相关---字典\n// Mock.mock(/\\/admin\\/dictionary\\/query-all/, 'post', dictionaryAPI.queryAll)\n// Mock.mock(/\\/admin\\/dictionary\\/query-page/, 'post', dictionaryAPI.queryPage)\n// Mock.mock(/\\/admin\\/dictionary\\/query-by-id/, 'get', dictionaryAPI.queryById)\n// Mock.mock(/\\/admin\\/dictionary\\/add/, 'post', dictionaryAPI.add)\n// Mock.mock(/\\/admin\\/dictionary\\/edit/, 'post', dictionaryAPI.edit)\n// Mock.mock(/\\/admin\\/dictionary\\/del/, 'post', dictionaryAPI.del)\n\n//  系统设置相关---资源定义\n// Mock.mock(/\\/admin\\/security\\/query-all/, 'post', securityAPI.queryAll)\n// Mock.mock(/\\/admin\\/security\\/query-page/, 'post', securityAPI.queryPage)\n// Mock.mock(/\\/admin\\/security\\/query-by-id/, 'get', securityAPI.queryById)\n// Mock.mock(/\\/admin\\/security\\/add/, 'post', securityAPI.add)\n// Mock.mock(/\\/admin\\/security\\/edit/, 'post', securityAPI.edit)\n// Mock.mock(/\\/admin\\/security\\/del/, 'post', securityAPI.del)\n\n//  系统设置相关---菜单\n// Mock.mock(/\\/admin\\/menu\\/query-all/, 'post', menuAPI.queryAll)\n// Mock.mock(/\\/admin\\/menu\\/query-by-id/, 'get', menuAPI.queryById)\n// Mock.mock(/\\/admin\\/menu\\/edit/, 'post', menuAPI.edit)\n// Mock.mock(/\\/admin\\/menu\\/sync/, 'post', menuAPI.sync)\n// Mock.mock(/\\/admin\\/menu\\/all-securities/, 'get', menuAPI.queryAllMenuSecurities)\n// Mock.mock(/\\/admin\\/menu\\/all-roles/, 'get', menuAPI.queryMenuRoles)\n\n//  用户-部门，中间表\n// Mock.mock(/\\/admin\\/user-dept\\/del-by-entity-mapping/, 'post', userDeptAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/user-dept\\/add/, 'post', userDeptAPI.add)\n// Mock.mock(/\\/admin\\/user-dept\\/reset/, 'post', userDeptAPI.reset)\n\n//  用户-用户组，中间表\n// Mock.mock(/\\/admin\\/user-group\\/del-by-entity-mapping/, 'post', userGroupAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/user-group\\/add/, 'post', userGroupAPI.add)\n// Mock.mock(/\\/admin\\/user-group\\/reset/, 'post', userGroupAPI.reset)\n\n//  菜单-角色,中间表\n// Mock.mock(/\\/admin\\/menu-role\\/del-by-entity-mapping/, 'post', menuRoleAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/menu-role\\/reset/, 'post', menuRoleAPI.reset)\n\n// 用户-角色组,中间表\n// Mock.mock(/\\/admin\\/user-role-group\\/del-by-entity-mapping/, 'post', userRoleGroupAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/user-role-group\\/add/, 'post', userRoleGroupAPI.add)\n// Mock.mock(/\\/admin\\/user-role-group\\/reset/, 'post', userRoleGroupAPI.reset)\n\n// 用户-角色,中间表\n// Mock.mock(/\\/admin\\/user-role\\/del-by-entity-mapping/, 'post', userRoleAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/user-role\\/add/, 'post', userRoleAPI.add)\n// Mock.mock(/\\/admin\\/user-role\\/reset/, 'post', userRoleAPI.reset)\n\n// 角色-角色组,中间表\n// Mock.mock(/\\/admin\\/role-group\\/del-by-entity-mapping/, 'post', roleGroupAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/role-group\\/add/, 'post', roleGroupAPI.add)\n\n// 用户组-角色组,中间表\n// Mock.mock(/\\/admin\\/user-group-role-group\\/del-by-entity-mapping/, 'post', userGroupRoleGroupAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/user-group-role-group\\/add/, 'post', userGroupRoleGroupAPI.add)\n\n// 菜单-资源,中间表\n// Mock.mock(/\\/admin\\/menu-security\\/del-by-entity-mapping/, 'post', menuSecurityAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/menu-security\\/add/, 'post', menuSecurityAPI.add)\n\n// 部门-角色,中间表\n// Mock.mock(/\\/admin\\/dept-role\\/del-by-entity-mapping/, 'post', deptRoleAPI.delByEntityMapping)\n// Mock.mock(/\\/admin\\/dept-role\\/add/, 'post', deptRoleAPI.add)\n\nexport default Mock\n"
  },
  {
    "path": "src/mock/login.js",
    "content": "import Mock from 'mockjs'\nimport * as MockDB from './MockDB'\n\nlet captcha = null\n\nexport default {\n  captcha: config => {\n    console.log(config)\n    captcha = Mock.mock({ 'number|1000-9999': 1000 }).number\n    return {\n      code: 1,\n      data: Mock.Random.dataImage('448x47', captcha)\n    }\n  },\n  loginByLoginName: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    let token = null\n    if ('' + captcha !== '' + params.captcha) {\n      return {\n        code: 1,\n        data: {\n          result: 2,\n          message: '验证码错误'\n        }\n      }\n    }\n    if ((params.loginName === MockDB.simple.user.loginName && params.password !== MockDB.simple.user.password) || (params.loginName === MockDB.admin.user.loginName && params.password !== MockDB.admin.user.password)) {\n      return {\n        code: 1,\n        data: {\n          result: 3,\n          message: '用户名或密码错误'\n        }\n      }\n    }\n    if (params.loginName === 'admin') {\n      token = MockDB.admin.token\n    } else {\n      token = MockDB.simple.token\n    }\n    return {\n      code: 1,\n      data: {\n        result: 1,\n        message: '登录成功',\n        token: token\n      }\n    }\n  },\n  getUserInfo: config => {\n    console.log(config)\n    return {\n      code: 1,\n      data: MockDB.admin\n    }\n  },\n  getRouterRoles: () => {\n    const routerRoles = new Map()\n    routerRoles.set('90a127ce319d5d93b3b49c697cfa138f', ['simple'])\n    // routerRoles.set('323c76618c6b56109bd490baf0d00902', ['simple'])\n    routerRoles.set('f33d83225bef590d81f61a5afcbbca14', ['simple', 'others'])\n    routerRoles.set('3de22ff390ab5d06bafcce547ff780bb', ['simple', 'others'])\n    // routerRoles.set('8bdc5038a6585fd2b5d3ef7b1e4bf4e1', ['simple'])\n    return {\n      code: 1,\n      data: routerRoles\n    }\n  },\n  logout: () => {\n    return {\n      code: 1\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/dept.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nfunction findDept(deptId) {\n  let dept = null\n  for (let i = 0; i < MockDB.deptsTree.length; i++) {\n    dept = findDeptTreeNode(deptId, MockDB.deptsTree[i])\n    if (dept !== null) {\n      break\n    }\n  }\n  return dept\n}\n\nfunction findDeptTreeNode(deptId, dept) {\n  if (dept.id === deptId) {\n    return dept\n  }\n  if (dept.children && dept.children.length > 0) {\n    for (let i = 0; i < dept.children.length; i++) {\n      const find = findDeptTreeNode(deptId, dept.children[i])\n      if (find !== null) {\n        return find\n      }\n    }\n  }\n  return null\n}\n\nexport default {\n  queryAll: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.depts, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: queryResult\n    }\n  },\n  queryAllTree: config => {\n    console.log(config)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.deptsTree\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const dept = findDept(params.id)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: dept\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const dept = Mock.mock(MockDB.deptMockConfig)\n    params.id = dept.id\n    deepMerge(dept, params)\n\n    if (dept.parentId) {\n      const find = findDept(dept.parentId)\n      if (!find.children) {\n        find.children = []\n      }\n      find.children.push(dept)\n    } else {\n      MockDB.deptsTree.push(dept)\n    }\n\n    return {\n      code: 1,\n      message: '操作成功',\n      data: dept\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const dept = findDept(params.id)\n    deepMerge(dept, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    let dept = findDept(params.id)\n    if (dept.parentId === null) {\n      MockDB.deptsTree.splice(MockDB.deptsTree.findIndex(item => { return item.id === params.id }), 1)\n    } else {\n      dept = findDept(dept.parentId)\n      dept.children.splice(dept.children.findIndex(item => { return item.id === params.id }), 1)\n    }\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  queryAllDeptUsers: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const deptUsersResult = MockDB.deptUsers.filter(item => { return item.deptId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.users.filter(user => {\n        return deptUsersResult.findIndex(deptUser => { return user.id === deptUser.userId }) !== -1\n      })\n    }\n  },\n  queryAllDeptRoles: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.deptRoles.filter(item => { return item.deptId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.roles.filter(role => {\n        return tempResult.findIndex(item => { return role.id === item.roleId }) !== -1\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/deptRole.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.deptRoles.splice(MockDB.deptRoles.findIndex(item => {\n      return item.roleId === params.roleId && item.deptId === params.deptId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.deptRoles.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/dictionary.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nexport default {\n  queryPage: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.dictionaries, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '',\n      data: {\n        total: queryResult.length,\n        pageSize: params.pageSize,\n        page: params.page,\n        list: queryResult.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)\n      }\n    }\n  },\n  queryAll: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.dictionaries, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: queryResult\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const dictionary = MockDB.dictionaries[MockDB.dictionaries.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: dictionary\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const dictionary = Mock.mock(MockDB.dictionaryMockConfig)\n    params.id = dictionary.id\n    deepMerge(dictionary, params)\n    MockDB.dictionaries.push(dictionary)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const dictionary = MockDB.dictionaries[MockDB.dictionaries.findIndex(item => { return item.id === params.id })]\n    deepMerge(dictionary, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.dictionaries.splice(MockDB.dictionaries.findIndex(item => { return item.id === params.id }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/group.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nexport default {\n  queryPage: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.groups, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '',\n      data: {\n        total: queryResult.length,\n        pageSize: params.pageSize,\n        page: params.page,\n        list: queryResult.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)\n      }\n    }\n  },\n  queryAll: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value + ''\n    })\n    console.log(query)\n    const queryResult = deepClone(fieldQueryLike(MockDB.groups, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: queryResult\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const group = MockDB.groups[MockDB.groups.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: group\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const group = Mock.mock(MockDB.groupMockConfig)\n    params.id = group.id\n    deepMerge(group, params)\n    MockDB.groups.push(group)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: group\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const group = MockDB.groups[MockDB.groups.findIndex(item => { return item.id === params.id })]\n    deepMerge(group, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.groups.splice(MockDB.groups.findIndex(item => { return item.id === params.id }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  queryAllRoleGroupUsers: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.userRoleGroups.filter(item => { return item.roleGroupId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.users.filter(user => {\n        return tempResult.findIndex(item => { return user.id === item.userId }) !== -1\n      })\n    }\n  },\n  queryAllUserGroupUsers: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.userGroups.filter(item => { return item.groupId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.users.filter(user => {\n        return tempResult.findIndex(item => { return user.id === item.userId }) !== -1\n      })\n    }\n  },\n  queryAllGroupRoles: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.roleGroups.filter(item => { return item.roleGroupId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.roles.filter(role => {\n        return tempResult.findIndex(item => { return role.id === item.roleId }) !== -1\n      })\n    }\n  },\n  queryAllUserGroups: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.userGroupRoleGroups.filter(item => { return item.roleGroupId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.groups.filter(group => {\n        return tempResult.findIndex(item => { return group.id === item.userGroupId }) !== -1\n      })\n    }\n  },\n  queryAllRoleGroups: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.userGroupRoleGroups.filter(item => { return item.userGroupId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.groups.filter(group => {\n        return tempResult.findIndex(item => { return group.id === item.roleGroupId }) !== -1\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/menu.js",
    "content": "import Mock from 'mockjs'\nimport { deepMerge, param2Obj } from '@/utils'\nimport { asyncMenuMap } from '@/router'\nimport * as MockDB from '../MockDB'\n\nfunction createMenu(router, parentId, menus) {\n  const menu = {}\n  menu.id = router.name\n  menu.parentId = parentId\n  menu.deleted = 0\n  menu.sortNum = router.meta.sortNum\n  menu.name = router.meta.title\n  menu.icon = router.meta.icon\n  menu.remark = Mock.mock('@cparagraph(1, 3)')\n  menu.createdBy = Mock.mock('@id')\n  menu.createdDate = Mock.mock('@date(\\'T\\')')\n  menu.modifiedBy = Mock.mock('@id')\n  menu.modifiedDate = Mock.mock('@date(\\'T\\')')\n\n  if (router.children && router.children.length > 0) {\n    router.children.forEach(children => {\n      createMenu(children, router.name, menus)\n    })\n  }\n  menus.push(menu)\n}\n\nexport default {\n  queryAll: config => {\n    console.log(config)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.menus\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const menu = MockDB.menus[MockDB.menus.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: menu\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const menu = MockDB.menus[MockDB.menus.findIndex(item => { return item.id === params.id })]\n    deepMerge(menu, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n\n  sync: config => {\n    console.log(config)\n    asyncMenuMap.forEach(router => createMenu(router, null, MockDB.menus))\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  queryAllMenuSecurities: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.menuSecurities.filter(item => { return item.menuId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.securities.filter(security => {\n        return tempResult.findIndex(item => { return security.id === item.securityId }) !== -1\n      })\n    }\n  },\n  queryMenuRoles: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    if (MockDB.roleMenus.findIndex(item => { return item.menuId === params.id }) === -1) {\n      // 生成几个role\n      for (let i = 0; i < 5; i++) {\n        const role = Mock.mock(MockDB.roleMockConfig)\n        MockDB.roles.push(role)\n        MockDB.roleMenus.push({\n          menuId: params.id,\n          roleId: role.id\n        })\n      }\n    }\n    const roleMenusResult = MockDB.roleMenus.filter(item => { return params.id === item.menuId })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.roles.filter(role => {\n        return roleMenusResult.findIndex(menuRole => { return role.id === menuRole.roleId }) !== -1\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/menuRole.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.roleMenus.splice(MockDB.roleMenus.findIndex(item => {\n      return item.menuId === params.menuId && item.roleId === params.roleId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  reset: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.roleMenus.forEach(() => {\n      MockDB.roleMenus.splice(MockDB.roleMenus.findIndex(item => {\n        return item.roleId === params.roleId\n      }), 1)\n    })\n    params.menuIds.forEach(menuId => {\n      MockDB.roleMenus.push({\n        roleId: params.roleId,\n        menuId\n      })\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/menuSecurity.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.menuSecurities.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  },\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.menuSecurities.splice(MockDB.menuSecurities.findIndex(item => {\n      return item.menuId === params.menuId && item.securityId === params.securityId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/role.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nexport default {\n  queryPage: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.roles, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '',\n      data: {\n        total: queryResult.length,\n        pageSize: params.pageSize,\n        page: params.page,\n        list: queryResult.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)\n      }\n    }\n  },\n  queryAll: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.roles, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: queryResult\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const role = MockDB.roles[MockDB.roles.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: role\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const role = Mock.mock(MockDB.roleMockConfig)\n    params.id = role.id\n    deepMerge(role, params)\n    MockDB.roles.push(role)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: role\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const role = MockDB.roles[MockDB.roles.findIndex(item => { return item.id === params.id })]\n    deepMerge(role, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.roles.splice(MockDB.roles.findIndex(item => { return item.id === params.id }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n\n  // ###################################RoleMenu中间表操作MOCK#######################################\n  queryAllRoleMenus: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.roleMenus.filter(item => { return params.id === item.roleId })\n    }\n  },\n  queryAllRoleUsers: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.userRoles.filter(item => { return item.roleId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.users.filter(user => {\n        return tempResult.findIndex(item => { return user.id === item.userId }) !== -1\n      })\n    }\n  },\n  queryAllRoleDepts: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResult = MockDB.deptRoles.filter(item => { return item.roleId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.depts.filter(dept => {\n        return tempResult.findIndex(item => { return dept.id === item.deptId }) !== -1\n      })\n    }\n  },\n  queryAllRoleGroups: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResults = MockDB.roleGroups.filter(item => { return item.roleId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.groups.filter(group => {\n        return '' + group.category === '2' && tempResults.findIndex(item => { return group.id === item.roleGroupId }) !== -1\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/roleGroup.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.roleGroups.splice(MockDB.roleGroups.findIndex(item => {\n      return item.roleId === params.roleId && item.groupId === params.groupId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.roleGroups.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/security.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nexport default {\n  queryPage: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.securities, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '',\n      data: {\n        total: queryResult.length,\n        pageSize: params.pageSize,\n        page: params.page,\n        list: queryResult.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)\n      }\n    }\n  },\n  queryAll: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value + ''\n    })\n    console.log(query)\n    const queryResult = deepClone(fieldQueryLike(MockDB.securities, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: queryResult\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const security = MockDB.securities[MockDB.securities.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: security\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const security = Mock.mock(MockDB.securityMockConfig)\n    params.id = security.id\n    deepMerge(security, params)\n    MockDB.securities.push(security)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: security\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const security = MockDB.securities[MockDB.securities.findIndex(item => { return item.id === params.id })]\n    deepMerge(security, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.securities.splice(MockDB.securities.findIndex(item => { return item.id === params.id }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/user.js",
    "content": "import Mock from 'mockjs'\nimport { param2Obj, deepMerge, deepClone, fieldQueryLike, sortArray } from '@/utils'\nimport * as MockDB from '../MockDB'\n\nexport default {\n  queryPage: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const query = {}\n    params.filters.forEach(filter => {\n      query[filter.field] = filter.value\n    })\n    const queryResult = deepClone(fieldQueryLike(MockDB.users, query))\n    params.sorts.forEach(sort => {\n      // 前端目前无法实现多字段排序，因此排序以最后一个字段为准\n      sortArray(queryResult, sort.field, sort.value === 'desc')\n    })\n    return {\n      code: 1,\n      message: '',\n      data: {\n        total: queryResult.length,\n        pageSize: params.pageSize,\n        page: params.page,\n        list: queryResult.slice((params.page - 1) * params.pageSize, params.page * params.pageSize)\n      }\n    }\n  },\n  checkLoginName: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const find = MockDB.users.some(item => {\n      if (params.id) {\n        return item.loginName === params.loginName && item.id !== params.id\n      }\n      return item.loginName === params.loginName\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {\n        exist: find ? 1 : 0\n      }\n    }\n  },\n  uploadAvatar: config => {\n    console.log(config)\n    return {\n      code: 0,\n      message: '操作成功',\n      data: Mock.Random.dataImage('180x180', Mock.mock('@cname'))\n    }\n  },\n  queryById: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const user = MockDB.users[MockDB.users.findIndex(item => { return item.id === params.id })]\n    return {\n      code: 1,\n      message: '操作成功',\n      data: user\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const user = Mock.mock(MockDB.userMockConfig)\n    params.id = user.id\n    deepMerge(user, params)\n    MockDB.users.push(user)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: user\n    }\n  },\n  edit: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const user = MockDB.users[MockDB.users.findIndex(item => { return item.id === params.id })]\n    deepMerge(user, params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n\n  editUserPassword: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const user = MockDB.users[MockDB.users.findIndex(item => { return item.id === params.id })]\n    user.password = params.password\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  del: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.users.splice(MockDB.users.findIndex(item => { return item.id === params.id }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n\n  queryAllUserDepts: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const deptUsersResult = MockDB.deptUsers.filter(item => { return item.userId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.depts.filter(dept => {\n        return deptUsersResult.findIndex(deptUser => { return dept.id === deptUser.deptId }) !== -1\n      })\n    }\n  },\n  // 用户具有的\n  queryAllUserGroups: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const groupUsersResult = MockDB.userGroups.filter(item => { return item.userId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.groups.filter(group => {\n        return '' + group.category === '1' && groupUsersResult.findIndex(groupUser => { return group.id === groupUser.groupId }) !== -1\n      })\n    }\n  },\n  queryAllUserRoleGroups: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const tempResults = MockDB.userRoleGroups.filter(item => { return item.userId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.groups.filter(group => {\n        return '' + group.category === '2' && tempResults.findIndex(item => { return group.id === item.roleGroupId }) !== -1\n      })\n    }\n  },\n\n  queryAllUserRoles: config => {\n    console.log(config)\n    const params = param2Obj(config.url)\n    const userRolesResult = MockDB.userRoles.filter(item => { return item.userId === params.id })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: MockDB.roles.filter(role => {\n        return userRolesResult.findIndex(userRole => { return role.id === userRole.roleId }) !== -1\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/userDept.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.deptUsers.splice(MockDB.deptUsers.findIndex(item => {\n      return item.userId === params.userId && item.deptId === params.deptId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.deptUsers.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  },\n  reset: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const newDeptUsers = MockDB.deptUsers.filter(item => {\n      let found = false\n      for (let i = 0; i < params.length; i++) {\n        if (item.userId === params[i].userId) {\n          found = true\n          break\n        }\n      }\n      return !found\n    })\n    MockDB.deptUsers.splice(0, MockDB.deptUsers.length)\n    newDeptUsers.forEach(item => {\n      MockDB.deptUsers.push(item)\n    })\n    params.forEach(item => {\n      MockDB.deptUsers.push(item)\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/userGroup.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userGroups.splice(MockDB.userGroups.findIndex(item => {\n      return item.userId === params.userId && item.groupId === params.groupId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userGroups.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  },\n  reset: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const newGroupUsers = MockDB.userGroups.filter(item => {\n      let found = false\n      for (let i = 0; i < params.length; i++) {\n        if (item.userId === params[i].userId) {\n          found = true\n          break\n        }\n      }\n      return !found\n    })\n    MockDB.userGroups.splice(0, MockDB.userGroups.length)\n    newGroupUsers.forEach(item => {\n      MockDB.userGroups.push(item)\n    })\n    params.forEach(item => {\n      MockDB.userGroups.push(item)\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/userGroupRoleGroup.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userGroupRoleGroups.splice(MockDB.userGroupRoleGroups.findIndex(item => {\n      return item.userGroupId === params.userGroupId && item.roleGroupId === params.roleGroupId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userGroupRoleGroups.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/userRole.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userRoles.splice(MockDB.userRoles.findIndex(item => {\n      return item.userId === params.userId && item.roleId === params.roleId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: ''\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userRoles.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  },\n  reset: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const newUserRoles = MockDB.userRoles.filter(item => {\n      let found = false\n      for (let i = 0; i < params.length; i++) {\n        if (item.userId === params[i].userId) {\n          found = true\n          break\n        }\n      }\n      return !found\n    })\n    MockDB.userRoles.splice(0, MockDB.userRoles.length)\n    newUserRoles.forEach(item => {\n      MockDB.userRoles.push(item)\n    })\n    params.forEach(item => {\n      MockDB.userRoles.push(item)\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/system-management/userRoleGroup.js",
    "content": "import * as MockDB from '../MockDB'\n\nexport default {\n  delByEntityMapping: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userRoleGroups.splice(MockDB.userRoleGroups.findIndex(item => {\n      return item.userId === params.userId && item.userRoleId === params.userRoleId\n    }), 1)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: {}\n    }\n  },\n  add: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    MockDB.userRoleGroups.push(params)\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  },\n  reset: config => {\n    console.log(config)\n    const params = JSON.parse(config.body)\n    const newUserRoleGroups = MockDB.userRoleGroups.filter(item => {\n      let found = false\n      for (let i = 0; i < params.length; i++) {\n        if (item.userId === params[i].userId) {\n          found = true\n          break\n        }\n      }\n      return !found\n    })\n    MockDB.userRoleGroups.splice(0, MockDB.userRoleGroups.length)\n    newUserRoleGroups.forEach(item => {\n      MockDB.userRoleGroups.push(item)\n    })\n    params.forEach(item => {\n      MockDB.userRoleGroups.push(item)\n    })\n    return {\n      code: 1,\n      message: '操作成功',\n      data: params\n    }\n  }\n}\n"
  },
  {
    "path": "src/mock/utils.js",
    "content": "import Mock from 'mockjs'\n\nconst id = []\nfor (let i = 0; i < 1000; i++) {\n  id.push(Mock.mock('@id'))\n}\n\nexport default {\n  state: [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1],\n  deleted: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n  id: id\n}\n"
  },
  {
    "path": "src/permission.js",
    "content": "import router from './router'\nimport store from './store'\nimport { Message } from 'element-ui'\nimport NProgress from 'nprogress' // 进度条组件\nimport 'nprogress/nprogress.css'// 进度条样式\nimport { getToken, hasPermission } from '@/utils/auth' // 从cookie中获取用户信息\n\nNProgress.configure({ showSpinner: false })// NProgress Configuration\n\nrouter.beforeEach((to, from, next) => {\n  NProgress.start() // 开始进度条\n  if (getToken()) { // 判断是否已存在token信息\n    if (to.path.indexOf('/login') === 0) {\n      next({ path: '/' })\n      NProgress.done() // 部分页面可能不会触发路由afterEach钩子\n    } else {\n      if (store.getters.user === null) { // 判断当前用户是否已拉取完用户信息\n        store.dispatch('GetUserInfo').then(data => { // 拉取用户信息\n          const roles = data.roles // 必须是数组结构\n          store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表\n            router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表\n            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record\n          })\n        }).catch((err) => {\n          store.dispatch('FedLogOut').then(() => {\n            Message.error(err || '登录失败')\n            next({ path: '/' })\n          })\n        })\n      } else {\n        // 没有动态改变权限的需求可直接next() 删除下方权限判断\n        if (hasPermission(store.getters.roles, to)) {\n          next()\n        } else {\n          next({ path: '/401', replace: true, query: { noGoBack: true }})\n        }\n      }\n    }\n  } else {\n    if (to.path.indexOf('/login') === 0) {\n      next()\n    } else {\n      next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页\n      NProgress.done() // 防止当前页面与to相同，导致afterEach钩子未触发\n    }\n  }\n})\n\nrouter.afterEach(() => {\n  NProgress.done() // finish progress bar\n})\n"
  },
  {
    "path": "src/router/index.js",
    "content": "import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n/**\n * Layout，建议在一级路由中应用不同的布局\n */\nimport defaultLayout from '@/views/layout/LeftAccordionSidebar/index'\n\n/* 模块化路由 */\nimport systemManagementRouter from './modules/SystemManagement'\nimport CodeGenerator from './modules/CodeGenerator'\n\n/**\n * 静态路由定义，无需权限的全局路由\n * @type {*[]}\n */\nexport const constantRouterMap = [\n  {\n    path: '/redirect', // 通常用于刷新当前路由，可参见tagsView中的案例\n    component: defaultLayout,\n    hidden: true,\n    children: [\n      {\n        path: '/redirect/:path*',\n        component: () => import('@/components/Redirect/index')\n      }\n    ]\n  },\n  {\n    path: '/login',\n    component: () => import('@/views/login/index'),\n    hidden: true\n  },\n  {\n    path: '/404',\n    component: () => import('@/components/ErrorPage/404'),\n    hidden: true\n  },\n  {\n    path: '/401',\n    component: () => import('@/components/ErrorPage/401'),\n    hidden: true\n  },\n  {\n    path: '/myself',\n    component: defaultLayout,\n    hidden: true,\n    meta: { title: '个人设置', icon: 'user' },\n    children: [\n      {\n        path: 'modify',\n        component: () => import('@/views/system-management/user/myself/modify'),\n        name: 'myself-modify',\n        meta: { title: '个人信息编辑', icon: 'user' }\n      }\n    ]\n  },\n  {\n    path: '',\n    component: defaultLayout,\n    hidden: false,\n    redirect: 'index',\n    children: [\n      {\n        path: '/index',\n        component: () => import('@/views/dashboard/index'),\n        name: 'index',\n        meta: { title: '首页', icon: 'index' }\n      }\n    ]\n  }\n]\n\nexport default new Router({\n  routes: constantRouterMap\n})\n\n/**\n * 聚合子模块路由对象，登陆后异步匹配路由结构，动态添加路由\n * 建议，该动态路由表由前端控制\n * asyncRouterMap动态够钱过程中，请在最后末尾处加上路由 ： { path: '*', redirect: '/404', hidden: true }，将未知路由归置到404页面, 详见src/store/modules/permission.js\n */\nexport const asyncRouterMap = [\n  systemManagementRouter,\n  CodeGenerator\n]\n\nexport const asyncMenuMap = JSON.parse(JSON.stringify(asyncRouterMap))\n"
  },
  {
    "path": "src/router/modules/CodeGenerator.js",
    "content": "import defaultLayout from '@/views/layout/LeftAccordionSidebar/index'\n\nconst asyncRouter = {\n  path: '/java-code-generator',\n  component: defaultLayout,\n  hidden: false,\n  redirect: '/java-code-generator/execute',\n  name: '923c7i98uc6khj109b8930ba20d907j3',\n  meta: {\n    sortNum: 1,\n    roles: [],\n    title: '插件',\n    icon: 'utils'\n  },\n  children: [\n    {\n      path: 'execute',\n      component: () => import('@/views/code-generator/main'),\n      hidden: false,\n      alwaysShow: true,\n      name: '723c7698uc6ghj109b8970baf0d008j5',\n      meta: {\n        sortNum: 2,\n        roles: [],\n        title: '代码生成器',\n        icon: 'java'\n      }\n    }\n  ]\n}\n\nexport default asyncRouter\n"
  },
  {
    "path": "src/router/modules/SystemManagement.js",
    "content": "/** When your routing table is too long, you can split it into small modules**/\n\nimport defaultLayout from '@/views/layout/LeftAccordionSidebar/index'\nimport MenuGroup from '@/views/layout/MenuGroup/index'\n\n// name值即为后端ID，请使用http://www.uuid.online/ 在前端生成，后端只允许做同步操作\n\nconst asyncRouter = {\n  path: '/system',\n  component: defaultLayout,\n  hidden: false,\n  alwaysShow: true,\n  name: '90a127ce319d5d93b3b49c697cfa138f',\n  meta: {\n    sortNum: 1,\n    roles: [],\n    title: '系统管理',\n    icon: 'setting'\n  },\n  children: [\n    {\n      path: 'dept',\n      component: () => import('@/views/system-management/dept/main'),\n      hidden: false,\n      alwaysShow: true,\n      name: '323c76618c6b56109bd490baf0d00902',\n      meta: {\n        sortNum: 1,\n        roles: [],\n        title: '部门管理',\n        icon: 'dept'\n      }\n    },\n    {\n      path: 'user-group',\n      component: MenuGroup,\n      hidden: false,\n      alwaysShow: true,\n      name: 'f33d83225bef590d81f61a5afcbbca14',\n      meta: {\n        sortNum: 1,\n        roles: [],\n        title: '用户与分组',\n        icon: 'user-setting'\n      },\n      children: [\n        {\n          path: 'group',\n          component: () => import('@/views/system-management/group/main'),\n          query: {\n            category: 1\n          },\n          hidden: false,\n          alwaysShow: true,\n          name: '3de22ff390ab5d06bafcce547ff780bb',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '用户分组',\n            icon: 'group'\n          }\n        },\n        {\n          path: 'user',\n          component: () => import('@/views/system-management/user/main'),\n          hidden: false,\n          alwaysShow: true,\n          name: '8bdc5038a6585fd2b5d3ef7b1e4bf4e1',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '用户管理',\n            icon: 'user'\n          }\n        }\n      ]\n    },\n    {\n      path: 'menu-setting',\n      component: MenuGroup,\n      hidden: false,\n      alwaysShow: true,\n      name: '9fd0d16c3f454636a8b8f1444c1a3c93',\n      meta: {\n        sortNum: 1,\n        roles: [],\n        title: '菜单与资源',\n        icon: 'menu-setting'\n      },\n      children: [\n        {\n          path: 'security',\n          component: () => import('@/views/system-management/security/main'),\n          hidden: false,\n          alwaysShow: true,\n          name: '7ff5ba3af6c2463296dd0eb5ecedb23c',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '资源管理',\n            icon: 'security'\n          }\n        },\n        {\n          path: 'menu',\n          component: () => import('@/views/system-management/menu/main'),\n          hidden: false,\n          alwaysShow: true,\n          name: '3d2b85978d4c43edb9a7f7396b15d32f',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '菜单管理',\n            icon: 'menu'\n          }\n        }\n      ]\n    },\n    {\n      path: 'role-group',\n      component: MenuGroup,\n      hidden: false,\n      alwaysShow: true,\n      name: 'd4a808c28d2c44159fb7cb47e6d524a5',\n      meta: {\n        sortNum: 1,\n        roles: [],\n        title: '角色与分组',\n        icon: 'role-setting'\n      },\n      children: [\n        {\n          path: 'group',\n          component: () => import('@/views/system-management/group/main'),\n          query: {\n            category: 2\n          },\n          hidden: false,\n          alwaysShow: true,\n          name: '81cb5f5db7d141f9bad227ab0c0bc5c9',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '角色分组',\n            icon: 'group'\n          }\n        },\n        {\n          path: 'role',\n          component: () => import('@/views/system-management/role/main'),\n          hidden: false,\n          alwaysShow: true,\n          name: 'd2249f50a3235286b173663a6c45122d',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '角色管理',\n            icon: 'user-role'\n          }\n        }\n      ]\n    },\n    {\n      path: 'dictionary-setting',\n      component: MenuGroup,\n      hidden: false,\n      alwaysShow: true,\n      name: 'da4c2695c36a50eab041735842b530e7',\n      meta: {\n        sortNum: 1,\n        roles: [],\n        title: '字典管理',\n        icon: 'dictionary-setting'\n      },\n      children: [\n        {\n          path: 'dictionary-type',\n          component: () => import('@/views/system-management/dictionary-type/main'),\n          hidden: false,\n          alwaysShow: true,\n          name: 'd9fab44477ba5d2caf1aab1b95281713',\n          meta: {\n            sortNum: 1,\n            roles: [],\n            title: '字典分类',\n            icon: 'dictionary-type'\n          }\n        },\n        {\n          path: 'dictionary-single',\n          component: () => import('@/views/system-management/dictionary/singleMain'),\n          hidden: false,\n          alwaysShow: true,\n          name: '22fc466264e65171a7631b2079a2b7f6',\n          meta: {\n            sortNum: 2,\n            roles: [],\n            title: '单级业务字典',\n            icon: 'dictionary-single'\n          }\n        },\n        {\n          path: 'dictionary-multi',\n          component: () => import('@/views/system-management/dictionary/multiMain'),\n          hidden: false,\n          alwaysShow: true,\n          name: 'd9369152df124e1aae855f743d3eedc8',\n          meta: {\n            sortNum: 3,\n            roles: [],\n            title: '多级业务字典',\n            icon: 'dictionary-multi'\n          }\n        }\n      ]\n    }\n  ]\n}\n\nexport default asyncRouter\n"
  },
  {
    "path": "src/store/getters.js",
    "content": "const getters = {\n  sidebar: state => state.app.sidebar,\n\n  visitedViews: state => state.tagsView.visitedViews,\n\n  token: state => state.user.token,\n  user: state => state.user.user,\n  roles: state => state.user.roles,\n\n  adminCode: state => state.permission.adminCode,\n  permission_routers: state => state.permission.routers,\n  addRouters: state => state.permission.addRouters,\n\n  dictionaries: state => state.dictionaries\n}\nexport default getters\n"
  },
  {
    "path": "src/store/index.js",
    "content": "import Vue from 'vue'\nimport Vuex from 'vuex'\nimport app from './modules/app'\nimport permission from './modules/permission'\nimport tagsView from './modules/tagsView'\nimport user from './modules/user'\nimport dictionaries from './modules/dictionaries'\nimport getters from './getters'\n\nVue.use(Vuex)\n\nconst store = new Vuex.Store({\n  modules: {\n    app,\n    permission,\n    tagsView,\n    user,\n    dictionaries\n  },\n  getters\n})\n\nexport default store\n"
  },
  {
    "path": "src/store/modules/app.js",
    "content": "import Cookies from 'js-cookie'\n\nconst app = {\n  state: {\n    sidebar: {\n      opened: !+Cookies.get('sidebarStatus'),\n      withoutAnimation: false\n    }\n  },\n  mutations: {\n    TOGGLE_SIDEBAR: state => {\n      if (state.sidebar.opened) {\n        Cookies.set('sidebarStatus', 1)\n      } else {\n        Cookies.set('sidebarStatus', 0)\n      }\n      state.sidebar.opened = !state.sidebar.opened\n      state.sidebar.withoutAnimation = false\n    },\n    CLOSE_SIDEBAR: (state, withoutAnimation) => {\n      Cookies.set('sidebarStatus', 1)\n      state.sidebar.opened = false\n      state.sidebar.withoutAnimation = withoutAnimation\n    },\n    OPEN_SIDEBAR: (state, withoutAnimation) => {\n      Cookies.set('sidebarStatus', 0)\n      state.sidebar.opened = true\n      state.sidebar.withoutAnimation = withoutAnimation\n    }\n  },\n  actions: {\n    toggleSideBar({ commit }) {\n      commit('TOGGLE_SIDEBAR')\n    },\n    closeSideBar({ commit }, { withoutAnimation }) {\n      commit('CLOSE_SIDEBAR', withoutAnimation)\n    },\n    openSideBar({ commit }, { withoutAnimation }) {\n      commit('OPEN_SIDEBAR', withoutAnimation)\n    }\n  }\n}\n\nexport default app\n"
  },
  {
    "path": "src/store/modules/dictionaries.js",
    "content": "const dictionaries = {\n  state: {\n    trueOrFalse: [{\n      key: '0',\n      value: '否'\n    }, {\n      key: '1',\n      value: '是'\n    }],\n\n    gender: [{\n      key: '0',\n      value: '女'\n    }, {\n      key: '1',\n      value: '男'\n    }],\n\n    dictionaryCategory: [{\n      key: '1',\n      value: '字典分类'\n    }, {\n      key: '2',\n      value: '单级字典'\n    }, {\n      key: '3',\n      value: '多级字典'\n    }]\n  }\n}\nexport default dictionaries\n"
  },
  {
    "path": "src/store/modules/permission.js",
    "content": "import { asyncRouterMap, constantRouterMap } from '@/router'\nimport { filterAsyncRouter, initRouterRoles, initRouterRedirect } from '@/utils/auth'\nimport { getRouterRoles } from '@/api/login'\n\nconst permission = {\n  state: {\n    adminCode: 'admin',\n    routers: constantRouterMap,\n    addRouters: []\n  },\n  mutations: {\n    SET_ROUTERS: (state, routers) => {\n      state.routers = constantRouterMap.concat(routers)\n      state.addRouters = routers\n    }\n  },\n  actions: {\n    GenerateRoutes({ commit, state }, data) {\n      return new Promise(resolve => {\n        const { roles } = data\n        let accessedRouters = null\n        if (roles.includes(state.adminCode)) {\n          // 将未知路由归置到404页面\n          asyncRouterMap.push({ path: '*', redirect: '/404', hidden: true })\n          accessedRouters = asyncRouterMap\n          initRouterRedirect(accessedRouters)\n          commit('SET_ROUTERS', accessedRouters)\n          resolve()\n        } else {\n          getRouterRoles().then(routerRoles => {\n            const routerRolesMap = new Map(routerRoles)\n            asyncRouterMap.forEach(module => {\n              initRouterRoles(module, routerRolesMap)\n            })\n            accessedRouters = filterAsyncRouter(asyncRouterMap, roles)\n            // 将未知路由归置到404页面\n            accessedRouters.push({ path: '*', redirect: '/404', hidden: true })\n            initRouterRedirect(accessedRouters)\n            commit('SET_ROUTERS', accessedRouters)\n            resolve()\n          })\n        }\n      })\n    }\n  }\n}\n\nexport default permission\n"
  },
  {
    "path": "src/store/modules/tagsView.js",
    "content": "const tagsView = {\n  state: {\n    visitedViews: []\n  },\n  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    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_OTHERS_VISITED_VIEWS: (state, view) => {\n      for (const [i, v] of state.visitedViews.entries()) {\n        if (v.path === view.path) {\n          state.visitedViews = state.visitedViews.slice(i, i + 1)\n          break\n        }\n      }\n    },\n    DEL_ALL_VISITED_VIEWS: state => {\n      state.visitedViews = []\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  },\n  actions: {\n    addView({ dispatch }, view) {\n      dispatch('addVisitedView', view)\n    },\n    addVisitedView({ commit }, view) {\n      commit('ADD_VISITED_VIEW', view)\n    },\n    delView({ dispatch, state }, view) {\n      return new Promise(resolve => {\n        dispatch('delVisitedView', view)\n        resolve({\n          visitedViews: [...state.visitedViews]\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    delOthersViews({ dispatch, state }, view) {\n      return new Promise(resolve => {\n        dispatch('delOthersVisitedViews', view)\n        resolve({\n          visitedViews: [...state.visitedViews]\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    delAllViews({ dispatch, state }, view) {\n      return new Promise(resolve => {\n        dispatch('delAllVisitedViews', view)\n        resolve({\n          visitedViews: [...state.visitedViews]\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    updateVisitedView({ commit }, view) {\n      commit('UPDATE_VISITED_VIEW', view)\n    }\n  }\n}\n\nexport default tagsView\n"
  },
  {
    "path": "src/store/modules/user.js",
    "content": "import { logout, getUserInfo } from '@/api/login'\nimport { getToken, setToken, removeToken } from '@/utils/auth'\n\nconst user = {\n  state: {\n    token: getToken(),\n    user: null,\n    roles: []\n  },\n\n  mutations: {\n    SET_TOKEN: (state, token) => {\n      state.token = token\n      if (token) {\n        setToken(token)\n      } else {\n        removeToken()\n      }\n    },\n    SET_USER: (state, user) => {\n      state.user = user\n    },\n    SET_ROLES: (state, roles) => {\n      state.roles = roles\n    },\n    CLEAR_USER: (state) => {\n      state.user = null\n      state.roles = []\n    }\n  },\n\n  actions: {\n    // 用户名登录\n    LoginByLoginName({ commit }, token) {\n      commit('SET_TOKEN', token)\n      commit('CLEAR_USER')\n    },\n\n    // 获取用户信息\n    GetUserInfo({ commit, state }) {\n      return new Promise((resolve, reject) => {\n        getUserInfo(state.token).then(data => {\n          commit('SET_USER', data.user)\n          commit('SET_ROLES', data.roles)\n          resolve(data)\n        }).catch(error => {\n          commit('CLEAR_USER')\n          reject(error)\n        })\n      })\n    },\n\n    // 登出\n    LogOut({ commit, state }) {\n      return new Promise((resolve, reject) => {\n        logout(state.token).then(() => {\n          commit('SET_TOKEN', null)\n          commit('CLEAR_USER')\n          resolve()\n        }).catch(error => {\n          reject(error)\n        })\n      })\n    },\n\n    // 前端 登出\n    FedLogOut({ commit }) {\n      return new Promise(resolve => {\n        commit('SET_TOKEN', null)\n        commit('CLEAR_USER')\n        resolve()\n      })\n    }\n  }\n}\n\nexport default user\n"
  },
  {
    "path": "src/styles/element-ui.scss",
    "content": " //覆盖一些element-ui样式\n\n .el-breadcrumb__inner, .el-breadcrumb__inner a {\n  font-weight: 400!important;\n }\n\n .current-row {\n   td {\n     background-color: #409EFF !important;\n     color: #f5f7fa;\n     font-weight: 600;\n     font-size: 16px;\n   }\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 //element ui upload\n .upload-container {\n   .el-upload {\n     width: 100%;\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 .el-menu--vertical > .el-menu .svg-icon {\n   margin-right: 20px;\n }\n\n"
  },
  {
    "path": "src/styles/index.scss",
    "content": "@import './mixin.scss';\n@import './transition.scss';\n@import './element-ui.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*, *:before, *:after {\n  box-sizing: inherit;\n}\n\na:focus, a:active {\n  outline: none;\n}\n\na, a:focus, a:hover {\n  cursor: pointer;\n  color: inherit;\n  text-decoration: none;\n}\n\ndiv:focus{\n  outline: none;\n}\n\n.block {\n  display: block;\n}\n\n.pointer {\n  cursor: pointer;\n}\n"
  },
  {
    "path": "src/styles/mixin.scss",
    "content": "@mixin clearfix {\n  &:after {\n    content: \"\";\n    display: table;\n    clear: both;\n  }\n}\n"
  },
  {
    "path": "src/styles/transition.scss",
    "content": "//globl transition css\n\n/*fade*/\n.fade-enter-active, .fade-leave-active {\n  transition: opacity 0.28s;\n}\n\n.fade-enter, .fade-leave-active {\n  opacity: 0;\n}\n\n/*fade-transform*/\n.fade-transform-leave-active, .fade-transform-enter-active {\n  transition: all .5s;\n}\n.fade-transform-enter {\n  opacity: 0;\n  transform: translateX(-30px);\n}\n.fade-transform-leave-to {\n  opacity: 0;\n  transform: translateX(30px);\n}\n"
  },
  {
    "path": "src/utils/auth.js",
    "content": "import Cookies from 'js-cookie'\n\nconst TokenKey = 'USER_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\n/**\n * 通过meta.role判断是否与当前用户权限匹配\n * @param roles 用户的角色列表\n * @param meta meta中规定了有权限操作的所有角色，只要用户具有其中一个即可\n */\nexport function hasPermission(roles, { meta }) {\n  if (roles.indexOf('admin') >= 0) return true\n  if (meta && meta.roles) {\n    return roles.some(role => meta.roles.includes(role))\n  } else {\n    return true\n  }\n}\n\n/**\n * 递归过滤异步路由表，返回符合用户角色权限的路由表\n * @param routes asyncRouterMap\n * @param roles\n */\nexport function filterAsyncRouter(routes, roles) {\n  const res = []\n\n  routes.forEach(router => {\n    const temp = { ...router } // 继承一个router对象,非深度复制\n    if (hasPermission(roles, temp)) {\n      if (temp.children) {\n        temp.children = filterAsyncRouter(temp.children, roles)\n      }\n      res.push(temp)\n    }\n  })\n\n  return res\n}\n\nexport function initRouterRedirect(routes, redirect = '') {\n  routes.forEach(router => {\n    let routerRedirect = router.path\n    // 约束，路由中请勿使用绝对路由路径path\n    if (!router.path.startsWith('/')) {\n      routerRedirect = redirect + '/' + router.path\n    }\n    if (router.children) {\n      for (let i = 0; i < router.children.length; i++) {\n        if (router.children[i].hidden === false) {\n          router.redirect = routerRedirect + '/' + router.children[i].path\n          break\n        }\n      }\n      initRouterRedirect(router.children, routerRedirect)\n    }\n  })\n}\n\nexport function initRouterRoles(router, routerRolesMap) {\n  if (!router.meta) {\n    router.meta = { }\n  }\n  if (routerRolesMap.get(router.name)) {\n    router.meta.roles = routerRolesMap.get(router.name)\n  } else {\n    router.meta.roles = []\n  }\n  if (router.children) {\n    router.children.forEach(children => {\n      initRouterRoles(children, routerRolesMap)\n    })\n  }\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.off('error')\n    clipboard.off('success')\n    clipboard.destroy()\n  })\n  clipboard.on('error', () => {\n    clipboardError()\n    clipboard.off('error')\n    clipboard.off('success')\n    clipboard.destroy()\n  })\n  clipboard.onClick(event)\n}\n"
  },
  {
    "path": "src/utils/index.js",
    "content": "/**\n * @param time 可为日期对象（Date） 或者 时间戳（通过parseInt(time) * 1000需要转换为毫秒数）\n * @param format  期望的日期格式，如： '{y}-{m}-{d} {h}:{i}:{s} 星期{a}'\n * @returns 获取指定格式的日期字符串\n * @author hujie@mail.taiji.com.cn\n */\nexport function parseTime(time, format = '{y}-{m}-{d} {h}:{i}:{s}') {\n  if (arguments.length === 0) { // 没传递参数\n    return null\n  }\n  if (!time) {\n    return null\n  }\n  let date\n  if (typeof time === 'object') {\n    date = time\n  } else {\n    if (('' + time).length === 10) time = parseInt(time) * 1000\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(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n    let value = formatObj[key]\n    // Note: getDay() returns 0 on Sunday\n    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }\n    if (result.length > 0 && value < 10) {\n      value = '0' + value\n    }\n    return value || 0\n  })\n  return time_str\n}\n\n/**\n * @param time 可为日期对象（Date） 或者 时间戳（通过parseInt(time) * 1000需要转换为毫秒数）\n * @param format  期望的日期格式，如： '{y}-{m}-{d} {h}:{i}:{s} 星期{a}'\n * @returns 获取指定格式的日期字符串 或 计算距离当前时间的时间差描述（刚刚、XX分钟前、XX小时前）\n * @author hujie@mail.taiji.com.cn\n */\nexport function formatTime(time, format) {\n  if (time.toString().length !== 13) {\n    time = time * 1000\n  }\n  const d = new Date(time)\n  const now = Date.now()\n\n  const diff = (now - d) / 1000\n\n  if (diff > 3600 * 24 * 7 || format) { // 一个月以上或传递了格式，采用标准日期格式化方式处理\n    return parseTime(time, format)\n  } else if (diff > 3600 * 24 * 3) {\n    return '3天前'\n  } else if (diff > 3600 * 24 * 2) {\n    return '2天前'\n  } else if (diff > 3600 * 24 * 1) {\n    return '1天前'\n  } else if (diff > 3600) {\n    return Math.ceil(diff / 3600) + '小时前'\n  } else if (diff > 60) {\n    return Math.ceil(diff / 60) + '分钟前'\n  } else {\n    return '刚刚'\n  }\n}\n\n/**\n *\n * @param actual 需要清理的数组\n * @returns 清理数据中不存在的数据,如undefined、null以及空字符串\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 arr 原始数组\n * @returns 返回一个去重的新数组\n */\nexport function getUniqueArr(arr) {\n  return Array.from(new Set(arr))\n}\n\n/**\n * @param json\n * @returns 将JSON对象转换为url查询字符串\n */\nexport function obj2Param(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 url\n * @returns 从url中获取查询字符串并转换为JSON对象\n */\nexport function param2Obj(url) {\n  const search = url.split('?')[1]\n  if (!search) {\n    return {}\n  }\n  return JSON.parse(\n    '{\"' +\n      decodeURIComponent(search)\n        .replace(/\"/g, '\\\\\"')\n        .replace(/&/g, '\",\"')\n        .replace(/=/g, '\":\"') +\n      '\"}'\n  )\n}\n\n/**\n * @param val\n * @returns 将html转换为字符串\n */\nexport function html2Text(inner) {\n  const div = document.createElement('div')\n  div.innerHTML = inner\n  return div.textContent || div.innerText\n}\n\n/**\n * @param source 被复制的对象\n * @returns 深度复制对象，新对象与原始对象不存在引用关系\n */\nexport function deepClone(source) {\n  if (!source && typeof source !== 'object') {\n    throw new Error('source不是对象，值为 = ' + source)\n  }\n  const targetObj = Array.isArray(source) ? [] : {}\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 target\n * @param source\n * @returns 合并对象属性，将source合并给target，若source为数组，则返回source的数组新副本\n */\nexport function deepMerge(target, source) {\n  if (typeof target !== 'object') {\n    target = {}\n  }\n  if (Array.isArray(source)) {\n    return source.slice() // slice产生数组新副本\n  }\n  if (source === null || source === undefined) {\n    return source\n  }\n  Object.keys(source).forEach(property => {\n    const sourceProperty = source[property]\n    if (typeof sourceProperty === 'object') {\n      target[property] = deepMerge(target[property], sourceProperty)\n    } else {\n      target[property] = sourceProperty\n    }\n  })\n  return target\n}\n\n/**\n * 深度合并对象，仅仅合并target已有的属性\n * @param target\n * @param source\n * @returns {*}\n */\nexport function deepMergeLeft(target, source) {\n  if (typeof target !== 'object') {\n    target = {}\n  }\n  if (Array.isArray(source)) {\n    return source.slice() // slice产生数组新副本\n  }\n  if (source === null || source === undefined) {\n    return source\n  }\n  Object.keys(target).forEach(property => {\n    if (Object.prototype.toString.call(target[property]) === '[object Object]') {\n      target[property] = deepMergeLeft(target[property], source[property])\n    } else if (Object.prototype.toString.call(source[property]) === '[object Object]') {\n      target[property] = deepMerge({}, source[property])\n    } else if (Object.prototype.toString.call(source[property]) === '[object Array]') {\n      target[property] = source[property].slice()\n    } else {\n      target[property] = source[property]\n    }\n  })\n  return target\n}\n\n/**\n * 为了moke模糊查询方便\n * 从数组中模糊查询获得匹配的子集\n * 全字段匹配\n * @param array\n * @param querys  ['hujie', '一路向北', '5349691']\n * @returns {*}\n */\nexport function fullQueryLike(array, ...querys) {\n  return array.filter(item => {\n    return Object.values(item).some(value => {\n      return querys.some(query => {\n        return new RegExp(query + '').test(value)\n      })\n    })\n  })\n}\n\n/**\n * 为了moke模糊查询方便\n * 从数组中模糊查询获得匹配的子集\n * 根据字段属性模糊匹配 and关系\n * @param array\n * @param query  {name: 'hujie', qq: '5349691'}\n * @returns {*}\n */\nexport function fieldQueryLike(array, query) {\n  const keys = Object.keys(query)\n  return array.filter(item => {\n    return keys.every(key => {\n      if (query[key] === null || query[key] === undefined || query[key] === '') {\n        return true\n      }\n      return new RegExp(query[key] + '').test(item[key] + '')\n    })\n  })\n}\n\n/**\n * @param array 数组\n * @param sort 仅仅支持非对象类型的字段，反之报错\n * @param isDesc  是否desc排序\n * @returns {*}\n */\nexport function sortArray(array, sort, isDesc) {\n  return array.sort((a, b) => { return isDesc && a[sort] - b[sort] })\n}\n\n/**\n * 添加或删除元素class属性\n * @param element 目标元素dom对象\n * @param className 需要添加或删除的class值，若存在，则删除，反之则添加\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\nexport const pickerOptions = [\n  {\n    text: '今天',\n    onClick(picker) {\n      const end = new Date()\n      const start = new Date(new Date().toDateString())\n      end.setTime(start.getTime())\n      picker.$emit('pick', [start, end])\n    }\n  },\n  {\n    text: '最近一周',\n    onClick(picker) {\n      const end = new Date(new Date().toDateString())\n      const start = new Date()\n      start.setTime(end.getTime() - 3600 * 1000 * 24 * 7)\n      picker.$emit('pick', [start, end])\n    }\n  },\n  {\n    text: '最近一个月',\n    onClick(picker) {\n      const end = new Date(new Date().toDateString())\n      const start = new Date()\n      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\n      picker.$emit('pick', [start, end])\n    }\n  },\n  {\n    text: '最近三个月',\n    onClick(picker) {\n      const end = new Date(new Date().toDateString())\n      const start = new Date()\n      start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)\n      picker.$emit('pick', [start, end])\n    }\n  }\n]\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 * 延时执行函数，长用于第三方组件与VUE无法完美集成时，入Echarts，两者的渲染存在时间差\n * @param func 延时执行的函数\n * @param wait  延时周期\n * @param immediate 是否立即执行\n * @returns {function(...[*]=): *}\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 * 创建唯一ID\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\nexport function isExternal(path) {\n  return /^(https?:|mailto:|tel:)/.test(path)\n}\n\n/**\n * 给tree结构中增加一个新节点,注意，该方法不考虑插入节点顺序问题，只追加在末尾处\n * @param node 需要新增进入的节点\n * @param nodes tree数据\n * @param id 表明tree的唯一标识的key值\n * @param parentId 表明tree的上下级关系的key值\n * @param children 表明tree节点子节点数组的key值\n */\nexport function addNode2Tree(node, nodes, isElementNode = true, id = 'id', parentId = 'parentId', children = 'children') {\n  for (let i = 0; i < nodes.length; i++) {\n    let nodeV = nodes[i];\n    if (isElementNode) {\n      nodeV = nodes[i].data\n    }\n    if (!nodeV[children]) {\n      nodeV[children] = []\n    }\n    if (nodeV[id] === node[parentId]) {\n      nodeV[children].push(node)\n      return\n    } else {\n      for (let j = 0; j < nodeV[children].length; j++) {\n        addNode2Tree(node, nodeV[children], id, parentId, children)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/utils/openWindow.js",
    "content": "/**\n * 打开windows窗口\n * @param {Sting} url\n * @param {Sting} title\n * @param {Number} w\n * @param {Number} h\n */\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\n    if (!hasPermission) {\n      return false\n    }\n    return true\n  } else {\n    console.error('权限不足')\n    return false\n  }\n}\n"
  },
  {
    "path": "src/utils/request.js",
    "content": "import axios from 'axios'\nimport Qs from 'Qs'\nimport { Message } from 'element-ui'\nimport store from '@/store'\n\n// 本工程中axios使用，均通过其API构建请求，可参考https://www.kancloud.cn/yunye/axios/234845\n// create an axios instance\nconst service = axios.create({\n  baseURL: process.env.BASE_API, // api 的 base_url\n  timeout: 20000 // request timeout\n})\nservice.defaults.withCredentials = true\n\n// request interceptor\nservice.interceptors.request.use(\n  request => {\n    // 后端服务jwt token信息\n    if (store.getters.token) {\n      request.headers.common['Authorization'] = `${store.getters.token}`\n    }\n    return request\n  },\n  error => {\n    // 请求发生错误\n    console.log('request interceptor error') // for debug\n    Promise.reject(error)\n  }\n)\n// {\n//   code: 1, //1：正确结果，2：回话过期，3：非法回话，4：权限不足，5：未知错误\n//   message: 后端错误信息\n//   data: 后端正常处理结果封装\n// }\n// response interceptor\nservice.interceptors.response.use(\n  response => {\n    const res = response.data\n    if ('' + res.code !== '1') {\n      if (('' + res.code).indexOf('3') === 0) { // 规则码3开头的均为回话问题，token过期等\n        Message({\n          message: '你已从其他终端登出，或回话已超时，请重新登录',\n          type: 'warning'\n        })\n        store.dispatch('FedLogOut').then(() => {\n          location.reload() // 为了重新实例化vue-router对象 避免bug\n        })\n      }\n      console.log('response interceptor: error') // for debug\n      if (res.message) {\n        Message({\n          message: res.message,\n          type: 'error',\n          duration: 3 * 1000\n        })\n      }\n      return Promise.reject('error')\n    } else {\n      console.log(res.data)\n      return res.data\n    }\n  },\n  error => {\n    console.log('response interceptor error') // for debug\n    Message({\n      message: error.message,\n      type: 'error',\n      duration: 3 * 1000\n    })\n    return Promise.reject(error)\n  }\n)\n\nexport default function ({ url, method = 'get', data = null }) {\n  // 解决axios post请求Request Payload问题\n  if (data && method.toLowerCase() === 'post') {\n    // 对 data 进行任意转换处理\n    const isDeep = Object.keys(data).findIndex(prop => {\n      const type = Object.prototype.toString.call(data[prop])\n      return type === '[object Object]' || type === '[object Array]' || type === '[object JSON]'\n    }) !== -1\n\n    if (isDeep) {\n      // 嵌套data,对层JSON对象,提交时采用 Request Payload 方案\n      // data 原样输出\n    } else {\n      // 非嵌套data，提交时采用Request FormData方案\n      // data需要进行转换\n      data = Qs.stringify(data)\n    }\n  }\n  if (method.toLowerCase() === 'post') {\n    return service({\n      url,\n      method,\n      data\n    })\n  } else if(method.toLowerCase() === 'get') {\n    return service({\n      url,\n      method,\n      params: data\n    })\n  } else {\n    throw \"目前仅仅支持get/post方法\"\n  }\n}\n"
  },
  {
    "path": "src/utils/scrollTo.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// because it's so fucking difficult to detect the scrolling element, just move them all\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\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/* 合法uri*/\nexport function validateURL(textval) {\n  const urlregex = /^(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 urlregex.test(textval)\n}\n\n/* 小写字母*/\nexport function validateLowerCase(str) {\n  const reg = /^[a-z]+$/\n  return reg.test(str)\n}\n\n/* 大写字母*/\nexport function validateUpperCase(str) {\n  const reg = /^[A-Z]+$/\n  return reg.test(str)\n}\n\n/* 大小写字母*/\nexport function validateAlphabets(str) {\n  const reg = /^[A-Za-z]+$/\n  return reg.test(str)\n}\n\n/**\n * validate email\n * @param email\n * @returns {boolean}\n */\nexport function validateEmail(email) {\n  const re = /^(([^<>()\\[\\]\\\\.,;:\\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 re.test(email)\n}\n"
  },
  {
    "path": "src/views/code-generator/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      dd\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\n\nexport default {\n  components: {  },\n  data() {\n    return {\n\n    }\n  },\n  methods: {\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/common/components/auditInfo/auditInfo.vue",
    "content": "<template>\n  <el-form :model=\"detail\" :label-width=\"labelWidth\" :size=\"size\" :inline=\"inline\">\n    <input-item-view label=\"创建人\">{{ detail.createdBy }}</input-item-view>\n    <input-item-view label=\"创建时间\">{{ detail.createdDate | parseTime }}</input-item-view>\n    <input-item-view label=\"最后修改人\">{{ detail.modifiedBy }}</input-item-view>\n    <input-item-view label=\"最后修改时间\">{{ detail.modifiedDate | parseTime }}</input-item-view>\n  </el-form>\n</template>\n\n<script>\n\nexport default {\n  props: {\n    inline: {\n      required: false,\n      type: Boolean,\n      default: false\n    },\n    size: {\n      required: false,\n      type: String,\n      default: 'small'\n    },\n    labelWidth: {\n      required: false,\n      type: String,\n      default: '200px'\n    },\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/common/components/buttons/ButtonRight.vue",
    "content": "<template>\n  <div class=\"full\">\n    <div class=\"left\">\n      <slot/>\n    </div>\n    <div class=\"right\">\n      <slot name=\"button\"/>\n    </div>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n  .full {\n    width: 100%;\n    .left {\n      display: inline;\n      width: 50%;\n      min-height: 32px;\n      line-height: 32px;\n    }\n    .right {\n      display: inline;\n      width: 50%;\n      min-height: 32px;\n      line-height: 32px;\n\n      .el-button, .el-button-group {\n        float: right;\n        margin-left: 15px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/buttons/NewLineButtonRight.vue",
    "content": "<template>\n  <div class=\"full\">\n    <slot/>\n    <div class=\"buttons\">\n      <slot name=\"buttons\"/>\n    </div>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n  .full {\n    width: 100%;\n\n    .buttons {\n      width: 100%;\n      margin-top: 10px;\n\n      .el-button, .el-button-group {\n        float: right;\n        margin-left: 15px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/dictionaryTranslates/State.vue",
    "content": "<template>\n  <el-tag :type=\"state === 1 ? 'success' : 'info'\" plain>{{ state | translateTrueOrFalse }}</el-tag>\n</template>\n\n<script>\nexport default {\n  props: {\n    state: {\n      required: true,\n      type: [String, Number],\n      default: () => {}\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/common/components/formItemViews/InputItemView.vue",
    "content": "<template>\n  <div :class=\"['el-form-item', elFormItemSize]\">\n    <label :style=\"{ width: labelWidth}\" class=\"el-form-item__label\">{{ label }}:</label>\n    <div :style=\"{ marginLeft: labelWidth}\" class=\"el-form-item__content\">\n      <div :class=\"['el-input', 'is-disabled', elInputSize]\">\n        <div class=\"el-input__inner break-word\">\n          <slot/>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    label: {\n      required: true,\n      type: String\n    },\n    labelWidth: {\n      required: false,\n      type: String,\n      default: '200px'\n    },\n    size: {\n      required: false,\n      type: String,\n      default: 'small'\n    }\n  },\n  computed: {\n    elFormItemSize() {\n      return 'el-form-item--' + this.size\n    },\n    elInputSize() {\n      return 'el-input--' + this.size\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-input__inner {\n    background-color: white !important;\n    border: none !important;\n  }\n  .break-word {\n    word-wrap: break-word;\n    word-break: break-all;\n    white-space: pre-wrap !important;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/formItemViews/TextItemView.vue",
    "content": "<template>\n  <div :class=\"['el-form-item', elFormItemSize]\">\n    <label :style=\"{ width: labelWidth}\" class=\"el-form-item__label\">{{ label }}:</label>\n    <div :style=\"{ marginLeft: labelWidth}\" class=\"el-form-item__content\">\n      <div :class=\"['el-textarea', 'is-disabled', elInputSize]\">\n        <div class=\"el-textarea__inner break-word\">\n          <slot/>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    label: {\n      required: true,\n      type: String\n    },\n    labelWidth: {\n      required: false,\n      type: String,\n      default: '200px'\n    },\n    size: {\n      required: false,\n      type: String,\n      default: 'small'\n    }\n  },\n  computed: {\n    elFormItemSize() {\n      return 'el-form-item--' + this.size\n    },\n    elInputSize() {\n      return 'el-input--' + this.size\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-textarea__inner {\n    background-color: white !important;\n    border: none !important;\n  }\n  .break-word {\n    word-wrap: break-word;\n    word-break: break-all;\n    white-space: pre-wrap !important;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/layouts/FlexCenter.vue",
    "content": "<template>\n  <div class=\"flex-container\">\n    <slot/>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n  .flex-container{\n    width: 100%;\n    padding: 10px 0px;\n    display: flex;\n    flex-flow: row wrap;\n    justify-content: center;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/layouts/FlexLeft.vue",
    "content": "<template>\n  <div class=\"flex-container\">\n    <slot/>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n  .flex-container{\n    width: 100%;\n    padding: 10px 0px;\n    display: flex;\n    flex-flow: row wrap;\n    justify-content: flex-start;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/layouts/FlexRight.vue",
    "content": "<template>\n  <div class=\"flex-container\">\n    <slot/>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n  .flex-container{\n    width: 100%;\n    padding: 10px 0px;\n    display: flex;\n    flex-flow: row wrap;\n    justify-content: flex-end;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/paginations/pagination.vue",
    "content": "<template>\n  <el-pagination\n    :current-page=\"pagination.page\"\n    :page-size=\"pagination.pageSize\"\n    :total=\"pagination.total\"\n    :page-sizes=\"pageSizes\"\n    :pager-count=\"pagerCount\"\n    :layout=\"layout\"\n    @size-change=\"pageSizeChangeHandler\"\n    @current-change=\"pageChangeHandler\"/>\n</template>\n\n<script>\nexport default {\n  props: {\n    pagination: {\n      required: true,\n      type: Object\n    },\n    pageSizes: {\n      required: false,\n      type: Array,\n      default: () => [10, 30, 50, 100, 200]\n    },\n    pagerCount: {\n      required: false,\n      type: Number,\n      default: 5\n    },\n    layout: {\n      required: false,\n      type: String,\n      default: 'total, sizes, prev, pager, next, jumper'\n    }\n  },\n  methods: {\n    pageSizeChangeHandler(pageSize) {\n      this.$emit('page-size-changed', pageSize)\n    },\n    pageChangeHandler(page) {\n      this.$emit('page-changed', page)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-pagination {\n    padding-top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/components/selects/SelectRight.vue",
    "content": "<template>\n  <div class=\"full\">\n    <div class=\"left\">\n      <slot name=\"left\"/>\n    </div>\n    <div class=\"right\">\n      <slot/>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .full {\n    width: 100%;\n    .left {\n      display: inline;\n      width: 50%;\n      min-height: 32px;\n      line-height: 32px;\n    }\n    .right {\n      display: inline;\n      width: 50%;\n      min-height: 32px;\n      line-height: 32px;\n\n      .el-select {\n        float: right;\n        margin-left: 15px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/common/index.js",
    "content": "import upperFirst from 'lodash/upperFirst'\nimport camelCase from 'lodash/camelCase'\n\nconst requireComponent = require.context(\n  // 其组件目录的相对路径\n  './components',\n  // 是否查询其子目录\n  true,\n  // 匹配基础组件文件名的正则表达式\n  /[A-Za-z]\\w+\\.vue$/\n)\n\nconst components = {}\n\nrequireComponent.keys().forEach(fileName => {\n  // 获取组件配置\n  const componentConfig = requireComponent(fileName)\n\n  fileName = (fileName.split('/'))[fileName.split('/').length - 1]\n\n  // 获取组件的 PascalCase 命名\n  const componentName = upperFirst(\n    camelCase(\n      // 排出子目录\n      // 结尾的扩展名\n      fileName.replace('.vue', '')\n    )\n  )\n\n  // 如果这个组件选项是通过 `export default` 导出的，\n  // 那么就会优先使用 `.default`，\n  // 否则回退到使用模块的根。\n  components[componentName] = componentConfig.default || componentConfig\n})\n\nexport default components\n"
  },
  {
    "path": "src/views/common/mixins/BaseEditForm.js",
    "content": "/**\n * newest 记录最新的表单（通常为后端返回结果存储）\n */\nexport default {\n  methods: {\n    backHandler(data) {\n      if (this.customBackHandler) {\n        this.customBackHandler(data)\n      } else {\n        this.$emit('option-changed')\n      }\n    },\n    submitHandler(form, otherSubmitHandler = null) {\n      this.newest = null\n      this.$refs[form].validate((valid) => {\n        if (!valid) return false\n        this.$confirm('确定要保存吗?', '提示', {\n          confirmButtonText: '确定',\n          cancelButtonText: '取消',\n          type: 'warning'\n        }).then(() => {\n          if (otherSubmitHandler) {\n            otherSubmitHandler()\n          } else {\n            this.customSubmitHandler()\n          }\n        }).catch(() => {\n          this.$message({\n            type: 'info',\n            message: '已取消操作'\n          })\n        })\n      })\n    },\n    submitSuccessHandler(data) {\n      this.optionSuccessHandler()\n      this.newest = data\n      if (this.customSubmitSuccessHandler) {\n        this.customSubmitSuccessHandler(data)\n      } else {\n        this.backHandler(data)\n      }\n    },\n    optionSuccessHandler() {\n      this.$message({\n        type: 'success',\n        message: '操作成功'\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/common/mixins/BaseQueryPageForm.js",
    "content": "/**\n * 适用于一个一个查询对象+一个分页结果集展示的简单组件\n * 约束：\n * 寄主对象中应具有：\n * --this.queryCriteria : 表单查询对象封装\n * --this.initQueryCriteria() : 表单查询对象初始化函数\n * --this.executeQueryPage : 分页表单查询接口\n */\n\nimport { deepMerge, deepClone } from '@/utils'\n\nexport default {\n  data() {\n    const pagination = this.initPagination()\n    return {\n      autoRefresh: true,\n      pagination: pagination\n    }\n  },\n  activated() {\n    if (this.autoRefresh) {\n      this.executeQueryPage()\n    }\n  },\n  methods: {\n    initPagination(pagination = {}) {\n      return deepMerge(pagination, {\n        total: 0,\n        pageSize: 10,\n        page: 1,\n        list: [],\n        filters: [],\n        sorts: []\n      })\n    },\n    resetHandler() {\n      this.initQueryCriteria(this.queryCriteria)\n      this.initPagination(this.pagination)\n      this.executeQueryPage()\n    },\n    queryHandler() {\n      this.initPagination(this.pagination)\n      this.executeQueryPage()\n    },\n    createQueryParams() {\n      this.pagination.filters = []\n      Object.keys(this.queryCriteria).forEach(key => {\n        const value = this.queryCriteria[key]\n        if (value) {\n          if (typeof value === 'object') {\n            this.pagination.filters.push({ field: key, value: deepClone(value) })\n          } else {\n            this.pagination.filters.push({ field: key, value: value })\n          }\n        }\n      })\n      let filters = this.pagination.filters;\n      if (this.pagination.sorts) {\n        filters = filters.concat(this.pagination.sorts)\n      }\n      console.log(filters)\n      return {\n        page: this.pagination.page,\n        pageSize: this.pagination.pageSize,\n        filters: filters\n      }\n    },\n    queryResultHandler(result) {\n      return deepMerge(this.pagination, result)\n    },\n    pageSizeChangeHandler(pageSize) {\n      this.pagination.pageSize = pageSize\n      this.pagination.page = 1\n      this.executeQueryPage()\n    },\n    pageChangeHandler(page) {\n      this.pagination.page = page\n      this.executeQueryPage()\n    },\n    sortChangeHandler({ column, prop, order }) {\n      // ElementUI 目前并不支持远端多字段排序\n      // sorts数组设计的目的是为了支持ElementUI后续拓展\n\n      this.pagination.sorts = []\n      // sorts = [type: 'ORDER_BY_DESC', field: ['name']]\n      if (column) {\n        this.pagination.sorts.push({\n          field: [prop],\n          type: order === 'descending' ? 'ORDER_BY_DESC' : 'ORDER_BY_ASC'\n        })\n      }\n      this.pagination.page = 1\n      this.executeQueryPage()\n    },\n    delHandler() {\n      this.$confirm('此操作将永久删除, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        if (this.customDelHandler) {\n          this.customDelHandler()\n        } else {\n          this.$message({\n            type: 'info',\n            message: '您未定义删除逻辑处理方法customDelHandler'\n          })\n        }\n      }).catch(() => {\n        this.$message({\n          type: 'info',\n          message: '已取消删除'\n        })\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/dashboard/index.vue",
    "content": "<template>\n  <div class=\"dashboard-container\"/>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\n\nexport default {\n  name: 'Dashboard',\n  components: { },\n  data() {\n    return {\n      currentRole: 'adminDashboard'\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'roles'\n    ])\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/AppMain.vue",
    "content": "<template>\n  <section class=\"app-main\">\n    <el-card>\n      <transition name=\"fade-transform\" mode=\"out-in\">\n        <router-view :key=\"key\"/>\n      </transition>\n    </el-card>\n  </section>\n</template>\n\n<script>\nexport default {\n  name: 'AppMain',\n  computed: {\n    key() {\n      return this.$route.name\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-main {\n  min-height: calc(100vh - 84px);\n  width: 100%;\n  padding: 15px;\n  position: relative;\n  overflow: hidden;\n}\n</style>\n\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/Navbar.vue",
    "content": "<template>\n  <div class=\"navbar\">\n    <hamburger :toggle-click=\"toggleSideBar\" :is-active=\"sidebar.opened\" class=\"hamburger-container\"/>\n\n    <breadcrumb class=\"breadcrumb-container\"/>\n\n    <div class=\"right-menu\">\n\n      <el-tooltip content=\"全屏\" effect=\"dark\" placement=\"bottom\">\n        <screenfull class=\"screenfull right-menu-item\"/>\n      </el-tooltip>\n\n      <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\">\n        <div class=\"avatar-wrapper\">\n          <img :src=\"getAvatar(user.avatar)\" class=\"user-avatar\">\n        </div>\n        <el-dropdown-menu slot=\"dropdown\">\n          <el-dropdown-item>\n            <router-link to=\"/myself/modify\"><span style=\"display:block;\" >个人信息</span></router-link>\n          </el-dropdown-item>\n          <el-dropdown-item divided>\n            <span style=\"display:block;\" @click=\"logout\">退出</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 Hamburger from '@/components/Hamburger'\nimport Breadcrumb from '@/components/Breadcrumb'\nimport Screenfull from '@/components/Screenfull'\nimport * as UserAPI from '@/api/system-management/user'\nimport defaultAvatar from '@/assets/images/avatar.jpeg'\n\nexport default {\n  components: {\n    Hamburger,\n    Breadcrumb,\n    Screenfull\n  },\n  data() {\n    return {\n      previewAvatar: UserAPI.previewAvatar + '?token=' + this.$store.getters.token + '&avatar='\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'sidebar',\n      'user'\n    ])\n  },\n  methods: {\n    toggleSideBar() {\n      this.$store.dispatch('toggleSideBar')\n    },\n    getAvatar(avatar) {\n      if (avatar) {\n        return this.previewAvatar + avatar\n      } else if (avatar.trim().startsWith(\"http\")) {\n        return avatar\n      } else {\n        return defaultAvatar\n      }\n    },\n    logout() {\n      this.$store.dispatch('LogOut').then(() => {\n        location.reload()\n      })\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n.navbar {\n  height: 50px;\n  line-height: 50px;\n  border-radius: 0px !important;\n  .hamburger-container {\n    line-height: 58px;\n    height: 50px;\n    float: left;\n    padding: 0 10px;\n  }\n  .breadcrumb-container{\n    float: left;\n  }\n  .errLog-container {\n    display: inline-block;\n    vertical-align: top;\n  }\n  .right-menu {\n    float: right;\n    height: 100%;\n    &:focus{\n     outline: none;\n    }\n    .right-menu-item {\n      display: inline-block;\n      margin: 0 8px;\n    }\n    .screenfull {\n      height: 20px;\n    }\n    .international{\n      vertical-align: top;\n    }\n    .theme-switch {\n      vertical-align: 15px;\n    }\n    .avatar-container {\n      height: 50px;\n      margin-right: 15px;\n      .avatar-wrapper {\n        line-height: initial;\n        cursor: pointer;\n        margin-top: 5px;\n        position: relative;\n        .user-avatar {\n          width: 40px;\n          height: 40px;\n          border-radius: 50%;\n          border: 2px solid ghostwhite;\n        }\n        .el-icon-caret-bottom {\n          position: absolute;\n          right: -20px;\n          top: 25px;\n          font-size: 12px;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/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      vnodes.push(<svg-icon icon-class={icon}/>)\n    }\n\n    if (title) {\n      vnodes.push(<span slot='title'>{(title)}</span>)\n    }\n    return vnodes\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/Sidebar/Link.vue",
    "content": "<template>\n  <!-- eslint-disable-next-line vue/require-component-is -->\n  <component v-bind=\"linkProps(to)\">\n    <slot/>\n  </component>\n</template>\n\n<script>\nimport { isExternal } from '@/utils'\n\nexport default {\n  props: {\n    to: {\n      type: String,\n      required: true\n    }\n  },\n  methods: {\n    isExternalLink(routePath) {\n      return isExternal(routePath)\n    },\n    linkProps(url) {\n      if (this.isExternalLink(url)) {\n        return {\n          is: 'a',\n          href: url,\n          target: '_blank',\n          rel: 'noopener'\n        }\n      }\n      return {\n        is: 'router-link',\n        to: url\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/Sidebar/SidebarItem.vue",
    "content": "<template>\n\n  <div v-if=\"!item.hidden && item.children\" class=\"menu-wrapper\">\n    <!-- 判断是否可直接渲染，判断依据为： -->\n    <!-- 1、item及其一级子路由中，至多包含一个非hidden路由，记为onlyOneShowing -->\n    <!-- 2、&& onlyOneShowing是item本身或没有子路由 -->\n    <!-- 3、&& alwaysShow为false -->\n    <template v-if=\"hasOneShowingChild(item.children,item) && (!onlyOneShowing.children || onlyOneShowing.noShowingChildren) && !item.alwaysShow\">\n      <app-link :to=\"resolvePath(onlyOneShowing)\">\n        <el-menu-item :index=\"resolvePath(onlyOneShowing)\" :class=\"{'submenu-title-no-dropdown':!isNest}\">\n          <item v-if=\"onlyOneShowing.meta\" :icon=\"onlyOneShowing.meta.icon || item.meta.icon\" :title=\"onlyOneShowing.meta.title\" />\n        </el-menu-item>\n      </app-link>\n    </template>\n\n    <el-submenu v-else :index=\"item.name||item.path\">\n\n      <template slot=\"title\">\n        <item v-if=\"item.meta\" :icon=\"item.meta.icon\" :title=\"item.meta.title\" />\n      </template>\n\n      <template v-for=\"child in item.children\" v-if=\"!child.hidden\">\n        <sidebar-item\n          v-if=\"child.children && child.children.length > 0\"\n          :is-nest=\"true\"\n          :item=\"child\"\n          :key=\"child.path\"\n          :base-path=\"resolvePath(child)\"/>\n\n        <app-link v-else :to=\"resolvePath(child)\" :key=\"child.name\">\n          <el-menu-item :index=\"resolvePath(child)\">\n            <item v-if=\"child.meta\" :icon=\"child.meta.icon\" :title=\"child.meta.title\" />\n          </el-menu-item>\n        </app-link>\n      </template>\n    </el-submenu>\n\n  </div>\n</template>\n\n<script>\nimport path from 'path'\nimport { isExternal, obj2Param } from '@/utils'\nimport Item from './Item'\nimport AppLink from './Link'\n\nexport default {\n  name: 'SidebarItem',\n  components: { Item, AppLink },\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    return {\n      onlyOneShowing: null\n    }\n  },\n  methods: {\n    hasOneShowingChild(children, parent) {\n      const showingChildren = children.filter(item => {\n        if (item.hidden) {\n          return false\n        } else {\n          // 记录最后一个非hidden子路由\n          this.onlyOneShowing = item\n          return true\n        }\n      })\n\n      // 有且仅有一个可显示的非hidden子路由,根据上述记录结果，显示该子路由\n      if (showingChildren.length === 1) {\n        return true\n      }\n\n      // 没有可显示的非hidden子路由,显示自身路由\n      if (showingChildren.length === 0) {\n        this.onlyOneShowing = { ... parent, noShowingChildren: true }\n        return true\n      }\n\n      // 非hidden子路由大于1个\n      return false\n    },\n    resolvePath(router) {\n      const query = obj2Param(router.query)\n      let routerPath = router.path\n      if (isExternal(routerPath)) {\n        routerPath = routerPath + '?token=' + encodeURIComponent(this.$store.state.user.token)\n        if (query) {\n          routerPath = routerPath + query\n        }\n        return routerPath\n      }\n      routerPath = path.resolve(this.basePath, routerPath)\n      if (query) {\n        routerPath = routerPath + '?' + query\n      }\n      return routerPath\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n  .menu-wrapper {\n    .submenu-title-no-dropdown {\n      position: relative;\n\n      /deep/ .el-tooltip {\n        padding: 0px 10px !important;\n      }\n    }\n    /deep/ .el-submenu__title, .el-menu-item{\n      &:hover {\n        background-color: #001528 !important;\n      }\n    }\n  }\n\n</style>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/Sidebar/index.vue",
    "content": "<template>\n  <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n    <el-menu\n      :show-timeout=\"200\"\n      :default-active=\"getDefaultActive()\"\n      :collapse=\"isCollapse\"\n      mode=\"vertical\"\n      background-color=\"#304156\"\n      text-color=\"#bfcbd9\"\n      active-text-color=\"#409EFF\">\n      <el-menu-item class=\"logo\" index=\"-1\">UMI-SOFT</el-menu-item>\n      <sidebar-item v-for=\"route in permission_routers\" :key=\"route.name\" :item=\"route\" :base-path=\"route.path\" />\n    </el-menu>\n  </el-scrollbar>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport SidebarItem from './SidebarItem'\nimport { obj2Param } from '@/utils'\n\nexport default {\n  components: { SidebarItem },\n  computed: {\n    ...mapGetters([\n      'permission_routers',\n      'sidebar'\n    ]),\n    isCollapse() {\n      return !this.sidebar.opened\n    }\n  },\n  methods: {\n    getDefaultActive() {\n      const query = obj2Param(this.$route.query)\n      let routerPath = this.$route.path\n      if (query) {\n        routerPath = routerPath + '?' + query\n      }\n      return routerPath\n    }\n  }\n}\n</script>\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n  /deep/ .scrollbar-wrapper {\n    overflow-x: hidden!important;\n\n    .el-scrollbar__view {\n      height: 100%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/components/TagsView.vue",
    "content": "<template>\n  <div class=\"tags-view-container\">\n    <scroll-pane ref=\"scrollPane\" class=\"tags-view-wrapper\">\n      <router-link\n        v-for=\"tag in visitedViews\"\n        ref=\"tag\"\n        :class=\"isActive(tag)?'active':''\"\n        :to=\"{ path: tag.path, query: tag.query, fullPath: tag.fullPath }\"\n        :key=\"tag.path\"\n        tag=\"span\"\n        class=\"tags-view-item\"\n        @click.middle.native=\"closeSelectedTag(tag)\"\n        @contextmenu.prevent.native=\"openMenu(tag,$event)\">\n        {{ tag.title }}\n        <span 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)\">刷新</li>\n      <li @click=\"closeSelectedTag(selectedTag)\">关闭当前页面</li>\n      <li @click=\"closeOthersTags\">关闭其他页面</li>\n      <li @click=\"closeAllTags\">关闭全部页面</li>\n    </ul>\n  </div>\n</template>\n\n<script>\nimport ScrollPane from '@/components/ScrollPane'\n\nexport default {\n  components: { ScrollPane },\n  data() {\n    return {\n      visible: false,\n      top: 0,\n      left: 0,\n      selectedTag: {}\n    }\n  },\n  computed: {\n    visitedViews() {\n      return this.$store.state.tagsView.visitedViews\n    }\n  },\n  watch: {\n    $route() {\n      this.addViewTags()\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.addViewTags()\n  },\n  methods: {\n    isActive(route) {\n      return route.path === this.$route.path\n    },\n    addViewTags() {\n      const { name } = this.$route\n      if (name) {\n        this.$store.dispatch('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 === this.$route.fullPath) {\n            this.$refs.scrollPane.moveToTarget(tag)\n\n            // when query is different then update\n            if (tag.to.fullPath !== this.$route.fullPath) {\n              this.$store.dispatch('updateVisitedView', this.$route)\n            }\n\n            break\n          }\n        }\n      })\n    },\n    refreshSelectedTag(view) {\n      this.$nextTick(() => {\n        this.$router.replace({\n          path: '/redirect' + view.fullPath\n        })\n      })\n    },\n    closeSelectedTag(view) {\n      this.$store.dispatch('delView', view).then(({ visitedViews }) => {\n        if (this.isActive(view)) {\n          const latestView = visitedViews.slice(-1)[0]\n          if (latestView) {\n            this.$router.push(latestView)\n          } else {\n            this.$router.push('/redirect/index')\n          }\n        }\n      })\n    },\n    closeOthersTags() {\n      this.$router.push(this.selectedTag)\n      this.$store.dispatch('delOthersViews', this.selectedTag).then(() => {\n        this.moveToCurrentTag()\n      })\n    },\n    closeAllTags() {\n      this.$store.dispatch('delAllViews')\n      this.$router.push('/redirect/index')\n    },\n    openMenu(tag, e) {\n      const menuMinWidth = 105\n      const offsetLeft = this.$el.getBoundingClientRect().left\n      const offsetWidth = this.$el.offsetWidth\n      const maxLeft = offsetWidth - menuMinWidth\n      const left = e.clientX - offsetLeft + 15\n\n      if (left > maxLeft) {\n        this.left = maxLeft\n      } else {\n        this.left = left\n      }\n      this.top = e.clientY\n\n      this.visible = true\n      this.selectedTag = tag\n    },\n    closeMenu() {\n      this.visible = false\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n.tags-view-container {\n  height: 34px;\n  width: 100%;\n  background: #fff;\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: 100;\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 rel=\"stylesheet/scss\" 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/views/layout/LeftAccordionSidebar/components/index.js",
    "content": "export { default as Navbar } from './Navbar'\nexport { default as Sidebar } from './Sidebar/index.vue'\nexport { default as TagsView } from './TagsView'\nexport { default as AppMain } from './AppMain'\n"
  },
  {
    "path": "src/views/layout/LeftAccordionSidebar/index.vue",
    "content": "<template>\n  <div :class=\"classObj\" class=\"app-wrapper\">\n    <sidebar class=\"sidebar-container\"/>\n    <div class=\"main-container\">\n      <navbar/>\n      <tags-view/>\n      <app-main/>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { Navbar, Sidebar, AppMain, TagsView } from './components/index'\n\nexport default {\n  name: 'DefaultLayout',\n  components: {\n    Navbar,\n    Sidebar,\n    AppMain,\n    TagsView\n  },\n  computed: {\n    sidebar() {\n      return this.$store.state.app.sidebar\n    },\n    classObj() {\n      return {\n        'hide-sidebar': !this.sidebar.opened,\n        'open-sidebar': this.sidebar.opened,\n        'without-animation': this.sidebar.withoutAnimation\n      }\n    }\n  },\n  methods: {\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n  @import \"src/styles/mixin.scss\";\n\n  $sidebar-container-width: 220px !important;\n  $hide-sidebar-container-width: 36px !important;\n\n  .app-wrapper {\n    @include clearfix;\n    position: relative;\n    height: 100%;\n    width: 100%;\n\n    // 主体区域\n    .main-container {\n      min-height: 100%;\n      transition: margin-left .28s;\n      margin-left: $sidebar-container-width;\n      position: relative;\n    }\n\n    // 侧边栏\n    .sidebar-container {\n      transition: width 0.28s;\n      width: $sidebar-container-width;\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      /deep/ .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      /deep/ .el-scrollbar__bar.is-vertical {\n        right: 0px;\n      }\n      /deep/ .is-horizontal {\n        display: none;\n      }\n      /deep/ a {\n        display: inline-block;\n        width: 100%;\n        overflow: hidden;\n      }\n      /deep/ .svg-icon {\n        margin-right: 16px;\n      }\n      /deep/ .el-menu {\n        border: none;\n        height: 100%;\n        width: 100% !important;\n      }\n    }\n\n    &.hide-sidebar {\n      .sidebar-container {\n        width: $hide-sidebar-container-width;\n      }\n      .main-container {\n        margin-left: $hide-sidebar-container-width;\n      }\n\n      /deep/ .el-submenu {\n        overflow: hidden;\n        & > .el-submenu__title {\n          padding: 0 10px !important;\n          .el-submenu__icon-arrow {\n            display: none;\n          }\n        }\n      }\n\n      /deep/ .logo {\n        display: none;\n      }\n\n      .el-menu--vertical > .el-menu .svg-icon {\n        margin-right: 20px;\n      }\n    }\n\n    &.without-animation {\n      .main-container, .sidebar-container {\n        transition: none;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/layout/MenuGroup/index.vue",
    "content": "<template>\n  <router-view/>\n</template>\n\n<script>\n/**\n * 目的： 用于更多级的菜单，默认提供的layout不支持三级菜单\n */\nexport default {\n  name: 'MenuGroup',\n  computed: {\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/login/index.vue",
    "content": "<template>\n  <div class=\"login-container\">\n\n    <el-form ref=\"loginForm\" :model=\"loginForm\" :rules=\"loginRules\" class=\"login-form\" auto-complete=\"on\" label-position=\"left\">\n\n      <div class=\"title-container\">\n        <h3 class=\"title\">UMI-SOFT</h3>\n      </div>\n\n      <el-form-item prop=\"loginName\">\n        <span class=\"svg-container\">\n          <svg-icon icon-class=\"user\" />\n        </span>\n        <el-input\n          v-model=\"loginForm.loginName\"\n          placeholder=\"请填写用户名\"\n          name=\"loginName\"\n          type=\"text\"\n          auto-complete=\"on\" />\n      </el-form-item>\n\n      <el-form-item prop=\"password\">\n        <span class=\"svg-container\">\n          <svg-icon icon-class=\"password\" />\n        </span>\n        <el-input\n          :type=\"passwordType\"\n          v-model=\"loginForm.password\"\n          placeholder=\"请填写密码\"\n          name=\"password\"\n          auto-complete=\"on\"\n          @keyup.enter.native=\"handleLogin\" />\n        <span class=\"show-pwd\" @click=\"showPwd\">\n          <svg-icon icon-class=\"eye\" />\n        </span>\n      </el-form-item>\n      <el-form-item prop=\"captcha\">\n        <span class=\"svg-container\">\n          <svg-icon icon-class=\"captcha\" />\n        </span>\n        <el-input\n          v-model=\"loginForm.captcha\"\n          type=\"text\"\n          placeholder=\"请填写验证码\"\n          name=\"captcha\"\n          auto-complete=\"on\"\n          @keyup.enter.native=\"handleLogin\" />\n        <span class=\"captcha\">\n          <img :src=\"captchaBase64\" style=\"width: 100%; height: 100%;\" @click=\"getCaptcha\">\n        </span>\n      </el-form-item>\n      <el-button :loading=\"loading\" type=\"primary\" style=\"width:100%;margin-bottom:30px;\" @click.native.prevent=\"handleLogin\">登陆</el-button>\n\n    </el-form>\n  </div>\n</template>\n\n<script>\nimport UUID from 'es6-uuid'\nimport * as LoginAPI from '@/api/login'\n\nexport default {\n  name: 'Login',\n  data() {\n    const validatePassword = (rule, value, callback) => {\n      if (value && value.length < 5) {\n        callback(new Error())\n      } else {\n        callback()\n      }\n    }\n    const remoteValidator = (rule, value, callback) => {\n      if ('' + this.remoteError === '3' && rule.field === 'password') {\n        callback(new Error())\n      } else if ('' + this.remoteError === '2' && rule.field === 'captcha') {\n        callback(new Error())\n      } else {\n        callback()\n      }\n    }\n    return {\n      loginForm: {\n        loginName: 'admin',\n        password: 'admin',\n        captcha: null\n      },\n      loginRules: {\n        loginName: [{ required: true, trigger: 'change', message: '请填写用户名' }],\n        password: [{ required: true, trigger: 'change', message: '请填写密码' }, { validator: validatePassword, trigger: 'change', message: '请输入密码（至少5位）' }, { validator: remoteValidator, trigger: 'change', message: '用户名或密码错误' }],\n        captcha: [{ required: true, trigger: 'change', message: '请填写验证码' }, { validator: remoteValidator, trigger: 'change', message: '验证码错误' }]\n      },\n      remoteError: null,\n      captchaBase64: null,\n      passwordType: 'password',\n      loading: false,\n      redirect: undefined\n    }\n  },\n  watch: {\n    $route: {\n      handler: function(route) {\n        this.redirect = route.query && route.query.redirect\n      },\n      immediate: true\n    }\n  },\n  mounted() {\n    this.getCaptcha()\n  },\n  methods: {\n    showPwd() {\n      if (this.passwordType === 'password') {\n        this.passwordType = ''\n      } else {\n        this.passwordType = 'password'\n      }\n    },\n    getCaptcha() {\n      LoginAPI.captcha({ uuid: UUID(32) }).then(data => {\n        this.captchaBase64 = data\n      })\n    },\n    handleLogin() {\n      this.$refs.loginForm.validate(valid => {\n        if (valid) {\n          this.loading = true\n          LoginAPI.loginByLoginName(this.loginForm).then(data => {\n            if ('' + data.result === '1') {\n              this.$store.dispatch('LoginByLoginName', data.token)\n              this.$router.push({ path: this.redirect || '/' })\n            } else if ('' + data.result === '2') { // 验证码错误\n              this.remoteError = data.result\n              this.getCaptcha()\n              this.$refs.loginForm.validateField('captcha', () => {\n                this.remoteError = null\n              })\n            } else if ('' + data.result === '3') { // 用户名或密码错误\n              this.remoteError = data.result\n              this.getCaptcha()\n              this.$refs.loginForm.validateField('password', () => {\n                this.remoteError = null\n              })\n            }\n            this.loading = false\n          }).catch(() => {\n            this.loading = false\n          })\n        } else {\n          return false\n        }\n      })\n    }\n  }\n}\n</script>\n\n<style rel=\"stylesheet/scss\" lang=\"scss\">\n  /* 修复input 背景不协调 和光标变色 */\n\n  $bg:#283443;\n  $light_gray:#eee;\n  $cursor: #fff;\n\n  @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {\n    .login-container .el-input input{\n      color: $cursor;\n      &::first-line {\n        color: $light_gray;\n      }\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      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        &:-webkit-autofill {\n          -webkit-box-shadow: 0 0 0px 1000px $bg inset !important;\n          -webkit-text-fill-color: $cursor !important;\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 rel=\"stylesheet/scss\" lang=\"scss\" scoped>\n$bg:#2d3a4b;\n$dark_gray:#889aa4;\n$light_gray:#eee;\n\n.login-container {\n  position: fixed;\n  height: 100%;\n  width: 100%;\n  background-color: $bg;\n  .login-form {\n    position: absolute;\n    left: 0;\n    right: 0;\n    width: 520px;\n    max-width: 100%;\n    padding: 35px 35px 15px 35px;\n    margin: 120px auto;\n  }\n  .tips {\n    font-size: 14px;\n    color: #fff;\n    margin-bottom: 10px;\n    span {\n      &:first-of-type {\n        margin-right: 16px;\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  .title-container {\n    position: relative;\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    .set-language {\n      color: #fff;\n      position: absolute;\n      top: 5px;\n      right: 0px;\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  .captcha {\n    position: absolute;\n    right: 10px;\n    top: 3px;\n    font-size: 16px;\n    color: $dark_gray;\n    cursor: pointer;\n    user-select: none;\n    display: inline-block;\n    width: 200px;\n    height: 40px;\n  }\n  .thirdparty-button {\n    position: absolute;\n    right: 35px;\n    bottom: 28px;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/system-management/dept/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item v-if=\"parentDeptName\" label=\"上级部门\">\n      <el-input :value=\"parentDeptName\" disabled/>\n    </el-form-item>\n    <el-form-item label=\"部门类型\" prop=\"type\">\n      <el-input v-model=\"form.type\"/>\n    </el-form-item>\n    <el-form-item label=\"部门名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"部门编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"部门备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DeptAPI from '@/api/system-management/dept'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    if (this.detail.id) {\n      this.form.parentId = this.detail.id\n    }\n    this.getParentDeptName(this.form.parentId)\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      DeptAPI.addDept(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler(data) {\n      this.$emit('option-changed', 'edit', data)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/dept/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view v-if=\"parentDeptName\" label=\"上级部门\">{{ parentDeptName }}</input-item-view>\n          <input-item-view label=\"部门编号\">{{ detail.sortNum }}</input-item-view>\n          <input-item-view label=\"部门类型\">{{ detail.type }}</input-item-view>\n          <input-item-view label=\"部门名称\">{{ detail.name }}</input-item-view>\n          <text-item-view label=\"部门备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n      <el-collapse-item title=\"部门用户信息\" name=\"dept-user\">\n        <el-table :data=\"users\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n          <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n          </el-table-column>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"部门角色信息\" name=\"dept-role\">\n        <el-table :data=\"roles\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        </el-table>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  },\n  activated() {\n    this.getParentDeptName(this.detail.parentId)\n    this.queryAllUsers()\n    this.queryAllRoles()\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dept/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          部门信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n        <el-form-item label=\"ID\" prop=\"id\">\n          <el-input v-model=\"form.id\" disabled/>\n        </el-form-item>\n        <el-form-item v-if=\"parentDeptName\" label=\"上级部门\">\n          <el-input :value=\"parentDeptName\" disabled/>\n        </el-form-item>\n        <el-form-item label=\"部门类型\" prop=\"type\">\n          <el-input v-model=\"form.type\"/>\n        </el-form-item>\n        <el-form-item label=\"部门名称\" prop=\"name\">\n          <el-input v-model=\"form.name\"/>\n        </el-form-item>\n        <el-form-item label=\"部门编号\" prop=\"sortNum\">\n          <el-input v-model=\"form.sortNum\"/>\n        </el-form-item>\n        <el-form-item label=\"部门备注\" prop=\"remark\">\n          <el-input v-model=\"form.remark\" type=\"textarea\"/>\n        </el-form-item>\n      </el-form>\n    </el-card>\n    <el-card header=\"部门用户信息\">\n      <el-table :data=\"users\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n        <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n        </el-table-column>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delDeptUserHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"部门角色信息\">\n      <el-table :data=\"roles\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delDeptRoleHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DeptAPI from '@/api/system-management/dept'\nimport * as UserDeptAPI from '@/api/system-management/userDept'\nimport * as DeptRoleAPI from '@/api/system-management/deptRole'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      newest: null, // 记录最新的值，后端返回时存储\n      form: form,\n      rules: rules,\n      users: []\n    }\n  },\n  activated() {\n    this.newest = this.detail\n    DeptAPI.queryDeptById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.getParentDeptName(this.form.parentId)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.queryAllUsers()\n    this.queryAllRoles()\n  },\n  methods: {\n    customBackHandler() {\n      this.$emit('option-changed', 'query', this.newest)\n    },\n    customSubmitHandler() {\n      DeptAPI.editDept(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n    },\n    delDeptUserHandler(id) {\n      const params = {\n        userId: id,\n        deptId: this.detail.id\n      }\n      UserDeptAPI.delByEntityMapping(params).then(() => {\n        this.optionSuccessHandler()\n        this.queryAllUsers()\n      })\n    },\n    delDeptRoleHandler(id) {\n      const params = {\n        roleId: id,\n        deptId: this.detail.id\n      }\n      DeptRoleAPI.delByEntityMapping(params).then(() => {\n        this.optionSuccessHandler()\n        this.queryAllRoles()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dept/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/dept/mixins.js",
    "content": "import * as DeptAPI from '@/api/system-management/dept'\n\nexport default {\n  data() {\n    return {\n      parentDeptName: '',\n      users: [],\n      roles: []\n    }\n  },\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        token: null,\n        parentId: null,\n        type: '',\n        name: '',\n        sortNum: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        type: [{\n          required: true, message: '请输入部门类型', trigger: 'blur'\n        }],\n        name: [{\n          required: true, message: '请输入部门名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入部门编号', trigger: 'blur'\n        }]\n      }\n    },\n    queryAllUsers() {\n      this.users = []\n      DeptAPI.queryAllDeptUsers(this.detail.id).then(users => {\n        this.users = users\n      })\n    },\n    queryAllRoles() {\n      this.roles = []\n      DeptAPI.queryAllDeptRoles(this.detail.id).then(roles => {\n        this.roles = roles\n      })\n    },\n    getParentDeptName(id) {\n      this.parentDeptName = ''\n      if (!id) return\n      DeptAPI.queryDeptById(id).then(dept => {\n        this.parentDeptName = dept.name\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/dept/query.vue",
    "content": "<template>\n  <el-row>\n    <el-col :span=\"24\">\n      <el-card>\n        <el-input v-model=\"filter\" placeholder=\"输入关键字进行过滤\"/>\n      </el-card>\n    </el-col>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        部门树列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','add', selected)\">新增子部门</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-tree :data=\"[{}]\" :props=\"defaultProps\">\n        <div class=\"custom-tree-node\">\n          <div class=\"name\">名称</div>\n          <div class=\"time\">最后修改时间</div>\n          <div class=\"time\">创建时间</div>\n        </div>\n      </el-tree>\n      <el-tree ref=\"tree\" :data=\"nodes\" :props=\"defaultProps\" :filter-node-method=\"filterNodeHandler\" node-key=\"id\" class=\"filter-tree\" highlight-current accordion @current-change=\"(value, node) => selected = value\">\n        <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n          <div class=\"name\">{{ data.name }}</div>\n          <div class=\"time\">{{ data.modifiedDate | parseTime }}</div>\n          <div class=\"time\">{{ data.createdDate | parseTime }}</div>\n        </div>\n      </el-tree>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport * as DeptAPI from '@/api/system-management/dept'\n\nexport default {\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      filter: null,\n      selected: null,\n      nodes: [],\n      defaultProps: {\n        children: 'children',\n        label: 'name'\n      }\n    }\n  },\n  watch: {\n    filter(filter) {\n      this.$refs.tree.filter(filter)\n    }\n  },\n  created() {\n    this.queryAllHandler()\n  },\n  activated() {\n    this.selected = null\n    if (this.detail && this.detail.id) {\n      let result = this.$refs.tree.getNode(this.detail.id)\n      if (result !== null) {\n        // 页面显示的三项字段将被更新，其中createdDate无需更新\n        result.data.name = this.detail.name\n        result.data.modifiedDate = this.detail.modifiedDate\n      } else if(this.detail.parentId) { // 新增操作获取的, 子节点\n        this.$refs.tree.append(this.detail, this.detail.parentId)\n      } else { // 新增操作获取的,根节点\n        let beforeNodeKey = null\n        if (this.nodes && this.nodes.length > 0) {\n          beforeNodeKey = this.nodes[this.nodes.length - 1].id\n        }\n        this.$refs.tree.insertAfter(this.detail, beforeNodeKey)\n      }\n      this.$refs.tree.filter(this.filter)\n    }\n  },\n  methods: {\n    queryAllHandler() {\n      DeptAPI.queryAllTreeDepts().then(data => {\n        this.nodes = data\n        this.$nextTick(() => {\n          this.$refs.tree.filter(this.filter)\n        })\n      })\n    },\n    delHandler() {\n      this.$confirm('此操作将永久删除, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        DeptAPI.delDept(this.selected.id).then(() => {\n          this.queryAllHandler()\n          this.$message({\n            type: 'success',\n            message: '删除成功'\n          })\n        })\n      }).catch(() => {\n        this.$message({\n          type: 'info',\n          message: '已取消删除'\n        })\n      })\n    },\n    filterNodeHandler(value, data) {\n      if (!value) return true\n      const show = data.name.indexOf(value) !== -1\n      if (!show && this.selected && this.selected.id === data.id) {\n        this.selected = null\n      }\n      return show\n    },\n    findNodeById(id,node) {\n      if (node.id === id) {\n        return node\n      }\n      if (node.children) {\n        for(let i = 0; i < node.children.length; i++) {\n          const result = this.findNodeById(id, node.children[i])\n          if (result !== null) {\n            return node\n          }\n        }\n      }\n      return null\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n    .time {\n      float: right;\n      width: 200px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item v-if=\"parentDictionaryName\" label=\"上级字典\">\n      <el-input :value=\"parentDictionaryName\" disabled/>\n    </el-form-item>\n    <!--  禁止多级字典新增子节点时编辑分类，应该直接继承自父节点即可 -->\n    <el-form-item v-if=\"categoryEditAble\" label=\"字典分类\" prop=\"type\">\n      <el-select v-model=\"form.type\" filterable clearable placeholder=\"请输入字典分类关键词进行搜索\">\n        <el-option v-for=\"(item, index) in dictionaryTypeList\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n      </el-select>\n    </el-form-item>\n    <el-form-item label=\"字典名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"字典规则码\" prop=\"code\">\n      <el-input v-model=\"form.code\"/>\n    </el-form-item>\n    <el-form-item label=\"字典编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"字典备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      newest: null, // 记录最新的值，后端返回时存储\n      form: form,\n      rules: rules\n    }\n  },\n  computed: {\n    categoryEditAble() {\n      return !(this.category === '3' && this.form.parentId !== 'root')\n    }\n  },\n  activated() {\n    this.newest = null\n    deepMergeLeft(this.form, this.initForm())\n    this.form.category = this.category\n    if (this.category === '3') {\n      this.form.parentId = this.detail.id ? this.detail.id : 'root'\n      this.form.type = this.detail.type\n    }\n    this.getParentDictionaryName(this.form.parentId)\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n    this.queryAllDictionaryType()\n  },\n  methods: {\n    customBackHandler() {\n      this.$emit('option-changed', 'query', this.newest)\n    },\n    customSubmitHandler() {\n      DictionaryAPI.addDictionary(this.form).then(this.submitSuccessHandler)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-select {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view v-if=\"parentDictionaryName\" label=\"上级字典\">{{ parentDictionaryName }}</input-item-view>\n          <input-item-view label=\"字典类型\">{{ detail.category | translateDicCategory }}</input-item-view>\n          <input-item-view label=\"字典分类\">{{ getDictionaryTypeName(detail.type) }}</input-item-view>\n          <input-item-view label=\"字典名称\">{{ detail.name }}</input-item-view>\n          <input-item-view label=\"字典规则码\">{{ detail.code }}</input-item-view>\n          <input-item-view label=\"字典编号\">{{ detail.sortNum }}</input-item-view>\n          <text-item-view label=\"字典备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  },\n  activated() {\n    this.getParentDictionaryName(this.detail.parentId)\n    this.queryAllDictionaryType()\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary/edit.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"ID\" prop=\"id\">\n      <el-input v-model=\"form.id\" disabled/>\n    </el-form-item>\n    <el-form-item v-if=\"parentDictionaryName\" label=\"上级字典\">\n      <el-input :value=\"parentDictionaryName\" disabled/>\n    </el-form-item>\n    <el-form-item label=\"字典名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"字典规则码\" prop=\"code\">\n      <el-input v-model=\"form.code\"/>\n    </el-form-item>\n    <el-form-item label=\"字典编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"字典备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    delete form.category\n    delete rules.category\n    delete form.parentId\n    delete rules.parentId\n    delete form.type\n    delete rules.type\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      newest: null, // 记录最新的值，后端返回时存储\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    this.newest = this.detail\n    DictionaryAPI.queryDictionaryById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.getParentDictionaryName(this.form.parentId)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.queryAllDictionaryType()\n  },\n  methods: {\n    customBackHandler() {\n      this.$emit('option-changed', 'query', this.newest)\n    },\n    customSubmitHandler() {\n      DictionaryAPI.editDictionary(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-select {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary/mixins.js",
    "content": "import { mapGetters } from 'vuex'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\n\nexport default {\n  props: {\n    category: {\n      required: true,\n      type: String,\n      default: () => {}\n    },\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      parentDictionaryName: '',\n      dictionaryTypeList: []\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        token: null,\n        parentId: null,\n        category: 2,\n        type: '',\n        name: '',\n        code: '',\n        sortNum: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        category: [{\n          required: true, message: '字典类别为必填项', trigger: 'change'\n        }],\n        type: [{\n          required: true, message: '请选择字典类型', trigger: 'change'\n        }],\n        name: [{\n          required: true, message: '请输入字典名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入字典编号', trigger: 'blur'\n        }]\n      }\n    },\n    queryAllDictionaryType() {\n      DictionaryAPI.queryAllDictionaries([{ field: 'category', value: 1 }]).then((list) => {\n        this.dictionaryTypeList = list\n      }, () => {\n        this.dictionaryTypeList = []\n      })\n    },\n    getDictionaryTypeName(type) {\n      const dictionary = this.dictionaryTypeList.find(item => item.id === type)\n      if (dictionary) {\n        return dictionary.name\n      }\n      return type\n    },\n    getParentDictionaryName(id) {\n      this.parentDictionaryName = ''\n      if (!id || id === 'root') return\n      DictionaryAPI.queryDictionaryById(id).then(dictionary => {\n        this.parentDictionaryName = dictionary.name\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/dictionary/multiMain.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" category=\"3\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './multiQuery'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/dictionary/multiQuery.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"20\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"字典分类:\" prop=\"type\">\n            <el-select v-model=\"queryCriteria.type\" filterable clearable placeholder=\"全部\">\n              <el-option v-for=\"(item, index) in dictionaryTypeList\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n            </el-select>\n          </el-form-item>\n          <el-form-item label=\"字典名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入字典名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"4\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        字典列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','add', selected)\">新增下级</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-card>\n        <el-input v-model=\"filter\" placeholder=\"输入关键字对已加载的数据进行过滤\"/>\n      </el-card>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-tree :data=\"[{}]\" :props=\"defaultProps\">\n        <div class=\"custom-tree-node\">\n          <div class=\"name\">字典名称</div>\n          <div class=\"type\">字典分类</div>\n        </div>\n      </el-tree>\n      <!-- eslint-disable-next-line vue/max-attributes-per-line -->\n      <el-tree ref=\"tree\" :data=\"pagination.list\" :load=\"loadChildren\" :props=\"defaultProps\" :filter-node-method=\"filterNodeHandler\" node-key=\"id\" class=\"filter-tree\" highlight-current accordion lazy @current-change=\"(value, node) => selected = value\">\n        <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n          <div class=\"name\">{{ data.name }}</div>\n          <div class=\"type\">{{ getDictionaryTypeName(data.type) }}</div>\n        </div>\n      </el-tree>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseQueryPageForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null,\n      defaultProps: {\n        children: 'children',\n        label: 'name'\n      },\n      filter: ''\n    }\n  },\n  watch: {\n    filter(filter) {\n      this.$refs.tree.filter(filter)\n    }\n  },\n  created() {\n    this.autoRefresh = false\n    this.executeQueryPage()\n  },\n  activated() {\n    this.selected = null\n    this.queryAllDictionaryType()\n    // 目前的设计逻辑为，新增之后，立即跳转至编辑，可由编辑页面返回至查询页面\n    // 意味着页面跳转过程中，从查看页面返回的detail，为空对象{}\n    // detail为非空对象时，可能是从新增或修改页面返回回来的，id可从当前列表中找到则为编辑，反之则为新增\n    // 注意，从新增页面跳转至编辑，再返回，id也是在当前列表中找不到的\n    if (this.detail && this.detail.id) {\n      let result = this.$refs.tree.getNode(this.detail.id)\n      if (result !== null) { // 说明 detail 是从更新页面传递过来的\n        // 页面显示的2项字段将被更新, type无需更新，修改时不允许修改\n        result.data.name = this.detail.name\n        this.$refs.tree.filter(this.filter)\n      } else if(this.detail.parentId && this.detail.parentId !== 'root') { // 新增操作获取的, 子节点\n        this.$refs.tree.append(this.detail, this.detail.parentId)\n        this.$refs.tree.filter(this.filter)\n      } else { // 新增操作获取的,根节点\n        this.executeQueryPage()\n      }\n    }\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        category: '3',\n        parentId: 'root',\n        type: '',\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      DictionaryAPI.queryPageDictionaries(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n        this.$refs.tree.filter(this.filter)\n      })\n    },\n    customDelHandler() {\n      DictionaryAPI.delDictionary(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    },\n    loadChildren(node, resolve) {\n      if (!node.data.id) return\n      DictionaryAPI.queryAllDictionaries([{ field: 'category', value: 3 }, { field: 'parentId', value: node.data.id }]).then(data => {\n        resolve(data)\n      })\n    },\n    filterNodeHandler(value, data) {\n      if (!value) return true\n      const show = data.name.indexOf(value) !== -1\n      if (!show && this.selected && this.selected.id === data.id) {\n        this.selected = null\n      }\n      return show\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .type {\n      float: right;\n      width: 400px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary/singleMain.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" category=\"2\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './singleQuery'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/dictionary/singleQuery.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"20\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"字典分类:\" prop=\"type\">\n            <el-select v-model=\"queryCriteria.type\" filterable clearable placeholder=\"全部\">\n              <el-option v-for=\"(item, index) in dictionaryTypeList\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n            </el-select>\n          </el-form-item>\n          <el-form-item label=\"字典名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入字典名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"4\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        字典列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"type\" label=\"字典分类\" sortable=\"custom\">\n          <template slot-scope=\"scope\">\n            {{ getDictionaryTypeName(scope.row.type) }}\n          </template>\n        </el-table-column>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"code\" label=\"规则码\" width=\"120\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"sortNum\" label=\"编号\" width=\"80\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseQueryPageForm, mixins],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null\n    }\n  },\n  activated() {\n    this.selected = null\n    this.queryAllDictionaryType()\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        category: '2',\n        type: '',\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      DictionaryAPI.queryPageDictionaries(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      DictionaryAPI.delDictionary(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"字典分类名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类规则码\" prop=\"code\">\n      <el-input v-model=\"form.code\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      DictionaryAPI.addDictionary(this.form).then(this.submitSuccessHandler)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view label=\"字典分类名称\">{{ detail.name }}</input-item-view>\n          <input-item-view label=\"字典分类规则码\">{{ detail.code }}</input-item-view>\n          <input-item-view label=\"字典分类编号\">{{ detail.sortNum }}</input-item-view>\n          <text-item-view label=\"字典分类备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/edit.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"ID\" prop=\"id\">\n      <el-input v-model=\"form.id\" disabled/>\n    </el-form-item>\n    <el-form-item label=\"字典分类名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类规则码\" prop=\"code\">\n      <el-input v-model=\"form.code\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"字典分类备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    delete form.category\n    const rules = this.initRules()\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    DictionaryAPI.queryDictionaryById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      DictionaryAPI.editDictionary(this.form).then(this.submitSuccessHandler)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/mixins.js",
    "content": "export default {\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        token: null,\n        parentId: null,\n        category: 1,\n        type: '',\n        name: '',\n        code: '',\n        sortNum: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        name: [{\n          required: true, message: '请输入字典分类名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入字典分类编号', trigger: 'blur'\n        }]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/dictionary-type/query.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"18\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"字典类型名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入字典类型名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"6\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        字典类型列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable=\"custom\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"code\" label=\"规则码\" width=\"120\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"sortNum\" label=\"编号\" width=\"80\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as DictionaryAPI from '@/api/system-management/dictionary'\n\nexport default {\n  mixins: [BaseQueryPageForm],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  activated() {\n    this.selected = null\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        category: 1,\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      DictionaryAPI.queryPageDictionaries(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      DictionaryAPI.delDictionary(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/group/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"分组名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"分组编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"分组备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as GroupAPI from '@/api/system-management/group'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      GroupAPI.addGroup(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler(data) {\n      this.$emit('option-changed', 'edit', data)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/group/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view label=\"分组编号\">{{ detail.sortNum }}</input-item-view>\n          <input-item-view label=\"分组名称\">{{ detail.name }}</input-item-view>\n          <text-item-view label=\"分组备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n      <el-collapse-item :title=\"getGroupName()\" name=\"group\">\n        <el-table :data=\"groups\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户信息\" name=\"group-user\">\n        <el-table :data=\"users\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n          <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n          </el-table-column>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item v-if=\"isRoleGroup\" title=\"角色信息\" name=\"group-role\">\n        <el-table :data=\"roles\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column prop=\"sortNum\" label=\"角色编号\" width=\"100\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"角色名称\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"角色备注\" sortable align=\"center\"/>\n        </el-table>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  data() {\n    return {\n      labelWidth: '200px',\n      users: [],\n      roles: [],\n      groups: []\n    }\n  },\n  activated() {\n    this.queryAllUsers() // 查询分组下的用户\n    this.queryAllGroups() // 查询分组关联的分组\n    if (this.isRoleGroup) {\n      this.queryAllRoles()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/group/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          基础信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n        <el-form-item label=\"ID\" prop=\"id\">\n          <el-input v-model=\"form.id\" disabled/>\n        </el-form-item>\n        <el-form-item label=\"分组名称\" prop=\"name\">\n          <el-input v-model=\"form.name\"/>\n        </el-form-item>\n        <el-form-item label=\"分组编号\" prop=\"sortNum\">\n          <el-input v-model=\"form.sortNum\"/>\n        </el-form-item>\n        <el-form-item label=\"分组备注\" prop=\"remark\">\n          <el-input v-model=\"form.remark\" type=\"textarea\"/>\n        </el-form-item>\n      </el-form>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">{{ getGroupName() }}</template>\n          <el-select v-model=\"groupId\" placeholder=\"添加分组\" clearable filterable @change=\"addGroupHandler\">\n            <el-option v-for=\"(item, index) in allGroups\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"groups\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delGroupHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"用户信息\">\n      <el-table :data=\"users\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n        <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n        </el-table-column>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delUserHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card v-if=\"isRoleGroup\" header=\"角色信息\">\n      <el-table :data=\"roles\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column prop=\"sortNum\" label=\"角色编号\" width=\"100\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"角色名称\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"角色备注\" sortable align=\"center\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delGroupRoleHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as GroupAPI from '@/api/system-management/group'\nimport * as UserGroupAPI from '@/api/system-management/userGroup'\nimport * as UserRoleGroupAPI from '@/api/system-management/userRoleGroup'\nimport * as UserGroupRoleGroupAPI from '@/api/system-management/userGroupRoleGroup'\nimport * as RoleGroupAPI from '@/api/system-management/roleGroup'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      form: form,\n      rules: rules,\n      users: [],\n      roles: [],\n      groups: [],\n      groupId: null,\n      allGroups: []\n    }\n  },\n  activated() {\n    GroupAPI.queryGroupById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.queryAllUsers()\n    this.queryAllGroups()\n    if (this.isRoleGroup) {\n      this.queryAllRoles()\n    }\n    if (this.isUserGroup) {\n      GroupAPI.queryAllGroups([{ field: 'category', value: 1 }]).then(data => {\n        this.allGroups = data\n      }) // 系统已有的所有用户组\n    }\n    if (this.isRoleGroup) {\n      GroupAPI.queryAllGroups([{ field: 'category', value: 2 }]).then(data => {\n        this.allGroups = data\n      }) // 系统已有的所有角色组\n    }\n  },\n  methods: {\n    customSubmitHandler() {\n      GroupAPI.editGroup(this.form).then(this.submitSuccessHandler)\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n    },\n    delUserHandler(id) {\n      const params = { userId: id }\n      let delByEntityMapping = null\n      if (this.isUserGroup) {\n        params.groupId = this.detail.id\n        delByEntityMapping = UserGroupAPI.delByEntityMapping // 用户分组下的用户\n      }\n      if (this.isRoleGroup) {\n        params.roleGroupId = this.detail.id\n        delByEntityMapping = UserRoleGroupAPI.delByEntityMapping // 角色分组下的用户\n      }\n      delByEntityMapping(params).then(() => {\n        this.optionSuccessHandler()\n        this.queryAllUsers()\n      })\n    },\n    delGroupRoleHandler(id) {\n      const params = {\n        roleId: id,\n        groupId: this.detail.id\n      }\n      RoleGroupAPI.delByEntityMapping(params).then(() => {\n        this.optionSuccessHandler()\n        this.queryAllRoles()\n      })\n    },\n    addGroupHandler() {\n      if (!this.groupId) return // 防止取消选择时触发\n      let params = null\n      if (this.isUserGroup) {\n        params = {\n          userGroupId: this.detail.id,\n          roleGroupId: this.groupId\n        }\n      }\n      if (this.isRoleGroup) {\n        params = {\n          roleGroupId: this.detail.id,\n          userGroupId: this.groupId\n        }\n      }\n      UserGroupRoleGroupAPI.add(params).then(() => {\n        this.queryAllGroups()\n        this.optionSuccessHandler()\n      })\n    },\n    delGroupHandler(id) {\n      let params = null\n      if (this.isUserGroup) {\n        params = {\n          userGroupId: this.detail.id,\n          roleGroupId: id\n        }\n      }\n      if (this.isRoleGroup) {\n        params = {\n          roleGroupId: this.detail.id,\n          userGroupId: id\n        }\n      }\n      UserGroupRoleGroupAPI.delByEntityMapping(params).then(() => {\n        this.queryAllGroups()\n        this.optionSuccessHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/group/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/group/mixins.js",
    "content": "import * as GroupAPI from '@/api/system-management/group'\n\nexport default {\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      isUserGroup: this.$route.query.category === '' + 1,\n      isRoleGroup: this.$route.query.category === '' + 2\n    }\n  },\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        // 新增操作，根据路由决定该值的实际取值，分组可面向用户、角色等\n        // 其他操作不允许修改该字段\n        category: this.$route.query.category,\n        name: '',\n        sortNum: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        category: [{\n          required: true, message: '请输入分组类型', trigger: 'blur'\n        }],\n        name: [{\n          required: true, message: '请输入分组名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入分组编号', trigger: 'blur'\n        }]\n      }\n    },\n    queryAllUsers() {\n      this.users = []\n      let queryAllUsers = null\n      if (this.isUserGroup) {\n        queryAllUsers = GroupAPI.queryAllUserGroupUsers // 用户分组下的所有用户\n      }\n      if (this.isRoleGroup) {\n        queryAllUsers = GroupAPI.queryAllRoleGroupUsers // 角色分组下的所有用户\n      }\n      queryAllUsers(this.detail.id).then(users => {\n        this.users = users\n      })\n    },\n    queryAllGroups() {\n      this.groups = []\n      let queryAllGroups = null\n      if (this.isUserGroup) {\n        queryAllGroups = GroupAPI.queryAllRoleGroups // 用户分组下的所有角色分组\n      }\n      if (this.isRoleGroup) {\n        queryAllGroups = GroupAPI.queryAllUserGroups // 角色分组下的所有用户分组\n      }\n      queryAllGroups(this.detail.id).then(groups => {\n        this.groups = groups\n      })\n    },\n    queryAllRoles() {\n      this.roles = []\n      GroupAPI.queryAllGroupRoles(this.detail.id).then(roles => {\n        this.roles = roles\n      })\n    },\n    getGroupName() {\n      if (this.isUserGroup) return '关联的角色组信息'\n      if (this.isRoleGroup) return '关联的用户组信息'\n      return '未知分组信息'\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/group/query.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"18\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"分组名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入分组名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"6\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        分组列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable=\"custom\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as GroupAPI from '@/api/system-management/group'\n\nexport default {\n  mixins: [BaseQueryPageForm],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  activated() {\n    this.selected = null\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        category: this.$route.query.category,\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      GroupAPI.queryPageGroups(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      GroupAPI.delGroup(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/menu/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form>\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view v-if=\"parentMenuName\" label=\"上级菜单\">{{ parentMenuName }}</input-item-view>\n          <input-item-view label=\"菜单编号\">{{ detail.sortNum }}</input-item-view>\n          <input-item-view label=\"菜单名称\">{{ detail.name }}</input-item-view>\n          <input-item-view label=\"菜单图标名称\">{{ detail.icon }}</input-item-view>\n          <text-item-view label=\"菜单备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n      <el-collapse-item title=\"菜单资源权限信息\" name=\"menu-security\">\n        <el-col :span=\"24\">\n          <el-table :data=\"securities\" border style=\"width: 100%\">\n            <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n            <el-table-column :show-overflow-tooltip=\"true\" prop=\"securityDef\" label=\"定义\" sortable/>\n            <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n          </el-table>\n        </el-col>\n      </el-collapse-item>\n      <el-collapse-item title=\"菜单角色信息\" name=\"menu-role\">\n        <el-table :data=\"roles\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"角色名称\"/>\n        </el-table>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  },\n  activated() {\n    this.getParentMenuName(this.detail.parentId)\n    this.queryMenuSecurities()\n    this.queryMenuRoles()\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/menu/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">资源权限信息</template>\n          <el-select v-model=\"securityId\" placeholder=\"添加角色\" clearable filterable @change=\"addSecirityHandler\">\n            <el-option v-for=\"(item, index) in allSecurities\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"securities\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"securityDef\" label=\"定义\" sortable/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delSecirityHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"角色信息\">\n      <el-table :data=\"roles\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"角色名称\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delMenuRoleHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport * as MenuRoleAPI from '@/api/system-management/menuRole'\nimport * as SecurityAPI from '@/api/system-management/security'\nimport * as MenuSecurityAPI from '@/api/system-management/menuSecurity'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px',\n      securityId: null,\n      allSecurities: []\n    }\n  },\n  activated() {\n    this.queryMenuSecurities()\n    this.queryMenuRoles()\n    SecurityAPI.queryAll([]).then(data => { this.allSecurities = data }) // 系统已有的所有资源权限信息\n  },\n  methods: {\n    addSecirityHandler() {\n      if (!this.securityId) return\n      const params = {\n        menuId: this.detail.id,\n        securityId: this.securityId\n      }\n      MenuSecurityAPI.add(params).then(() => {\n        this.securityId = null\n        this.queryMenuSecurities()\n        this.optionSuccessHandler()\n      })\n    },\n    delSecirityHandler(id) {\n      const params = {\n        menuId: this.detail.id,\n        securityId: id\n      }\n      MenuSecurityAPI.delByEntityMapping(params).then(() => {\n        this.queryMenuSecurities()\n        this.optionSuccessHandler()\n      })\n    },\n    delMenuRoleHandler(id) {\n      const params = {\n        menuId: this.detail.id,\n        roleId: id\n      }\n      MenuRoleAPI.delByEntityMapping(params).then(() => {\n        this.queryMenuRoles()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/menu/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport check from './check'\n\nexport default {\n  components: { query, edit, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/menu/mixins.js",
    "content": "import * as MenuAPI from '@/api/system-management/menu'\n\nexport default {\n  data() {\n    return {\n      parentMenuName: '',\n      roles: [],\n      securities: []\n    }\n  },\n  methods: {\n    queryMenuRoles() {\n      this.roles = []\n      MenuAPI.queryAllMenuRole(this.detail.id).then(roles => { this.roles = roles })\n    },\n    queryMenuSecurities() {\n      this.securities = []\n      MenuAPI.queryAllMenuSecurities(this.detail.id).then(securities => {\n        this.securities = securities\n      })\n    },\n    getParentMenuName(id) {\n      this.parentMenuName = ''\n      if (!id) return\n      MenuAPI.queryMenuById(id).then(menu => {\n        this.parentMenuName = menu.name\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/menu/query.vue",
    "content": "<template>\n  <el-row>\n    <el-col :span=\"24\">\n      <el-card>\n        <el-input v-model=\"filter\" placeholder=\"输入关键字进行过滤\"/>\n      </el-card>\n    </el-col>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        菜单树列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected && !needSync\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button v-if=\"needSync\" type=\"primary\" @click=\"syncMenus\">同步</el-button>\n            <el-button v-if=\"selected && !needSync\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-tree :data=\"[{}]\">\n        <div class=\"custom-tree-node\">\n          <div class=\"name\">名称</div>\n          <div class=\"remark\">备注</div>\n          <div class=\"icon\">图标</div>\n        </div>\n      </el-tree>\n      <el-tree ref=\"tree\" :data=\"menusTree\" :filter-node-method=\"filterNodeHandler\" class=\"filter-tree\" highlight-current accordion @current-change=\"(value, node) => selected = value\">\n        <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n          <div class=\"name\">\n            {{ data.name }}\n          </div>\n          <div class=\"remark\">\n            {{ data.remark }}\n          </div>\n          <div class=\"icon\">\n            <svg-icon :icon-class=\"data.icon\"/>\n          </div>\n        </div>\n      </el-tree>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { asyncMenuMap } from '@/router'\nimport * as MenuAPI from '@/api/system-management/menu'\n\nexport default {\n  data() {\n    return {\n      filter: null,\n      selected: null,\n      menusTree: [],\n      allMenus: [],\n      needSync: false\n    }\n  },\n  watch: {\n    filter(filter) {\n      this.$refs.tree.filter(filter)\n    }\n  },\n  created() {\n    this.initMenus()\n  },\n  activated() {\n    this.$refs.tree.filter(this.filter)\n  },\n  methods: {\n    initMenus() {\n      MenuAPI.queryAllMenus({}).then(data => {\n        this.allMenus = data\n        const menusTree = []\n        asyncMenuMap.forEach(router => {\n          menusTree.push(MenuAPI.createMenuTree(this.allMenus, router, null))\n        })\n        this.menusTree = menusTree\n        this.needSync = this.menusTree.some(menu => {\n          return MenuAPI.syncMenuVoter(this.allMenus, menu)\n        })\n        if (this.needSync) {\n          this.$notify({\n            title: '提示',\n            type: 'warning',\n            message: '检测到您需要同步本地菜单信息树至服务端',\n            duration: 0\n          })\n        }\n      })\n    },\n    syncMenus() {\n      this.$confirm('确定要同步吗?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        MenuAPI.syncMenus().then((data) => {\n          this.needSync = false\n          this.initMenus()\n          console.log(data)\n          this.$message({\n            type: 'success',\n            message: '保存成功\\n新增路由：' + data.insert.length + '个\\n修改：'+ data.update.length + '个\\n删除：'+ data.delete.length + '个'\n          })\n        })\n      }, () => {\n        this.$message({\n          type: 'info',\n          message: '已取消操作'\n        })\n      })\n    },\n    filterNodeHandler(value, data) {\n      if (!value) return true\n      const show = data.name.indexOf(value) !== -1\n      if (!show && this.selected && this.selected.id === data.id) {\n        this.selected = null\n      }\n      return show\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n    .remark {\n      float: right;\n      width: 300px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n\n    .icon {\n      float: right;\n      width: 100px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/role/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"角色名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"角色编号\" prop=\"sortNum\">\n      <el-input v-model=\"form.sortNum\"/>\n    </el-form-item>\n    <el-form-item label=\"角色备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as RoleAPI from '@/api/system-management/role'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      RoleAPI.addRole(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler(data) {\n      this.$emit('option-changed', 'edit', data)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/role/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view label=\"角色编号\">{{ detail.sortNum }}</input-item-view>\n          <input-item-view label=\"角色名称\">{{ detail.name }}</input-item-view>\n          <text-item-view label=\"角色备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n      <el-collapse-item title=\"角色菜单信息\" name=\"role-menu\">\n        <el-tree :data=\"[{}]\">\n          <div class=\"custom-tree-node\">\n            <div class=\"name\">名称</div>\n            <div class=\"remark\">备注</div>\n            <div class=\"icon\">图标</div>\n          </div>\n        </el-tree>\n        <el-tree ref=\"menusTree\" :data=\"menusTree\" :filter-node-method=\"filterNodeHandler\" class=\"filter-tree\" node-key=\"id\" show-checkbox accordion>\n          <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n            <div class=\"name\">\n              {{ data.name }}\n            </div>\n            <div class=\"remark\">\n              {{ data.remark }}\n            </div>\n            <div class=\"icon\">\n              <svg-icon :icon-class=\"data.icon\"/>\n            </div>\n          </div>\n        </el-tree>\n      </el-collapse-item>\n      <el-collapse-item title=\"角色组信息\" name=\"role-group\">\n        <el-table :data=\"groups\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\" sortable/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\" sortable>\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\" sortable>\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"部门信息\" name=\"dept-role\">\n        <el-table :data=\"depts\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\" sortable/>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户信息\" name=\"role-user\">\n        <el-table :data=\"users\" border style=\"width: 100%\">\n          <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n          <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n          </el-table-column>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        </el-table>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  },\n  activated() {\n    this.queryAllUsers()\n    this.queryAllGroups()\n    this.queryAllDepts()\n    this.initMenus()\n  },\n  methods: {\n\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n    .remark {\n      float: right;\n      width: 300px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n\n    .icon {\n      float: right;\n      width: 100px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/role/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          角色信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n        <el-form-item label=\"ID\" prop=\"id\">\n          <el-input v-model=\"form.id\" disabled/>\n        </el-form-item>\n        <el-form-item label=\"角色名称\" prop=\"name\">\n          <el-input v-model=\"form.name\"/>\n        </el-form-item>\n        <el-form-item label=\"角色编号\" prop=\"sortNum\">\n          <el-input v-model=\"form.sortNum\"/>\n        </el-form-item>\n        <el-form-item label=\"角色备注\" prop=\"remark\">\n          <el-input v-model=\"form.remark\" type=\"textarea\"/>\n        </el-form-item>\n      </el-form>\n    </el-card>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          可操作菜单信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"resetRoleMenus\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-row>\n        <el-col :span=\"24\">\n          <el-input v-model=\"menuFilter\" placeholder=\"输入关键字进行过滤\"/>\n        </el-col>\n        <el-col :span=\"24\" style=\"margin-top: 10px;\">\n          <el-tree :data=\"[{}]\">\n            <div class=\"custom-tree-node\">\n              <div class=\"name\">名称</div>\n              <div class=\"remark\">备注</div>\n              <div class=\"icon\">图标</div>\n            </div>\n          </el-tree>\n          <el-tree ref=\"menusTree\" :data=\"menusTree\" :filter-node-method=\"filterNodeHandler\" class=\"filter-tree\" node-key=\"id\" show-checkbox accordion>\n            <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n              <div class=\"name\">\n                {{ data.name }}\n              </div>\n              <div class=\"remark\">\n                {{ data.remark }}\n              </div>\n              <div class=\"icon\">\n                <svg-icon :icon-class=\"data.icon\"/>\n              </div>\n            </div>\n          </el-tree>\n        </el-col>\n      </el-row>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">角色分组信息</template>\n          <el-select v-model=\"roleGroupId\" placeholder=\"添加分组\" clearable filterable @change=\"addGroupHandler\">\n            <el-option v-for=\"(item, index) in allRoleGroups\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"groups\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\" sortable/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\" sortable>\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\" sortable>\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delGroupHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">部门信息</template>\n          <el-select v-model=\"deptId\" placeholder=\"添加部门\" clearable filterable @change=\"addDeptHandler\">\n            <el-option v-for=\"(item, index) in allDepts\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"depts\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\" sortable/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delDeptHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"用户信息\">\n      <el-table :data=\"users\" border style=\"width: 100%\">\n        <el-table-column type=\"index\" width=\"100\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable align=\"center\"/>\n        <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n        </el-table-column>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable align=\"center\"/>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delUserRoleHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as RoleGroupAPI from '@/api/system-management/roleGroup'\nimport * as RoleAPI from '@/api/system-management/role'\nimport * as MenuRoleAPI from '@/api/system-management/menuRole'\nimport * as DeptRoleAPI from '@/api/system-management/deptRole'\nimport * as UserRoleAPI from '@/api/system-management/userRole'\nimport * as GroupAPI from '@/api/system-management/group'\nimport * as DeptAPI from '@/api/system-management/dept'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      form: form,\n      rules: rules,\n      menuFilter: null,\n      allRoleGroups: [],\n      allDepts: [],\n      roleGroupId: null,\n      deptId: null\n    }\n  },\n  watch: {\n    menuFilter(filter) {\n      this.$refs.menusTree.filter(filter)\n    }\n  },\n  activated() {\n    RoleAPI.queryRoleById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.initMenus()\n    this.queryAllUsers()\n    this.queryAllGroups() // 该角色已有的角色组信息\n    this.queryAllDepts()\n    GroupAPI.queryAllGroups([{ field: 'category', value: 2 }]).then(data => {\n      this.allRoleGroups = data\n    }) // 系统已有的所有角色组信息\n    DeptAPI.queryAllDepts([]).then(data => {\n      this.allDepts = data\n    }) // 系统已有的所有部门信息\n  },\n  methods: {\n    customSubmitHandler() {\n      RoleAPI.editRole(this.form).then(this.submitSuccessHandler)\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n    },\n    resetRoleMenus() {\n      const menuIds = this.$refs['menusTree'].getCheckedKeys()\n      const data = []\n      menuIds.forEach(menuId => {\n        data.push({ roleId: this.detail.id, menuId: menuId })\n      })\n      MenuRoleAPI.reset(data).then(this.optionSuccessHandler)\n    },\n    delUserRoleHandler(id) {\n      const params = {\n        userId: id,\n        roleId: this.detail.id\n      }\n      UserRoleAPI.delByEntityMapping(params).then(() => {\n        this.queryAllUsers()\n        this.optionSuccessHandler()\n      })\n    },\n    addGroupHandler() {\n      if (!this.roleGroupId) return // 防止取消选择时触发\n      const params = { roleId: this.detail.id, groupId: this.roleGroupId }\n\n      RoleGroupAPI.add(params).then(() => {\n        this.queryAllGroups()\n        this.optionSuccessHandler()\n      })\n    },\n    delGroupHandler(id) {\n      const params = { roleId: this.detail.id, roleGroupId: id }\n      RoleGroupAPI.delByEntityMapping(params).then(() => {\n        this.queryAllGroups()\n        this.optionSuccessHandler()\n      })\n    },\n    addDeptHandler() {\n      if (!this.deptId) return // 防止取消选择时触发\n      const params = { roleId: this.detail.id, deptId: this.deptId }\n      DeptRoleAPI.add(params).then(() => {\n        this.queryAllDepts()\n        this.optionSuccessHandler()\n      })\n    },\n    delDeptHandler(id) {\n      const params = { roleId: this.detail.id, deptId: id }\n      DeptRoleAPI.delByEntityMapping(params).then(() => {\n        this.queryAllDepts()\n        this.optionSuccessHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n    .remark {\n      float: right;\n      width: 300px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n\n    .icon {\n      float: right;\n      width: 100px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/role/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/role/mixins.js",
    "content": "import * as RoleAPI from '@/api/system-management/role'\nimport * as MenuAPI from '@/api/system-management/menu'\nimport { asyncMenuMap } from '@/router'\n\nexport default {\n  data() {\n    return {\n      menusTree: [],\n      users: [],\n      groups: [],\n      depts: []\n    }\n  },\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        token: null,\n        name: '',\n        sortNum: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        name: [{\n          required: true, message: '请输入角色名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入角色编号', trigger: 'blur'\n        }]\n      }\n    },\n    queryAllUsers() {\n      this.users = []\n      RoleAPI.queryAllRoleUsers(this.detail.id).then(users => {\n        this.users = users\n      })\n    },\n    queryAllGroups() {\n      this.groups = []\n      RoleAPI.queryAllRoleGroups(this.detail.id).then(groups => {\n        this.groups = groups\n      })\n    },\n    queryAllDepts() {\n      this.depts = []\n      RoleAPI.queryAllRoleDepts(this.detail.id).then(depts => {\n        this.depts = depts\n      })\n    },\n    filterNodeHandler(value, data) {\n      if (!value) return true\n      return data.name.indexOf(value) !== -1\n    },\n    initMenus() {\n      MenuAPI.queryAllMenus({}).then(allMenus => {\n        const menusTree = []\n        asyncMenuMap.forEach(router => {\n          menusTree.push(MenuAPI.createMenuTree(allMenus, router, null))\n        })\n        this.menusTree = menusTree\n        const needSync = this.menusTree.some(menu => {\n          return MenuAPI.syncMenuVoter(allMenus, menu)\n        })\n        if (needSync) {\n          this.$notify({\n            title: '提示',\n            type: 'warning',\n            message: '检测到您需要同步本地菜单信息树至服务端',\n            duration: 0\n          })\n        }\n\n        RoleAPI.queryAllRoleMenus(this.detail.id).then(roleMenus => {\n          const checkedMenus = []\n          roleMenus.forEach(item => {\n            checkedMenus.push(item.id)\n          })\n          this.$refs['menusTree'].setCheckedKeys(checkedMenus)\n        })\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/role/query.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"18\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"角色名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入角色名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"6\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        角色列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable=\"custom\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as RoleAPI from '@/api/system-management/role'\n\nexport default {\n  mixins: [BaseQueryPageForm],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  activated() {\n    this.selected = null\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      RoleAPI.queryPageRoles(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      RoleAPI.delRole(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/security/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n    <el-form-item label=\"定义\" prop=\"securityDef\">\n      <el-input v-model=\"form.securityDef\"/>\n    </el-form-item>\n    <el-form-item label=\"名称\" prop=\"name\">\n      <el-input v-model=\"form.name\"/>\n    </el-form-item>\n    <el-form-item label=\"备注\" prop=\"remark\">\n      <el-input v-model=\"form.remark\" type=\"textarea\"/>\n    </el-form-item>\n    <el-form-item>\n      <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n      <el-button @click=\"backHandler\">取消</el-button>\n    </el-form-item>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as SecurityAPI from '@/api/system-management/security'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      SecurityAPI.add(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler(data) {\n      this.$emit('option-changed', 'edit', data)\n    }\n  }\n}\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "src/views/system-management/security/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <input-item-view label=\"ID\">{{ detail.id }}</input-item-view>\n          <input-item-view label=\"定义\">{{ detail.securityDef }}</input-item-view>\n          <input-item-view label=\"名称\">{{ detail.name }}</input-item-view>\n          <text-item-view label=\"备注\">{{ detail.remark }}</text-item-view>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '200px'\n    }\n  },\n  activated() {\n\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/security/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          基础信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"200px\">\n        <el-form-item label=\"ID\" prop=\"id\">\n          <el-input v-model=\"form.id\" disabled/>\n        </el-form-item>\n        <el-form-item label=\"定义\" prop=\"securityDef\">\n          <el-input v-model=\"form.securityDef\"/>\n        </el-form-item>\n        <el-form-item label=\"名称\" prop=\"name\">\n          <el-input v-model=\"form.name\"/>\n        </el-form-item>\n        <el-form-item label=\"分组备注\" prop=\"remark\">\n          <el-input v-model=\"form.remark\" type=\"textarea\"/>\n        </el-form-item>\n      </el-form>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as SecurityAPI from '@/api/system-management/security'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    SecurityAPI.queryById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      SecurityAPI.edit(this.form).then(this.submitSuccessHandler)\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/security/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\n\nexport default {\n  components: { query, edit, add, check },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/security/mixins.js",
    "content": "export default {\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        securityDef: null,\n        name: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      return {\n        securityDef: [{\n          required: true, message: '请输入资源定义', trigger: 'blur'\n        }, {\n          min: 1, max: 200, message: '长度在 1 到 200 个字符', trigger: 'blur'\n        }],\n        name: [{\n          required: true, message: '请输入资源名称', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        remark: [{\n          min: 0, max: 200, message: '长度在 0 到 200 个字符', trigger: 'blur'\n        }]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/security/query.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"18\">\n        <el-form\n          :model=\"queryCriteria\"\n          :inline=\"true\">\n          <el-form-item label=\"资源定义:\" prop=\"securityDef\">\n            <el-input v-model=\"queryCriteria.securityDef\" placeholder=\"请输入资源定义\"/>\n          </el-form-item>\n          <el-form-item label=\"资源名称:\" prop=\"name\">\n            <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入分组名称\"/>\n          </el-form-item>\n        </el-form>\n      </el-col>\n      <el-col :span=\"6\" class=\"query-btn\">\n        <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n        <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        资源列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"securityDef\" label=\"定义\" sortable=\"custom\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\" sortable=\"custom\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as SecurityAPI from '@/api/system-management/security'\n\nexport default {\n  mixins: [BaseQueryPageForm],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  activated() {\n    this.selected = null\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        securityDef: '',\n        name: ''\n      })\n    },\n    executeQueryPage() {\n      SecurityAPI.queryPage(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      SecurityAPI.del(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/add.vue",
    "content": "<template>\n  <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"150px\">\n    <el-row>\n      <el-col :span=\"12\">\n        <el-form-item label=\"是否启用\" prop=\"disabled\">\n          <el-switch v-model=\"form.disabled\" :active-value=\"1\" :inactive-value=\"0\"/>\n        </el-form-item>\n        <el-form-item label=\"用户编号\" prop=\"sortNum\">\n          <el-input v-model=\"form.sortNum\"/>\n        </el-form-item>\n        <el-form-item label=\"登录ID\" prop=\"loginName\">\n          <el-input v-model=\"form.loginName\"/>\n        </el-form-item>\n        <el-form-item label=\"密码\" prop=\"password\">\n          <el-input v-model=\"form.password\"/>\n        </el-form-item>\n      </el-col>\n      <el-col :span=\"12\">\n        <el-form-item label=\"照片\" prop=\"avatar\">\n          <el-upload :headers=\"uploadAvatarHeaders\" :show-file-list=\"false\" :with-credentials=\"true\" :on-success=\"uploadAvatarSuccess\" :on-error=\"uploadAvatarError\" :action=\"uploadAvatar\" class=\"avatar-uploader\">\n            <img v-if=\"form.avatar\" :src=\"getAvatar(form.avatar)\" class=\"avatar\">\n            <i v-else class=\"el-icon-plus avatar-uploader-icon\"/>\n          </el-upload>\n        </el-form-item>\n      </el-col>\n    </el-row>\n    <el-row>\n      <el-col :span=\"12\">\n        <el-form-item label=\"用户姓名\" prop=\"name\">\n          <el-input v-model=\"form.name\"/>\n        </el-form-item>\n        <el-form-item label=\"昵称\" prop=\"nickName\">\n          <el-input v-model=\"form.nickName\"/>\n        </el-form-item>\n        <el-form-item label=\"邮箱\" prop=\"email\">\n          <el-input v-model=\"form.email\"/>\n        </el-form-item>\n        <el-form-item label=\"性别\" prop=\"gender\">\n          <el-radio v-for=\"item in dictionaries.gender\" v-model=\"form.gender\" :key=\"item.key\" :label=\"item.key\">{{ item.value }}</el-radio>\n        </el-form-item>\n        <el-form-item label=\"生日\" prop=\"birthday\">\n          <el-date-picker v-model=\"form.birthday\" :picker-options=\"(time) => { return time.getTime() > Date.now() }\" align=\"right\" type=\"date\"/>\n        </el-form-item>\n      </el-col>\n      <el-col :span=\"12\">\n        <el-form-item label=\"证件号码\" prop=\"idNumber\">\n          <el-input v-model=\"form.idNumber\"/>\n        </el-form-item>\n        <el-form-item label=\"电话\" prop=\"phone\">\n          <el-input v-model=\"form.phone\"/>\n        </el-form-item>\n        <el-form-item label=\"住址\" prop=\"address\">\n          <el-input v-model=\"form.address\"/>\n        </el-form-item>\n        <el-form-item label=\"标签\" prop=\"tag\" placeholder=\"支持英文逗号隔开\">\n          <el-input v-model=\"form.tag\"/>\n        </el-form-item>\n      </el-col>\n      <el-col :span=\"24\">\n        <el-form-item label=\"用户备注\" prop=\"remark\">\n          <el-input v-model=\"form.remark\" type=\"textarea\"/>\n        </el-form-item>\n      </el-col>\n      <el-col :span=\"24\">\n        <el-form-item>\n          <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          <el-button @click=\"backHandler\">取消</el-button>\n        </el-form-item>\n      </el-col>\n    </el-row>\n  </el-form>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as UserAPI from '@/api/system-management/user'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    const rules = this.initRules()\n    return {\n      form: form,\n      rules: rules\n    }\n  },\n  activated() {\n    deepMergeLeft(this.form, this.initForm())\n    this.$nextTick(() => {\n      this.$refs['form'].clearValidate()\n    })\n  },\n  methods: {\n    customSubmitHandler() {\n      UserAPI.addUser(this.form).then(data => {\n        this.submitSuccessHandler(data)\n      })\n    },\n    customSubmitSuccessHandler(data) {\n      this.$emit('option-changed', 'edit', data)\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.avatar-uploader {\n  /deep/ .el-upload {\n    border: 1px dashed #d9d9d9;\n    border-radius: 6px;\n    cursor: pointer;\n    position: relative;\n    overflow: hidden;\n\n    &:hover {\n      border-color: #409EFF;\n    }\n\n    .avatar-uploader-icon {\n      font-size: 28px;\n      color: #8c939d;\n      width: 178px;\n      height: 178px;\n      line-height: 178px;\n      text-align: center;\n    }\n  }\n\n  .avatar {\n    width: 178px;\n    height: 178px;\n    display: block;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/batchEdit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed','query')\">返回</el-button>\n    <el-card>\n      <template slot=\"header\">\n        <button-right>\n          用户分组信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitUserGroupHandler()\" >保存</el-button>\n          </template>\n        </button-right>\n      </template>\n      <el-table :data=\"allUserGroups\" border style=\"width: 100%\" @selection-change=\"clickUserGroupCheckboxHandler\" >\n        <el-table-column type=\"selection\" label=\"全选\" />\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <el-row>\n        <el-col :span=\"24\">\n          <el-card>\n            <el-input v-model=\"filter\" placeholder=\"输入关键字进行过滤\"/>\n          </el-card>\n        </el-col>\n      </el-row>\n      <template slot=\"header\">\n        <button-right>\n          部门信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitUserDeptHandler()\" >保存</el-button>\n          </template>\n        </button-right>\n      </template>\n      <el-tree :data=\"[{}]\" :props=\"defaultProps\">\n        <div class=\"custom-tree-node\">\n          <div class=\"name\">名称</div>\n          <div class=\"time\">最后修改时间</div>\n          <div class=\"time\">创建时间</div>\n        </div>\n      </el-tree>\n      <el-tree ref=\"tree\" :data=\"depts\" :props=\"defaultProps\" :filter-node-method=\"filterNodeHandler\" class=\"filter-tree\" highlight-current accordion show-checkbox @current-change=\"(value, node) => selected = value\">\n        <div slot-scope=\"{ data }\" class=\"custom-tree-node\">\n          <div class=\"name\">{{ data.name }}</div>\n          <div class=\"time\">{{ data.modifiedDate | parseTime }}</div>\n          <div class=\"time\">{{ data.createdDate | parseTime }}</div>\n        </div>\n      </el-tree>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <button-right>\n          角色分组信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitUserRoleGroupHandler()\" >保存</el-button>\n          </template>\n        </button-right>\n      </template>\n      <el-table :data=\"allRoleGroups\" border style=\"width: 100%\" @selection-change=\"clickRoleGroupCheckboxHandler\" >\n        <el-table-column type=\"selection\" label=\"全选\" />\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <button-right>\n          角色信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitUserRoleHandler()\" >保存</el-button>\n          </template>\n        </button-right>\n      </template>\n      <el-table :data=\"roles\" border style=\"width: 100%\" @selection-change=\"clickRoleCheckboxHandler\" >\n        <el-table-column type=\"selection\" label=\"全选\" />\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport * as RoleAPI from '@/api/system-management/role'\nimport * as DeptAPI from '@/api/system-management/dept'\nimport * as GroupAPI from '@/api/system-management/group'\nimport * as UserRoleAPI from '@/api/system-management/userRole'\nimport * as UserDeptAPI from '@/api/system-management/userDept'\nimport * as UserGroupAPI from '@/api/system-management/userGroup'\nimport * as UserRoleGroupAPI from '@/api/system-management/userRoleGroup'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Array,\n      default: () => []\n    }\n  },\n  data() {\n    return {\n      filter: null,\n      roles: [],\n      selectedRoles: [],\n      depts: [],\n      defaultProps: {\n        children: 'children',\n        label: 'name'\n      },\n      allUserGroups: [],\n      allRoleGroups: [],\n      selectedUserGroups: [],\n      selectedRoleGroups: []\n    }\n  },\n  watch: {\n    filter(filter) {\n      this.$refs.tree.filter(filter)\n    }\n  },\n  activated() {\n    const params = {\n      filters: []\n    }\n    RoleAPI.queryAllRoles(params).then(data => {\n      this.roles = data\n    })\n    DeptAPI.queryAllTreeDepts().then(data => {\n      this.depts = data\n    })\n    this.allUserGroups = []\n    GroupAPI.queryAllGroups([{ field: 'category', value: 1 }]).then(data => {\n      this.allUserGroups = data\n    }) // 系统已有的所有用户组\n    this.allRoleGroups = []\n    GroupAPI.queryAllGroups([{ field: 'category', value: 2 }]).then(data => {\n      this.allRoleGroups = data\n    }) // 系统已有的所有角色组\n  },\n  methods: {\n    clickRoleCheckboxHandler(selection) {\n      this.selectedRoles = selection\n    },\n    clickUserGroupCheckboxHandler(selection) {\n      this.selectedUserGroups = selection\n    },\n    clickRoleGroupCheckboxHandler(selection) {\n      this.selectedRoleGroups = selection\n    },\n    submitUserRoleHandler() {\n      if (this.selectedRoles.length === 0) {\n        this.$message({\n          type: 'error',\n          message: '您未勾选任何角色'\n        })\n        return\n      }\n      this.$confirm('此操作将批量授权, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        const userRoles = []\n        this.detail.forEach(user => {\n          this.selectedRoles.forEach(role => {\n            userRoles.push({\n              userId: user.id,\n              roleId: role.id\n            })\n          })\n        })\n        UserRoleAPI.reset(userRoles).then(() => {\n          this.optionSuccessHandler()\n        })\n      }).catch(() => {\n        this.$message({\n          type: 'warning',\n          message: '已取消授权'\n        })\n      })\n    },\n    submitUserDeptHandler() {\n      const selectedDepts = this.$refs.tree.getCheckedNodes()\n      if (selectedDepts.length === 0) {\n        this.$message({\n          type: 'error',\n          message: '您未勾选任何部门'\n        })\n        return\n      }\n      this.$confirm('此操作将批量授权, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        const userDepts = []\n        this.detail.forEach(user => {\n          selectedDepts.forEach(dept => {\n            userDepts.push({\n              userId: user.id,\n              deptId: dept.id\n            })\n          })\n        })\n        UserDeptAPI.reset(userDepts).then(() => {\n          this.optionSuccessHandler()\n        })\n      }).catch(() => {\n        this.$message({\n          type: 'warning',\n          message: '已取消授权'\n        })\n      })\n    },\n    filterNodeHandler(value, data) {\n      if (!value) return true\n      return data.name.indexOf(value) !== -1\n    },\n    submitUserGroupHandler() {\n      if (this.selectedUserGroups.length === 0) {\n        this.$message({\n          type: 'error',\n          message: '您未勾选任何用户分组'\n        })\n        return\n      }\n      this.$confirm('此操作将批量授权, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        const userGroups = []\n        this.detail.forEach(user => {\n          this.selectedUserGroups.forEach(group => {\n            userGroups.push({\n              userId: user.id,\n              groupId: group.id\n            })\n          })\n        })\n        UserGroupAPI.reset(userGroups).then(() => {\n          this.optionSuccessHandler()\n        })\n      }).catch(() => {\n        this.$message({\n          type: 'warning',\n          message: '已取消授权'\n        })\n      })\n    },\n    submitUserRoleGroupHandler() {\n      if (this.selectedRoleGroups.length === 0) {\n        this.$message({\n          type: 'error',\n          message: '您未勾选任何角色分组'\n        })\n        return\n      }\n      this.$confirm('此操作将批量授权, 是否继续?', '提示', {\n        confirmButtonText: '确定',\n        cancelButtonText: '取消',\n        type: 'warning'\n      }).then(() => {\n        const userRoleGroups = []\n        this.detail.forEach(user => {\n          this.selectedRoleGroups.forEach(group => {\n            userRoleGroups.push({\n              userId: user.id,\n              roleGroupId: group.id\n            })\n          })\n        })\n        UserRoleGroupAPI.reset(userRoleGroups).then(() => {\n          this.optionSuccessHandler()\n        })\n      }).catch(() => {\n        this.$message({\n          type: 'warning',\n          message: '已取消授权'\n        })\n      })\n    }\n  }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n  /deep/ .el-card {\n    border: none;\n  }\n  .query-btn /deep/ .el-button {\n    float: right;\n    margin-left: 10px;\n  }\n  /deep/ .el-tree {\n    border-bottom: 1px solid #ebeef5;\n\n    .el-tree-node__content {\n      border-top: 1px solid #ebeef5;\n      border-left: 1px solid #ebeef5;\n      border-right: 1px solid #ebeef5;\n      min-height: 40px;\n    }\n  }\n\n  .custom-tree-node {\n    width: 100%;\n\n    .name {\n      float: left;\n      min-height: 40px;\n      line-height: 40px;\n    }\n\n    .time {\n      float: right;\n      width: 200px;\n      min-height: 40px;\n      line-height: 40px;\n      border-left: 1px solid #ebeef5;\n      text-align: center;\n    }\n\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/check.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"$emit('option-changed')\">返回</el-button>\n    <el-collapse value=\"base-info\" accordion>\n      <el-collapse-item title=\"基本信息\" name=\"base-info\">\n        <el-form :model=\"detail\" :label-width=\"labelWidth\">\n          <el-row>\n            <el-col :span=\"12\">\n              <input-item-view :label-width=\"labelWidth\" label=\"ID\">{{ detail.id }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"启用状态\">{{ detail.disabled | translateTrueOrFalse }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"用户编号\">{{ detail.sortNum }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"登录ID\">{{ detail.loginName }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"用户姓名\">{{ detail.name }}</input-item-view>\n            </el-col>\n            <el-col :span=\"12\">\n              <input-item-view :label-width=\"labelWidth\" label=\"肖像\">\n                <img :src=\"getAvatar(detail.avatar)\" class=\"photo\">\n              </input-item-view>\n            </el-col>\n          </el-row>\n          <el-row>\n            <el-col :span=\"12\">\n              <input-item-view :label-width=\"labelWidth\" label=\"昵称\">{{ detail.nickName }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"证件号码\">{{ detail.idNumber }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"性别\">{{ detail.gender | translateGender }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"生日\">{{ detail.birthday }}</input-item-view>\n            </el-col>\n            <el-col :span=\"12\">\n              <input-item-view :label-width=\"labelWidth\" label=\"电话\">{{ detail.phone }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"邮箱\">{{ detail.email }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"住址\">{{ detail.address }}</input-item-view>\n              <input-item-view :label-width=\"labelWidth\" label=\"标签\">{{ detail.tag }}</input-item-view>\n            </el-col>\n            <el-col :span=\"24\">\n              <text-item-view :label-width=\"labelWidth\" label=\"用户备注\">{{ detail.remark }}</text-item-view>\n            </el-col>\n          </el-row>\n        </el-form>\n      </el-collapse-item>\n      <el-collapse-item title=\"审计信息\" name=\"audit-info\">\n        <audit-info :detail=\"detail\" :label-width=\"labelWidth\"/>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户分组\" name=\"user-group\">\n        <el-table :data=\"userGroups\" border style=\"width: 100%\">\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户部门\" name=\"user-dept\">\n        <el-table :data=\"depts\" border style=\"width: 100%\">\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户角色组\" name=\"user-role-group\">\n        <el-table :data=\"roleGroups\" border style=\"width: 100%\">\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n      <el-collapse-item title=\"用户角色\" name=\"user-role\">\n        <el-table :data=\"roles\" border style=\"width: 100%\">\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n          <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n          <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n          </el-table-column>\n          <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n            <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n          </el-table-column>\n        </el-table>\n      </el-collapse-item>\n    </el-collapse>\n  </div>\n</template>\n\n<script>\nimport mixins from './mixins'\n\nexport default {\n  mixins: [mixins],\n  props: {\n    detail: {\n      required: true,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    return {\n      labelWidth: '150px',\n      depts: [],\n      userGroups: [],\n      roleGroups: [],\n      roles: []\n    }\n  },\n  activated() {\n    this.queryAllUserDepts()\n    this.queryAllUserGroups()\n    this.queryAllRoleGroups()\n    this.queryAllUserRoles()\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-button {\n    margin-bottom: 10px;\n  }\n\n  .photo {\n    margin: 0 auto;\n    width: 178px;\n    height: 178px;\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/edit.vue",
    "content": "<template>\n  <div>\n    <el-button icon=\"el-icon-back\" round @click=\"backHandler\">返回</el-button>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          用户信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"150px\">\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"ID\" prop=\"id\">\n              <el-input v-model=\"form.id\" disabled/>\n            </el-form-item>\n            <el-form-item label=\"是否启用\" prop=\"disabled\">\n              <el-switch v-model=\"form.disabled\" :active-value=\"1\" :inactive-value=\"0\"/>\n            </el-form-item>\n            <el-form-item label=\"用户编号\" prop=\"sortNum\">\n              <el-input v-model=\"form.sortNum\"/>\n            </el-form-item>\n            <el-form-item label=\"登录ID\" prop=\"loginName\">\n              <el-input v-model=\"form.loginName\"/>\n            </el-form-item>\n            <el-form-item label=\"用户姓名\" prop=\"name\">\n              <el-input v-model=\"form.name\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"照片\" prop=\"avatar\">\n              <el-upload :headers=\"uploadAvatarHeaders\" :show-file-list=\"false\" :on-success=\"uploadAvatarSuccess\" :on-error=\"uploadAvatarError\" :action=\"uploadAvatar\" class=\"avatar-uploader\">\n                <img v-if=\"form.avatar\" :src=\"getAvatar(form.avatar)\" class=\"avatar\">\n                <i v-else class=\"el-icon-plus avatar-uploader-icon\"/>\n              </el-upload>\n            </el-form-item>\n          </el-col>\n        </el-row>\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"昵称\" prop=\"nickName\">\n              <el-input v-model=\"form.nickName\"/>\n            </el-form-item>\n            <el-form-item label=\"邮箱\" prop=\"email\">\n              <el-input v-model=\"form.email\"/>\n            </el-form-item>\n            <el-form-item label=\"性别\" prop=\"gender\">\n              <el-radio v-for=\"item in dictionaries.gender\" v-model=\"form.gender\" :key=\"item.key\" :label=\"item.key\">{{ item.value }}</el-radio>\n            </el-form-item>\n            <el-form-item label=\"生日\" prop=\"birthday\">\n              <el-date-picker v-model=\"form.birthday\" :picker-options=\"(time) => { return time.getTime() > Date.now() }\" align=\"right\" type=\"date\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"证件号码\" prop=\"idNumber\">\n              <el-input v-model=\"form.idNumber\"/>\n            </el-form-item>\n            <el-form-item label=\"电话\" prop=\"phone\">\n              <el-input v-model=\"form.phone\"/>\n            </el-form-item>\n            <el-form-item label=\"住址\" prop=\"address\">\n              <el-input v-model=\"form.address\"/>\n            </el-form-item>\n            <el-form-item label=\"标签\" prop=\"tag\" placeholder=\"支持英文逗号隔开\">\n              <el-input v-model=\"form.tag\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"24\">\n            <el-form-item label=\"用户备注\" prop=\"remark\">\n              <el-input v-model=\"form.remark\" type=\"textarea\"/>\n            </el-form-item>\n          </el-col>\n        </el-row>\n      </el-form>\n    </el-card>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          密码修改\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('password', editUserPassword)\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"password\" :model=\"password\" :rules=\"passwordRules\" label-width=\"150px\">\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"新密码\" prop=\"value\">\n              <el-input v-model=\"password.value\" type=\"password\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"再次填写密码\" prop=\"validator\">\n              <el-input v-model=\"password.validator\" type=\"password\"/>\n            </el-form-item>\n          </el-col>\n        </el-row>\n      </el-form>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">用户分组信息</template>\n          <el-select v-model=\"addOption.userGroupId\" placeholder=\"添加分组\" clearable filterable @change=\"addGroupHandler(addOption.userGroupId, 'user-group')\">\n            <el-option v-for=\"(item, index) in addOption.allUserGroups\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"userGroups\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delGroupHandler(scope.row.id, 'user-group')\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">部门信息</template>\n          <el-select v-model=\"addOption.deptId\" placeholder=\"添加部门\" clearable filterable @change=\"addUserDeptHandler\">\n            <el-option v-for=\"(item, index) in addOption.allDepts\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"depts\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delUserDeptHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">角色分组信息</template>\n          <el-select v-model=\"addOption.roleGroupId\" placeholder=\"添加分组\" clearable filterable @change=\"addGroupHandler(addOption.roleGroupId, 'role-group')\">\n            <el-option v-for=\"(item, index) in addOption.allRoleGroups\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"roleGroups\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delGroupHandler(scope.row.id, 'role-group')\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card>\n      <template slot=\"header\">\n        <select-right>\n          <template slot=\"left\">角色信息</template>\n          <el-select v-model=\"addOption.roleId\" placeholder=\"添加角色\" clearable filterable @change=\"addUserRoleHandler\">\n            <el-option v-for=\"(item, index) in addOption.allRoles\" :key=\"index\" :label=\"item.name\" :value=\"item.id\"/>\n          </el-select>\n        </select-right>\n      </template>\n      <el-table :data=\"roles\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column label=\"操作\" width=\"100\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <el-button type=\"warning\" @click=\"delUserRoleHandler(scope.row.id)\">删除</el-button>\n          </template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as DeptAPI from '@/api/system-management/dept'\nimport * as RoleAPI from '@/api/system-management/role'\nimport * as GroupAPI from '@/api/system-management/group'\nimport * as UserAPI from '@/api/system-management/user'\nimport * as UserRoleAPI from '@/api/system-management/userRole'\nimport * as UserDeptAPI from '@/api/system-management/userDept'\nimport * as UserGroupAPI from '@/api/system-management/userGroup'\nimport * as UserRoleGroupAPI from '@/api/system-management/userRoleGroup'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  props: {\n    detail: {\n      required: false,\n      type: Object,\n      default: () => {}\n    }\n  },\n  data() {\n    const form = this.initForm()\n    delete form.password\n    const rules = this.initRules()\n    delete rules.password\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n\n    const validatePassword = (rule, value, callback) => {\n      if (value === '') {\n        callback(new Error('请再次输入密码'))\n      } else if (value !== this.password.value) {\n        callback(new Error('两次输入密码不一致!'))\n      } else {\n        callback()\n      }\n    }\n\n    return {\n      form: form,\n      rules: rules,\n      depts: [], // 用户所属的\n      userGroups: [], // 用户所属的\n      roleGroups: [], // 用户所属的\n      roles: [], // 用户所属的\n\n      addOption: {\n        allDepts: [], // 系统具有的\n        allUserGroups: [], // 系统具有的\n        allRoleGroups: [], // 系统具有的\n        allRoles: [], // 系统具有的\n        deptId: null,\n        roleId: null,\n        userGroupId: null,\n        roleGroupId: null\n      },\n\n      password: {\n        value: '',\n        validator: ''\n      },\n      passwordRules: {\n        value: [{\n          required: true, message: '请输入密码！', trigger: 'change'\n        }, {\n          min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'change'\n        }],\n        validator: [{\n          required: true, message: '请再次输入密码！', trigger: 'change'\n        }, {\n          validator: validatePassword, trigger: 'blur'\n        }]\n      }\n    }\n  },\n  activated() {\n    UserAPI.queryUserById(this.detail.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.queryAllUserDepts() // 用户已有的所有部门\n    this.queryAllUserGroups() // 用户已有的所有用户组\n    this.queryAllRoleGroups() // 用户已有的所有角色组\n    this.queryAllUserRoles() // 用户已有的所有角色\n    DeptAPI.queryAllDepts([]).then(data => { this.addOption.allDepts = data }) // 系统已有的所有部门\n    RoleAPI.queryAllRoles([]).then(data => { this.addOption.allRoles = data }) // 系统已有的所有角色\n    GroupAPI.queryAllGroups([{ field: 'category', value: 1 }]).then(data => {\n      this.addOption.allUserGroups = data\n    }) // 系统已有的所有用户组\n    GroupAPI.queryAllGroups([{ field: 'category', value: 2 }]).then(data => {\n      this.addOption.allRoleGroups = data\n    }) // 系统已有的所有角色组\n  },\n  methods: {\n    customSubmitHandler() {\n      UserAPI.editUser(this.form).then(this.submitSuccessHandler)\n    },\n    editUserPassword() {\n      UserAPI.editUserPassword({\n        id: this.form.id,\n        password: this.password.value\n      }).then(this.submitSuccessHandler)\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n      this.$refs['password'].clearValidate()\n    },\n    addUserDeptHandler(id) {\n      if (!id) return\n      const params = {\n        userId: this.detail.id,\n        deptId: id\n      }\n      UserDeptAPI.add(params).then(() => {\n        this.queryAllUserDepts()\n        this.optionSuccessHandler()\n        this.addOption.deptId = null\n      })\n    },\n    delUserDeptHandler(id) {\n      const params = {\n        userId: this.detail.id,\n        deptId: id\n      }\n      UserDeptAPI.delByEntityMapping(params).then(() => {\n        this.queryAllUserDepts()\n        this.optionSuccessHandler()\n      })\n    },\n    addGroupHandler(id, category) {\n      if (!id) return // 防止取消选择时触发\n      const params = { userId: this.detail.id }\n      let refreshMethod = null\n      let addMethod = null\n      if (category === 'user-group') {\n        params.groupId = id\n        refreshMethod = this.queryAllUserGroups\n        addMethod = UserGroupAPI.add\n      } else if (category === 'role-group') {\n        params.roleGroupId = id\n        refreshMethod = this.queryAllRoleGroups\n        addMethod = UserRoleGroupAPI.add\n      }\n      addMethod(params).then(() => {\n        refreshMethod()\n        this.optionSuccessHandler()\n      })\n    },\n    delGroupHandler(id, category) {\n      const params = { userId: this.detail.id }\n      let refreshMethod = null\n      let delMethod = null\n      if (category === 'user-group') {\n        params.groupId = id\n        refreshMethod = this.queryAllUserGroups\n        delMethod = UserGroupAPI.delByEntityMapping\n      } else if (category === 'role-group') {\n        params.roleGroupId = id\n        refreshMethod = this.queryAllRoleGroups\n        delMethod = UserRoleGroupAPI.delByEntityMapping\n      }\n      delMethod(params).then(() => {\n        refreshMethod()\n        this.optionSuccessHandler()\n      })\n    },\n    addUserRoleHandler(id) {\n      if (!id) return\n      const params = {\n        userId: this.detail.id,\n        roleId: id\n      }\n      UserRoleAPI.add(params).then(() => {\n        this.queryAllUserRoles()\n        this.optionSuccessHandler()\n        this.addOption.roleId = null\n      })\n    },\n    delUserRoleHandler(id) {\n      const params = {\n        userId: this.detail.id,\n        roleId: id\n      }\n      UserRoleAPI.delByEntityMapping(params).then(() => {\n        this.queryAllUserRoles()\n        this.optionSuccessHandler()\n      })\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n\n  .avatar-uploader {\n\n    /deep/ .el-upload {\n      border: 1px dashed #d9d9d9;\n      border-radius: 6px;\n      cursor: pointer;\n      position: relative;\n      overflow: hidden;\n\n      &:hover {\n        border-color: #409EFF;\n      }\n\n      .avatar-uploader-icon {\n        font-size: 28px;\n        color: #8c939d;\n        width: 178px;\n        height: 178px;\n        line-height: 178px;\n        text-align: center;\n      }\n    }\n\n    .avatar {\n      width: 178px;\n      height: 178px;\n      display: block;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/main.vue",
    "content": "<template>\n  <transition name=\"fade-transform\" mode=\"out-in\">\n    <keep-alive>\n      <component :is=\"optionType\" :detail=\"detail\" @option-changed=\"optionChangeHandler\"/>\n    </keep-alive>\n  </transition>\n</template>\n\n<script>\nimport NProgress from 'nprogress' // 进度条组件\nimport query from './query'\nimport edit from './edit'\nimport add from './add'\nimport check from './check'\nimport batchEdit from './batchEdit'\n\nexport default {\n  components: { query, edit, add, check, batchEdit },\n  data() {\n    return {\n      optionType: 'query',\n      detail: {}\n    }\n  },\n  methods: {\n    optionChangeHandler(optionType = 'query', detail = {}) {\n      NProgress.start()\n      this.detail = detail\n      this.optionType = optionType\n      NProgress.done()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/views/system-management/user/mixins.js",
    "content": "import { mapGetters } from 'vuex'\nimport store from '@/store'\nimport * as UserAPI from '@/api/system-management/user'\nimport defaultAvatar from '@/assets/images/avatar.jpeg'\n\nexport default {\n  data() {\n    return {\n      uploadAvatarHeaders: {\n        Authorization: store.getters.token\n      },\n      uploadAvatar: UserAPI.uploadAvatar,\n      previewAvatar: UserAPI.previewAvatar + '?token=' + this.$store.getters.token + '&avatar='\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'dictionaries'\n    ])\n  },\n  methods: {\n    initForm() {\n      return {\n        id: null,\n        token: null,\n        disabled: '',\n        sortNum: '',\n        loginName: '',\n        name: '',\n        nickName: '',\n        avatar: '',\n        idNumber: '',\n        gender: '',\n        birthday: '',\n        phone: '',\n        email: '',\n        address: '',\n        tag: '',\n        remark: ''\n      }\n    },\n    initRules() {\n      const validateLoginName = (rule, value, callback) => {\n        UserAPI.checkLoginName({ id: this.form.id, loginName: value }).then(data => {\n          if (data.exist === 0) {\n            callback()\n          } else {\n            callback(new Error('用户名已存在'))\n          }\n        })\n      }\n      return {\n        disabled: [{\n          required: true, message: '请选择用户启用状态', trigger: 'blur'\n        }],\n        sortNum: [{\n          required: true, message: '请输入用户编号', trigger: 'blur'\n        }],\n        loginName: [{\n          required: true, message: '请输入用户名', trigger: 'blur'\n        }, {\n          validator: validateLoginName, trigger: 'change'\n        }],\n        password: [{\n          required: true, message: '请输入密码', trigger: 'blur'\n        }],\n        name: [{\n          required: true, message: '请输入用户姓名', trigger: 'blur'\n        }, {\n          min: 4, max: 20, message: '长度在 4 到 20 个字符', trigger: 'blur'\n        }],\n        nickName: [{\n          required: true, message: '请输入简称', trigger: 'blur'\n        }],\n        gender: [{\n          required: true, message: '请输入性别', trigger: 'blur'\n        }],\n        email: [{\n          required: true, message: '请输入邮箱', trigger: 'blur'\n        }]\n      }\n    },\n    getAvatar(avatar) {\n      if (avatar) {\n        return this.previewAvatar + avatar\n      } else if (avatar.trim().startsWith(\"http\")) {\n        return avatar\n      } else {\n        return defaultAvatar\n      }\n    },\n    // 用户所属的部门信息\n    queryAllUserDepts(id) {\n      this.depts = []\n      if (!id) id = this.detail.id\n      const params = { id: id }\n      UserAPI.queryAllUserDepts(params).then(depts => { this.depts = depts })\n    },\n    // 用户所属的用户组信息查询\n    queryAllUserGroups(id) {\n      this.userGroups = []\n      if (!id) id = this.detail.id\n      const params = { id: id }\n      UserAPI.queryAllUserGroups(params).then(groups => { this.userGroups = groups })\n    },\n    // 用户所属的角色组信息查询\n    queryAllRoleGroups(id) {\n      this.roleGroups = []\n      if (!id) id = this.detail.id\n      const params = { id: id }\n      UserAPI.queryAllUserRoleGroups(params).then(groups => { this.roleGroups = groups })\n    },\n    // 用户所属的角色信息\n    queryAllUserRoles(id) {\n      this.roles = []\n      if (!id) id = this.detail.id\n      const params = { id: id }\n      UserAPI.queryAllUserRoles(params).then(roles => { this.roles = roles })\n    },\n    // eslint-disable-next-line no-unused-vars\n    uploadAvatarSuccess(response, file, fileList) {\n      this.form.avatar = response.data.fileName\n    },\n    // eslint-disable-next-line no-unused-vars\n    uploadAvatarError(response, file, fileList) {\n      this.form.avatar = null\n    }\n  }\n}\n"
  },
  {
    "path": "src/views/system-management/user/myself/modify.vue",
    "content": "<template>\n  <div>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          用户信息\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('form')\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"150px\">\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"ID\" prop=\"id\">\n              <el-input v-model=\"form.id\" disabled/>\n            </el-form-item>\n            <el-form-item label=\"登录ID\" prop=\"loginName\">\n              <el-input v-model=\"form.loginName\"/>\n            </el-form-item>\n            <el-form-item label=\"用户姓名\" prop=\"name\">\n              <el-input v-model=\"form.name\"/>\n            </el-form-item>\n            <el-form-item label=\"昵称\" prop=\"nickName\">\n              <el-input v-model=\"form.nickName\"/>\n            </el-form-item>\n            <el-form-item label=\"邮箱\" prop=\"email\">\n              <el-input v-model=\"form.email\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"照片\" prop=\"avatar\">\n              <el-upload :headers=\"uploadAvatarHeaders\" :show-file-list=\"false\" :on-success=\"uploadAvatarSuccess\" :on-error=\"uploadAvatarError\" :action=\"uploadAvatar\" class=\"avatar-uploader\">\n                <img v-if=\"form.avatar\" :src=\"getAvatar(form.avatar)\" class=\"avatar\">\n                <i v-else class=\"el-icon-plus avatar-uploader-icon\"/>\n              </el-upload>\n            </el-form-item>\n          </el-col>\n        </el-row>\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"性别\" prop=\"gender\">\n              <el-radio v-for=\"item in dictionaries.gender\" v-model=\"form.gender\" :key=\"item.key\" :label=\"item.key\">{{ item.value }}</el-radio>\n            </el-form-item>\n            <el-form-item label=\"生日\" prop=\"birthday\">\n              <el-date-picker v-model=\"form.birthday\" :picker-options=\"(time) => { return time.getTime() > Date.now() }\" align=\"right\" type=\"date\"/>\n            </el-form-item>\n            <el-form-item label=\"证件号码\" prop=\"idNumber\">\n              <el-input v-model=\"form.idNumber\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"电话\" prop=\"phone\">\n              <el-input v-model=\"form.phone\"/>\n            </el-form-item>\n            <el-form-item label=\"住址\" prop=\"address\">\n              <el-input v-model=\"form.address\"/>\n            </el-form-item>\n            <el-form-item label=\"标签\" prop=\"tag\" placeholder=\"支持英文逗号隔开\">\n              <el-input v-model=\"form.tag\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"24\">\n            <el-form-item label=\"用户备注\" prop=\"remark\">\n              <el-input v-model=\"form.remark\" type=\"textarea\"/>\n            </el-form-item>\n          </el-col>\n        </el-row>\n      </el-form>\n    </el-card>\n    <el-card>\n      <div slot=\"header\">\n        <button-right>\n          密码修改\n          <template slot=\"button\">\n            <el-button type=\"primary\" @click=\"submitHandler('password', editUserPassword)\">保存</el-button>\n          </template>\n        </button-right>\n      </div>\n      <el-form ref=\"password\" :model=\"password\" :rules=\"passwordRules\" label-width=\"150px\">\n        <el-row>\n          <el-col :span=\"12\">\n            <el-form-item label=\"新密码\" prop=\"value\">\n              <el-input v-model=\"password.value\" type=\"password\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"12\">\n            <el-form-item label=\"再次填写密码\" prop=\"validator\">\n              <el-input v-model=\"password.validator\" type=\"password\"/>\n            </el-form-item>\n          </el-col>\n        </el-row>\n      </el-form>\n    </el-card>\n    <el-card header=\"用户分组信息\">\n      <el-table :data=\"userGroups\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"部门信息\">\n      <el-table :data=\"depts\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"角色分组信息\">\n      <el-table :data=\"roleGroups\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n    <el-card header=\"角色信息\">\n      <el-table :data=\"roles\" border style=\"width: 100%\">\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"名称\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"remark\" label=\"备注\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"modifiedDate\" label=\"最后修改时间\" width=\"180\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.modifiedDate | parseTime }}</template>\n        </el-table-column>\n      </el-table>\n    </el-card>\n  </div>\n</template>\n\n<script>\nimport { mapGetters } from 'vuex'\nimport BaseEditForm from '@/views/common/mixins/BaseEditForm'\nimport { deepMergeLeft } from '@/utils'\nimport * as UserAPI from '@/api/system-management/user'\nimport mixins from '../mixins'\n\nexport default {\n  mixins: [BaseEditForm, mixins],\n  data() {\n    const form = this.initForm()\n    delete form.password\n    delete form.disabled\n    delete form.sortNum\n    const rules = this.initRules()\n    delete rules.password\n    delete rules.disabled\n    delete rules.sortNum\n    rules.id = [{\n      required: true, message: '编辑信息时ID不能为空', trigger: 'change'\n    }]\n\n    const validatePassword = (rule, value, callback) => {\n      if (value === '') {\n        callback(new Error('请再次输入密码'))\n      } else if (value !== this.password.value) {\n        callback(new Error('两次输入密码不一致!'))\n      } else {\n        callback()\n      }\n    }\n\n    return {\n      form: form,\n      rules: rules,\n\n      depts: [],\n      userGroups: [],\n      roleGroups: [],\n      roles: [],\n\n      password: {\n        value: '',\n        validator: ''\n      },\n      passwordRules: {\n        value: [{\n          required: true, message: '请输入密码！', trigger: 'change'\n        }, {\n          min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'change'\n        }],\n        validator: [{\n          required: true, message: '请再次输入密码！', trigger: 'change'\n        }, {\n          validator: validatePassword, trigger: 'blur'\n        }]\n      }\n    }\n  },\n  computed: {\n    ...mapGetters([\n      'user'\n    ])\n  },\n  mounted() {\n    UserAPI.queryUserById(this.user.id).then((data) => {\n      deepMergeLeft(this.form, data)\n      this.$nextTick(() => {\n        this.$refs['form'].clearValidate()\n      })\n    })\n    this.queryAllUserDepts(this.user.id)\n    this.queryAllUserGroups(this.user.id)\n    this.queryAllRoleGroups(this.user.id)\n    this.queryAllUserRoles(this.user.id)\n  },\n  methods: {\n    customSubmitHandler() {\n      UserAPI.editUser(this.form).then(this.submitSuccessHandler)\n    },\n    editUserPassword() {\n      UserAPI.editUserPassword({\n        id: this.form.id,\n        password: this.password.value\n      }).then(this.submitSuccessHandler)\n    },\n    customSubmitSuccessHandler() {\n      this.$refs['form'].clearValidate()\n      this.$refs['password'].clearValidate()\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  .el-card {\n    margin-top: 10px;\n  }\n\n  .avatar-uploader {\n\n    /deep/ .el-upload {\n      border: 1px dashed #d9d9d9;\n      border-radius: 6px;\n      cursor: pointer;\n      position: relative;\n      overflow: hidden;\n\n      &:hover {\n        border-color: #409EFF;\n      }\n\n      .avatar-uploader-icon {\n        font-size: 28px;\n        color: #8c939d;\n        width: 178px;\n        height: 178px;\n        line-height: 178px;\n        text-align: center;\n      }\n    }\n\n    .avatar {\n      width: 178px;\n      height: 178px;\n      display: block;\n    }\n  }\n</style>\n"
  },
  {
    "path": "src/views/system-management/user/query.vue",
    "content": "<template>\n  <el-row>\n    <el-card>\n      <el-col :span=\"24\">\n        <el-form :model=\"queryCriteria\" label-width=\"150px\">\n          <el-col :span=\"8\">\n            <el-form-item label=\"是否删除:\" prop=\"deleted\">\n              <el-select v-model=\"queryCriteria.deleted\" clearable placeholder=\"全部\">\n                <el-option v-for=\"item in dictionaries.trueOrFalse\" :key=\"item.key\" :value=\"item.key\" :label=\"item.value\"/>\n              </el-select>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"8\">\n            <el-form-item label=\"登录ID:\" prop=\"loginName\">\n              <el-input v-model=\"queryCriteria.loginName\" placeholder=\"请输入登录ID\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"8\">\n            <el-form-item label=\"姓名:\" prop=\"name\">\n              <el-input v-model=\"queryCriteria.name\" placeholder=\"请输入姓名\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"8\">\n            <el-form-item label=\"性别:\" prop=\"gender\">\n              <el-select v-model=\"queryCriteria.gender\" clearable placeholder=\"全部\">\n                <el-option v-for=\"item in dictionaries.gender\" :key=\"item.key\" :value=\"item.key\" :label=\"item.value\"/>\n              </el-select>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"8\">\n            <el-form-item label=\"邮箱:\" prop=\"email\">\n              <el-input v-model=\"queryCriteria.email\" placeholder=\"请输入邮箱\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"8\">\n            <el-form-item label=\"ID:\" prop=\"id\">\n              <el-input v-model=\"queryCriteria.id\" placeholder=\"请输入ID\"/>\n            </el-form-item>\n          </el-col>\n          <el-col :span=\"24\">\n            <flex-center>\n              <el-button round type=\"info\" @click=\"resetHandler\">重置</el-button>\n              <el-button round type=\"primary\" @click=\"queryHandler\">查询</el-button>\n            </flex-center>\n          </el-col>\n        </el-form>\n      </el-col>\n    </el-card>\n    <el-col :span=\"24\" style=\"margin: 10px 0px;\">\n      <button-right>\n        用户列表\n        <template slot=\"button\">\n          <el-button-group>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','check', selected)\">查看</el-button>\n            <el-button type=\"primary\" @click=\"$emit('option-changed','add')\">新增</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"$emit('option-changed','edit', selected)\">编辑</el-button>\n            <el-button v-if=\"selected\" type=\"primary\" @click=\"delHandler\">删除</el-button>\n            <el-button v-if=\"selectedUsers.length > 0\" type=\"primary\" @click=\"$emit('option-changed','batchEdit', selectedUsers)\">批量编辑</el-button>\n          </el-button-group>\n        </template>\n      </button-right>\n    </el-col>\n    <el-col :span=\"24\">\n      <el-table :data=\"pagination.list\" highlight-current-row stripe border @current-change=\"(row) => { selected = row }\" @row-dblclick=\"$emit('option-changed','check', selected)\" @sort-change=\"sortChangeHandler\" @selection-change=\"clickCheckboxHandler\">\n        <el-table-column type=\"selection\" label=\"全选\" />\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"loginName\" label=\"登录ID\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"name\" label=\"姓名\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column prop=\"gender\" label=\"性别\" width=\"100\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.gender | translateGender }}</template>\n        </el-table-column>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"email\" label=\"邮箱\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column :show-overflow-tooltip=\"true\" prop=\"phone\" label=\"电话\" width=\"160\" sortable=\"custom\" align=\"center\"/>\n        <el-table-column prop=\"createdDate\" label=\"创建时间\" width=\"180\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">{{ scope.row.createdDate | parseTime }}</template>\n        </el-table-column>\n        <el-table-column prop=\"disabled\" label=\"是否启用\" width=\"100\" sortable=\"custom\" align=\"center\">\n          <template slot-scope=\"scope\">\n            <state :state=\"scope.row.disabled\"/>\n          </template>\n        </el-table-column>\n      </el-table>\n      <pagination :pagination=\"pagination\" @page-size-changed=\"pageSizeChangeHandler\" @page-changed=\"pageChangeHandler\"/>\n    </el-col>\n  </el-row>\n</template>\n\n<script>\nimport { deepMerge } from '@/utils'\nimport BaseQueryPageForm from '@/views/common/mixins/BaseQueryPageForm'\nimport * as UserAPI from '@/api/system-management/user'\nimport mixins from './mixins'\n\nexport default {\n  mixins: [BaseQueryPageForm, mixins],\n  data() {\n    const queryCriteria = this.initQueryCriteria()\n    return {\n      queryCriteria: queryCriteria,\n      selected: null,\n      selectedUsers: []\n    }\n  },\n  activated() {\n    this.selected = null\n  },\n  methods: {\n    initQueryCriteria(form = {}) {\n      return deepMerge(form, {\n        id: '',\n        deleted: '',\n        gender: '',\n        name: '',\n        email: '',\n        loginName: ''\n      })\n    },\n    executeQueryPage() {\n      UserAPI.queryPageUsers(this.createQueryParams()).then(data => {\n        this.queryResultHandler(data)\n      })\n    },\n    customDelHandler() {\n      UserAPI.delUser(this.selected.id).then(() => {\n        this.queryHandler()\n      })\n    },\n    clickCheckboxHandler(selection) {\n      this.selectedUsers = selection\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  /deep/ .el-card {\n    border: none;\n  }\n  /deep/ .el-button {\n    margin-left: 10px;\n  }\n</style>\n"
  },
  {
    "path": "vue.config.js",
    "content": "'use strict'\nconst path = require('path')\n\nfunction resolve(dir) {\n  return path.join(__dirname, dir)\n}\n\nconst port = 9527 // TODO: change to Settings\nconst appName = 'element-admin'\n\nmodule.exports = {\n  /**\n   * You can set by yourself according to actual condition\n   * You will need to set this 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 assetsPublicPath should be set to \"/bar/\".\n   * In most cases please use '/' !!!\n   * Detail https://cli.vuejs.org/config/#baseurl\n   */\n  publicPath: '/',\n  outputDir: 'dist',\n  assetsDir: 'public',\n  lintOnSave: process.env.NODE_ENV !== 'production',\n  productionSourceMap: false,\n  devServer: {\n    port: port,\n    open: true,\n    overlay: {\n      warnings: false,\n      errors: true\n    },\n    proxy: {\n      '/admin': {\n        // target: `http://localhost:${port}/mock`,\n        target: 'http://localhost:8080',\n        changeOrigin: true,\n        pathRewrite: {\n          '^/' : '/'\n        }\n      }\n    }\n  },\n  configureWebpack: {\n    // We 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: appName,\n    resolve: {\n      alias: {\n        '@': resolve('src')\n      }\n    }\n  },\n  chainWebpack(config) {\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}\n"
  }
]