郑永安
2023-06-19 6ae336af4670a425ae8892aacda560ec2147d8a7
remove and commit
已添加184个文件
50666 ■■■■■ 文件已修改
.editorconfig 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.staging 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.eslintignore 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.eslintrc.js 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.prettierrc 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.travis.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LICENSE 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README-zh.md 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
babel.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jest.config.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jsconfig.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mock/index.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mock/mock-server.js 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mock/table.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mock/user.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 17612 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
postcss.config.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
public/index.html 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/assessment.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/baseinfo.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/company.js 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/configgroup.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/datadictionary.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/defaultUrl.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/news.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/permisson.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/role.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/serverconfig.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/table.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/upload.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/uploadUrl.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/user.js 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/404_images/404.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/404_images/404_cloud.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/bg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/expire.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/expire.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Blob.js 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Export2Excel.js 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login-bg.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login-form-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/BaiduMap/index.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Breadcrumb/index.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Hamburger/index.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/LineChart/index.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PageTitle/index.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Pagination/index.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SvgIcon/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Uploader/index.vue 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Uploader2/index.vue 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directives.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/i18n/i18n.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/i18n/langs/cn.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/i18n/langs/en.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/i18n/langs/index.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/index.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/11.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/31.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/authority.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/company.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/dashboard.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/dictionary.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/example.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/eye-open.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/eye.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/form.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/gate.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/heat.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/home.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/ldar.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/link.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/nested.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/password.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/permisson.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/role.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/table.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/tree.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/user.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/中专志愿管理.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/企业.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/信用.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/公开.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/危化品管理.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/危废统计.svg 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/园区.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/固废管理.svg 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/土壤.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/地下水.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/基础信息.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/大气环境.svg 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/学生留言.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/巡查.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/应急资源.svg 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/投诉.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/指标事物.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/排口信息.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/数据.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/数据管理.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/权限管理.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/水质监测.svg 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/污水处理.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/渗流.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/环保.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/环境气象.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/用户权限管理.svg 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/硬件.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/管理员.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/行政处罚.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/行政执法.svg 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/评价.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/试运行.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/车辆管理.svg 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/软件.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/防护目标.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/风险源.svg 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/首页.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/高中志愿管理.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svgo.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/AppMain.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Logo.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/index.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/mixin/ResizeHandler.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/constroutes.js 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/settings.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/getters.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/app.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/park.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/permission.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/settings.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/element-ui.scss 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/index.scss 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/mixin.scss 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/sidebar.scss 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/transition.scss 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/variables.scss 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/get-page-title.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/index.js 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/pxtorem.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/requestUpload.js 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/scroll-to.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/stopReClick.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/validate.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/404.vue 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appointment/index.vue 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/baseinfo/index.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/datadictionary/index.vue 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/datagroup/index.vue 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 372 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/management/component/companyDetailDialog.vue 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/management/component/companyDialog.vue 790 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/management/index.vue 602 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/managementCopy/index.vue 863 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/managementDetails/index.vue 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/news/index.vue 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/permisson/index.vue 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/role/index.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tempsecondview/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tempsecondview/index2.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tempsecondview/index3.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/user/index.vue 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/.eslintrc.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/components/Breadcrumb.spec.js 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/components/Hamburger.spec.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/components/SvgIcon.spec.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/utils/formatTime.spec.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/utils/parseTime.spec.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/unit/utils/validate.spec.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yarn-error.log 11081 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yarn.lock 10972 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.editorconfig
对比新文件
@@ -0,0 +1,14 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
.env.development
对比新文件
@@ -0,0 +1,14 @@
# just a flag
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://192.168.0.29:6703/api'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
# It only does one thing by converting all import() to require().
# This configuration can significantly increase the speed of hot updates,
# when you have a large number of pages.
# Detail:  https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
VUE_CLI_BABEL_TRANSPILE_MODULES = true
.env.production
对比新文件
@@ -0,0 +1,6 @@
# just a flag
ENV = 'production'
# base api
VUE_APP_BASE_API = 'http://121.239.169.27:6703/api'
.env.staging
对比新文件
@@ -0,0 +1,8 @@
NODE_ENV = production
# just a flag
ENV = 'staging'
# base api
VUE_APP_BASE_API = '/stage-api'
.eslintignore
对比新文件
@@ -0,0 +1,4 @@
build/*.js
src
public
dist
.eslintrc.js
对比新文件
@@ -0,0 +1,198 @@
module.exports = {
  root: true,
  parserOptions: {
    parser: 'babel-eslint',
    sourceType: 'module'
  },
  env: {
    browser: true,
    node: true,
    es6: true,
  },
  extends: ['plugin:vue/recommended', 'eslint:recommended'],
  // add your custom rules here
  //it is base on https://github.com/vuejs/eslint-config-vue
  rules: {
    "vue/max-attributes-per-line": [2, {
      "singleline": 10,
      "multiline": {
        "max": 1,
        "allowFirstLine": false
      }
    }],
    "vue/singleline-html-element-content-newline": "off",
    "vue/multiline-html-element-content-newline":"off",
    "vue/name-property-casing": ["error", "PascalCase"],
    "vue/no-v-html": "off",
    'accessor-pairs': 2,
    'arrow-spacing': [2, {
      'before': true,
      'after': true
    }],
    'block-spacing': [2, 'always'],
    'brace-style': [2, '1tbs', {
      'allowSingleLine': true
    }],
    'camelcase': [0, {
      'properties': 'always'
    }],
    'comma-dangle': [2, 'never'],
    'comma-spacing': [2, {
      'before': false,
      'after': true
    }],
    'comma-style': [2, 'last'],
    'constructor-super': 2,
    'curly': [2, 'multi-line'],
    'dot-location': [2, 'property'],
    'eol-last': 2,
    'eqeqeq': ["error", "always", {"null": "ignore"}],
    'generator-star-spacing': [2, {
      'before': true,
      'after': true
    }],
    'handle-callback-err': [2, '^(err|error)$'],
    'indent': [2, 2, {
      'SwitchCase': 1
    }],
    'jsx-quotes': [2, 'prefer-single'],
    'key-spacing': [2, {
      'beforeColon': false,
      'afterColon': true
    }],
    'keyword-spacing': [2, {
      'before': true,
      'after': true
    }],
    'new-cap': [2, {
      'newIsCap': true,
      'capIsNew': false
    }],
    'new-parens': 2,
    'no-array-constructor': 2,
    'no-caller': 2,
    'no-console': 'off',
    'no-class-assign': 2,
    'no-cond-assign': 2,
    'no-const-assign': 2,
    'no-control-regex': 0,
    'no-delete-var': 2,
    'no-dupe-args': 2,
    'no-dupe-class-members': 2,
    'no-dupe-keys': 2,
    'no-duplicate-case': 2,
    'no-empty-character-class': 2,
    'no-empty-pattern': 2,
    'no-eval': 2,
    'no-ex-assign': 2,
    'no-extend-native': 2,
    'no-extra-bind': 2,
    'no-extra-boolean-cast': 2,
    'no-extra-parens': [2, 'functions'],
    'no-fallthrough': 2,
    'no-floating-decimal': 2,
    'no-func-assign': 2,
    'no-implied-eval': 2,
    'no-inner-declarations': [2, 'functions'],
    'no-invalid-regexp': 2,
    'no-irregular-whitespace': 2,
    'no-iterator': 2,
    'no-label-var': 2,
    'no-labels': [2, {
      'allowLoop': false,
      'allowSwitch': false
    }],
    'no-lone-blocks': 2,
    'no-mixed-spaces-and-tabs': 2,
    'no-multi-spaces': 2,
    'no-multi-str': 2,
    'no-multiple-empty-lines': [2, {
      'max': 1
    }],
    'no-native-reassign': 2,
    'no-negated-in-lhs': 2,
    'no-new-object': 2,
    'no-new-require': 2,
    'no-new-symbol': 2,
    'no-new-wrappers': 2,
    'no-obj-calls': 2,
    'no-octal': 2,
    'no-octal-escape': 2,
    'no-path-concat': 2,
    'no-proto': 2,
    'no-redeclare': 2,
    'no-regex-spaces': 2,
    'no-return-assign': [2, 'except-parens'],
    'no-self-assign': 2,
    'no-self-compare': 2,
    'no-sequences': 2,
    'no-shadow-restricted-names': 2,
    'no-spaced-func': 2,
    'no-sparse-arrays': 2,
    'no-this-before-super': 2,
    'no-throw-literal': 2,
    'no-trailing-spaces': 2,
    'no-undef': 2,
    'no-undef-init': 2,
    'no-unexpected-multiline': 2,
    'no-unmodified-loop-condition': 2,
    'no-unneeded-ternary': [2, {
      'defaultAssignment': false
    }],
    'no-unreachable': 2,
    'no-unsafe-finally': 2,
    'no-unused-vars': [2, {
      'vars': 'all',
      'args': 'none'
    }],
    'no-useless-call': 2,
    'no-useless-computed-key': 2,
    'no-useless-constructor': 2,
    'no-useless-escape': 0,
    'no-whitespace-before-property': 2,
    'no-with': 2,
    'one-var': [2, {
      'initialized': 'never'
    }],
    'operator-linebreak': [2, 'after', {
      'overrides': {
        '?': 'before',
        ':': 'before'
      }
    }],
    'padded-blocks': [2, 'never'],
    'quotes': [2, 'single', {
      'avoidEscape': true,
      'allowTemplateLiterals': true
    }],
    'semi': [2, 'never'],
    'semi-spacing': [2, {
      'before': false,
      'after': true
    }],
    'space-before-blocks': [2, 'always'],
    'space-before-function-paren': [2, 'never'],
    'space-in-parens': [2, 'never'],
    'space-infix-ops': 2,
    'space-unary-ops': [2, {
      'words': true,
      'nonwords': false
    }],
    'spaced-comment': [2, 'always', {
      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
    }],
    'template-curly-spacing': [2, 'never'],
    'use-isnan': 2,
    'valid-typeof': 2,
    'wrap-iife': [2, 'any'],
    'yield-star-spacing': [2, 'both'],
    'yoda': [2, 'never'],
    'prefer-const': 2,
    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
    'object-curly-spacing': [2, 'always', {
      objectsInObjects: false
    }],
    'array-bracket-spacing': [2, 'never']
  }
}
.prettierrc
对比新文件
@@ -0,0 +1,7 @@
{
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "useTabs": false,
  "printWidth": 160
}
.travis.yml
对比新文件
@@ -0,0 +1,5 @@
language: node_js
node_js: 10
script: npm run test
notifications:
  email: false
LICENSE
对比新文件
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017-present PanJiaChen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
README-zh.md
对比新文件
@@ -0,0 +1,42 @@
## Build Setup
```bash
# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
# 安装依赖
npm install 或者 yarn install
# 启动服务
npm run dev
```
## 发布
```bash
# 构建测试环境
npm run build:stage
# 构建生产环境
npm run build:prod
```
## 其它
```bash
# 预览发布环境效果
npm run preview
# 预览发布环境效果 + 静态资源分析
npm run preview -- --report
# 代码格式检查
npm run lint
# 代码格式检查并自动修复
npm run lint -- --fix
```
## Browsers support
Modern browsers and Internet Explorer 10+.
babel.config.js
对比新文件
@@ -0,0 +1,5 @@
module.exports = {
  presets: [
    '@vue/app'
  ]
}
jest.config.js
对比新文件
@@ -0,0 +1,24 @@
module.exports = {
  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
  transform: {
    '^.+\\.vue$': 'vue-jest',
    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
      'jest-transform-stub',
    '^.+\\.jsx?$': 'babel-jest'
  },
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1'
  },
  snapshotSerializers: ['jest-serializer-vue'],
  testMatch: [
    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
  ],
  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
  coverageDirectory: '<rootDir>/tests/unit/coverage',
  // 'collectCoverage': true,
  'coverageReporters': [
    'lcov',
    'text-summary'
  ],
  testURL: 'http://192.168.0.29:6703/'
}
jsconfig.json
对比新文件
@@ -0,0 +1,9 @@
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
        "@/*": ["src/*"]
    }
  },
  "exclude": ["node_modules", "dist"]
}
mock/index.js
对比新文件
@@ -0,0 +1,66 @@
import Mock from 'mockjs'
import { param2Obj } from '../src/utils'
import user from './user'
import table from './table'
const mocks = [
  ...user,
  ...table
]
// for front mock
// please use it cautiously, it will redefine XMLHttpRequest,
// which will cause many of your third-party libraries to be invalidated(like progress event).
export function mockXHR() {
  // mock patch
  // https://github.com/nuysoft/Mock/issues/300
  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  Mock.XHR.prototype.send = function() {
    if (this.custom.xhr) {
      this.custom.xhr.withCredentials = this.withCredentials || false
      if (this.responseType) {
        this.custom.xhr.responseType = this.responseType
      }
    }
    this.proxy_send(...arguments)
  }
  function XHR2ExpressReqWrap(respond) {
    return function(options) {
      let result = null
      if (respond instanceof Function) {
        const { body, type, url } = options
        // https://expressjs.com/en/4x/api.html#req
        result = respond({
          method: type,
          body: JSON.parse(body),
          query: param2Obj(url)
        })
      } else {
        result = respond
      }
      return Mock.mock(result)
    }
  }
  for (const i of mocks) {
    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
  }
}
// for mock server
const responseFake = (url, type, respond) => {
  return {
    url: new RegExp(`/mock${url}`),
    type: type || 'get',
    response(req, res) {
      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
    }
  }
}
export default mocks.map(route => {
  return responseFake(route.url, route.type, route.response)
})
mock/mock-server.js
对比新文件
@@ -0,0 +1,68 @@
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const mockDir = path.join(process.cwd(), 'mock')
function registerRoutes(app) {
  let mockLastIndex
  const { default: mocks } = require('./index.js')
  for (const mock of mocks) {
    app[mock.type](mock.url, mock.response)
    mockLastIndex = app._router.stack.length
  }
  const mockRoutesLength = Object.keys(mocks).length
  return {
    mockRoutesLength: mockRoutesLength,
    mockStartIndex: mockLastIndex - mockRoutesLength
  }
}
function unregisterRoutes() {
  Object.keys(require.cache).forEach(i => {
    if (i.includes(mockDir)) {
      delete require.cache[require.resolve(i)]
    }
  })
}
module.exports = app => {
  // es6 polyfill
  require('@babel/register')
  // parse app.body
  // https://expressjs.com/en/4x/api.html#req.body
  app.use(bodyParser.json())
  app.use(bodyParser.urlencoded({
    extended: true
  }))
  const mockRoutes = registerRoutes(app)
  var mockRoutesLength = mockRoutes.mockRoutesLength
  var mockStartIndex = mockRoutes.mockStartIndex
  // watch files, hot reload mock server
  chokidar.watch(mockDir, {
    ignored: /mock-server/,
    ignoreInitial: true
  }).on('all', (event, path) => {
    if (event === 'change' || event === 'add') {
      try {
        // remove mock routes stack
        app._router.stack.splice(mockStartIndex, mockRoutesLength)
        // clear routes cache
        unregisterRoutes()
        const mockRoutes = registerRoutes(app)
        mockRoutesLength = mockRoutes.mockRoutesLength
        mockStartIndex = mockRoutes.mockStartIndex
        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
      } catch (error) {
        console.log(chalk.redBright(error))
      }
    }
  })
}
mock/table.js
对比新文件
@@ -0,0 +1,29 @@
import Mock from 'mockjs'
const data = Mock.mock({
  'items|30': [{
    id: '@id',
    title: '@sentence(10, 20)',
    'status|1': ['published', 'draft', 'deleted'],
    author: 'name',
    display_time: '@datetime',
    pageviews: '@integer(300, 5000)'
  }]
})
export default [
  {
    url: '/table/list',
    type: 'get',
    response: config => {
      const items = data.items
      return {
        code: 20000,
        data: {
          total: items.length,
          items: items
        }
      }
    }
  }
]
mock/user.js
对比新文件
@@ -0,0 +1,84 @@
const tokens = {
  admin: {
    token: 'admin-token'
  },
  editor: {
    token: 'editor-token'
  }
}
const users = {
  'admin-token': {
    roles: ['admin'],
    introduction: 'I am a super administrator',
    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    name: 'Super Admin'
  },
  'editor-token': {
    roles: ['editor'],
    introduction: 'I am an editor',
    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    name: 'Normal Editor'
  }
}
export default [
  // user login
  {
    url: '/user/login',
    type: 'post',
    response: config => {
      const { username } = config.body
      const token = tokens[username]
      // mock error
      if (!token) {
        return {
          code: 60204,
          message: '用户名或密码不正确'
        }
      }
      return {
        code: 20000,
        data: token
      }
    }
  },
  // get user info
  {
    url: '/user/info\.*',
    type: 'get',
    response: config => {
      const { token } = config.query
      const info = users[token]
      // mock error
      if (!info) {
        return {
          code: 50008,
          message: 'Login failed, unable to get user details.'
        }
      }
      return {
        code: 20000,
        data: info
      }
    }
  },
  // user logout
  {
    url: '/user/logout',
    type: 'post',
    response: _ => {
      return {
        code: 20000,
        data: 'success'
      }
    }
  }
]
package-lock.json
对比新文件
文件太大
package.json
对比新文件
@@ -0,0 +1,80 @@
{
  "name": "vue-admin-template",
  "version": "4.2.1",
  "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
  "author": "Pan <panfree23@gmail.com>",
  "license": "MIT",
  "scripts": {
    "dev": "vue-cli-service serve",
    "clean": "rm -rf node_modules && cnpm install",
    "build:prod": "vue-cli-service build",
    "build:stage": "vue-cli-service build --mode staging",
    "preview": "node build/index.js --preview",
    "lint": "eslint --ext .js,.vue src",
    "test:unit": "jest --clearCache && vue-cli-service test:unit",
    "test:ci": "npm run lint && npm run test:unit",
    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
  },
  "dependencies": {
    "axios": "0.18.1",
    "echarts": "^4.6.0",
    "element-ui": "2.13.0",
    "file-saver": "^2.0.2",
    "image-webpack-loader": "^6.0.0",
    "imagemin-gifsicle": "^6.0.1",
    "js-cookie": "2.2.0",
    "js-md5": "^0.7.3",
    "moment": "^2.29.1",
    "node-sass": "^8.0.0",
    "normalize.css": "7.0.0",
    "nprogress": "0.2.0",
    "path-to-regexp": "2.4.0",
    "postcss-px2rem": "^0.3.0",
    "px2rem-loader": "^0.1.9",
    "script-loader": "^0.7.2",
    "trtc-js-sdk": "^4.8.0",
    "vue": "2.6.10",
    "vue-baidu-map": "^0.21.22",
    "vue-i18n": "^8.15.4",
    "vue-router": "3.0.6",
    "vuex": "3.1.0",
    "xlsx": "^0.16.1"
  },
  "devDependencies": {
    "@babel/core": "7.0.0",
    "@babel/register": "7.0.0",
    "@vue/cli-plugin-babel": "3.6.0",
    "@vue/cli-plugin-eslint": "^3.9.1",
    "@vue/cli-plugin-unit-jest": "3.6.3",
    "@vue/cli-service": "3.6.0",
    "@vue/test-utils": "1.0.0-beta.29",
    "autoprefixer": "^9.5.1",
    "babel-core": "7.0.0-bridge.0",
    "babel-eslint": "10.0.1",
    "babel-jest": "23.6.0",
    "better-scroll": "^1.15.1",
    "chalk": "2.4.2",
    "connect": "3.6.6",
    "eslint": "5.15.3",
    "eslint-plugin-vue": "5.2.2",
    "html-webpack-plugin": "3.2.0",
    "mockjs": "1.0.1-beta3",
    "runjs": "^4.3.2",
    "sass": "^1.56.1",
    "sass-loader": "^7.1.0",
    "script-ext-html-webpack-plugin": "2.1.3",
    "script-loader": "^0.7.2",
    "serve-static": "^1.13.2",
    "svg-sprite-loader": "4.1.3",
    "svgo": "1.2.2",
    "vue-template-compiler": "2.6.10"
  },
  "engines": {
    "node": ">=8.9",
    "npm": ">= 3.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}
postcss.config.js
对比新文件
@@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
  'plugins': {
    // to edit target browsers: use "browserslist" field in package.json
    'autoprefixer': {}
  }
}
public/favicon.ico
public/index.html
对比新文件
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= webpackConfig.name %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
src/App.vue
对比新文件
@@ -0,0 +1,16 @@
<template>
  <div id="app">
    <router-view />
  </div>
</template>
<script>
export default {
  name: 'App'
}
</script>
<style>
  .xian{
    border: 1px solid black;
  }
</style>
src/api/assessment.js
对比新文件
@@ -0,0 +1,39 @@
import request from '@/utils/request';
export function addAssessment(data) {
  return request({
    url: '/assessment',
    method: 'post',
    data
  });
}
export function updateAssessment(data) {
  return request({
    url: '/assessment',
    method: 'put',
    data
  });
}
export async function getAllAssessment(query) {
  return request({
    url: `/assessment?page=${query.page}&size=${query.limit}&product=${encodeURIComponent(query.searchname)}&address=`,
    method: 'get'
  });
}
export function deleteAssessmentById(id) {
  return request({
    url: `/assessment/delete/${id}`,
    method: 'delete'
  });
}
export function getAssessmentById(id) {
  return request({
    url: `/assessment/${id}`,
    method: 'get'
  });
}
src/api/baseinfo.js
对比新文件
@@ -0,0 +1,16 @@
import request from '@/utils/request';
export async function getParkInfo(id) {
  return request({
    url: `/wisdom/baseinfo/${id}`,
    method: 'get'
  });
}
export async function update(data) {
  return request({
    url: `/wisdom/baseinfo`,
    method: 'put',
    data
  });
}
src/api/company.js
对比新文件
@@ -0,0 +1,197 @@
import request from '@/utils/request';
// export function searchCompanyList(data) {
//   return request({
//     url: 'companyInfo/findCompanyInfo',
//     method: 'put',
//     data
//   });
// }
export function searchCompanyList(data) {
  return request({
    url: 'enterpriseManage/select/getEnterpriseInfoByCondition',
    method: 'post',
    data
  });
}
// export function saveCompanyInfo(data) {
//   return request({
//     url: 'companyInfo/svarInfo',
//     method: 'put',
//     headers:{
//       'Content-Type': 'multipart/form-data'
//     },
//     data
//   });
// }
export function saveCompanyInfo(data) {
  return request({
    url: 'enterpriseManage/insert/saveEnterpriseInfo',
    method: 'post',
    data
  });
}
// export function updateCompanyInfo(data) {
//   return request({
//     url: 'companyInfo/updateInfo',
//     method: 'put',
//     headers:{
//       'Content-Type': 'multipart/form-data'
//     },
//     data
//   });
// }
export function updateCompanyInfo(data) {
  return request({
    url: 'enterpriseManage/update/updateEnterpriseInfoById',
    method: 'post',
    data
  });
}
// export function deleteById(data) {
//   return request({
//     url: 'companyInfo/deleteById',
//     method: 'put',
//     data
//   });
// }
export function deleteById(data) {
  return request({
    url: 'enterpriseManage/delete/deleteEnterpriseInfoById',
    method: 'post',
    data
  });
}
// export function getOneCompany(data) {
//   return request({
//     url: 'companyInfo/getOne',
//     method: 'put',
//     data
//   });
// }
export function getTechType(data) {
  return request({
    url: 'technologyType/select/selectTechnologyTypeList',
    method: 'post',
    data
  });
}
export function addTechType(data) {
  return request({
    url: 'technologyType/insert/saveTechnologyType',
    method: 'post',
    data
  });
}
export function updateTechType(data) {
  return request({
    url: 'technologyType/update/updateTechnologyType',
    method: 'post',
    data
  });
}
export function deleteTechType(data) {
  return request({
    url: 'technologyType/delete/deleteTechnologyType',
    method: 'post',
    data
  });
}
// 获取某市级企业信息列表
export function getOneCompany(data) {
  return request({
    url: 'enterpriseManage/select/getEnterpriseInfoByCity',
    method: 'post',
    data
  });
}
// 根据id获取企业信息
export function getEnterpriseInfoById(data) {
  return request({
    url: 'enterpriseManage/select/getEnterpriseInfoById',
    method: 'post',
    data
  });
}
// 条件查询企业信息列表
export function getAllCompany(data) {
  return request({
    url: 'enterpriseManage/select/getEnterpriseInfoByCondition',
    method: 'post',
    data
  });
}
// export function importCompanyData(data) {
//   return request({
//     url: 'companyInfo/importData',
//     method: 'put',
//     headers:{
//       'Content-Type': 'multipart/form-data'
//     },
//     data
//   });
// }
export function importCompanyData(data) {
  return request({
    url: 'enterpriseManage/import/importData',
    method: 'post',
    headers:{
      'Content-Type': 'multipart/form-data'
    },
    data
  });
}
export function exportCompanyData(data) {
  return request({
    url: 'companyInfo/export',
    method: 'post',
    responseType: 'arraybuffer',
    data
  });
}
// export function downLoadTemplate(data) {
//   return request({
//     url: 'companyInfo/downLoadTemplate',
//     method: 'post',
//     responseType: 'arraybuffer',
//     data
//   });
// }
export function downLoadTemplate(data) {
  return request({
    url: 'enterpriseManage/download/downLoadTemplate',
    method: 'post',
    responseType: 'arraybuffer',
    data
  });
}
export function getAreaInfo() {
  return request({
    url: 'areaInfo/getAreaInfo',
    method: 'post',
  });
}
export function getProvinceInfo() {
  return request({
    url: 'enterpriseManage/select/countProvinceData',
    method: 'post',
  });
}
src/api/configgroup.js
对比新文件
@@ -0,0 +1,38 @@
import request from '@/utils/request';
export function addConfigGroup(data) {
  return request({
    url: '/wisdom/configgroup',
    method: 'post',
    data
  });
}
export function updateConfigGroup(data) {
  return request({
    url: '/wisdom/configgroup',
    method: 'put',
    data
  });
}
export async function getGroupList(query) {
  return request({
    url: `/wisdom/configgroup?page=${query.page}&size=${query.limit}&search=${encodeURIComponent(query.searchname)}`,
    method: 'get'
  });
}
export function deleteConfigGroupById(id) {
  return request({
    url: `wisdom/configgroup/delete/${id}`,
    method: 'delete'
  });
}
export function getConfigGroupById(id) {
  return request({
    url: `wisdom/configgroup/${id}`,
    method: 'get'
  });
}
src/api/datadictionary.js
对比新文件
@@ -0,0 +1,60 @@
import request from '@/utils/request';
export function add(data) {
  return request({
    url: '/wisdom/serverconfig',
    method: 'post',
    data
  });
}
export function update(data) {
  return request({
    url: '/wisdom/serverconfig',
    method: 'put',
    data
  });
}
export async function getDataGroupList(data) {
  return request({
    url: '/wisdom/configgroup',
    method: 'get',
    data
  });
}
export function deleteById(id) {
  return request({
    url: `wisdom/serverconfig/delete/${id}`,
    method: 'delete'
  });
}
export function getById(id) {
  return request({
    url: `wisdom/serverconfig/${id}`,
    method: 'get'
  });
}
export async function fetchList(query) {
  if (query.searchname) {
    return request({
      url: `wisdom/serverconfig/byCode/page/${query.searchname}?page=${query.page}&size=${query.limit}&code=${query.searchname}&name=${query.searchValue}`,
      method: 'get'
    });
  } else {
    return request({
      url: `/wisdom/serverconfig?page=${query.page}&size=${query.limit}&search=${query.searchname || ''}&groupName=${query.groupName}&name=${query.searchValue}`,
      method: 'get'
    });
  }
}
export async function fetchListByCode(query) {
  return request({
    url: `wisdom/serverconfig/byCode/page/${query.searchname}?page=${query.page}&size=${query.limit}&code=${query.searchname}`,
    method: 'get'
  });
}
src/api/defaultUrl.js
对比新文件
@@ -0,0 +1,4 @@
const url = "http://192.168.0.29:6703"
export default url
src/api/news.js
对比新文件
@@ -0,0 +1,39 @@
import request from '@/utils/request';
export function addNews(data) {
  return request({
    url: '/news',
    method: 'post',
    data
  });
}
export function updateNews(data) {
  return request({
    url: '/news',
    method: 'put',
    data
  });
}
export async function getAllNews(query) {
  return request({
    url: `/news?page=${query.page}&size=${query.limit}&newsTitle=${encodeURIComponent(query.searchname)}`,
    method: 'get'
  });
}
export function deleteNewsById(id) {
  return request({
    url: `/news/delete/${id}`,
    method: 'delete'
  });
}
export function getNewsById(id) {
  return request({
    url: `/news/${id}`,
    method: 'get'
  });
}
src/api/permisson.js
对比新文件
@@ -0,0 +1,48 @@
import request from '@/utils/request';
export function addPermission(data) {
  return request({
    url: '/wisdom/permission',
    method: 'post',
    data
  });
}
export function updatePermission(data) {
  return request({
    url: '/wisdom/permission',
    method: 'put',
    data
  });
}
export async function addRolePermission(data) {
  return request({
    url: '/wisdom/rolepermission',
    method: 'post',
    data
  });
}
export async function updateRolePermission(data) {
  return request({
    url: '/wisdom/rolepermission',
    method: 'put',
    data
  });
}
export async function batchAddPermission(data) {
  return request({
    url: '/wisdom/permission/batchAdd',
    method: 'post',
    data
  });
}
export async function getPermissionList() {
  return request({
    url: '/wisdom/permission',
    method: 'get'
  });
}
src/api/role.js
对比新文件
@@ -0,0 +1,38 @@
import request from '@/utils/request';
export function getRoleList(data) {
  return request({
    url: '/wisdom/role?search='+data,
    method: 'get'
  });
}
export async function addRole(data) {
  return request({
    url: '/wisdom/role',
    method: 'post',
    data
  });
}
export function deleteRoleById(id) {
  return request({
    url: `wisdom/role/delete/${id}`,
    method: 'delete'
  });
}
export function updateRole(data) {
  return request({
    url: `wisdom/role/`,
    method: 'put',
    data
  });
}
export function getRolebyId(id) {
  return request({
    url: `wisdom/role/${id}`,
    method: 'get'
  });
}
src/api/serverconfig.js
对比新文件
@@ -0,0 +1,7 @@
import request from '@/utils/request';
export async function getConfigData() {
  return request({
    url: 'wisdom/serverconfig'
  });
}
src/api/table.js
对比新文件
@@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getList(params) {
  return request({
    url: '/table/list',
    method: 'get',
    params
  })
}
src/api/upload.js
对比新文件
@@ -0,0 +1,32 @@
import request from '@/utils/request';
import requestUpload from '@/utils/requestUpload'
export function upload(companynum, type, data) {
  return request({
    url: `/wisdom/file/upload/${companynum}/${type}`,
    method: 'post',
    data
  });
}
export function deleteFile(data) {
  return request({
    url: `/wisdom/file/delete?filePath=${data.filePath}&type=${data.fileType}`,
    method: 'delete'
  });
}
export function uploadNew(data) {
  return requestUpload({
    url: `/wisdom/upload/uploadNew`,
    method: 'post',
    data
  });
}
export function downloadNew(data) {
  return request({
    url: `/wisdom/upload/download?path=${data}`,
    method: 'get'
  });
}
src/api/uploadUrl.js
对比新文件
@@ -0,0 +1,6 @@
import url from "./defaultUrl";
const download=url+'/api/wisdom/upload/downloadNew?path='
export default download
src/api/user.js
对比新文件
@@ -0,0 +1,107 @@
import request from '@/utils/request';
export async function fetchList(query) {
  return request({
    url: `/wisdom/user?&searchusername=${query.searchusername }&searchname=${query.searchname }`,
    method: 'get'
  });
}
export function login(data) {
  return request({
    url: '/sso/login',
    method: 'post',
    data
  });
}
export function elogin(data) {
  return request({
    url: '/sso/login',
    method: 'post',
    data
  });
}
export async function getOnline() {
  return request({
    url: '/wisdom/user/getOnline',
    method: 'get'
  });
}
export function getInfo(token) {
  return request({
    url: '/user/info',
    method: 'get',
    params: { token }
  });
}
export function logout() {
  return request({
    url: '/sso/logout',
    method: 'get'
  });
}
export function getUserList(data) {
  return request({
    url: '/wisdom/user',
    method: 'post',
    data
  });
}
export function addUser(data) {
  return request({
    url: '/system/user',
    method: 'post',
    data
  });
}
export function deleteUserById(id) {
  return request({
    url: `system/user/${id}`,
    method: 'delete'
  });
}
export function updateUser(data) {
  return request({
    url: 'system/user/',
    method: 'put',
    data
  });
}
export async function getUserById(id) {
  return request({
    url: `wisdom/getUSerById?userId=`+id,
    method: 'get'
  });
}
export async function getUser(id) {
  return request({
    url: `wisdom/user/getUser`,
    method: 'get'
  });
}
export async function getUserById1() {
  return request({
    url: `wisdom/user/findpassword`,
    method: 'get'
  });
}
export function getRoleList() {
  return request({
    url: 'system/role/optionselect',
    method: 'GET',
  });
}
src/assets/404_images/404.png
src/assets/404_images/404_cloud.png
src/assets/bg.png
src/assets/expire.jpg
src/assets/expire.png
src/assets/js/Blob.js
对比新文件
@@ -0,0 +1,210 @@
/* eslint-disable */
/* Blob.js*/
/*global self, unescape */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
  plusplus: true */
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
(function (view) {
  "use strict";
  view.URL = view.URL || view.webkitURL;
  if (view.Blob && view.URL) {
    try {
      new Blob;
      return;
    } catch (e) {
    }
  }
  // Internally we use a BlobBuilder implementation to base Blob off of
  // in order to support older browsers that only have BlobBuilder
  var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function (view) {
    var
      get_class = function (object) {
        return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
      }
      , FakeBlobBuilder = function BlobBuilder() {
        this.data = [];
      }
      , FakeBlob = function Blob(data, type, encoding) {
        this.data = data;
        this.size = data.length;
        this.type = type;
        this.encoding = encoding;
      }
      , FBB_proto = FakeBlobBuilder.prototype
      , FB_proto = FakeBlob.prototype
      , FileReaderSync = view.FileReaderSync
      , FileException = function (type) {
        this.code = this[this.name = type];
      }
      , file_ex_codes = (
        "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
        + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
      ).split(" ")
      , file_ex_code = file_ex_codes.length
      , real_URL = view.URL || view.webkitURL || view
      , real_create_object_URL = real_URL.createObjectURL
      , real_revoke_object_URL = real_URL.revokeObjectURL
      , URL = real_URL
      , btoa = view.btoa
      , atob = view.atob
      , ArrayBuffer = view.ArrayBuffer
      , Uint8Array = view.Uint8Array
      , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
    ;
    FakeBlob.fake = FB_proto.fake = true;
    while (file_ex_code--) {
      FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
    }
    // Polyfill URL
    if (!real_URL.createObjectURL) {
      URL = view.URL = function (uri) {
        var
          uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
          , uri_origin
        ;
        uri_info.href = uri;
        if (!("origin" in uri_info)) {
          if (uri_info.protocol.toLowerCase() === "data:") {
            uri_info.origin = null;
          } else {
            uri_origin = uri.match(origin);
            uri_info.origin = uri_origin && uri_origin[1];
          }
        }
        return uri_info;
      };
    }
    URL.createObjectURL = function (blob) {
      var
        type = blob.type
        , data_URI_header
      ;
      if (type === null) {
        type = "application/octet-stream";
      }
      if (blob instanceof FakeBlob) {
        data_URI_header = "data:" + type;
        if (blob.encoding === "base64") {
          return data_URI_header + ";base64," + blob.data;
        } else if (blob.encoding === "URI") {
          return data_URI_header + "," + decodeURIComponent(blob.data);
        }
        if (btoa) {
          return data_URI_header + ";base64," + btoa(blob.data);
        } else {
          return data_URI_header + "," + encodeURIComponent(blob.data);
        }
      } else if (real_create_object_URL) {
        return real_create_object_URL.call(real_URL, blob);
      }
    };
    URL.revokeObjectURL = function (object_URL) {
      if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
        real_revoke_object_URL.call(real_URL, object_URL);
      }
    };
    FBB_proto.append = function (data/*, endings*/) {
      var bb = this.data;
      // decode data to a binary string
      if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
        var
          str = ""
          , buf = new Uint8Array(data)
          , i = 0
          , buf_len = buf.length
        ;
        for (; i < buf_len; i++) {
          str += String.fromCharCode(buf[i]);
        }
        bb.push(str);
      } else if (get_class(data) === "Blob" || get_class(data) === "File") {
        if (FileReaderSync) {
          var fr = new FileReaderSync;
          bb.push(fr.readAsBinaryString(data));
        } else {
          // async FileReader won't work as BlobBuilder is sync
          throw new FileException("NOT_READABLE_ERR");
        }
      } else if (data instanceof FakeBlob) {
        if (data.encoding === "base64" && atob) {
          bb.push(atob(data.data));
        } else if (data.encoding === "URI") {
          bb.push(decodeURIComponent(data.data));
        } else if (data.encoding === "raw") {
          bb.push(data.data);
        }
      } else {
        if (typeof data !== "string") {
          data += ""; // convert unsupported types to strings
        }
        // decode UTF-16 to binary string
        bb.push(unescape(encodeURIComponent(data)));
      }
    };
    FBB_proto.getBlob = function (type) {
      if (!arguments.length) {
        type = null;
      }
      return new FakeBlob(this.data.join(""), type, "raw");
    };
    FBB_proto.toString = function () {
      return "[object BlobBuilder]";
    };
    FB_proto.slice = function (start, end, type) {
      var args = arguments.length;
      if (args < 3) {
        type = null;
      }
      return new FakeBlob(
        this.data.slice(start, args > 1 ? end : this.data.length)
        , type
        , this.encoding
      );
    };
    FB_proto.toString = function () {
      return "[object Blob]";
    };
    FB_proto.close = function () {
      this.size = 0;
      delete this.data;
    };
    return FakeBlobBuilder;
  }(view));
  view.Blob = function (blobParts, options) {
    var type = options ? (options.type || "") : "";
    var builder = new BlobBuilder();
    if (blobParts) {
      for (var i = 0, len = blobParts.length; i < len; i++) {
        if (Uint8Array && blobParts[i] instanceof Uint8Array) {
          builder.append(blobParts[i].buffer);
        }
        else {
          builder.append(blobParts[i]);
        }
      }
    }
    var blob = builder.getBlob(type);
    if (!blob.slice && blob.webkitSlice) {
      blob.slice = blob.webkitSlice;
    }
    return blob;
  };
  var getPrototypeOf = Object.getPrototypeOf || function (object) {
    return object.__proto__;
  };
  view.Blob.prototype = getPrototypeOf(new view.Blob());
}(
  typeof self !== "undefined" && self
  || typeof window !== "undefined" && window
  || this
));
src/assets/js/Export2Excel.js
对比新文件
@@ -0,0 +1,144 @@
/* eslint-disable */
require('script-loader!file-saver');
// require('script-loader!src/vendor/Blob');
require('script-loader!../../assets/js/Blob');
require('script-loader!xlsx/dist/xlsx.core.min');
function generateArray(table) {
  var out = [];
  var rows = table.querySelectorAll('tr');
  var ranges = [];
  for (var R = 0; R < rows.length; ++R) {
    var outRow = [];
    var row = rows[R];
    var columns = row.querySelectorAll('td');
    for (var C = 0; C < columns.length; ++C) {
      var cell = columns[C];
      var colspan = cell.getAttribute('colspan');
      var rowspan = cell.getAttribute('rowspan');
      var cellValue = cell.innerText;
      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
      //Skip ranges
      ranges.forEach(function (range) {
        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
        }
      });
      //Handle Row Span
      if (rowspan || colspan) {
        rowspan = rowspan || 1;
        colspan = colspan || 1;
        ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
      }
      ;
      //Handle Value
      outRow.push(cellValue !== "" ? cellValue : null);
      //Handle Colspan
      if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    }
    out.push(outRow);
  }
  return [out, ranges];
};
function datenum(v, date1904) {
  if (date1904) v += 1462;
  var epoch = Date.parse(v);
  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
  var ws = {};
  var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
  for (var R = 0; R != data.length; ++R) {
    for (var C = 0; C != data[R].length; ++C) {
      if (range.s.r > R) range.s.r = R;
      if (range.s.c > C) range.s.c = C;
      if (range.e.r < R) range.e.r = R;
      if (range.e.c < C) range.e.c = C;
      var cell = {v: data[R][C]};
      if (cell.v == null) continue;
      var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
      if (typeof cell.v === 'number') cell.t = 'n';
      else if (typeof cell.v === 'boolean') cell.t = 'b';
      else if (cell.v instanceof Date) {
        cell.t = 'n';
        cell.z = XLSX.SSF._table[14];
        cell.v = datenum(cell.v);
      }
      else cell.t = 's';
      ws[cell_ref] = cell;
    }
  }
  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  return ws;
}
function Workbook() {
  if (!(this instanceof Workbook)) return new Workbook();
  this.SheetNames = [];
  this.Sheets = {};
}
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  return buf;
}
export function export_table_to_excel(id) {
  var theTable = document.getElementById(id);
  console.log('a')
  var oo = generateArray(theTable);
  var ranges = oo[1];
  /* original data */
  var data = oo[0];
  var ws_name = "SheetJS";
  console.log(data);
  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  /* add ranges to worksheet */
  // ws['!cols'] = ['apple', 'banan'];
  ws['!merges'] = ranges;
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}
function formatJson(jsonData) {
  console.log(jsonData)
}
export function export_json_to_excel(th, jsonData, defaultTitle) {
  /* original data */
  var data = jsonData;
  data.unshift(th);
  var ws_name = "SheetJS";
  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  var title = defaultTitle || '列表'
  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}
src/assets/login-bg.jpeg
src/assets/login-form-bg.png
src/assets/logo.png
src/components/BaiduMap/index.vue
对比新文件
@@ -0,0 +1,63 @@
<template>
  <div class="app-container">
    <baidu-map class="map-container" v-bind="mapOptions" @click="mapMoveEnd">
      <bm-control ::offset="{ width: '30px', height: '10px' }">
        <bm-auto-complete v-model="mapKeyword" :sugStyle="{ zIndex: 100000 }">
          <el-row :gutter="2">
            <el-col :span="22">
              <el-input v-model="mapKeyword" placeholder="请输入搜索关键字"></el-input>
            </el-col>
            <el-col :span="2">
              <el-button type="primary" @click="mapSearch">确定</el-button>
            </el-col>
          </el-row>
        </bm-auto-complete>
      </bm-control>
    </baidu-map>
  </div>
</template>
<script>
import { BaiduMap, BmControl, BmAutoComplete } from 'vue-baidu-map/components';
export default {
  components: { BaiduMap, BmControl, BmAutoComplete },
  props: {},
  data() {
    return {
      mapOptions: {
        ak: '42xN1Fhp3VCKvKQRprbfsR48ZbvDbOD0',
        center: { lng: 119.691445, lat: 31.512202 },
        scrollWheelZoom: true,
        zoom: 16
      },
      mapKeyword: '宜兴市'
    };
  },
  methods: {
    mapSearch() {
      let geoCoder = new BMap.Geocoder();
      /* 获取位置对应的坐标 */
      geoCoder.getPoint(this.mapKeyword, point => {
        this.$emit('locationChanged', { searchConfirmed: true, lng: point.lng, lat: point.lat });
      });
    },
    mapMoveEnd(e) {
      const { lng, lat } = e.point;
      this.$emit('locationChanged', {
        lng,
        lat
      });
    }
  }
};
</script>
<style lang="scss" scoped>
.map-container {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}
</style>
src/components/Breadcrumb/index.vue
对比新文件
@@ -0,0 +1,79 @@
<template>
  <el-breadcrumb class="app-breadcrumb" separator="/">
    <transition-group name="breadcrumb">
      <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
        <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
      </el-breadcrumb-item>
    </transition-group>
  </el-breadcrumb>
</template>
<script>
import pathToRegexp from 'path-to-regexp';
export default {
  data() {
    return {
      levelList: null
    };
  },
  watch: {
    $route() {
      this.getBreadcrumb();
    }
  },
  created() {
    this.getBreadcrumb();
  },
  methods: {
    getBreadcrumb() {
      // only show routes with meta.title
      let matched = this.$route.matched.filter(item => item.meta && item.meta.title);
      const first = matched[0];
      // if (!this.isDashboard(first)) {
      //   const dashboard = matched.find(item => item.path === '/dashboard');
      //   matched = dashboard ? [].concat(matched) : [{ path: '/dashboard', meta: { title: '首页' } }].concat(matched);
      // }
      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false);
    },
    isDashboard(route) {
      const name = route && route.name;
      if (!name) {
        return false;
      }
      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase();
    },
    pathCompile(path) {
      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
      const { params } = this.$route;
      var toPath = pathToRegexp.compile(path);
      return toPath(params);
    },
    handleLink(item) {
      const { redirect, path } = item;
      if (redirect) {
        this.$router.push(redirect);
        return;
      }
      this.$router.push(this.pathCompile(path));
    }
  }
};
</script>
<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
  display: inline-block;
  font-size: 14px;
  line-height: 50px;
  margin-left: 8px;
  .no-redirect {
    color: #97a8be;
    cursor: text;
  }
}
</style>
src/components/Hamburger/index.vue
对比新文件
@@ -0,0 +1,44 @@
<template>
  <div style="padding: 0 15px;" @click="toggleClick">
    <svg
      :class="{'is-active':isActive}"
      class="hamburger"
      viewBox="0 0 1024 1024"
      xmlns="http://www.w3.org/2000/svg"
      width="64"
      height="64"
    >
      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
    </svg>
  </div>
</template>
<script>
export default {
  name: 'Hamburger',
  props: {
    isActive: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    toggleClick() {
      this.$emit('toggleClick')
    }
  }
}
</script>
<style scoped>
.hamburger {
  display: inline-block;
  vertical-align: middle;
  width: 20px;
  height: 20px;
}
.hamburger.is-active {
  transform: rotate(180deg);
}
</style>
src/components/LineChart/index.vue
对比新文件
@@ -0,0 +1,136 @@
<template>
  <div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import echarts from 'echarts';
require('echarts/theme/macarons'); // echarts theme
// import resize from './mixins/resize';
export default {
  //   mixins: [resize],
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '350px'
    },
    autoResize: {
      type: Boolean,
      default: true
    },
    chartData: {
      type: Object,
      required: true
    }
  },
  data() {
    return {
      chart: null
    };
  },
  watch: {
    chartData: {
      deep: true,
      handler(val) {
        this.setOptions(val);
      }
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart();
    });
  },
  beforeDestroy() {
    if (!this.chart) {
      return;
    }
    this.chart.dispose();
    this.chart = null;
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons');
      this.setOptions(this.chartData);
    },
    getRandomColor() {
      return '#' + ('00000' + ((Math.random() * 0x1000000) << 0).toString(16)).substr(-6);
    },
    setOptions(chartData) {
      if (!chartData || !chartData.data) {
        return;
      }
      const series = chartData.data.map(item => {
        const randomColor = this.getRandomColor();
        return {
          name: item.name,
          itemStyle: {
            normal: {
              color: randomColor,
              lineStyle: {
                color: randomColor,
                width: 2
              }
            }
          },
          smooth: true,
          type: 'line',
          data: item.data,
          animationDuration: 2800,
          animationEasing: 'cubicInOut'
        };
      });
      const legendData = chartData.data.map(item => item.name);
      this.chart.setOption({
        xAxis: {
          data: chartData.dimension,
          boundaryGap: false,
          axisTick: {
            show: false
          }
        },
        grid: {
          left: 10,
          right: 10,
          bottom: 20,
          top: 30,
          containLabel: true
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'cross'
          },
          formatter:function (params) {
            console.log(params)
            var res=params[0].name
            for(var i=0;i<params.length;i++){
              res +="<br>"+params[i].marker+params[i].seriesName+":"+params[i].data
            }
            return res
          }
        },
        yAxis: {
          axisTick: {
            show: false
          }
        },
        legend: {
          data: legendData
        },
        series: series
      });
    }
  }
};
</script>
src/components/PageTitle/index.vue
对比新文件
@@ -0,0 +1,43 @@
<template>
  <div class="PageTitle-body">
      {{title}}
  </div>
</template>
<script>
export default {
  name: 'PageTitle',
  props:{
    title:{
      type:String,
      default:'标题'
    }
  },
  data () {
    return {
    }
  }
}
</script>
<style scoped>
.PageTitle-body{
  height: 50px;
  background: #FFFFFF;
  border-bottom: 1px solid #e5e5e5;
  padding-left: 20px;
  position: relative;
  line-height: 50px;
  font-size: 18px;
  font-weight: bold;
  top: -10px;
}
.PageTitle-body:before{
  content: '';
  position: absolute;
  left: 5px;
  top: 17px;
  width: 4px;
  height: 19px;
  background-color: #108EE9;
}
</style>
src/components/Pagination/index.vue
对比新文件
@@ -0,0 +1,101 @@
<template>
  <div :class="{'hidden':hidden}" class="pagination-container">
    <el-pagination
      :background="background"
      :current-page.sync="currentPage"
      :page-size.sync="pageSize"
      :layout="layout"
      :page-sizes="pageSizes"
      :total="total"
      v-bind="$attrs"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    />
  </div>
</template>
<script>
import { scrollTo } from '@/utils/scroll-to'
export default {
  name: 'Pagination',
  props: {
    total: {
      required: true,
      type: Number
    },
    page: {
      type: Number,
      default: 1
    },
    limit: {
      type: Number,
      default: 20
    },
    pageSizes: {
      type: Array,
      default() {
        return [10, 20, 30, 50]
      }
    },
    layout: {
      type: String,
      default: 'total, sizes, prev, pager, next, jumper'
    },
    background: {
      type: Boolean,
      default: true
    },
    autoScroll: {
      type: Boolean,
      default: true
    },
    hidden: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    currentPage: {
      get() {
        return this.page
      },
      set(val) {
        this.$emit('update:page', val)
      }
    },
    pageSize: {
      get() {
        return this.limit
      },
      set(val) {
        this.$emit('update:limit', val)
      }
    }
  },
  methods: {
    handleSizeChange(val) {
      this.$emit('pagination', { page: this.currentPage, limit: val })
      if (this.autoScroll) {
        scrollTo(0, 800)
      }
    },
    handleCurrentChange(val) {
      this.$emit('pagination', { page: val, limit: this.pageSize })
      if (this.autoScroll) {
        scrollTo(0, 800)
      }
    }
  }
}
</script>
<style scoped>
.pagination-container {
  background: #fff;
  padding: 32px 16px;
}
.pagination-container.hidden {
  display: none;
}
</style>
src/components/SvgIcon/index.vue
对比新文件
@@ -0,0 +1,62 @@
<template>
  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :href="iconName" />
  </svg>
</template>
<script>
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
import { isExternal } from '@/utils/validate'
export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal() {
      return isExternal(this.iconClass)
    },
    iconName() {
      return `#icon-${this.iconClass}`
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    },
    styleExternalIcon() {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
      }
    }
  }
}
</script>
<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>
src/components/Uploader/index.vue
对比新文件
@@ -0,0 +1,197 @@
<template>
  <div class="upload-container" style="display: flex;justify-content: space-between;align-items: center">
    <el-input :disabled="true" type="text" size="medium" v-model="viewName" style="width: auto;min-width: 40%;max-width: 100%;display: flex;align-items: center" ></el-input>
    <el-button slot="tip" v-if="disabled && fileName" type="primary" size="mini" style="margin-left: 5px">
      <a  @click="downLoadFile(downloadUrl)">下载<i class="el-icon-download el-icon--right"></i></a>
    </el-button>
    <el-upload
      v-if="!disabled"
      class="upload"
      action=""
      multiple
      :limit="1"
      :file-list="fileList"
      :http-request="uploadSectionFile"
      :show-file-list="false"
      :before-upload="beforeUpload"
      :on-success="uploadSuccess"
      :on-error="uploadError"
    >
      <div style="display: flex;justify-content: flex-end;">
        <el-button v-if="!fileName" type="primary" size="mini" style="margin-left:25px;">上传<i class="el-icon-upload el-icon--right"></i></el-button>
      </div>
    </el-upload>
    <div style="display: flex;align-items: center;justify-content: center;">
      <a @click="downLoadFile(downloadUrl)" v-if="!disabled&&fileName">
        <el-button  slot="tip" type="primary" size="mini" style="margin-left:5px;width:65px">
          下载<i class="el-icon-download el-icon--right"></i>
        </el-button>
      </a>
      <el-button v-if="!disabled&&fileName" slot="tip" type="primary" size="mini" @click="handleClear" style="margin-left:5px;height:28px;width:65px"
      >清除<i class="el-icon-delete el-icon--right"></i
      ></el-button>
    </div>
  </div>
</template>
<script>
  import download from '@/api/uploadUrl';
  import axios from 'axios';
  import { Loading } from 'element-ui';
  import defaultUrl from "@/api/defaultUrl";
  export default {
    props: {
      name: {
        type: String
      },
      url: {
        type: String
      },
      disabled: {
        type: Boolean
      },
      assetPackageSn:{
        type:String
      }
    },
    data() {
      return {
        drawer:false,
        progress:"0%",
        viewName:'',
        download: download,
        defaultUrl:defaultUrl,
        fileName: '',
        filePath: '',
        downloadUrl: '',
        fileList: [],
        action: '',
        fileData: '',
        fileType: ''
      };
    },
    mounted() {
      setTimeout(() => {
        this.fileName = this.$props.name;
        this.downloadUrl = this.$props.url;
        this.viewName=this.$props.name
      }, 100);
    },
    watch: {
      name() {
        this.fileName = this.$props.name;
        this.downloadUrl = this.$props.url;
        this.viewName=this.$props.name;
      }
    },
    methods: {
      downLoadFile(fileUrl){
        let a = document.createElement('a')
        a.href =this.defaultUrl+`/api/wisdom/upload/downloadNew?path=`+encodeURI(fileUrl)
        a.click();
      },
      uploadSectionFile(param) {
        let form = new FormData();
        var that = this;
        form.append('file', param.file);
        form.append('dir', 'temp1');
        form.append("assetPackageSn",this.$props.assetPackageSn)
        var config = {
          onUploadProgress: progressEvent => {
            var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) ;
            var num//=complete+"%"
            if(complete>98){
              this.progress=98+"%"
              num=98+"%"
            }else {
              this.progress = complete+"%"
              num=complete+"%"
            }
            this.loading.setText(num);
          }
        }
        axios.post(this.defaultUrl+`/api/wisdom/upload/uploadNew`,
          form, config).then(res =>{
          if (res.data.result) {
            this.loading.setText(100+"%");
            this.progress=100+"%"
            this.fileName = res.data.data.fileName;
            this.viewName=res.data.data.fileName;
            this.downloadUrl=res.data.data.fileUrl
            this.$nextTick(() => {
              this.$emit('uploadSuccess', {
                fileName: res.data.data.fileName,
                fileUrl: res.data.data.fileUrl
              });
            });
            this.loading.close();
            this.$message("上传成功", 'success');
          }else {
            this.loading.close();
            this.$message.error("上传失败");
          }
          this.loading.close();
        })
      },
      beforeUpload(file) {
        const options = {
          text: "0%",
          spinner: 'el-icon-loading',
          lock: true,
          background: 'rgba(0, 0, 0, 0.7)'
        };
        this.loading = Loading.service(options);
      },
      uploadSuccess(response, file, fileList) {
        this.filePath = response.data;
        this.fileName = response.data;
        this.downloadUrl = `${window.location.origin}/api/wisdom/file/download?filePath=${response}`;
        this.fileList = fileList;
        this.$message(this.$t('zjl.tips.sccg'), 'success');
        this.$emit('uploadSuccess', {
          fileUrl: response.data
        });
      },
      uploadError(err, file, fileList) {
        this.$message(this.$t('zjl.tips.scsb'), 'error');
      },
      async handleClear() {
        this.fileName = '';
        this.fileList = [];
        this.viewName=""
        this.progress=0
        this.$emit('uploadSuccess', {
          fileUrl: '',
          fileName: ''
        });
        /*deleteFile({
          filePath: this.filePath,
          fileType: this.fileType
        });
        return false;*/
      }
    }
  };
</script>
<!--<style lang="scss" scoped>
  .upload-container {
    display: flex;
    justify-content: space-between;
    .upload {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
  }
</style>-->
<style scoped>
  ::v-deep .el-input__inner{
    height:40px;
    line-height:40px;
    margin-bottom: 10px;
  }
</style>
src/components/Uploader2/index.vue
对比新文件
@@ -0,0 +1,204 @@
<template>
  <div class="upload-container" style="display: flex;justify-content: space-between;align-items: center">
    <el-input :disabled="true" type="text" size="medium" v-model="viewName" style="width: auto;min-width: 40%;max-width: 100%;display: flex;align-items: center" ></el-input>
    <el-button slot="tip" v-if="disabled && fileName" type="primary" size="mini" style="margin-left: 5px">
      <a  @click="downLoadFile(downloadUrl)">下载<i class="el-icon-download el-icon--right"></i></a>
    </el-button>
    <el-upload
      v-if="!disabled"
      class="upload"
      action=""
      multiple
      :limit="1"
      :file-list="fileList"
      :http-request="uploadSectionFile"
      :show-file-list="false"
      :before-upload="beforeUpload"
      :on-success="uploadSuccess"
      :on-error="uploadError"
    >
      <div style="display: flex;justify-content: flex-end;">
        <el-button v-if="!fileName" type="primary" size="mini" style="margin-left:25px;">上传<i class="el-icon-upload el-icon--right"></i></el-button>
      </div>
    </el-upload>
    <div style="display: flex;align-items: center;justify-content: center;">
      <a @click="downLoadFile(downloadUrl)" v-if="!disabled&&fileName">
        <el-button  slot="tip" type="primary" size="mini" style="margin-left:5px;width:65px">
          下载<i class="el-icon-download el-icon--right"></i>
        </el-button>
      </a>
      <el-button v-if="!disabled&&fileName" slot="tip" type="primary" size="mini" @click="handleClear" style="margin-left:5px;height:28px;width:65px"
      >清除<i class="el-icon-delete el-icon--right"></i
      ></el-button>
    </div>
  </div>
</template>
<script>
  import download from '@/api/uploadUrl';
  import {uploadNew,downloadNew} from '@/api/upload';
  import axios from 'axios';
  import { Loading } from 'element-ui';
  import defaultUrl from "@/api/defaultUrl";
  export default {
    props: {
      name: {
        type: String
      },
      url: {
        type: String
      },
      disabled: {
        type: Boolean
      }
    },
    data() {
      return {
        drawer:false,
        progress:"0%",
        viewName:'',
        download: download,
        defaultUrl:defaultUrl,
        fileName: '',
        filePath: '',
        downloadUrl: '',
        fileList: [],
        action: '',
        fileData: '',
        fileType: ''
      };
    },
    mounted() {
      setTimeout(() => {
        this.fileName = this.$props.name;
        this.downloadUrl = this.$props.url;
        this.viewName=this.$props.name
      }, 100);
    },
    watch: {
      name() {
        this.fileName = this.$props.name;
        this.downloadUrl = this.$props.url;
        this.viewName=this.$props.name;
      }
    },
    methods: {
      downLoadFile(fileUrl){
        let a = document.createElement('a')
        a.href =this.defaultUrl+`/api/wisdom/upload/downloadNew?path=`+encodeURI(fileUrl)
        a.click();
       /*downloadNew(encodeURI(fileUrl)).then(res=>{
       })*/
      },
      uploadSectionFile(param) {
        let form = new FormData();
        var that = this;
        form.append('file', param.file);
        form.append('dir', 'temp1')
        uploadNew(form).then(res=>{
          console.log(res)
          if(res.result){
            this.fileName = res.data.fileName;
            this.viewName=res.data.fileName;
            this.downloadUrl=res.data.fileUrl
            this.$nextTick(() => {
              this.$emit('uploadSuccess', {
                fileName: res.data.fileName,
                fileUrl: res.data.fileUrl
              });
            });
            this.$message("上传成功", 'success');
          }else {
            this.$message.error("上传失败");
          }
        })
        /*axios.post(this.defaultUrl+`/api/upload/uploadNew`,
          form, config).then(res =>{
          if (res.data.result) {
            this.loading.setText(100+"%");
            this.progress=100+"%"
            this.fileName = res.data.data.fileName;
            this.viewName=res.data.data.fileName;
            this.downloadUrl=res.data.data.fileUrl
            this.$nextTick(() => {
              this.$emit('uploadSuccess', {
                fileName: res.data.data.fileName,
                fileUrl: res.data.data.fileUrl
              });
            });
            this.loading.close();
            this.$message("上传成功", 'success');
          }else {
            this.loading.close();
            this.$message.error("上传失败");
          }
          this.loading.close();
        })*/
      },
      beforeUpload(file) {
        /*const options = {
          text: "0%",
          spinner: 'el-icon-loading',
          lock: true,
          background: 'rgba(0, 0, 0, 0.7)'
        };
        this.loading = Loading.service(options);*/
      },
      uploadSuccess(response, file, fileList) {
        console.log(1)
        console.log(response)
        this.filePath = response.data;
        this.fileName = response.data;
        this.downloadUrl = `${window.location.origin}/api/wisdom/file/download?filePath=${response}`;
        this.fileList = fileList;
        this.$message(this.$t('zjl.tips.sccg'), 'success');
        this.$emit('uploadSuccess', {
          fileUrl: response.data
        });
      },
      uploadError(err, file, fileList) {
        this.$message(this.$t('zjl.tips.scsb'), 'error');
      },
      async handleClear() {
        this.fileName = '';
        this.fileList = [];
        this.viewName=""
        this.progress=0
        this.$emit('uploadSuccess', {
          fileUrl: '',
          fileName: ''
        });
        /*deleteFile({
          filePath: this.filePath,
          fileType: this.fileType
        });
        return false;*/
      }
    }
  };
</script>
<!--<style lang="scss" scoped>
  .upload-container {
    display: flex;
    justify-content: space-between;
    .upload {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
  }
</style>-->
<style scoped>
  ::v-deep .el-input__inner{
    height:40px;
    line-height:40px;
    margin-bottom: 10px;
  }
</style>
src/directives.js
对比新文件
@@ -0,0 +1,13 @@
import Vue from 'vue';
Vue.directive('loadmore', {
  bind(el, binding) {
    // 获取element-ui定义好的scroll盒子
    const selectEle = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
    selectEle.addEventListener('scroll', function() {
      const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
      if (condition) {
        binding.value();
      }
    });
  }
});
src/i18n/i18n.js
对比新文件
@@ -0,0 +1,14 @@
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import locale from 'element-ui/lib/locale';
import messages from './langs';
Vue.use(VueI18n);
const i18n = new VueI18n({
  locale: localStorage.lang || 'cn',
  messages
});
locale.i18n((key, value) => i18n.t(key, value));
export default i18n;
src/i18n/langs/cn.js
对比新文件
@@ -0,0 +1,39 @@
import zhLocale from 'element-ui/lib/locale/lang/zh-CN';
const cn = {
  common: {
    search: '搜索',
    save: '保存',
    add: '添加',
    edit: '编辑',
    delete: '删除',
    ok: '确定',
    cancel: '取消',
    tip: '提示',
    check: '查看'
  },
  message: {
    operation_success:"操作成功",
    operation_fail:"操作失败,请稍后重试",
    save_success: '保存成功',
    save_fail: '保存失败,请稍后重试',
    add_success: '添加成功',
    add_fail: '添加失败,请稍后重试',
    edit_success: '修改成功',
    huifu_success: '回复成功',
    huifu_fail: '回复失败',
    edit_fail: '修改失败,请稍后重试',
    delete_success: '删除成功',
    delete_fail: '删除失败,请稍后重试',
    delete_confirm: '确定删除,是否继续?',
    upload_success: '上传成功',
    upload_fail: '上传失败,请稍后重试'
  },
  rule: {
    empty: '内容不能为空'
  },
  ...zhLocale
};
export default cn;
src/i18n/langs/en.js
对比新文件
@@ -0,0 +1,10 @@
import enLocale from 'element-ui/lib/locale/lang/en';
const en = {
  ...enLocale,
  message: {
    hello: 'hello, world'
  }
};
export default en;
src/i18n/langs/index.js
对比新文件
@@ -0,0 +1,6 @@
import en from './en';
import cn from './cn';
export default {
  en,
  cn
};
src/icons/index.js
对比新文件
@@ -0,0 +1,9 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
src/icons/svg/11.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576587744355" class="icon" viewBox="0 0 1280 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1416" width="160" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M0 47.038869C0 21.710247 21.710247 0 47.038869 0h492.09894c14.473498 0 28.946996 7.236749 39.80212 18.091873l126.64311 170.063604h528.282685c25.328622 0 47.038869 21.710247 47.03887 47.038869v249.667845c0 25.328622-21.710247 47.038869-47.03887 47.038869-28.946996 0-47.038869-21.710247-47.038869-47.038869V282.233216H683.872792c-18.091873 0-32.565371-7.236749-39.802121-21.710248L517.427562 94.077739H94.077739v835.844522h948.014134a142.20212 142.20212 0 0 0 144.734982-141.116607V723.674912c0-25.328622 18.091873-47.038869 47.038869-47.03887 25.328622 0 47.038869 21.710247 47.03887 47.03887v65.130742c0 65.130742-28.946996 123.024735-68.749117 166.445229-43.420495 43.420495-104.932862 68.749117-170.063604 68.749117H47.038869C21.710247 1024 0 1002.289753 0 976.961131V47.038869z" p-id="1417"></path><path d="M249.667845 824.989399c-25.328622 0-47.038869-21.710247-47.03887-47.038869s21.710247-47.038869 47.03887-47.038869h282.233215c28.946996 0 50.657244 21.710247 50.657244 47.038869s-21.710247 47.038869-50.657244 47.038869H249.667845zM1154.261484 90.459364v144.734982c0 28.946996-18.091873 47.038869-47.038869 47.03887H683.872792c-18.091873 0-32.565371-7.236749-39.802121-21.710248l-108.551236-141.116608c-14.473498-21.710247-10.855124-50.657244 10.855123-65.130742 7.236749-7.236749 18.091873-10.855124 25.328622-10.855123h535.519435c28.946996 0 47.038869 21.710247 47.038869 47.038869z m-94.077738 97.696113V137.498233H665.780919l39.80212 50.657244h354.600707z" p-id="1418"></path></svg>
src/icons/svg/31.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576587950626" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1646" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M965.795902 583.804878v402.731707c0 21.853659-15.609756 37.463415-37.463414 37.463415H94.771512c-21.853659 0-37.463415-15.609756-37.463414-37.463415v-593.170731c0-12.487805 6.243902-21.853659 15.609756-31.219513L247.747122 215.414634V312.195122l-115.512195 96.780488v540.097561h758.634146V408.97561L778.478829 312.195122V215.414634l174.829269 149.853659c9.365854 6.243902 12.487805 18.731707 12.487804 28.097561v190.439024zM297.698341 171.707317l190.439025-162.341463c12.487805-12.487805 34.341463-12.487805 46.829268 0l190.439025 162.341463h-112.390244L513.112976 84.292683l-99.902439 87.414634H297.698341z" p-id="1647"></path><path d="M606.771512 206.04878H285.210537v349.658537l-74.92683-65.560976V171.707317C210.283707 149.853659 225.893463 134.243902 247.747122 134.243902h530.731707c18.731707 0 34.341463 15.609756 34.341464 37.463415v318.439024l-71.804878 65.560976V206.04878h-134.243903z" p-id="1648"></path><path d="M413.210537 714.926829l-280.97561-240.390244v474.536586h6.243902l-43.707317 37.463414h833.560976l-40.585366-37.463414h3.121951V474.536585l-280.97561 240.390244-56.195122-49.951219 349.658537-296.585366a28.097561 28.097561 0 0 1 24.97561-12.487805c21.853659 0 37.463415 15.609756 37.463414 37.463415v593.170731c0 21.853659-15.609756 37.463415-37.463414 37.463415H97.893463 94.771512c-21.853659 0-37.463415-15.609756-37.463414-37.463415v-593.170731c0-9.365854 3.121951-18.731707 9.365853-24.97561 12.487805-15.609756 37.463415-15.609756 53.073171-3.121951l349.658537 299.707317-56.195122 49.951219z" p-id="1649"></path><path d="M72.917854 958.439024l415.219512-355.902439c12.487805-12.487805 34.341463-12.487805 49.951219 0l415.219513 355.902439c15.609756 12.487805 18.731707 37.463415 3.121951 53.073171-6.243902 6.243902-15.609756 12.487805-28.097561 12.487805H94.771512c-21.853659 0-37.463415-15.609756-37.463414-37.463415 0-12.487805 6.243902-21.853659 15.609756-28.097561z m440.195122-280.975609l-318.439025 271.609756h633.756098l-315.317073-271.609756zM416.332488 393.365854c-18.731707 0-34.341463-15.609756-34.341464-34.341464 0-21.853659 15.609756-37.463415 34.341464-37.463414h190.439024c18.731707 0 37.463415 15.609756 37.463415 37.463414 0 18.731707-18.731707 34.341463-37.463415 34.341464h-190.439024zM416.332488 530.731707c-18.731707 0-34.341463-18.731707-34.341464-37.463414 0-21.853659 15.609756-37.463415 34.341464-37.463415h62.439024c18.731707 0 37.463415 15.609756 37.463415 37.463415 0 18.731707-18.731707 37.463415-37.463415 37.463414h-62.439024z" p-id="1650"></path></svg>
src/icons/svg/authority.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="23px" height="28px" viewBox="0 0 23 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>权限</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-439.000000, -283.000000)" fill="rgb(49, 95, 152)" fill-rule="nonzero">
            <g id="权限" transform="translate(439.000000, 283.000000)">
                <path d="M11.4513992,-8.8817842e-15 L0.67232742,3.42749905 L0.672327439,3.42749905 C0.265813644,3.55414565 -0.00808124737,3.93420161 0.000181968185,4.35990211 L0.0663522932,17.832005 L0.0871880995,17.9830645 C0.109760234,18.0698804 0.542102856,20.3270931 2.7559088,22.4957655 C4.44708207,24.1661021 8.61252006,26.3573399 10.3922425,27.2897267 C10.6735271,27.4425226 10.8905648,27.5501743 10.9999534,27.6161557 L11.1944211,27.7238074 C11.3246448,27.7897874 11.4982765,27.8106233 11.6285019,27.7238074 L11.9323573,27.5727479 C12.974149,27.0726887 18.243886,24.4265361 20.1972386,22.4957625 C22.4093077,20.3253641 22.8433858,18.0698766 22.8659593,17.9830615 L22.9284668,4.35990753 L22.9284668,4.3599437 C22.9279825,3.93708729 22.6575242,3.56177156 22.2565469,3.42751622 L11.4513954,-8.8817842e-15 L11.4513992,-8.8817842e-15 Z M21.1053216,17.7225946 C21.0185057,18.0490236 20.5427551,19.6759527 18.93666,21.2594606 C17.3739752,22.7995746 13.1668638,24.9907988 11.6475866,25.7495826 L11.6475866,25.7495826 C11.5102095,25.8146551 11.3508848,25.8146551 11.2135058,25.7495826 C9.65082102,24.9248313 5.5097097,22.7561589 3.99043244,21.2594606 C2.3843374,19.6759391 1.90685181,18.0472759 1.82003403,17.7225946 L1.78009882,5.20895837 C1.78009882,5.01275441 1.91032251,4.86169538 2.08221743,4.7957143 L11.1926705,1.90994778 L11.1926705,1.90994776 C11.382309,1.84499277 11.5881717,1.84499304 11.7778106,1.90994781 L20.8900005,4.79571433 C21.0636323,4.86169432 21.1921191,5.01275417 21.1921191,5.20895839 L21.1053032,17.7243315 L21.1053216,17.7225946 Z M11.6250293,6.4868577 C12.6893918,6.4868577 13.687776,6.89837579 14.4465326,7.63631201 C15.1844688,8.37424823 15.595976,9.37262966 15.595976,10.4126845 C15.595976,11.4544762 15.1618953,12.4511207 14.4239618,13.1907938 L14.4239618,13.1907938 C13.9216475,13.6863561 13.2907579,14.0315729 12.6025632,14.187441 L12.6025632,15.8369436 L14.2520658,15.8369436 C14.5125135,15.8369436 14.7729616,15.9445954 14.9465918,16.1182282 C15.1202235,16.29186 15.2278764,16.552309 15.2278764,16.8127542 C15.2278764,17.0732019 15.1184883,17.3336501 14.9240209,17.5072802 L14.9240209,17.5072802 C14.7292957,17.687461 14.4739558,17.7878619 14.2086583,17.7885648 L12.5591557,17.7885648 L12.5591557,20.5215162 C12.5591557,20.7819638 12.4515039,21.042412 12.2553002,21.2160422 L12.2553002,21.2160422 C12.0661809,21.404965 11.8070832,21.5068442 11.5399375,21.4973268 C11.2794899,21.4973268 11.0190417,21.389675 10.8454116,21.2160422 L10.8454116,21.2160422 C10.6654981,21.0295317 10.564705,20.7806561 10.5641269,20.5215162 L10.5849627,14.1665935 C9.89043677,13.9929618 9.28272315,13.6456977 8.76183003,13.1456386 C8.02563065,12.4077023 7.5915526,11.4093209 7.61238659,10.3692661 C7.61238659,9.32747441 8.04646736,8.33082983 8.78440086,7.59115676 C9.56574462,6.89836492 10.564126,6.4868577 11.6267463,6.4868577 L11.6250293,6.4868577 Z M14.0124708,10.3918369 C14.0124708,9.78412602 13.7745899,9.19724911 13.3405103,8.76317105 L13.3405103,8.76317106 C12.4162595,7.8471459 10.9244217,7.85381375 10.0084019,8.77806376 C9.58200128,9.20829362 9.33767616,9.78621222 9.32614786,10.3918362 C9.32614786,10.9995471 9.56575962,11.5846872 9.99983984,12.0187652 C10.4339206,12.452846 11.0416315,12.6907204 11.6493424,12.6907204 C12.9272716,12.6907204 14.0124708,11.6055212 14.0124708,10.3918362 L14.0124708,10.3918369 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/company.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="25px" height="22px" viewBox="0 0 25 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>企业 </title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-438.000000, -348.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="企业-" transform="translate(438.000000, 348.000000)">
                <path d="M23.7523958,19.6571518 L22.9333519,19.6571518 L22.9333519,8.19048805 C22.9333519,6.38860607 21.4590582,4.91428794 19.6571518,4.91428794 L14.7428638,4.91428794 L14.7428638,3.2762001 C14.7428638,1.47431812 13.2685701,-8.8817842e-15 11.4666637,-8.8817842e-15 L4.91428794,-8.8817842e-15 C3.11240597,-8.8817842e-15 1.63808784,1.47429371 1.63808784,3.2762001 L1.63808784,19.6571518 L0.819043922,19.6571518 C0.360376396,19.6571518 -7.10542736e-15,20.0175282 -7.10542736e-15,20.4761957 C-7.10542736e-15,20.9348632 0.360376396,21.2952396 0.819043922,21.2952396 L23.752347,21.2952396 C24.2110145,21.2952396 24.5713909,20.9348632 24.5713909,20.4761957 C24.5713909,20.0175282 24.2110145,19.6571518 23.752347,19.6571518 L23.7523958,19.6571518 Z M13.104776,4.91431236 L13.104776,19.6571518 L3.27622452,19.6571518 L3.27622452,3.2762001 C3.27622452,2.37522249 4.01335916,1.63811226 4.91431236,1.63811226 L11.4666881,1.63811226 C12.3676658,1.63811226 13.104776,2.3752469 13.104776,3.2762001 L13.104776,4.91428794 L13.104776,4.91431236 Z M21.2952396,19.6571518 L14.7428638,19.6571518 L14.7428638,6.5524002 L19.6571518,6.5524002 C20.5581294,6.5524002 21.2952396,7.28953485 21.2952396,8.19048805 L21.2952396,19.6571518 Z M10.6476442,4.91431236 L5.73335628,4.91431236 C5.27468875,4.91431236 4.91431236,5.27468875 4.91431236,5.73335628 C4.91431236,6.19202381 5.27468875,6.5524002 5.73335628,6.5524002 L10.6476442,6.5524002 C11.1063118,6.5524002 11.4666881,6.19202381 11.4666881,5.73335628 C11.4666881,5.27468875 11.1063118,4.91431236 10.6476442,4.91431236 Z M10.6476442,9.8286003 L5.73335628,9.8286003 C5.27468875,9.8286003 4.91431236,10.1889767 4.91431236,10.6476442 C4.91431236,11.1063118 5.27468875,11.4666881 5.73335628,11.4666881 L10.6476442,11.4666881 C11.1063118,11.4666881 11.4666881,11.1063118 11.4666881,10.6476442 C11.4666881,10.1889767 11.1063118,9.8286003 10.6476442,9.8286003 Z M10.6476442,14.7428882 L5.73335628,14.7428882 C5.27468875,14.7428882 4.91431236,15.1032646 4.91431236,15.5619322 C4.91431236,16.0205997 5.27468875,16.3809761 5.73335628,16.3809761 L10.6476442,16.3809761 C11.1063118,16.3809761 11.4666881,16.0205997 11.4666881,15.5619322 C11.4666881,15.1032646 11.1063118,14.7428882 10.6476442,14.7428882 Z M18.8381079,9.8286003 L17.20002,9.8286003 C16.7413525,9.8286003 16.3809761,10.1889767 16.3809761,10.6476442 C16.3809761,11.1063118 16.7413525,11.4666881 17.20002,11.4666881 L18.8381079,11.4666881 C19.2967754,11.4666881 19.6571518,11.1063118 19.6571518,10.6476442 C19.6571518,10.1889767 19.2967754,9.8286003 18.8381079,9.8286003 Z M18.8381079,14.7428882 L17.20002,14.7428882 C16.7413525,14.7428882 16.3809761,15.1032646 16.3809761,15.5619322 C16.3809761,16.0205997 16.7413525,16.3809761 17.20002,16.3809761 L18.8381079,16.3809761 C19.2967754,16.3809761 19.6571518,16.0205997 19.6571518,15.5619322 C19.6571518,15.1032646 19.2967754,14.7428882 18.8381079,14.7428882 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/dashboard.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
src/icons/svg/dictionary.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>数据</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-439.000000, -405.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="数据" transform="translate(439.000000, 405.000000)">
                <path d="M14.9454713,1.94273898 L14.9454713,8.96844317 L21.9711749,8.96844317 L21.9711749,8.96844317 C21.2565483,5.42607186 18.4878428,2.65737332 14.9454713,1.94273898 L14.9454713,1.94273898 Z M13.1770485,0 L13.1770485,0 C19.1068601,0 23.9138969,4.80706028 23.9138969,10.7368485 C23.9138969,10.7368485 23.9138969,10.7368485 23.9138969,10.7368485 L13.1770485,10.7368485 L13.1770485,0 L13.1770485,0 Z M11.9138904,3.03157384 L11.9138905,3.03157384 C6.61124373,3.03087621 2.31205123,7.32893822 2.3113481,12.631585 C2.31065047,17.9342318 6.60871248,22.2334243 11.9113593,22.2341274 C17.2140061,22.2348251 21.5131986,17.9367631 21.5139017,12.6341163 C21.5139018,12.6332742 21.5139018,12.6324322 21.5139017,12.6315901 L23.2823241,12.6315901 L23.2823241,12.6328532 C23.2823241,18.9121652 18.1919276,24.0025617 11.9126156,24.0025617 C5.6333036,24.0025617 0.54290705,18.9121652 0.54290705,12.6328532 C0.54290705,6.3535412 5.6333036,1.26314465 11.9126156,1.26314465 C11.9134577,1.26314465 11.9142997,1.26314465 11.9151418,1.26314465 L11.9151418,3.0315673 L11.9138904,3.03157384 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/example.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
src/icons/svg/eye-open.svg
对比新文件
@@ -0,0 +1 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
src/icons/svg/eye.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
src/icons/svg/form.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
src/icons/svg/gate.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584327936605" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1464" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M627.072 519.296h56.128v47.296h-56.128zM627.072 595.392h56.128v49.664h-56.128z" p-id="1465"></path><path d="M915.392 116.352c0-40.384-43.52-70.08-133.12-90.624C709.76 9.152 613.76 0 512 0 410.304 0 314.368 9.152 241.792 25.728c-89.6 20.544-133.12 50.176-133.12 90.624 0 2.24 0.064 4.48 0.384 6.656A32.768 32.768 0 0 0 108.672 128v783.552c0 4.352 0.896 8.576 2.496 12.288 10.432 32.256 53.44 56.704 130.624 74.432C314.368 1014.848 410.304 1024 512 1024c101.76 0 197.76-9.152 270.272-25.728 77.184-17.728 120.192-42.176 130.624-74.432a31.424 31.424 0 0 0 2.496-12.288V128a31.36 31.36 0 0 0-0.384-4.928 59.136 59.136 0 0 0 0.384-6.72z m-612.544 611.136H178.432l-1.6-0.064v-61.952l1.664-0.064h124.352a30.976 30.976 0 1 1 0 62.08z m0-161.344H178.496v-62.08h124.352a30.976 30.976 0 1 1 0 62.08z m0-161.408H178.496l-1.664-0.064v-61.888l1.664-0.064h124.352a31.04 31.04 0 1 1 0 62.016z m170.24 82.56c-2.368 3.264-2.816 6.528-2.816 13.952v283.904h-40.32c2.752-26.432 4.16-48.704 4.16-66.304V527.68c0-22.72-0.448-38.976-1.856-56.128 15.296 2.752 24.576 3.712 33.856 3.264 12.544-0.96 13.888 3.2 6.976 12.48z m-8.832-91.84l35.712-18.112c13.44 25.984 26.88 48.256 41.728 70.016l-38.976 21.376c-10.176-28.736-22.208-52.416-38.464-73.28z m126.592 366.464c2.368-29.696 3.776-61.248 3.776-87.168-34.368 0.448-69.632 1.344-89.088 2.752 2.304-24.128 3.264-59.392 3.264-94.144 0-36.672-0.96-73.792-3.264-97.92 26.88 3.2 56.128 4.16 106.688 4.16 50.048 0 79.296-0.96 106.176-4.16-1.344 23.68-2.304 60.288-2.304 96 0 36.096 0.96 72.384 2.304 95.04a2191.36 2191.36 0 0 0-91.392-1.792c0 25.92 1.408 57.472 3.776 87.168h-39.936z m204.16-308.032v293.632c0 34.816-1.856 37.568-71.872 44.48-2.304-17.152-6.08-26.88-18.112-44.992 51.52 6.528 54.336 3.776 54.336-32.448V435.328h-74.688c-40.896 0-80.256 0.96-113.664 2.752v-38.464c35.264 2.368 76.032 2.816 113.216 2.816s81.216-0.448 112.768-2.816c-1.984 11.648-1.984 22.272-1.984 54.272z m-44.096-303.68c-65.856 13.184-150.72 20.48-238.912 20.48s-172.992-7.296-238.848-20.48c-60.8-12.224-88.832-26.112-99.008-33.856 10.176-7.744 38.208-21.696 99.008-33.792C339.008 69.312 423.808 62.016 512 62.016s173.056 7.296 238.912 20.48c60.736 12.16 88.896 26.112 99.008 33.792-10.112 7.808-38.208 21.696-99.008 33.92z" p-id="1466"></path><path d="M542.208 595.392h52.416v49.664h-52.416zM542.208 519.296h52.416v47.296h-52.416z" p-id="1467"></path></svg>
src/icons/svg/heat.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584327214706" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1202" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M833.2 216.176c-144.272 45.52-166.4 159.28-166.4 227.552C566.864 329.952 566.864 193.424 566.864 0 256.16 125.152 333.824 466.48 322.736 580.272c-77.68-68.272-99.872-227.568-99.872-227.568C134.096 398.224 89.712 512 89.712 603.024 89.712 830.576 278.4 1024 511.392 1024c2 0 3.968-0.128 5.952-0.144-97.76-3.056-183.52-92.64-183.52-193.28 11.104-102.4 166.4-182.048 166.4-273.072C644.544 614.4 611.2 773.696 611.2 819.2c33.28-34.128 44.368-102.4 44.368-102.4 33.296 22.752 55.488 68.272 55.488 113.776 0 95.648-77.456 181.36-169.072 192.24 218.688-15.184 391.008-191.44 391.008-419.792 0.064-136.544-99.792-204.8-99.792-386.848z" p-id="1203"></path></svg>
src/icons/svg/home.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="23px" viewBox="0 0 24 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>home</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-439.000000, -224.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="home" transform="translate(439.000000, 224.000000)">
                <path d="M12.0371397,2.3130651 L21.1783467,10.6689713 C20.712862,10.726086 20.2759332,10.9174194 19.9275348,11.222984 L19.9218233,11.2286955 L19.9161119,11.234407 C19.5791358,11.534258 19.179332,12.0625704 19.179332,12.8935895 L19.179332,20.6754601 L15.8324062,20.6754601 L15.8324062,17.3685076 C15.8324062,16.1262624 14.8043421,15.1181874 13.5392498,15.1181874 L10.5236012,15.1181874 C9.2585113,15.1181874 8.2304447,16.129118 8.2304447,17.3685076 L8.2304447,20.6725874 L4.92349219,20.6725874 L4.92349219,12.8764265 C4.92349219,11.7341316 4.05249251,10.7860288 2.92733362,10.6432422 L12.0371366,2.3130651 M12.0371366,0.462548663 C11.7172941,0.462548663 11.3974515,0.57106649 11.1689925,0.785246806 L0.651310655,10.4005102 C0.274353966,10.7232084 0.165836876,11.2086821 0.368593138,11.6513222 C0.571350383,12.0825374 1.00256709,12.3366991 1.4994632,12.3366991 L2.63033327,12.3366991 C2.95303141,12.3366991 3.21004868,12.5794365 3.21004868,12.8735783 L3.21004868,21.2522979 C3.21004868,21.8719914 3.76120579,22.3831679 4.43515792,22.3831679 L8.71875442,22.3831679 C9.392709,22.3831679 9.94386366,21.8719914 9.94386366,21.2522979 L9.94386366,17.3685076 C9.94386366,17.0715122 10.2008809,16.8316284 10.5235791,16.8316284 L13.5392277,16.8316284 C13.8619258,16.8316284 14.1189431,17.0743658 14.1189431,17.3685076 L14.1189431,21.2551706 C14.1189431,21.8748642 14.6701002,22.3860407 15.3583327,22.3860407 L19.6419292,22.3860407 C20.3301617,22.3860407 20.8955967,21.8748642 20.8955967,21.2551706 L20.8955967,12.8878685 C20.8955967,12.7279472 20.9355771,12.6194289 21.0583736,12.5109118 C21.1668914,12.4166726 21.3153908,12.3624136 21.4753109,12.3624136 L22.5376445,12.3624136 C23.0373986,12.3624136 23.4657583,12.093974 23.6685146,11.6770367 C23.8969733,11.2343966 23.7884555,10.7346449 23.4400558,10.4119468 L12.9081083,0.785265958 C12.6796496,0.571085887 12.3569512,0.462548663 12.0371086,0.462548663 L12.0371366,0.462548663 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/ldar.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1585277333868" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1129" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M251.809978 375.249455c-7.493818 267.822545-27.601455 436.689455-52.875636 543.697454a6.330182 6.330182 0 0 0 6.190545 7.819636h282.996364a6.376727 6.376727 0 0 0 6.144-8.005818c-44.264727-159.930182-66.792727-386.048-77.730909-543.790545a6.376727 6.376727 0 0 0-6.330182-5.911273H258.186705a6.376727 6.376727 0 0 0-6.376727 6.190546z m0.465455-262.516364c7.912727-7.912727 17.826909-11.822545 28.439272-14.987636 21.410909-6.330182 46.266182-7.121455 71.121455-7.121455h18.944c4.235636 0 8.471273-0.232727 12.660364-0.744727 3.723636-0.372364 7.447273-0.884364 11.077818-1.582546 14.615273-2.792727 29.602909-6.330182 45.009454-16.570182 7.121455-5.12 15.825455-14.196364 17.780364-26.437818a36.957091 36.957091 0 0 0-7.68-28.206545 80.802909 80.802909 0 0 0-16.942545-15.592727 6.376727 6.376727 0 0 0-9.309091 8.098909c2.932364 5.585455 5.166545 11.496727 6.656 17.640727 1.210182 5.12 0.465455 9.821091-1.163637 10.612364a33.419636 33.419636 0 0 1-7.540363 3.630545 118.225455 118.225455 0 0 1-31.604364 4.701091l-9.076364 0.418909H372.967796a376.971636 376.971636 0 0 0-21.178181-0.791273c-28.020364 0.372364-58.042182 3.956364-85.690182 20.107637-13.451636 7.912727-26.065455 20.107636-32.442182 35.467636a57.716364 57.716364 0 0 0-3.863273 22.295273c0.186182 6.516364 9.029818 8.610909 12.008727 2.792727a44.125091 44.125091 0 0 1 10.472728-13.730909z m105.099636 68.189091c-6.283636 8.517818-10.798545 18.152727-13.312 28.439273-1.629091 6.842182 7.400727 11.031273 11.357091 5.21309a71.68 71.68 0 0 1 17.733818-18.292363c13.498182-10.24 29.230545-14.568727 45.847273-16.523637 33.605818-3.956364 69.492364 1.954909 105.053091 9.448728 9.029818 1.954909 17.687273 3.909818 26.670545 6.237091l0.372364 0.093091c7.68 1.536 10.845091 1.954909 16.197818 2.699636h0.418909c5.073455 0.418909 10.146909 1.210182 15.220364 1.210182 20.48 0.372364 41.890909 0.791273 64.372363-8.285091 10.705455-4.328727 23.738182-12.567273 29.649455-26.810182 5.492364-14.568727 2.792727-27.973818-1.210182-37.841455a113.012364 113.012364 0 0 0-16.430545-26.763636c-4.468364-5.445818-13.079273-0.605091-10.938182 6.050909 2.978909 8.517818 4.980364 17.314909 6.050909 26.251637 0.744727 8.285091-0.837818 15.36-3.956364 18.52509-2.792727 3.118545-7.540364 5.492364-14.661818 7.07491a157.044364 157.044364 0 0 1-48.965818-0.791273l-13.032727-1.954909a303.290182 303.290182 0 0 1-11.403637-2.420364 384.558545 384.558545 0 0 0-28.858181-7.074909c-38.679273-8.285091-80.523636-11.822545-122.042182 0-20.526545 6.283636-40.680727 18.152727-54.132364 35.467636z m512.325818 378.088727h-203.124363a6.330182 6.330182 0 0 0-6.330182 6.190546c-0.884364 42.402909-7.214545 290.443636-38.306909 398.056727a6.330182 6.330182 0 0 1-6.097455 4.608h-3.816727a6.376727 6.376727 0 0 1-5.911273-4.049455C535.411433 787.549091 507.949615 338.571636 504.691433 281.6a6.376727 6.376727 0 0 0-6.330182-6.050909H166.49216a6.330182 6.330182 0 0 0-6.330182 6.237091c-1.210182 58.833455-11.869091 518.702545-70.842182 681.890909a6.376727 6.376727 0 0 1-6.050909 4.189091h-33.047272a26.205091 26.205091 0 1 0 0 52.456727h921.972363a26.205091 26.205091 0 1 0 0-52.410182h-0.465454c-2.792727 0-44.357818-1.768727-45.242182-4.328727-42.030545-124.136727-56.785455-404.526545-56.785455-404.526545zM145.825978 967.866182a6.330182 6.330182 0 0 1-6.050909-8.192c18.850909-61.579636 35.84-159.511273 48.965818-316.276364 10.426182-123.810909 15.127273-247.435636 17.128728-314.926545a6.330182 6.330182 0 0 1 6.330181-6.190546h241.943273c3.351273 0 6.097455 2.606545 6.330182 5.957818 8.936727 140.474182 35.048727 460.148364 94.859636 631.156364a6.376727 6.376727 0 0 1-6.004363 8.471273H145.825978z m525.218909-9.728c16.570182-63.813818 30.347636-169.658182 35.048728-346.112a6.376727 6.376727 0 0 1 6.376727-6.237091h107.194182c3.304727 0 6.097455 2.606545 6.330181 5.957818 6.330182 91.834182 20.712727 245.015273 50.408728 346.205091a6.330182 6.330182 0 0 1-6.050909 8.145455h-193.163637a6.330182 6.330182 0 0 1-6.144-7.912728z m80.709818-305.617455c-4.049455 112.779636-12.101818 196.747636-22.62109 259.351273a6.330182 6.330182 0 0 0 6.23709 7.447273h74.938182a6.330182 6.330182 0 0 0 6.237091-7.726546c-16.616727-75.962182-27.275636-166.167273-34.164363-253.207272a6.330182 6.330182 0 0 0-6.330182-5.864728h-24.296728z m-42.030545-180.642909a41.285818 41.285818 0 0 1 14.661818-12.613818c11.822545-6.702545 26.391273-10.705455 41.053091-14.196364l11.077818-2.420363a24.343273 24.343273 0 0 0 7.726546-2.466909c1.908364-0.744727 4.189091-1.489455 6.050909-2.234182 8.238545-3.584 16.570182-7.912727 24.436363-16.197818a26.065455 26.065455 0 0 0 7.121455-18.152728 22.667636 22.667636 0 0 0-9.914182-16.942545c-5.399273-4.002909-12.381091 2.187636-9.309091 8.145454l0.651637 1.396364c1.582545 2.746182 1.582545 5.492364 0.791272 6.656a21.457455 21.457455 0 0 1-3.956363 3.165091c-5.585455 3.258182-11.636364 5.632-18.013091 7.074909l-0.325818 0.093091-4.980364 1.536a33.698909 33.698909 0 0 1-4.189091 0.744727H772.327796l-12.288 2.327273-0.418909 0.046545c-16.523636 3.956364-33.838545 10.24-47.988363 23.645091a46.08 46.08 0 0 0-14.522182 27.601455c-0.605091 6.702545 8.145455 9.541818 11.729454 3.863273l0.791273-1.210182 0.093091 0.139636z m264.657455-3.537454l-1.210182-2.792728c-3.118545-6.562909-12.939636-3.537455-11.962182 3.630546l0.232727 2.327273c0.372364 4.701091-0.418909 9.448727-2.420363 11.031272-1.582545 1.954909-4.794182 3.584-9.076364 4.328728a95.883636 95.883636 0 0 1-30.021818-0.372364l-7.912728-1.210182c-2.141091-0.372364-5.166545-1.024-6.656-1.210182a6.562909 6.562909 0 0 1-1.070545-0.186182c-5.678545-1.536-11.077818-3.025455-17.175273-4.18909-23.691636-5.12-48.965818-7.493818-74.24 0-12.241455 3.537455-24.901818 10.658909-32.814545 21.690181a28.765091 28.765091 0 0 0-1.163637 1.768728c-4.096 6.050909 3.723636 12.939636 9.402182 8.331636l1.303273-1.024c8.331636-5.911273 17.780364-8.704 28.066909-10.24 20.526545-2.420364 42.263273 1.163636 64 5.911273 5.352727 1.163636 10.798545 2.327273 15.778909 3.816727a6.516364 6.516364 0 0 0 0.791273 0.186182c4.468364 0.744727 6.423273 1.117091 9.867636 1.489454 3.165091 0.465455 6.330182 0.744727 9.495273 0.791273 12.613818 0 25.646545 0.418909 39.098182-5.12 6.702545-2.792727 14.615273-7.447273 18.152727-16.151273a28.206545 28.206545 0 0 0-0.372364-22.807272h-0.09309z" p-id="1130"></path></svg>
src/icons/svg/link.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
src/icons/svg/nested.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
src/icons/svg/password.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
src/icons/svg/permisson.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793256873" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5102" width="200" height="200"><path d="M910.222222 682.666667v170.666666c0 94.264889-178.289778 170.666667-398.222222 170.666667-214.584889 0-389.518222-72.704-397.880889-163.84L113.777778 853.333333v-170.666666c0 94.264889 178.289778 170.666667 398.222222 170.666666 214.584889 0 389.518222-72.704 397.880889-163.84L910.222222 682.666667z m0-284.444445v170.666667c0 94.264889-178.289778 170.666667-398.222222 170.666667-214.584889 0-389.518222-72.704-397.880889-163.84L113.777778 568.888889V398.222222c0 94.264889 178.289778 170.666667 398.222222 170.666667 214.584889 0 389.518222-72.704 397.880889-163.84L910.222222 398.222222zM512 0c211.854222 0 385.024 70.883556 397.482667 160.312889H910.222222v113.777778h-0.739555c0.512 3.413333 0.739556 6.883556 0.739555 10.353777 0 94.264889-178.289778 170.666667-398.222222 170.666667S113.777778 378.709333 113.777778 284.444444c0-3.470222 0.227556-6.940444 0.739555-10.353777H113.777778v-113.777778h0.739555C126.976 70.883556 300.145778 0 512 0z" p-id="5103"></path></svg>
src/icons/svg/role.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576253878157" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2243" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M365.728131 585.156963a292.562025 292.562025 0 0 0 146.281012-39.495874 300.60748 300.60748 0 0 0 59.975215-45.347113 37.301658 37.301658 0 0 0 21.210747-21.942152 26.330582 26.330582 0 0 1 0-6.582646A266.962848 266.962848 0 0 0 648.78189 365.735444 267.694253 267.694253 0 0 0 658.290156 292.594938a285.247974 285.247974 0 0 0-40.958684-146.281012A292.562025 292.562025 0 1 0 365.728131 585.156963zM627.571143 731.437975a273.545493 273.545493 0 0 0-62.900835-40.958683 286.710784 286.710784 0 0 0-26.330582-11.702481A212.838873 212.838873 0 0 0 512.009143 667.805735 209.913253 209.913253 0 0 0 449.108308 658.297469H281.616549a213.570278 213.570278 0 0 0-62.16943 9.508266 292.562025 292.562025 0 0 0-134.578532 73.140506A292.562025 292.562025 0 0 0 0.0256 950.859494a73.140506 73.140506 0 0 0 73.140506 73.140506h585.12405a73.140506 73.140506 0 0 0 73.140506-73.140506 219.421519 219.421519 0 0 0 0-38.033063A292.562025 292.562025 0 0 0 627.571143 731.437975zM940.61251 597.590849a35.838848 35.838848 0 0 1 33.644633-24.136367H1023.992687v-73.140506h-49.735544a35.838848 35.838848 0 0 1-33.644633-24.136367 136.041342 136.041342 0 0 0-7.314051-18.285127 35.838848 35.838848 0 0 1 6.582646-40.958683l35.107443-35.107443-51.92976-51.92976-34.376038 35.838848a35.838848 35.838848 0 0 1-41.690088 6.582646L828.707535 365.735444a36.570253 36.570253 0 0 1-24.136367-35.838848v-49.004139h-62.900835V292.594938a375.210797 375.210797 0 0 1-32.181823 152.132253 60.70662 60.70662 0 0 1 11.702481-5.851241 25.599177 25.599177 0 0 1 10.239671-5.119835 104.590924 104.590924 0 0 1 36.570253-6.582646 98.739683 98.739683 0 0 1 36.570253 6.582646l10.971076 4.38843a106.785139 106.785139 0 0 1 51.92976 51.198355 64.363645 64.363645 0 0 1 3.657025 10.971076 98.739683 98.739683 0 0 1 6.582645 36.570253 104.590924 104.590924 0 0 1-6.582645 36.570253 42.421494 42.421494 0 0 1-3.657025 10.239671 111.904974 111.904974 0 0 1-51.92976 51.929759 34.376038 34.376038 0 0 1-10.971076 4.38843 98.739683 98.739683 0 0 1-36.570253 6.582646 104.590924 104.590924 0 0 1-36.570253-6.582646 25.599177 25.599177 0 0 1-10.239671-4.38843A111.904974 111.904974 0 0 1 669.261232 585.156963l-4.388431-10.239671A104.590924 104.590924 0 0 1 658.290156 536.884229a38.764468 38.764468 0 0 1 0-9.508266 231.124 231.124 0 0 1-27.793393 32.181823 323.281037 323.281037 0 0 1-38.764468 32.181822 14.628101 14.628101 0 0 1 0 5.851241l7.314051 18.285126a36.570253 36.570253 0 0 1 0 21.210747 386.181873 386.181873 0 0 1 177.000025 155.789278H804.571168v-49.735544a35.107443 35.107443 0 0 1 24.136367-33.644633l18.285127-8.045455a35.838848 35.838848 0 0 1 40.958683 7.31405l35.107443 35.107443 51.92976-51.929759-35.107443-33.644633a35.838848 35.838848 0 0 1-6.582646-40.958683 190.165316 190.165316 0 0 0 7.314051-19.747937z" p-id="2244"></path></svg>
src/icons/svg/table.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
src/icons/svg/tree.svg
对比新文件
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
src/icons/svg/user.svg
对比新文件
@@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
src/icons/svg/中专志愿管理.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793705987" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10120" width="200" height="200"><path d="M344.77154607407425 26.08317629629634h-179.28707792592596c-72.33475318518519 0-132.91186251851852 60.010344296296296-132.91186251851852 132.3463111111111v179.28586429629632c0 72.33475318518519 60.578322962962964 129.8765748148148 132.91307614814815 129.8765748148148h308.59203318518513v-309.16001185185183c0-72.33596681481482-56.9714157037037-132.3463111111111-129.3061688888889-132.3463111111111zM409.3075152592593 402.82172681481484h-243.8230471111111c-36.167376592592596 0-67.06517333333333-28.937784888888885-67.06517333333333-65.10758874074074v-179.28586429629632c0-36.168590222222214 30.89901037037037-66.49840829629628 67.06517333333333-66.49840829629628h179.28586429629632c36.167376592592596 0 64.53718281481481 30.32860444444444 64.53718281481481 66.49719466666666v244.39223940740737zM847.6438376296296 26.08317629629634h-179.28707792592596c-72.33475318518519 0-132.7516634074074 60.010344296296296-132.7516634074074 132.3463111111111v309.15879822222223h312.0375277037037c72.33475318518519 0 129.46879525925925-57.54060799999999 129.46879525925925-129.87536118518517v-179.28586429629632c0.0012136296296296298-72.33596681481482-57.134042074074074-132.3463111111111-129.46879525925925-132.3463111111111zM911.2659437037037 337.7153517037037c0 36.168590222222214-27.45472948148148 65.10758874074074-63.620892444444436 65.10758874074074h-247.26975525925926v-244.3910257777778c0-36.168590222222214 31.81651437037037-66.49840829629628 67.98389096296296-66.49840829629628h179.28586429629632c36.168590222222214 0 63.620892444444436 30.32860444444444 63.620892444444436 66.49719466666666v179.28586429629632zM32.571392 661.3042062222222v179.28586429629632c0 72.33596681481482 60.578322962962964 130.04041481481482 132.91307614814815 130.04041481481482h179.28586429629632c72.33475318518519 0 129.30738251851852-57.703234370370375 129.30738251851852-130.04041481481482v-311.46833540740744h-308.59203318518513c-72.33475318518519 0-132.91186251851852 59.848931555555545-132.91186251851852 132.18368474074072zM409.3075152592593 840.5912841481478c0 36.168590222222214-28.37223348148148 64.19129837037036-64.53718281481481 64.19129837037036h-179.28586429629632c-36.168590222222214 0-67.06517333333333-28.02270814814814-67.06517333333333-64.19129837037036v-179.28707792592596c0-36.167376592592596 30.89901037037037-67.41469866666667 67.06517333333333-67.41469866666667h243.82426074074073l-0.0024272592592592596 246.70056296296295zM847.6438376296296 529.1205214814813h-312.0375277037037v311.46833540740744c0 72.33596681481482 60.416910222222214 130.04041481481482 132.75287703703702 130.04041481481482h179.28586429629632c72.33475318518519 0 129.46879525925925-57.703234370370375 129.46879525925925-130.04041481481482v-179.28586429629632c0.0012136296296296298-72.33475318518519-57.134042074074074-132.18368474074072-129.46879525925925-132.18368474074072zM911.2659437037037 840.5912841481478c0 36.168590222222214-27.45472948148148 64.19129837037036-63.620892444444436 64.19129837037036h-179.28707792592596c-36.168590222222214 0-67.98389096296296-28.02270814814814-67.98389096296296-64.19129837037036v-246.69934933333332h247.26975525925926c36.168590222222214 0 63.620892444444436 31.247322074074074 63.620892444444436 67.4159122962963v179.28586429629632z" fill="" p-id="10121"></path></svg>
src/icons/svg/企业.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="19px" viewBox="0 0 22 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>企业</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="企业" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M20.8050518,17.0293856 L19.3706921,17.0293856 L19.3706921,4.25698157 L19.3706921,4.25698479 C19.3664601,3.46906603 18.7242962,2.83376438 17.9363775,2.83799633 C17.9363637,2.83799641 17.9363499,2.83799648 17.9363361,2.83799656 L15.0660817,2.83799656 L15.0660817,1.41901171 L15.0660817,1.41901492 C15.0618497,0.631096163 14.4196858,-0.00420549189 13.631767,5.42169337e-06 C13.6317532,5.42169337e-06 13.6317394,5.42169337e-06 13.6317256,5.42169337e-06 L3.58660102,5.42169337e-06 L3.58660103,5.42169337e-06 C2.79868407,-0.00423000465 2.15649851,0.631053147 2.15224133,1.4189701 C2.15224125,1.41898392 2.15224118,1.41899774 2.1522411,1.41901155 L2.1522411,17.0293853 L0.717881402,17.0293853 L0.717881444,17.0293853 C0.323925669,17.0268299 0.00248787956,17.3441229 -6.69812893e-05,17.7380787 C-6.69812893e-05,17.7380886 -6.69812893e-05,17.7380986 -6.69812893e-05,17.7381085 C-6.69812893e-05,18.1301365 0.321241093,18.4483846 0.717881251,18.4483846 L20.8049957,18.4483846 L20.8049957,18.4483846 C21.1989514,18.4509201 21.5203838,18.1336226 21.5229433,17.7396669 C21.5229433,17.7391472 21.5229433,17.7386276 21.5229433,17.738108 L21.5229433,17.7381106 C21.5204058,17.3441548 21.1989833,17.0268463 20.8050275,17.0293829 C20.8050175,17.029383 20.8050076,17.0293831 20.8049977,17.0293831 L20.8050518,17.0293856 Z M3.58658836,17.0293856 L3.58658836,1.41901187 L13.631713,1.41901187 L13.631713,17.0293856 L3.58658836,17.0293856 Z M15.0660745,17.0293856 L15.0660745,4.25698157 L17.9363288,4.25698157 L17.9363288,17.0293856 L15.0660745,17.0293856 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/信用.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
  <image id="图层_1" data-name="图层 1" width="22" height="22" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAACMElEQVQ4jbWVsWuUQRDFfxM+c8GA3olNYmEUvCJWNmIajZ2CYKONTUTQShBBAjY2kghiobX/gY1aqxAPiygWIhiiCOEgyFVGlMMYjE8mzuFm777Dwgws9+3s7Nu3c29mjRKTVAVOxxgH9rgb+AQsAI99mNmXXghdwJIqwBXgOjAMNIBXAeg2ChwGjgJt4BZwz8x+lJF00BFJ85LakmYk1frE1iKmHXtG+oE2JS1Kqpee3r2vHnuaXeB+fUkvI6CW+AckDWax20vYLwbzSrowHVeqJ74hSQ1JTxLffklrkg6UMHeM6Y6jKmnF85UEmaQHklqSxiXtlDQmaZ+kj5Lux9zH7mTfTGBVfTIVLNIU3NEfuxuHtFRuPyXtSlLiWFNF6LRhZiuxeBm4ALR8bua4cmn59bdlGfgFLJvZ54h1to0NTEnvJc0G6KSk75KOS3rjjMN/RNJ6CedzWa5nHbMIwXfE3wROmtmcpDT+NXAKqLDZ1oGnmc+xRovUY2ZLwFL+jwOHgEfAYOb3VJwBHuYiKTon9ABL7S1wvoTxs8y3kQEHfhe1388c8FIwT+0D8AL4mvgca6GILuW6rHWU0cNOAJPA1WzpBnAWuE3ILZrTxYEA9i51rQ/jofidy8ZqskZgtAOztKS9nG/G915J33pIbVXSBD1K2vjbg58D3twnQug7nJGZrUXMcBRJas2I9RTMA57KY5t685a0zQz8vzT6LXua/vUxPZgUkR/g2i9/TIHfnRRBXbtOz38AAAAASUVORK5CYII="/>
</svg>
src/icons/svg/公开.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
  <image id="图层_1" data-name="图层 1" width="22" height="22" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAB80lEQVQ4jaWVO2sUURSAvxsXTSX4RgsxGCFY+YAQCwsrK0VsRGx8FPEH6A8QRAVttDFYpAq2FoHUFiEGxIAWSbpIjAELkSiaYhM/uXJGhsms2d0cuMzsOfd+9+x5DVnUYXVebdq9NIMxnJkN9TbwHJgBXgDrdCfbgCFgRCWpc8AvYDCl1C20+OcZ/hbo7QEGgKmtQrMEYyozG8VlpVu3A/s74P1IKa2UHc93NGo2vgbOdABeU4+mlBbLyjrwg0hCu/INWC7tbf5dUVzPOgD9V9Q+9XKdx1uSlNICsLABrO4D+ivq2SJBaq6kS8BJ4DPwKqX0ZYMz1VCoMzW9Nx62neqbiu2req7KrQtFbslTFd1kPB9FYl9Gt54AngBjan9KabWlx5skZkldVhsl3dNgnC3v7WkHWJJDwMeU0lpAdwG7w3wr13NLj9XBPJhiXYlkFbZ76tV4P69+r8R7Xb3bClxN3rGakBxWV9Wf6h31tHpNXYwzF+vAe9WhWAMtYv04zt2s6I+H15NddZ46Eef21NjysF8p4pc6AQNL8TxSge4ADgKf8o859V0M6XY9vhAeT6sHCqg6GvqH+QtS/jRNA7/jfB7aIyml+RbwUeAGkJtiFuiL0nv/b+xGaeXY5NlaSH6/vonnuXZzi+ey+6DeV3sB/gA6CB2JTsS2ewAAAABJRU5ErkJggg=="/>
</svg>
src/icons/svg/危化品管理.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>危化品管理</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="rgb(49, 95, 152)" fill-rule="evenodd">
        <g id="危化品管理" transform="translate(1.000000, 1.000000)" fill-rule="nonzero" stroke="#FFFFFF" stroke-width="1.5">
            <path d="M9.13943257,10.5678712 C9.13943257,9.55692385 9.97420287,8.7345315 11.0015344,8.7345315 L11.0015343,8.7345315 C12.0304714,8.76684636 12.8379701,9.6138551 12.8051322,10.6263735 C12.7737654,11.593508 11.9843491,12.3703262 11.0015343,12.4011982 L11.0015344,12.4011982 C9.97318484,12.4001684 9.13995139,11.5798089 9.13943257,10.5678585 L9.13943257,10.5678712 Z M6.13799855,11.6883064 L6.13799855,11.6883064 C6.06368014,11.78582 5.95204527,11.8479026 5.82999819,11.8595923 L0.571992072,12.3671634 L0.52956339,12.3687348 L0.529563402,12.3687348 C0.308832677,12.3682018 0.122655312,12.204206 0.0942765677,11.9853049 L0.0942760866,11.9853012 C-0.518209782,7.31601059 1.91085086,2.77511078 6.13485147,0.693014605 L6.13485144,0.693014621 C6.34781771,0.589025398 6.604885,0.672398556 6.71628161,0.881586207 L9.20698959,5.54716 L9.20698959,5.54716 C9.32202222,5.76121423 9.2417492,6.02799161 9.02769497,6.14302339 C9.01848448,6.14797309 9.00910048,6.1525929 8.99956093,6.15687404 L8.99956088,6.15687406 C7.0086531,7.06291632 5.87108849,9.1899772 6.22285257,11.3488801 L6.22285258,11.3488802 C6.2429069,11.4696281 6.21157113,11.5932609 6.13642385,11.6898806 L6.13799855,11.6883064 Z M14.3157131,14.6944466 L14.3157132,14.6944466 C14.4366742,14.7120976 14.54484,14.7792743 14.614284,14.8798754 L17.6078558,19.2327438 L17.6298559,19.2704581 L17.6298559,19.2704581 C17.7355836,19.4638966 17.6818453,19.7057192 17.5041414,19.8361725 L17.5041414,19.8361725 C13.7178381,22.6356758 8.5692091,22.7134063 4.70012647,20.0294584 L4.70012647,20.0294584 C4.50595476,19.8933797 4.4545297,19.627915 4.58384065,19.4291714 L7.45641236,14.9883029 L7.45641233,14.988303 C7.58781028,14.783886 7.8600419,14.7246915 8.06445952,14.8560903 C8.07307386,14.8616276 8.08149225,14.8674639 8.08969939,14.8735885 L8.08969899,14.8735882 C9.8474194,16.1762605 12.2598425,16.1402075 13.9778426,14.7855888 L13.9778425,14.7855888 C14.0735725,14.7097611 14.1965924,14.6772978 14.3172724,14.6960171 L14.3157016,14.6960171 L14.3157131,14.6944466 Z M15.3497143,0.455724944 C19.6742877,2.31629762 22.3347225,6.5355953 21.9654271,11.2341691 C21.9481414,11.4635989 21.7548555,11.4542238 21.5285698,11.4542238 L21.5081412,11.4542238 L16.228135,11.4070264 C16.1071349,11.3991692 15.9924211,11.438455 15.9138483,11.3441693 C15.8337053,11.2530262 15.7959912,11.1775977 15.8101339,11.0565984 L15.8101341,11.0565969 C16.052867,8.88617837 14.803895,6.82434199 12.7678356,6.03429615 L12.7678356,6.03429615 C12.6550462,5.99445849 12.564313,5.9088612 12.5179785,5.79858221 L12.5179785,5.79858215 C12.4731625,5.68687186 12.4771515,5.56150179 12.5289785,5.45286807 L14.7776862,0.669430866 L14.7776862,0.66943089 C14.8786754,0.454700113 15.1321767,0.359288537 15.3496869,0.454144312 L15.3497143,0.455724944 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/危废统计.svg
对比新文件
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="22px" viewBox="0 0 24 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>危废统计</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="危废统计" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M23.2423369,17.1043483 L14.7807886,2.33894646 C13.3978543,-0.0673063385 10.534149,-0.0673063385 9.15121472,2.33894646 L0.687022178,17.1043483 C-0.00576708923,18.3074747 -0.0850941046,19.5449761 0.467550769,20.4995445 C1.01755141,21.4514687 2.12812962,21.9988251 3.50841969,21.9988251 L20.4315163,21.9988251 C21.8091621,21.9988251 22.9118077,21.4514687 23.4644525,20.5021888 C24.0144532,19.5449761 23.9351262,18.3074747 23.2423369,17.1043483 Z M21.5949792,19.4206971 C21.4442579,19.6824763 21.0079593,19.8384861 20.4315163,19.8384861 L3.50841969,19.8384861 C2.92668825,19.8384861 2.49038966,19.6824763 2.3370241,19.4180529 C2.18365854,19.1536295 2.26827402,18.6908886 2.56178398,18.1779072 L11.0259765,3.41514964 C11.3168422,2.90745674 11.6685253,2.60601408 11.9673238,2.60601408 C12.2661222,2.60601408 12.6178053,2.90745674 12.908671,3.41514964 L21.3702193,18.1779072 L21.3702193,18.1805514 C21.6637293,18.6908886 21.7483448,19.1536295 21.5949792,19.4206971 Z" id="形状"></path>
            <path d="M11.969968,15.3644424 C11.5310252,15.3644424 11.1423228,15.5204522 10.827659,15.8483372 C10.5024182,16.1603568 10.3464084,16.5490592 10.3464084,16.9906462 C10.3464084,17.440166 10.5024182,17.8156472 10.827659,18.1329552 C11.1423228,18.4476191 11.5283809,18.6036288 11.969968,18.6036288 C12.4089108,18.6036288 12.7870363,18.4476191 13.1017001,18.1329552 C13.4269408,17.8182914 13.5829506,17.440166 13.5829506,16.9906462 C13.5829506,16.5517034 13.4269408,16.163001 13.1017001,15.8483372 C12.7870363,15.5230964 12.4089108,15.3644424 11.969968,15.3644424 Z M11.969968,6.87380751 C11.4992944,6.87380751 11.110592,7.04039424 10.8091493,7.365635 C10.5050624,7.7014527 10.3490527,8.10866471 10.3490527,8.59255951 C10.3490527,9.01034846 11.0391977,12.1199675 11.2190056,14.3834316 L12.7367958,14.3834316 C12.9562672,12.1226117 13.5829506,9.01034846 13.5829506,8.59255951 C13.5829506,8.10073201 13.4269408,7.69087577 13.1334309,7.365635 C12.829344,7.0298173 12.4406416,6.87380751 11.969968,6.87380751 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/园区.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>园区</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="园区" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M20.559549,10.4762039 L20.5548674,10.4762039 L20.5548674,9.03572602 L9.03374536,9.03572602 L9.03374536,1.83333669 L1.83297657,1.83333669 L1.83297657,19.1190711 L10.4738631,19.1190711 L10.4738631,20.559549 L1.11291769,20.559549 L1.11291767,20.559549 C0.715210738,20.559549 0.392858801,20.237017 0.392858801,19.83931 L0.392858801,1.11309775 L0.392858801,1.11309784 C0.392858801,0.715390903 0.715210738,0.392858905 1.11291767,0.392858905 L9.75380422,0.392858905 L9.75380426,0.392858905 C10.1515112,0.392858905 10.4738631,0.715390903 10.4738631,1.11309784 L10.4738631,7.59524824 L21.279968,7.59524824 L21.279968,7.59524824 C21.6776749,7.59534769 22.000027,7.91778024 22.000027,8.31548717 L22.000027,9.03572611 L21.9949852,9.03572611 L21.9949852,10.476204 L22.000027,10.476204 L22.000027,19.1190712 L21.9766192,19.1190712 L20.5595491,16.4696723 L20.5595491,10.476204 L20.559549,10.4762039 Z M3.27318434,4.71429242 L7.59344756,4.71429242 L7.59344756,6.15477029 L3.27318434,6.15477029 L3.27318434,4.71429242 Z M3.27318434,9.03572602 L7.59344756,9.03572602 L7.59344756,10.4762039 L3.27318434,10.4762039 L3.27318434,9.03572602 Z M20.4274751,20.5982952 L21.2797879,20.5982952 L20.4273851,20.5982952 L20.4274751,20.5982952 Z M16.2381154,19.1190711 L16.2381154,22.0000268 L14.7976375,22.0000268 L14.7976375,19.1190711 L11.8266519,19.1190711 L11.8266519,19.1190711 C11.4288752,19.1190852 11.1063882,18.7966336 11.1063882,18.3988569 C11.1063882,18.2801685 11.1357114,18.1633185 11.191762,18.0586993 L14.8572379,11.2164294 L14.857238,11.2164294 C15.0450619,10.8657901 15.4815726,10.7337995 15.8322142,10.9216243 C15.9573975,10.9886799 16.0599627,11.0912465 16.1270192,11.2164294 L19.7924952,18.0586993 L19.7924952,18.0586993 C19.9803452,18.4093251 19.8483891,18.8458462 19.4977622,19.033698 C19.3931961,19.0897198 19.2764116,19.1190463 19.1577847,19.1190718 L16.2381161,19.1190718 L16.2381154,19.1190711 Z M16.2381154,17.6785932 L17.9547148,17.6785932 L15.4921279,13.0817583 L13.0295409,17.6785932 L16.2381154,17.6785932 Z M10.5762039,20.5982952 L10.4762039,20.5982952 L10.5762039,20.5982952 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/固废管理.svg
对比新文件
@@ -0,0 +1,14 @@
/<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="23px" viewBox="0 0 26 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>固废管理</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-90.000000, -857.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="固废管理" transform="translate(91.000000, 858.000000)">
                <path d="M17.6949491,21 L6.30505096,21 L6.30505094,21 C6.0870782,21 5.88566571,20.8834109 5.77667898,20.6941632 L0.0817418213,10.8058368 L0.0817418354,10.8058369 C-0.0272472738,10.6165843 -0.0272472738,10.3834165 0.0817418071,10.1941632 L5.77667897,0.305836866 L5.77667898,0.305836842 C5.88566523,0.116589066 6.08707749,0 6.30505094,0 L17.6949491,0 L17.6949491,0 C17.9129218,0 18.1143343,0.116589066 18.223321,0.305836842 L23.9182582,10.1941632 L23.9182582,10.1941632 C24.0272473,10.3834157 24.0272473,10.6165836 23.9182582,10.8058368 L18.223321,20.6941632 L18.223321,20.6941632 C18.1143348,20.8834109 17.9129225,21 17.6949491,21 L17.6949491,21 Z M6.65771045,19.7766526 L17.3410741,19.7766526 L22.6833756,10.5 L17.3410741,1.22334737 L6.65649495,1.22334737 L1.31419345,10.5 L6.65771045,19.7766526 Z" id="形状" stroke="#FFFFFF" stroke-width="0.5"></path>
                <path d="M9.44986086,9.37736223 L11.6859478,7.98555096 L11.6859478,7.98555097 C11.7529576,7.9447315 11.8393587,7.95947977 11.8894435,8.02028636 L13.996571,10.57753 L13.996571,10.57753 C14.0428858,10.6355136 14.0428858,10.7183765 13.996571,10.7763601 L12.1035873,13.2833067 L12.1035873,13.2833067 C12.0529727,13.3492279 11.9608884,13.3648523 11.8918098,13.3192398 L9.44632075,11.7082363 L9.44632074,11.7082362 C9.40143956,11.6787186 9.37429862,11.6282688 9.37415073,11.5740858 L9.37415073,9.51271984 L9.37415073,9.51272032 C9.37420745,9.45728522 9.40293786,9.40592934 9.44986962,9.37737183 L9.44986086,9.37736223 Z M13.4440518,12.7622617 L15.1808643,11.6842668 L15.1808643,11.6842668 C15.232403,11.6498105 15.3014505,11.661287 15.3394016,11.7106178 L16.9721,13.6977218 L16.9721,13.6977218 C17.0093,13.7423414 17.0093,13.8076148 16.9721,13.8522344 L15.5014884,15.7986142 L15.5014884,15.7986142 C15.46382,15.8523719 15.3903287,15.8652183 15.3370354,15.8273607 L13.4381362,14.5756888 L13.4381362,14.5756888 C13.4027469,14.5533105 13.3816179,14.5137149 13.3825014,14.4714826 L13.3825014,12.8676657 L13.3825014,12.8676644 C13.3824119,12.8237716 13.4060178,12.7833291 13.4440529,12.7622611 L13.4440518,12.7622617 Z M5.05220934,8.72815567 L6.79020496,7.65016071 L6.79020495,7.65016072 C6.8417437,7.61570442 6.91079115,7.62718092 6.94874233,7.67651171 L8.58144074,9.66122021 L8.58144074,9.66122021 C8.61864069,9.70583979 8.61864069,9.77111323 8.58144074,9.81573282 L7.11319529,11.7633104 L7.11319529,11.7633104 C7.07515792,11.8166657 7.00172855,11.8289665 6.94874234,11.7908591 L5.05575868,10.5391872 L5.05575867,10.5391872 C5.02036945,10.5168089 4.99924045,10.4772133 5.00015228,10.434981 L5.00015228,8.83355963 L5.00015228,8.83355964 C4.99805144,8.79161516 5.01780387,8.7516208 5.05220933,8.72815569 L5.05220934,8.72815567 Z M6.58315987,12.9107668 L8.31997238,11.8327718 L8.31997237,11.8327718 C8.37151111,11.7983155 8.44055857,11.809792 8.47850975,11.8591228 L10.1112082,13.8462268 L10.1112082,13.8462268 C10.1484081,13.8908464 10.1484081,13.9561199 10.1112082,14.0007394 L8.64414582,15.9495148 L8.64414582,15.9495148 C8.60647748,16.0032725 8.53298618,16.0161189 8.47969287,15.9782613 L6.58079364,14.7217983 L6.58079363,14.7217983 C6.5454044,14.69942 6.52427541,14.6598243 6.52515888,14.6175921 L6.52515888,13.0161707 L6.52515888,13.0161706 C6.52434718,12.973029 6.54649282,12.9327647 6.58315986,12.9107666 L6.58315987,12.9107668 Z M13.4440471,6.09782926 L15.1808596,5.0198343 L15.1808596,5.0198343 C15.2323984,4.985378 15.3014458,4.9968545 15.339397,5.04618529 L16.9720954,7.03328933 L16.9720954,7.03328933 C17.0092954,7.07790892 17.0092954,7.14318236 16.9720954,7.18780194 L15.5050331,9.13298396 L15.5050331,9.13298396 C15.4673647,9.18674171 15.3938734,9.19958805 15.3405801,9.16173049 L13.4416809,7.90886079 L13.4416809,7.9088608 C13.406657,7.88670381 13.3855807,7.84766072 13.3860745,7.80585239 L13.3860745,6.20443099 L13.3860745,6.2044308 C13.3848017,6.16086535 13.4070045,6.12003816 13.4440474,6.09782908 L13.4440471,6.09782926 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/土壤.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584351317223" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2734" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 0a51.2 51.2 0 1 1 0 102.4 410.112 410.112 0 0 0-407.04 359.253333 48.981333 48.981333 0 0 1 10.24-0.853333 76.8 76.8 0 0 1 79.36 51.2h60.586667a133.290667 133.290667 0 0 1 207.36 0h81.92a88.917333 88.917333 0 0 1 75.093333-64.853333 93.184 93.184 0 0 1 84.48 64.853333h40.96a153.6 153.6 0 0 1 126.293333-102.4A147.968 147.968 0 0 1 994.133333 512H1024a512 512 0 1 1-512-512zM256 409.6a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 44.373333 25.6 50.090667 50.090667 0 0 1 0 51.2 51.2 51.2 0 0 1-44.373333 25.6z m384 0a25.6 25.6 0 0 1-22.186667-12.8 27.221333 27.221333 0 0 1 0-25.6 25.6 25.6 0 0 1 44.373334 0 27.221333 27.221333 0 0 1 0 25.6 25.6 25.6 0 0 1-22.186667 12.8z m-153.6 51.2a25.6 25.6 0 0 1-22.186667-12.8 27.221333 27.221333 0 0 1 0-25.6 25.6 25.6 0 0 1 44.373334 0 27.221333 27.221333 0 0 1 0 25.6 25.6 25.6 0 0 1-22.186667 12.8z m-51.2-153.6a76.8 76.8 0 1 1 76.8-76.8 76.8 76.8 0 0 1-76.8 76.8z m0 0" p-id="2735"></path></svg>
src/icons/svg/地下水.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584351332222" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3565" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M103.88 65.211l816.24 0 0 27.517L103.88 92.728 103.88 65.211z" p-id="3566"></path><path d="M568.919 574.107l-12.455-16.645-12.106 16.893c-0.175 0.25-31.677 44.113-63.402 99.918-31.549 56.145-63.966 122.914-64.361 174.771-0.257 49.961 21.27 85.408 49.864 106.354 28.605 20.936 62.755 28.52 90.14 28.602 27.645-0.082 62.965-8.078 92.914-29.184 29.985-20.857 53.419-56.311 53.157-105.896-0.432-51.402-34.372-118.094-67.394-174.402C602.123 618.547 569.142 574.398 568.919 574.107zM631.63 932.066c-23.301 16.65-53.552 23.576-75.031 23.494-21.613 0.082-49.997-6.512-71.692-22.668-21.7-16.324-38.147-41.225-38.409-83.846-0.39-40.641 29.816-107.172 60.802-161.25 18.92-33.395 37.838-62.412 49.688-79.881 12.329 17.6 32.242 46.943 52.169 80.539 32.497 54.244 64.094 120.936 63.569 160.467C672.511 890.27 654.977 915.246 631.63 932.066zM318.705 464.714l-13.173-17.183-12.729 17.427c-0.22 0.242-23.172 31.654-46.391 71.672-23.039 40.344-46.954 87.994-47.396 126.775-0.221 36.74 16.255 63.641 38.153 79.305 21.887 15.74 47.659 21.32 68.626 21.402 21.061-0.082 47.624-5.988 70.482-21.736 22.822-15.498 40.886-42.475 40.618-79.131-0.481-38.545-25.552-86.023-49.688-126.535C342.937 496.613 318.927 464.958 318.705 464.714zM357.429 718.844c-15.859 11.16-37.048 15.951-51.633 15.867-14.848 0.041-34.534-4.422-49.207-15.207-14.578-10.908-25.767-26.977-25.988-56.096-0.436-27.223 21.195-74.623 43.61-112.834 11.718-20.26 23.393-38.214 31.851-50.768 8.941 12.632 21.323 30.834 33.656 51.336 23.521 38.297 46.164 85.816 45.635 112.104C385.133 691.375 373.287 707.531 357.429 718.844zM797.506 398.883c-9.85-16.108-19.49-30.359-26.756-40.711-3.632-5.099-6.679-9.272-8.85-12.209-1.041-1.467-1.879-2.546-2.46-3.36l-0.169-0.111-0.413-0.653-24.463-31.792-23.288 31.672c-0.25 0.31-18.785 25.416-37.32 57.236-18.238 32.219-38.316 70.068-39.148 105.683-0.088 1.003 0 1.151 0 1.233-0.128 32.6 15.149 58.395 36.396 73.305l0 0c20.787 14.756 44.406 19.783 63.82 19.783 19.787-0.084 43.744-5.336 65.118-19.861 21.659-14.559 38.648-40.248 38.566-73.381 0 0 0.041 0 0.041-0.699C837.746 469.024 816.582 431.245 797.506 398.883zM809.734 505.718c-0.041 24.639-12.061 41.786-26.797 51.913-15.527 10.578-33.854 14.678-48.125 14.678-14.066 0-31.683-3.871-46.251-14.299l0-0.035c-13.979-9.924-25.086-27.078-25.167-52.102l0-0.541c0.081-26.27 17.819-62.727 35.813-93.781 17.075-29.243 33.767-52.143 35.732-54.85l0 0 0 0c1.705 2.327 19.448 25.802 37.396 55.2 18.826 31.091 37.356 67.469 37.443 93.349C809.78 505.017 809.734 505.017 809.734 505.718z" p-id="3567"></path><path d="M103.88 120.25l40.812-41.281 13.608 13.76-40.812 41.281L103.88 120.25z" p-id="3568"></path><path d="M103.88 189.056 212.711 78.969l13.602 13.76L117.487 202.813 103.88 189.056z" p-id="3569"></path><path d="M103.88 257.861 280.733 78.969l13.602 13.76L131.09 257.861 103.88 257.861z" p-id="3570"></path><path d="M171.9 257.861 348.753 78.969l13.602 13.76L199.11 257.861 171.9 257.861z" p-id="3571"></path><path d="M239.921 257.861 416.774 78.969l13.602 13.76L267.131 257.861 239.921 257.861z" p-id="3572"></path><path d="M307.942 257.861 484.797 78.969l13.601 13.76L335.146 257.861 307.942 257.861z" p-id="3573"></path><path d="M375.964 257.861 552.812 78.969l13.608 13.76L403.166 257.861 375.964 257.861z" p-id="3574"></path><path d="M443.979 257.861 620.832 78.969l13.607 13.76L471.188 257.861 443.979 257.861z" p-id="3575"></path><path d="M512 257.861 688.853 78.968l13.608 13.76L539.209 257.861 512 257.861z" p-id="3576"></path><path d="M580.021 257.861 756.874 78.969l13.602 13.76L607.23 257.861 580.021 257.861z" p-id="3577"></path><path d="M648.041 257.861 824.895 78.969l13.602 13.76L675.251 257.861 648.041 257.861z" p-id="3578"></path><path d="M716.063 257.861 892.916 78.969l13.602 13.76L743.272 257.861 716.063 257.861z" p-id="3579"></path><path d="M784.084 257.861 920.12 120.25l0 27.524L811.287 257.861 784.084 257.861z" p-id="3580"></path><path d="M852.105 257.861l68.015-68.805 0 27.522-40.813 41.282L852.105 257.86z" p-id="3581"></path><path d="M267.131 626.387c0 0-16.581 86.434 68.015 68.805C335.146 695.191 288.384 670.684 267.131 626.387z" p-id="3582"></path><path d="M688.853 475.019c0 0-16.58 86.44 68.021 68.805C756.874 543.824 710.11 519.316 688.853 475.019z" p-id="3583"></path><path d="M498.397 819.037c0 0-24.231 106.643 81.623 82.563C580.021 901.6 520.931 871.5 498.397 819.037z" p-id="3584"></path></svg>
src/icons/svg/基础信息.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>基础信息</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="基础信息" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M22.1000179,16.3000268 L12.000014,22.2000258 L2.10000244,16.4000113 C1.69999417,16.2000189 1.2000014,16.3000268 0.900001047,16.6000271 C0.799993118,16.8000195 0.700008627,17.000012 0.799993118,17.2000278 C0.799993118,17.4000202 1.00000898,17.6000127 1.2000014,17.7000206 L11.6000057,23.7000276 C11.7000136,24.0000279 11.8000215,24.0000279 12.000014,24.0000279 C12.2000064,24.0000279 12.3000143,24.0000279 12.5000067,23.90002 L22.9000345,17.900013 C23.1000269,17.8000285 23.3000193,17.6000127 23.3000193,17.4000202 C23.3000193,17.2000278 23.3000193,17.000012 23.2000348,16.8000195 C22.9000345,16.3000268 22.5000262,16.2000189 22.1000179,16.3000268 Z" id="路径"></path>
            <path d="M21.9000255,12.000014 L12.000014,17.8000285 L2.10000244,12.000014 C1.69999417,11.8000215 1.2000014,11.900006 0.900001047,12.2000064 C0.799993118,12.4000222 0.700008627,12.6000147 0.799993118,12.8000071 C0.799993118,13.0000229 1.00000898,13.2000154 1.2000014,13.3000233 L11.6000057,19.3000303 C11.7000136,19.4000148 11.900006,19.4000148 12.1000219,19.4000148 C12.3000378,19.4000148 12.4000222,19.4000148 12.6000147,19.3000303 L23.000019,13.3000233 C23.2000348,13.2000154 23.4000272,13.0000229 23.4000272,12.8000071 C23.4000272,12.5999912 23.4000272,12.4000222 23.3000193,12.2000064 C22.8000265,11.900006 22.3000338,11.8000215 21.9000255,12.000014 Z" id="路径"></path>
            <path d="M23.2000348,6.30000733 L12.8000071,0.300000349 C12.6000147,0.100007929 12.3000143,0 12.000014,0 C11.7000136,0 11.4000133,0.100007929 11.1000129,0.19999242 L0.700008627,6.1999994 C0.300000349,6.5 0,7.00001596 0,7.5 C0,8 0.300000349,8.5000177 0.799993118,8.80001805 L11.2000208,14.800025 C11.5000212,15.0000175 11.8000215,15.0000175 12.1000219,15.0000175 C12.4000222,15.0000175 12.7000226,14.9000095 13.0000229,14.800025 L23.4000272,8.80001805 C23.7000276,8.60000219 24.0000279,8.10000943 24.0000279,7.5 C24.0000279,7.00001596 23.7000276,6.5 23.2000348,6.30000733 Z M22.0000334,7.50000873 L12.000014,13.3000233 L1.99999451,7.50000873 L12.000014,1.69999417 L22.0000334,7.50000873 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/大气环境.svg
对比新文件
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="21px" viewBox="0 0 24 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>大气环境</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-89.000000, -904.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="大气环境" transform="translate(89.000000, 904.000000)">
                <path d="M19.7160229,7.38764686 C19.1010222,3.62564249 15.8340184,0.82663923 11.9850139,0.82663923 C8.13600947,0.82663923 4.86900567,3.62564249 4.25400495,7.38764686 C2.19000255,7.98764756 0.723000841,9.9136498 0.723000841,12.0916523 C0.723000841,14.7916555 2.9220034,16.987658 5.61900654,16.987658 C6.88800802,16.987658 8.08800941,16.5046575 9.00601048,15.6256565 C10.317012,14.5576552 11.154013,12.9286533 11.154013,11.1106512 C11.154013,10.8406509 10.9350127,10.6186506 10.6620124,10.6186506 C10.3920121,10.6186506 10.1700118,10.8376509 10.1700118,11.1106512 C10.1700118,12.6106529 9.48601104,13.9516545 8.41200979,14.8426555 L8.36700974,14.8786556 C7.53300877,15.5536564 6.47400753,15.9586568 5.32200619,15.9586568 C5.27100613,15.9586568 5.22300084,15.9676568 5.17800603,15.9826569 C3.22200375,15.7636566 1.69800198,14.1016547 1.69800198,12.0916523 C1.69800198,10.2556502 3.00000349,8.64464833 4.79400558,8.26064788 C4.80000559,8.25764788 4.80600559,8.25764788 4.8120056,8.25764788 C4.82700562,8.25464787 4.84200563,8.24864787 4.85700565,8.24264786 C4.87200567,8.23664785 4.89000569,8.23064785 4.90500571,8.22164783 C4.91700572,8.21564783 4.92900574,8.20964782 4.94100575,8.20064781 C4.95600577,8.1916478 4.97100578,8.18264779 4.9860058,8.17064778 C4.99800582,8.16164776 5.00700583,8.15264775 5.01600584,8.14364774 C5.02800585,8.13164773 5.04300587,8.11964772 5.05500588,8.1076477 L5.08200591,8.07464766 C5.09400593,8.06264765 5.10300594,8.04764763 5.11200595,8.03564762 C5.12100596,8.0236476 5.12400596,8.00864759 5.13300597,7.99664757 C5.13900598,7.98164756 5.14800599,7.96664754 5.154006,7.95164752 C5.157006,7.93964751 5.16300601,7.92164749 5.16600601,7.90964747 C5.16900601,7.89164745 5.17500602,7.87364743 5.17800603,7.85564741 C5.17800603,7.85264741 5.18100603,7.84364739 5.18100603,7.84064739 C5.59200651,4.39664338 8.51700991,1.80464037 11.9850139,1.80464037 C15.453018,1.80464037 18.3780214,4.39964339 18.7890219,7.83764739 C18.7890219,7.84364739 18.7920219,7.8496474 18.7920219,7.85564741 L18.8010219,7.90064746 L18.8130219,7.94564751 C18.8160219,7.95764753 18.8250219,7.97264755 18.8280219,7.98164756 C18.8340219,7.99664757 18.8430219,8.01164759 18.8520219,8.02664761 C18.8580219,8.03864762 18.864022,8.04764763 18.873022,8.05964765 C18.882022,8.07164766 18.894022,8.08664768 18.903022,8.09864769 C18.912022,8.11064771 18.921022,8.11964772 18.933022,8.12864773 C18.945022,8.14064774 18.9570221,8.14964775 18.9720221,8.16164776 C18.9840221,8.17064778 18.9930221,8.17964779 19.0050221,8.18564779 L19.0500222,8.21264782 C19.0620222,8.21864783 19.0710222,8.22464784 19.0860222,8.23064785 C19.1070222,8.23964786 19.1280223,8.24564786 19.1490223,8.25164787 C19.1550223,8.25464787 19.1610223,8.25464787 19.1700223,8.25764788 C20.9640244,8.64164832 22.2660259,10.2496502 22.2660259,12.0886523 C22.2660259,14.2486548 20.5080239,16.0066569 18.3480214,16.0066569 C17.3160201,16.0066569 16.341019,15.6076564 15.6060182,14.8846556 C15.4110179,14.6956554 15.1020176,14.6986554 14.9130174,14.8906556 C14.7240171,15.0856558 14.7270171,15.3946562 14.9190174,15.5836564 C15.8400184,16.4866575 17.0610199,16.987658 18.3480214,16.987658 C21.0480245,16.987658 23.2440454,14.7886555 23.2440454,12.0916523 C23.2500271,9.9136498 21.7830253,7.98764756 19.7160229,7.38764686 L19.7160229,7.38764686 Z" id="路径"></path>
                <path d="M18.3510214,17.4406586 C16.9440197,17.4406586 15.6150182,16.8976579 14.607017,15.9076568 C14.4270168,15.7336566 14.3280167,15.4966563 14.3250167,15.244656 C14.3220167,14.9926557 14.4180168,14.7586554 14.592017,14.5786552 C14.9550174,14.2096548 15.5490181,14.2036548 15.9210185,14.5636552 C16.5750193,15.205656 17.4360203,15.5566564 18.3510214,15.5566564 C20.2620236,15.5566564 21.8190254,13.9996546 21.8190254,12.0886523 C21.8190254,10.4626504 20.667024,9.03764878 19.0800222,8.69864839 L19.0620222,8.69564839 C19.0500222,8.69264838 19.0410222,8.68964838 19.0320221,8.68664838 C18.9900221,8.67464836 18.948022,8.66264835 18.909022,8.64464833 L18.891022,8.63564832 C18.879022,8.62964831 18.8580219,8.6206483 18.8310219,8.60564828 L18.7800219,8.57564825 C18.7440218,8.55464822 18.7140218,8.53064819 18.6960218,8.51564818 L18.6900217,8.50964817 C18.6750217,8.49464815 18.6480217,8.47664813 18.6240217,8.4496481 C18.6060217,8.43164808 18.5850216,8.41064805 18.5640216,8.38364802 C18.5520216,8.36864801 18.5370216,8.35064798 18.5190215,8.32364795 C18.5010215,8.29964793 18.4890215,8.2786479 18.4740215,8.25764788 L18.4680215,8.24864787 C18.4560215,8.22764784 18.4380215,8.1946478 18.4230214,8.15864776 L18.4200214,8.14964775 C18.4140214,8.13764774 18.4050214,8.11364771 18.3960214,8.08664768 L18.3900214,8.06864766 L18.3690214,7.99664757 L18.3660214,7.97864755 C18.3660214,7.97564755 18.3630214,7.96964754 18.3630214,7.96364753 C18.3570214,7.94264751 18.3510214,7.91264748 18.3480214,7.87964744 C17.9580209,4.67264371 15.2280177,2.25464089 11.991014,2.25464089 C8.75101018,2.25464089 6.018007,4.67864371 5.63400656,7.89464745 L5.62500655,7.97564755 L5.61600653,7.99664757 C5.61300653,8.00564758 5.61300653,8.01464759 5.61000653,8.0206476 L5.59500651,8.06564765 C5.59200651,8.07464766 5.5890065,8.08064767 5.5890065,8.08964768 C5.57400649,8.13464773 5.55900647,8.16764777 5.55000646,8.18564779 L5.53800644,8.21564783 L5.52600643,8.23364785 C5.51700642,8.24864787 5.50800641,8.26664789 5.49300639,8.29064792 C5.48100638,8.30864794 5.46300636,8.33564797 5.43900633,8.365648 L5.40000628,8.41664806 L5.38200626,8.43464808 C5.36700625,8.4496481 5.35200623,8.46464812 5.3310062,8.48264814 C5.31900619,8.49464815 5.30100617,8.51264817 5.27700614,8.53064819 L5.25600612,8.54564821 C5.22300608,8.56964824 5.19600605,8.58464826 5.17500602,8.59664827 C5.16300601,8.60264828 5.14500599,8.61464829 5.12400596,8.62664831 C5.08800592,8.64464833 5.05800589,8.65664834 5.04000586,8.66264835 C5.00100582,8.68064837 4.96800578,8.68964838 4.94700576,8.69564839 L4.88700569,8.71364841 L4.87500567,8.71364841 C3.30000384,9.06164881 2.16000251,10.4806505 2.16000251,12.0976523 C2.16000251,13.8376544 3.44400401,15.3016561 5.160006,15.5326563 C5.21700607,15.5206563 5.27400614,15.5146563 5.33400621,15.5146563 C6.34800739,15.5146563 7.3020085,15.1756559 8.09100941,14.5396552 C8.10600943,14.5246552 8.12700946,14.5096552 8.14800948,14.4946551 C9.15601065,13.6546542 9.73201132,12.4246527 9.73201132,11.1196512 C9.73201132,10.6006506 10.1550118,10.1776501 10.6740124,10.1776501 C11.193013,10.1776501 11.6160135,10.6006506 11.6160135,11.1196512 C11.6160135,13.0066534 10.7790125,14.7736555 9.31501084,15.9736569 C8.31600968,16.924658 7.00800815,17.4466586 5.63100655,17.4466586 C2.68200312,17.4466586 0.285000332,15.0466558 0.285000332,12.1006523 C0.285000332,9.83264971 1.74600203,7.79564734 3.87300451,7.05164647 C4.23600493,5.23064435 5.20500606,3.57464243 6.62700771,2.36564102 C8.12400945,1.09063954 10.0320117,0.38863872 11.997014,0.38863872 C13.9620162,0.38863872 15.8700185,1.09063954 17.3670202,2.36564102 C18.7890219,3.57464243 19.761023,5.23364436 20.1210234,7.05164647 C22.2390259,7.78664733 23.7000276,9.8236497 23.6970322,12.0946523 C23.6970322,15.0436558 21.2970248,17.4406586 18.3510214,17.4406586 Z M15.2640178,15.196656 C15.2550178,15.196656 15.2430177,15.199656 15.2370177,15.208656 C15.2280177,15.217656 15.2250177,15.226656 15.2250177,15.238656 C15.2250177,15.253656 15.2340177,15.262656 15.2370177,15.265656 C16.0770187,16.087657 17.18102,16.5406575 18.3510214,16.5406575 C20.8020242,16.5406575 22.7970316,14.5456552 22.7970316,12.0946523 C22.8000265,10.1266501 21.480025,8.36864801 19.5900228,7.81964737 L19.3170225,7.74164728 L19.2720224,7.46264695 C18.6840217,3.87764278 15.6210182,1.27663975 11.9850139,1.27663975 C8.34900972,1.27663975 5.28600615,3.87764278 4.69800547,7.45964695 L4.65300541,7.73864727 L4.3800051,7.81664736 C2.4900029,8.365648 1.17000136,10.12365 1.17000136,12.0886523 C1.17000136,14.5396552 3.16500368,16.5346575 5.61600653,16.5346575 C6.76500787,16.5346575 7.85700914,16.096657 8.69101011,15.2986561 L8.71801014,15.274656 C9.97801161,14.2456548 10.7010125,12.7276531 10.7010125,11.1076512 C10.7010125,11.0866512 10.6830124,11.0656511 10.6590124,11.0656511 C10.6380124,11.0656511 10.6170124,11.0836512 10.6170124,11.1076512 C10.6170124,12.688653 9.91801154,14.1736548 8.69701012,15.1846559 L8.67301009,15.202656 C8.66701009,15.205656 8.66401008,15.211656 8.65801007,15.214656 L8.64601006,15.223656 C7.70700897,15.9856569 6.52500759,16.4026574 5.32200619,16.4026574 L5.22900608,16.4356574 L5.12700597,16.4236574 C4.06800473,16.3066572 3.08700359,15.8026567 2.37000276,15.0046557 C1.64700192,14.2006548 1.24800145,13.1656536 1.24800145,12.0856523 C1.24800145,10.04565 2.68800313,8.25764788 4.67700544,7.81964737 C4.68300545,7.81664736 4.68900546,7.81664736 4.69500546,7.81364736 C4.69800547,7.81064736 4.70400547,7.81064736 4.70700548,7.80764735 L4.71000548,7.80464735 L4.71900549,7.79564734 L4.7250055,7.78964733 C4.7250055,7.78664733 4.7280055,7.78364733 4.7280055,7.78364733 C4.73100551,7.76864731 4.73100551,7.75664729 4.73400551,7.74464728 C5.19300604,4.10564305 8.30400966,1.35763985 11.9850139,1.35763985 C15.6690182,1.35763985 18.7770218,4.10264304 19.2330224,7.74764728 L19.2360224,7.75364729 L19.2390224,7.78364733 C19.2390224,7.78664733 19.2420224,7.78964733 19.2420224,7.79564734 L19.2450224,7.80164735 L19.2510224,7.80764735 L19.2570224,7.81364736 L19.2660224,7.81964737 L19.2750224,7.82264737 L19.2900224,7.82864738 C21.2790248,8.26364788 22.7220264,10.05465 22.7220264,12.0946523 C22.7220264,14.5036551 20.7630242,16.4626574 18.3540214,16.4626574 C17.20202,16.4626574 16.1160188,16.0186569 15.2940178,15.211656 C15.2850178,15.202656 15.2730178,15.196656 15.2640178,15.196656 L15.2640178,15.196656 Z M4.86118684,8.74592964 L4.84838684,8.74592964 L4.86118684,8.74592964 Z M4.996187,8.72192961 L4.983387,8.72192961 L4.996187,8.72192961 Z" id="形状"></path>
                <path d="M13.2120154,10.6216506 C12.9420151,10.6216506 12.7200148,10.8406509 12.7200148,11.1136512 C12.7200148,15.4336562 9.20401071,18.9496603 4.88400568,18.9496603 C4.61400537,18.9496603 4.39200511,19.1686606 4.39200511,19.4416609 C4.39200511,19.7116612 4.61100537,19.9336615 4.88400568,19.9336615 C9.74401134,19.9336615 13.6980159,15.9796569 13.6980159,11.1196512 C13.6980159,10.8406509 13.4790157,10.6216506 13.2120154,10.6216506 L13.2120154,10.6216506 Z" id="路径"></path>
                <path d="M4.88400568,20.380662 C4.36500508,20.380662 3.94200459,19.9576615 3.94200459,19.4386609 C3.94200459,18.9196603 4.36500508,18.4966598 4.88400568,18.4966598 C8.95801042,18.4996598 12.2700143,15.1846559 12.2700143,11.1136512 C12.2700143,10.5946506 12.6930148,10.1716501 13.2120154,10.1716501 C13.728016,10.1716501 14.1510165,10.5946506 14.1510165,11.1136512 C14.1480165,16.2226571 9.99301163,20.380662 4.88400568,20.380662 Z M13.2120154,11.0716512 C13.1910153,11.0716512 13.1700153,11.0896512 13.1700153,11.1136512 C13.1700153,15.6826565 9.453011,19.3996608 4.88400568,19.3996608 C4.86300566,19.3996608 4.84200563,19.4176609 4.84200563,19.4416609 C4.84200563,19.4656609 4.86000566,19.4836609 4.88400568,19.4836609 C9.49801105,19.4836609 13.2480154,15.7306566 13.2480154,11.1196512 C13.2480154,11.0896512 13.2300154,11.0716512 13.2120154,11.0716512 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/学生留言.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793373109" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5852" width="200" height="200"><path d="M800.941 406.572a363.67 363.67 0 0 1-2.763 25.749C776.735 580.909 658.932 688.77 518.094 688.77H472.22l-8.406 8.764c31.631 58.692 90.435 97.028 156.53 97.028h45.593l90.226 94.185a30.17 30.17 0 0 0 21.808 9.327c3.777 0 7.586-0.71 11.257-2.186 11.43-4.57 18.909-15.668 18.909-27.981v-76.995c83.988-17.422 146.168-96.328 146.168-191.625 0-97.472-66.654-178.233-153.365-192.715z" p-id="5853"></path><path d="M755.185 426.126c2.1-14.6 3.112-27.722 3.112-40.17 0-142.983-107.756-259.337-240.202-259.337h-207.53c-132.46 0-240.221 116.354-240.221 259.338 0 128.374 84.829 234.279 198.528 255.466v109.324a35.16 35.16 0 0 0 22.053 32.62c4.262 1.699 8.685 2.546 13.072 2.546 9.436 0 18.65-3.803 25.412-10.857l124.25-129.748h64.436c119.042 0.001 218.742-92.174 237.09-219.182zM243.792 305.801h337.615c9.438 0 17.13 8.124 17.13 18.106 0 9.986-7.692 18.096-17.13 18.096H243.792c-9.455 0-17.139-8.11-17.139-18.096 0-9.982 7.683-18.106 17.139-18.106z m202.705 167.99H243.792c-9.455 0-17.139-8.105-17.139-18.075 0-10.007 7.684-18.13 17.139-18.13h202.705c9.436 0 17.144 8.123 17.144 18.13 0 9.97-7.708 18.074-17.144 18.074z" p-id="5854"></path></svg>
src/icons/svg/巡查.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>巡查</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="巡查" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M14.8815779,6.20379238 C12.7379074,4.06012191 9.26231156,4.06003597 7.1186411,6.20379238 C4.97497063,8.34746284 4.97497063,11.8230587 7.1186411,13.9667291 L11.0000987,17.8482942 L14.8815564,13.9667291 C17.0253343,11.8230587 17.0252483,8.34746284 14.8815779,6.20379238 L14.8815779,6.20379238 Z M13.7725961,12.8577474 L11.0000987,15.6302448 L8.22762286,12.8577474 C6.69640818,11.3266186 6.69640818,8.84390287 8.22762286,7.31277413 C9.75883753,5.78155946 12.2414674,5.78155946 13.7725961,7.31277413 C15.3038108,8.84398881 15.3038108,11.3265327 13.7725961,12.8577474 Z M9.89113846,8.97628974 C9.27868267,9.58874553 9.27868267,10.5817975 9.89113846,11.1942318 C10.5035943,11.8066661 11.4966462,11.8066876 12.1091879,11.1942318 C12.7216437,10.581776 12.7216437,9.58872405 12.1091879,8.97628974 C11.4966247,8.36374801 10.5035728,8.36374801 9.89113846,8.97628974 Z M11.0000128,0.0214844 C4.93677137,0.0214844 0.0214844,4.93677137 0.0214844,11.0000128 C0.0214844,17.0632542 4.93677137,21.9785412 11.0000128,21.9785412 L11.0000987,21.9785412 C11.4332457,21.9785412 11.7842793,21.6274217 11.7842793,21.1943606 C11.7842793,20.7612995 11.4332457,20.41018 11.0000987,20.41018 L11.0000128,20.41018 C5.80300089,20.41018 1.5898456,16.1971321 1.5898456,11.0000128 C1.5898456,5.80289347 5.80300089,1.5898456 11.0000128,1.5898456 C16.1971321,1.5898456 20.41018,5.80289347 20.41018,11.0000128 C20.41018,13.2240994 19.6342279,15.2644728 18.3442401,16.8749435 L17.711503,15.7789813 C17.4958426,15.4054535 17.0138616,15.2762248 16.6403338,15.4919067 C16.266806,15.7075886 16.1376848,16.1896556 16.3532593,16.5631619 L17.5295302,18.6004845 C17.5471474,18.6310139 17.575958,18.6494905 17.5969267,18.6766897 C17.6181748,18.704555 17.6287022,18.7374691 17.6541612,18.7629281 C17.6677608,18.7765277 17.6859366,18.7811254 17.7003097,18.7935648 C17.7399484,18.8279399 17.7827238,18.8528188 17.8278196,18.8781919 C17.873388,18.9040376 17.9167435,18.9293033 17.9655775,18.9452877 C18.0100932,18.960026 18.0546948,18.9650103 18.10123,18.9716061 C18.1544469,18.9790826 18.2053864,18.9862584 18.2588826,18.9827994 C18.3056971,18.9800279 18.3496327,18.9674811 18.3958671,18.9560943 C18.448998,18.9428814 18.4996368,18.9291099 18.5496095,18.9046822 C18.5662599,18.896647 18.5845431,18.8969263 18.6008283,18.8875376 C18.631465,18.8698345 18.6500276,18.8410239 18.6773127,18.8199477 C18.7050706,18.7987855 18.7378128,18.7882582 18.7631859,18.7628851 L18.7634652,18.7624984 C20.7499988,16.775793 21.9785412,14.0314402 21.9785412,11.0000128 C21.9785412,4.93677137 17.0633402,0.0214844 11.0000128,0.0214844 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/应急资源.svg
对比新文件
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="22px" viewBox="0 0 24 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>应急资源</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="应急资源" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M12.0000171,4.27619192 L12.8381121,4.27619192 L12.8381121,1.02858137 C12.8381121,0.609532447 12.5238268,0.190486387 12.0000171,0.190486387 C11.5809681,0.190486387 11.1619221,0.609535312 11.1619221,1.02858137 L11.1619221,4.27619192 L12.0000171,4.27619192 Z M17.8666906,6.89524341 L17.9714525,7.00000535 L20.1714551,4.80000279 C20.3809792,4.59047862 20.3809792,4.38095387 20.3809792,4.1714294 C20.3809792,3.96190523 20.2762173,3.75238048 20.1714551,3.54285602 C19.8571698,3.33333184 19.3333601,3.33333184 19.019072,3.64761796 L16.8190694,5.84762052 L17.0285936,5.95238247 C17.2381177,6.37143139 17.5524033,6.58095585 17.8666886,6.89524112 L17.8666906,6.89524341 Z M6.13334357,7.00000879 L6.23810552,6.89524341 C6.55239078,6.47619448 6.86667891,6.16190922 7.18096417,5.95238476 L7.39048806,5.84762281 L5.0857247,3.54285945 C4.66667577,3.22857419 4.14286605,3.22857419 3.82858079,3.54285945 C3.72381884,3.75238363 3.61905661,3.96190838 3.61905661,4.17143284 C3.61905661,4.38095702 3.72381856,4.59048177 3.82858079,4.80000623 L6.13334415,7.00000879 L6.13334357,7.00000879 Z M13.9905038,12.657163 L12.1047865,12.657163 L13.1524059,11.6095435 C13.3619301,11.4000194 13.3619301,11.1904946 13.3619301,10.9809701 C13.3619301,10.771446 13.2571681,10.5619212 13.1524059,10.3523968 C12.8381206,10.0381115 12.3143109,10.0381115 12.0000228,10.3523968 L9.48573497,12.7619238 C9.17144971,13.076209 9.17144971,13.6000188 9.48573497,13.9143069 C9.69525915,14.1238311 10.0095447,14.2285921 10.4285936,14.2285921 L12.2095473,14.2285921 L10.7428789,15.904785 C10.5333547,16.1143092 10.5333547,16.3238339 10.5333547,16.5333584 C10.5333547,16.7428825 10.6381167,16.9524073 10.7428789,17.1619318 C10.9524031,17.3714559 11.1619278,17.3714559 11.3714523,17.3714559 C11.5809764,17.3714559 11.7905012,17.266694 12.0000257,17.1619318 L14.5143135,14.6476439 C14.9333624,14.228595 14.9333624,13.809549 14.9333624,13.6000245 C14.9333624,13.0762148 14.6190771,12.6571658 13.9905038,12.6571658 L13.9905038,12.657163 Z M4.3524014,11.819068 L4.3524014,10.7714485 L1.31430672,10.7714485 C0.895257791,10.7714485 0.47621173,11.1904975 0.47621173,11.6095435 C0.47621173,12.0285925 0.895260655,12.4476385 1.31430672,12.4476385 L4.3524014,12.4476385 L4.3524014,11.8190651 L4.3524014,11.819068 Z M22.6857561,10.7714485 L19.6476614,10.7714485 L19.6476614,12.4476414 L22.6857561,12.4476414 C23.104805,12.4476414 23.523851,12.0285925 23.523851,11.6095464 C23.523851,11.1904975 23.1048021,10.7714485 22.6857561,10.7714485 L22.6857561,10.7714485 Z" id="形状"></path>
            <path d="M20.0666931,19.466694 L18.7047855,19.466694 L18.7047855,11.8190783 C18.7047855,8.15240737 15.6666909,5.11431269 12.0000199,5.11431269 C8.333349,5.11431269 5.29525432,8.15240737 5.29525432,11.8190783 L5.29525432,19.466694 L3.93334674,19.466694 C3.51429782,19.466694 3.09525176,19.8857429 3.09525176,20.304789 C3.09525176,20.7238379 3.51430068,21.1428839 3.93334674,21.1428839 L20.0666988,21.1428839 C20.4857478,21.1428839 20.9047938,20.723835 20.9047938,20.304789 C20.9047938,19.88574 20.4857449,19.466694 20.0666988,19.466694 L20.0666931,19.466694 Z M17.0285984,12.4476259 L17.0285984,19.466694 L6.97143569,19.466694 L6.97143569,12.342868 C6.97143569,10.9809604 7.49524542,9.72381649 8.43810407,8.67619704 C9.38096272,7.62857759 10.6381066,7.10476787 12.0000171,7.10476787 C13.3619246,7.10476787 14.6190686,7.62857759 15.5619301,8.67619704 C16.5047887,9.61905569 17.0285984,10.9809604 17.0285984,12.342868 L17.0285984,12.4476299 L17.0285984,12.4476259 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/投诉.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="21" viewBox="0 0 22 21">
  <image id="图层_1" data-name="图层 1" width="22" height="21" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAVCAYAAABCIB6VAAABGUlEQVQ4jdWUvS6EQRSGn8PGT4mgQaPQoyPBBdCo1KJwEa5gG51uu20kGpcgtlQQDaVOJCqRbXhkGMkmmzCfbxtvM5PJOc+8eSdzAkDdBjaABvUkcAW0Gxl6XhPYp+RwMx+eAJ2avDXgEFhJ4OF82ImIdh2qpiQ+wTFUoelMvVWjpL7KY60CC8A48PpbcbHjqvp/4CoZPwBjQHfQ4ANgKiLeS4qLolCXgGvgUt0dGBiYBUbyfr6koSiKiLhQ94Hp/PUHA87wVmntj2B1HUh5LlbgzeW12wdWZ4BjYK+Kwx69AKe94Mg5NoEJ4Ak4Am4qQNN4u4+I5+Sw6Zce85rUUif/6DhfoVvqWwbeqd+Dv77UZXVHHR0IEPgAbkN3h4u9SgMAAAAASUVORK5CYII="/>
</svg>
src/icons/svg/指标事物.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1585742527418" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="811" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.697 819.156c-87.206 0-155.724-68.517-155.724-155.721 0-87.206 68.518-155.724 155.724-155.724 87.204 0 155.722 68.518 155.722 155.724 0 87.204-68.518 155.721-155.722 155.721z m0-249.156c-52.947 0-93.435 40.489-93.435 93.435s40.489 93.433 93.435 93.433 93.434-40.487 93.434-93.433S564.642 570 511.697 570z" p-id="812"></path><path d="M868.974 263.372l44.044 44.045L622.324 598.11l-44.043-44.046 290.693-290.693zM60.1 775.554c-9.343-37.373-15.572-74.747-15.572-112.12 0-258.5 208.668-467.167 467.17-467.167 84.089 0 168.18 21.8 239.811 65.402l-31.144 52.946c-62.29-37.373-133.921-56.06-208.668-56.06-224.242 0-404.88 180.639-404.88 404.88 0 31.144 3.114 65.402 12.458 99.663L60.1 775.554z m903.192 0l-59.176-15.572c9.344-31.145 12.459-65.403 12.459-96.548 0-71.632-18.688-140.152-52.946-202.44l52.946-31.145c40.487 71.632 62.289 152.608 62.289 233.584-0.001 37.374-6.23 74.748-15.572 112.121z" p-id="813"></path></svg>
src/icons/svg/排口信息.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>排口信息</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="排口信息" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M21.1035258,16.8564209 L20.0508246,16.8564209 L20.0508246,16.8564209 C19.8349372,16.85652 19.6580657,16.6850086 19.6515242,16.4692204 C19.542624,8.85831159 16.0215199,5.11940724 8.13231076,4.24820622 L8.13231075,4.24820622 C7.68777703,4.19473361 7.28406431,4.5117502 7.23059029,4.95628392 C7.22649431,4.99033483 7.22456323,5.02461166 7.2248087,5.05890717 L7.2248087,7.63621017 L7.22480867,7.63621923 C7.22384475,7.93726852 7.39226152,8.21327883 7.66041627,8.35011533 L7.6604165,8.35011546 C10.7128814,10.0245873 12.8338342,13.0010584 13.4200232,16.4329249 L13.4200232,16.4329249 C13.4400732,16.6458277 13.2837352,16.8346737 13.0708315,16.8547238 C13.0581972,16.8559136 13.0455119,16.8564816 13.032822,16.8564257 L11.9680208,16.8564257 L11.9680208,16.8564257 C11.7697115,16.851871 11.6048124,16.7024306 11.5808204,16.5055253 L11.5808204,16.5055254 C10.9537372,13.4474123 8.89033971,10.8794206 6.03901393,9.60851736 L5.96641385,9.60851736 L5.9664139,9.60851738 C5.64862074,9.48865706 5.43713518,9.1858464 5.43401202,8.8462165 L5.43401202,3.07450978 L5.43401202,3.07450535 C5.43322881,2.62008601 5.8009722,2.25106866 6.25539154,2.25028283 C6.27201081,2.25028283 6.28862711,2.25073021 6.3052176,2.25170793 L6.40201771,2.25170793 C11.3751235,2.50580822 14.9809277,3.65530956 17.4251305,5.77281202 C20.1234337,8.09601473 21.4786353,11.5929188 21.5391353,16.4450244 L21.5391353,16.4450244 C21.5542459,16.6583349 21.3935733,16.8435072 21.1802636,16.858618 C21.1546782,16.8604305 21.1289758,16.8595859 21.1035355,16.8564258 L21.1035258,16.8564209 Z M4.58700662,3.32860515 L4.58700662,1.23530272 L4.58700662,1.23530272 C4.63643068,0.71527153 4.25924276,0.25186935 3.74000563,0.194701431 L0.618201999,0.194701431 L0.618202008,0.194701431 C0.442392112,0.194580882 0.298012475,0.333612507 0.291501628,0.509301876 L0.291501628,1.96130357 L0.291501628,1.96130352 C0.291501628,2.14173505 0.437770237,2.2880039 0.618202008,2.2880039 L2.02180364,2.2880039 L2.02180368,2.2880039 C2.54590917,2.33903122 2.93004208,2.80431765 2.88090468,3.32860511 L2.88090468,7.51520998 L2.88090467,7.51520988 C2.93738219,8.04638396 2.55291157,8.52291182 2.02180367,8.58001112 L0.618202033,8.58001112 L0.618202019,8.58001112 C0.437770485,8.58001113 0.291501628,8.72627997 0.291501628,8.9067115 C0.291501628,8.9067115 0.291501628,8.9067115 0.291501628,8.9067115 L0.291501628,10.3224131 L0.291501628,10.3224131 C0.291501628,10.5028446 0.437770248,10.6491135 0.618202019,10.6491135 L3.74000565,10.6491135 L3.74000569,10.6491135 C4.26411118,10.5980862 4.64824409,10.1327997 4.59910669,9.60851226 L4.59910669,3.32860496 L4.58700662,3.32860515 Z M11.1331142,21.8900268 L11.1331143,21.8900268 C10.5984497,21.8843025 10.0867609,21.6718212 9.70531266,21.2971261 L8.90671173,20.7889255 L8.9067117,20.7889254 C8.64709313,20.5490852 8.24672919,20.5490852 7.98711063,20.7889255 L7.1885097,21.2971261 L7.18850969,21.2971261 C6.40490616,22.082339 5.13313087,22.0836412 4.34791322,21.3000382 C4.34694151,21.2990685 4.3459708,21.2980978 4.34500108,21.2971261 L3.53430014,20.7889255 L3.53430011,20.7889255 C3.28113568,20.544595 2.87996349,20.544595 2.62679906,20.7889255 L1.59829786,21.5270264 L1.59829786,21.5270264 C1.31586651,21.8021363 0.863888449,21.7962021 0.588776195,21.5137699 C0.537043436,21.4606605 0.49389956,21.3998164 0.460896062,21.3334261 L0.460896069,21.3334261 C0.206500363,20.8803184 0.269812978,20.3153777 0.618196252,19.9298244 L1.65879746,19.1917236 L1.65879743,19.1917236 C2.44240096,18.4065107 3.71417625,18.4052085 4.4993939,19.1888114 C4.50036561,19.1897811 4.50133632,19.1907519 4.50230604,19.1917236 L5.30090697,19.6999242 L5.30090701,19.6999242 C5.55407145,19.9442547 5.95524363,19.9442547 6.20840807,19.6999241 L7.01910901,19.1917235 L7.01910898,19.1917235 C7.80271251,18.4065106 9.0744878,18.4052085 9.85970545,19.1888114 C9.86067716,19.1897811 9.86164787,19.1907518 9.86261758,19.1917235 L10.6612185,19.6999241 L10.6612186,19.6999241 C10.9208371,19.9397644 11.3212011,19.9397644 11.5808196,19.699924 L12.3794206,19.1917235 L12.3794205,19.1917235 C13.1630241,18.4065106 14.4347994,18.4052084 15.220017,19.1888113 C15.2209887,19.189781 15.2219594,19.1907517 15.2229291,19.1917234 L16.0215301,19.699924 L16.0215301,19.6999241 C16.2811487,19.9397643 16.6815126,19.9397643 16.9411312,19.699924 L17.7397321,19.1917234 L17.7397321,19.1917234 C18.5233356,18.4065105 19.7951109,18.4052083 20.5803286,19.1888112 C20.5813003,19.189781 20.582271,19.1907517 20.5832407,19.1917234 L21.3818416,19.699924 L21.3818417,19.699924 C21.7341931,20.0827169 21.8024046,20.647894 21.5512419,21.1035257 L21.5512419,21.1035256 C21.3757321,21.4565837 20.9472432,21.6005148 20.5941851,21.4250055 C20.5277948,21.392002 20.4669509,21.3488582 20.4138413,21.2971254 L19.6152403,20.7889248 L19.6152403,20.7889248 C19.3556217,20.5490845 18.9552578,20.5490845 18.6956392,20.7889248 L17.8970383,21.2971254 L17.8970383,21.2971254 C17.1134348,22.0823384 15.8416595,22.0836405 15.0564418,21.3000375 C15.0554701,21.2990678 15.0544994,21.2980971 15.0535297,21.2971254 L14.2549288,20.7889248 L14.2549287,20.7889248 C13.9953102,20.5490845 13.5949462,20.5490845 13.3353277,20.7889248 L12.5367267,21.2971254 L12.5367268,21.2971254 C12.1656368,21.6725401 11.6609764,21.8857178 11.1331251,21.8900268 L11.1331142,21.8900268 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/数据.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>数据</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="数据" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M10.9862989,3.434144e-05 L10.9862989,10.9862688 L21.9725333,10.9862688 C21.9725333,4.92023977 17.0544742,3.434144e-05 10.9862989,3.434144e-05 Z M12.5569883,1.69946772 C16.4987203,2.36250434 19.6122225,5.47384954 20.2731021,9.41772782 L12.5569883,9.41772782 L12.5569883,1.69946772 L12.5569883,1.69946772 Z M19.8675511,14.12551 C18.5736644,17.7840109 15.0868149,20.4039837 10.9862967,20.4039837 C5.78500659,20.4039837 1.56860752,16.1875847 1.56860752,10.9862946 C1.56860752,6.88577638 4.1885589,3.39891827 7.84708128,2.10504013 L7.84708128,0.454957543 C3.3109634,1.80678043 8.370726e-05,6.0103079 8.370726e-05,10.9862967 C8.370726e-05,17.0544721 4.91814279,21.9725312 10.9863182,21.9725312 C15.962307,21.9725312 20.165828,18.6637763 21.5176573,14.1255336 L19.8675747,14.1255336 L19.8675511,14.12551 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/数据管理.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793256873" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5102" width="200" height="200"><path d="M910.222222 682.666667v170.666666c0 94.264889-178.289778 170.666667-398.222222 170.666667-214.584889 0-389.518222-72.704-397.880889-163.84L113.777778 853.333333v-170.666666c0 94.264889 178.289778 170.666667 398.222222 170.666666 214.584889 0 389.518222-72.704 397.880889-163.84L910.222222 682.666667z m0-284.444445v170.666667c0 94.264889-178.289778 170.666667-398.222222 170.666667-214.584889 0-389.518222-72.704-397.880889-163.84L113.777778 568.888889V398.222222c0 94.264889 178.289778 170.666667 398.222222 170.666667 214.584889 0 389.518222-72.704 397.880889-163.84L910.222222 398.222222zM512 0c211.854222 0 385.024 70.883556 397.482667 160.312889H910.222222v113.777778h-0.739555c0.512 3.413333 0.739556 6.883556 0.739555 10.353777 0 94.264889-178.289778 170.666667-398.222222 170.666667S113.777778 378.709333 113.777778 284.444444c0-3.470222 0.227556-6.940444 0.739555-10.353777H113.777778v-113.777778h0.739555C126.976 70.883556 300.145778 0 512 0z" p-id="5103"></path></svg>
src/icons/svg/权限管理.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793193055" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4363" width="200" height="200"><path d="M881.536 134.912L514.432 0.896 512 0 144 134.4c-28.672 3.712-50.304 28.288-50.304 57.216V677.12c0 34.432 68.352 118.784 131.712 177.408 76.288 70.656 244.864 151.168 279.04 167.168 1.92 0.768 3.712 1.408 5.76 1.92l2.048 0.384 1.792-0.512c1.792-0.512 3.712-1.024 5.632-1.92 1.92-0.896 195.328-89.6 278.912-167.04 63.36-58.496 131.712-143.104 131.712-177.408V191.744c0-28.8-21.632-53.376-48.768-56.832z m-25.984 536.704c-6.656 13.312-39.552 65.152-107.648 128.128-57.344 52.992-182.528 116.736-233.472 141.568L512 942.336l-2.048-0.896c-51.2-24.96-176.384-88.576-233.728-141.696-68.096-62.976-100.992-114.816-107.648-128.128v-466.56L512 79.744l343.552 125.312v466.56z" p-id="4364"></path><path d="M370.048 385.536c0 66.048 45.312 121.472 106.496 137.216v236.032c0 17.792 15.872 32.384 35.456 32.384 19.584 0 35.456-14.464 35.456-32.384V654.976H620.8c17.792 0 32.256-15.872 32.256-35.456 0-19.584-14.464-35.456-32.256-35.456h-73.344v-61.312c61.056-15.744 106.496-71.296 106.496-137.216 0-78.336-63.616-141.952-141.952-141.952-78.336-0.128-141.952 63.744-141.952 141.952z m223.104 0c0 44.672-36.352 81.152-81.152 81.152-44.672 0-81.152-36.352-81.152-81.152 0-44.672 36.352-81.152 81.152-81.152 44.672 0.128 81.152 36.48 81.152 81.152z" p-id="4365"></path></svg>
src/icons/svg/水质监测.svg
对比新文件
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="25px" viewBox="0 0 22 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>水质监测</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-92.000000, -941.000000)" fill-rule="nonzero">
            <g id="水质监测" transform="translate(93.000000, 943.000000)">
                <path d="M10.0046483,21.5924665 C4.66644693,21.6845192 0.262872092,17.4877215 0.166093134,12.215815 C0.166093134,5.38712736 8.8236012,0.636862069 9.20659644,0.434221208 L10.0046549,1.07422e-05 L10.8134004,0.438275315 C11.1851158,0.640907152 19.8432166,5.39176155 19.8432166,12.2198691 C19.7458345,17.4917756 15.3422678,21.6885598 10.0040665,21.5965206 L10.0040665,21.592468 L10.0046483,21.5924665 Z" id="路径" stroke="#FFFFFF" stroke-width="2"></path>
                <path d="M3.44560416,11.932135 L3.44560416,11.9322605 C3.44560416,12.8556794 3.96067667,13.7060319 4.79006486,14.1518784 L4.79006448,14.1518782 C5.6254705,14.6087439 6.6445384,14.6087439 7.47995544,14.1518786 L7.47995561,14.1518785 C8.30473622,13.7032455 8.81490368,12.8536063 8.81243589,11.9327763 L8.81243589,11.9327602 C8.81477872,11.0118013 8.30435946,10.1621362 7.47934748,9.71365799 L7.47934757,9.71365803 C6.64439768,9.25587488 5.62501028,9.25587488 4.79005157,9.71365784 L4.7900512,9.71365804 C3.96068945,10.1589781 3.44560416,11.0090471 3.44570508,11.9321802 L3.44560416,11.932135 Z" id="路径" fill="#FFFFFF"></path>
                <path d="M3.44560416,11.932135 L8.81348701,15.7763602 C8.81883114,16.2395187 9.07831805,16.6633092 9.49041087,16.8844675 L9.49041066,16.8844674 C9.90796163,17.1134675 10.4178008,17.1134675 10.8353517,16.8844677 L10.8353517,16.8844677 C11.2482907,16.6606883 11.5039198,16.2358278 11.5027778,15.7752023 C11.5027778,15.3126238 11.2468496,14.8870952 10.8353517,14.665937 L10.8353519,14.665937 C10.4179529,14.4371539 9.90840247,14.4371539 9.49100575,14.6659368 L9.49100574,14.6659368 C9.07648904,14.889843 8.81747091,15.3137688 8.81289418,15.7757801 L3.44560416,11.9327151 L3.44560416,11.932135 Z" id="路径" fill="#FFFFFF"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/污水处理.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584349908547" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1966" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M846.222222 290.133333v-35.555555h-682.666666v35.555555h159.288888v76.8H163.555556v35.555556h62.577777v76.8h-62.577777v35.555555h129.422222c2.844444-12.8 7.111111-24.177778 11.377778-35.555555h-41.244445v-76.8h98.133333c18.488889-15.644444 38.4-27.022222 61.155556-35.555556h-64v-76.8h275.911111v76.8h-66.844444c22.755556 8.533333 44.088889 19.911111 61.155555 35.555556h103.822222v76.8h-46.933333c4.266667 11.377778 8.533333 22.755556 11.377778 35.555555h147.911111v-35.555555H768v-76.8h76.8v-35.555556H669.866667v-76.8h176.355555z m0 337.066667v-35.555556H699.733333c-1.422222 12.8-5.688889 24.177778-8.533333 35.555556h42.666667v76.8h-91.022223c-11.377778 11.377778-25.6 21.333333-39.822222 29.866667v-58.311111c32.711111-28.444444 52.622222-71.111111 52.622222-116.622223 0-86.755556-72.533333-157.866667-160.711111-157.866666s-160.711111 71.111111-160.711111 157.866666c0 46.933333 19.911111 88.177778 52.622222 116.622223v58.311111c-14.222222-8.533333-27.022222-18.488889-39.822222-29.866667h-85.333333v-76.8H298.666667c-4.266667-11.377778-7.111111-22.755556-8.533334-35.555556h-126.577777v35.555556h62.577777v76.8h-62.577777V739.555556h159.288888v76.8H163.555556v35.555555h224.711111V881.777778h214.755555v-29.866667h243.2v-35.555555H669.866667V739.555556h176.355555v-35.555556h-76.8v-76.8h76.8zM388.266667 816.355556h-29.866667V739.555556h29.866667v76.8z m213.333333-256l-15.644444 14.222222c-7.111111 5.688889-17.066667 5.688889-24.177778 0l-1.422222-1.422222c-7.111111-7.111111-18.488889-7.111111-25.6 0s-18.488889 7.111111-25.6 0l-1.422223-1.422223c-7.111111-7.111111-18.488889-7.111111-25.6 0l-1.422222 1.422223c-7.111111 7.111111-18.488889 7.111111-25.6 0l-1.422222-1.422223c-7.111111-7.111111-18.488889-7.111111-25.6 0l-1.422222 1.422223c-7.111111 7.111111-18.488889 7.111111-25.6 0l-12.8-12.8v-1.422223c0-58.311111 46.933333-105.244444 106.666666-105.244444s106.666667 46.933333 106.666667 106.666667c0-1.422222 0 0 0 0z m32.711111 256h-31.288889V739.555556h31.288889v76.8z" p-id="1967"></path></svg>
src/icons/svg/渗流.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1585742902540" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1012" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M180.565333 467.968c13.312 13.312 34.816 13.312 48.128 0l44.373334-44.373333 44.032 44.032c13.312 13.312 34.816 13.312 48.128 0l44.373333-44.032 44.032 44.032c6.826667 6.826667 15.36 10.24 24.234667 10.24s17.408-3.413333 24.234666-9.898667l68.266667-68.266667a33.9968 33.9968 0 1 0-48.128-48.128L477.866667 395.605333l-44.032-44.032a33.9968 33.9968 0 0 0-48.128 0L341.333333 395.605333 297.301333 351.573333a33.9968 33.9968 0 0 0-48.128 0L204.8 395.605333 160.768 351.573333a33.9968 33.9968 0 1 0-48.128 48.128l67.925333 68.266667z m0 204.8c13.312 13.312 34.816 13.312 48.128 0l44.373334-44.373333 44.032 44.032c6.826667 6.826667 15.36 10.24 24.234666 10.24s17.408-3.413333 24.234667-9.898667l68.266667-68.266667a33.9968 33.9968 0 1 0-48.128-48.128L341.333333 600.405333 297.301333 556.373333a33.9968 33.9968 0 0 0-48.128 0L204.8 600.405333 160.768 556.373333a33.9968 33.9968 0 1 0-48.128 48.128l67.925333 68.266667zM955.733333 68.266667h-159.744c-18.432 0-33.792 15.018667-34.133333 33.450666-2.730667 138.24-44.373333 266.922667-112.64 376.149334H512v68.266666h89.429333C473.429333 706.218667 281.258667 808.618667 68.266667 808.618667c-18.773333 0-34.133333 15.36-34.133334 34.133333V921.6c0 18.773333 15.36 34.133333 34.133334 34.133333h887.466666c18.773333 0 34.133333-15.36 34.133334-34.133333V102.4c0-18.773333-15.36-34.133333-34.133334-34.133333z m-34.133333 819.2H102.4v-11.264c137.557333-6.485333 265.557333-51.882667 375.466667-125.269334h273.066666v17.066667c0 12.970667 7.168 24.576 18.773334 30.378667 4.778667 2.389333 9.898667 3.754667 15.36 3.754666 7.168 0 14.336-2.389333 20.48-6.826666l68.266666-51.2c8.533333-6.485333 13.653333-16.725333 13.653334-27.306667s-5.12-20.821333-13.653334-27.306667l-68.266666-51.2a33.9968 33.9968 0 0 0-35.84-3.072c-11.605333 5.802667-18.773333 17.408-18.773334 30.378667v17.066667h-185.685333a793.941333 793.941333 0 0 0 120.832-136.533334H750.933333v17.066667c0 12.970667 7.168 24.576 18.773334 30.378667 4.778667 2.389333 9.898667 3.754667 15.36 3.754666 7.168 0 14.336-2.389333 20.48-6.826666l68.266666-51.2c8.533333-6.485333 13.653333-16.725333 13.653334-27.306667s-5.12-20.821333-13.653334-27.306667l-68.266666-51.2a33.9968 33.9968 0 0 0-35.84-3.072c-11.605333 5.802667-18.773333 17.408-18.773334 30.378667v17.066667h-21.845333c56.661333-102.058667 92.16-217.770667 99.669333-341.333334H921.6v750.933334z" p-id="1013"></path></svg>
src/icons/svg/环保.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
  <image id="图层_1" data-name="图层 1" width="22" height="22" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAABoUlEQVQ4ja3VP2hUQRAG8Dnv0EDAFIIkEGKhVleIBpSYwkqsTCMGwUKwsbGyCBbaCBaCWFhIBBtFbMTGFAEtQgoVLEVBC0UQC7FRBOP/nyxu8Hhc9l5yGVgeO/vNt2++ndmNOoYBPMRTDNUKqkl8Dp/xEVfWi3QYX3AWp/Ed29eD+AbeZjlaeIm7/ZLuwm8c6/BN+Wf7+yG+jSdd/Avd/Ksh3omRLv5x/MF0nu9DY80bVchv4Q0msjQ7SuBJXMIzzBdwxzGbCd/hRYl0Wwa+z9+U6vAK2JP44L/N9EpvCBdzUKrXEwVsK1fINWzpRTyGJZzCHM4XA+oa7uA5mnnUOmlcSI200uLerOuhNfzQ4az2RLfFR6VKqEGemuZx1TmNX2j3QbwnZ3x02bEpF/psjeDd2FxYv4nX2JgmM/mu3dqD9CB+4kgBM4qvOJMmr3K3tSqj2RHQxqdcNRtStRTG1fTSpKB7HR3UaT+WNc8prsbupx0GIuJARAxWMvsWEQ8ajUY61HTDzUXEeERcjojSlbkUEYslWav6DaaXA9d7giPiL0b8QXN0s9pHAAAAAElFTkSuQmCC"/>
</svg>
src/icons/svg/环境气象.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584342524077" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M354.9 809.4c-137.3 0-244.5-14.9-249.8-15.6-20.8-2.9-35.2-22.2-32.3-42.9s22.2-35.2 42.9-32.3c2 0.3 152.4 21.1 320.1 13 148.5-7.1 341.3-38.5 419-147.4l0.8-1.2c15.4-23.4 23.5-50.6 23.5-78.7 0-79-64.2-143.2-143.2-143.2s-143.2 64.2-143.2 143.2c0 21-17 38-38 38s-38-17-38-38c0-58.6 22.8-113.6 64.2-155 41.4-41.4 96.4-64.2 155-64.2s113.6 22.8 155 64.2 64.2 96.4 64.2 155c0 41.3-11.5 81.4-33.3 116.2l-0.3 0.9-3.1 4.4C875.7 687.3 804.6 734 707.3 764.7c-74.4 23.5-164.9 37.9-268.9 42.8-28.6 1.3-56.6 1.9-83.5 1.9z" p-id="1602"></path><path d="M243.2 692.1c-51.2 0-98.8-5.8-130.2-9.5-4-0.5-7.7-0.9-11.2-1.3-20.8-2.5-35.8-21.4-33.3-42.2 2.4-20.8 21.3-35.8 42.1-33.3 3.5 0.4 7.3 0.9 11.5 1.4 65.7 7.9 239.3 28.9 290.6-45.6l1.4-2.2c4.2-6.3 6.4-13.7 6.4-21.3 0-21.4-17.4-38.8-38.8-38.8s-38.8 17.4-38.8 38.8c0 21-17 38-38 38s-38-17-38-38c0-63.3 51.5-114.8 114.8-114.8S496.5 474.7 496.5 538c0 20.7-5.5 40.8-16 58.5l-0.1 0.3-2.6 4.1c-33.6 51.9-96.4 81.9-186.8 89.3-16.1 1.3-32.1 1.9-47.8 1.9z" p-id="1603"></path><path d="M159 532.2a28 28 0 1 0 56 0 28 28 0 1 0-56 0z m576-324.1a39.3 39.3 0 1 0 78.6 0 39.3 39.3 0 1 0-78.6 0z m-414.6 87.7a59.5 59.5 0 1 0 119 0 59.5 59.5 0 1 0-119 0z m472.8 517.8a38.5 38.5 0 1 0 77 0 38.5 38.5 0 1 0-77 0zM525.6 251.9a26.2 26.2 0 1 0 52.4 0 26.2 26.2 0 1 0-52.4 0z m363.6 454.7a26.2 26.2 0 1 0 52.4 0 26.2 26.2 0 1 0-52.4 0z m-186-162.1a35.8 35.8 0 1 0 71.6 0 35.8 35.8 0 1 0-71.6 0zM489.9 654.1a26.2 26.2 0 1 0 52.4 0 26.2 26.2 0 1 0-52.4 0z" p-id="1604"></path></svg>
src/icons/svg/用户权限管理.svg
对比新文件
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="27px" viewBox="0 0 22 27" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>用户权限管理</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="用户权限管理" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M20.7035547,3.54261523 L11.0638768,0.0235278052 L11.0000156,0 L1.33680996,3.52917077 C0.583920191,3.62664311 0.0158917518,4.27197719 0.0158917518,5.03158919 L0.0158917518,17.7802985 C0.0158917518,18.6844384 1.81072717,20.8994132 3.47447911,22.4388039 C5.47770366,24.2941394 9.90429215,26.4082807 10.8017099,26.8284201 C10.8521266,26.8485868 10.8991822,26.8653924 10.95296,26.8788368 L11.0067379,26.8889202 L11.0537935,26.8754757 C11.1008491,26.8620313 11.1512658,26.8485868 11.2016825,26.825059 C11.2520993,26.8015312 16.3307441,24.4722785 18.5255522,22.4388039 C20.1893041,20.9027743 21.9841395,18.6810773 21.9841395,17.7802985 L21.9841395,5.0349503 C21.9841395,4.27869942 21.4161111,3.63336534 20.7035547,3.54261523 Z M20.0212484,17.6357705 C19.8464704,17.9853265 18.9826638,19.3465781 17.1945506,21.0002467 C15.6887711,22.3917483 12.4016006,24.0655836 11.0638768,24.7176399 L11.0000156,24.7445288 L10.9462378,24.721001 C9.6017918,24.0655836 6.3146213,22.3951094 4.80884177,21.0002467 C3.02072858,19.3465781 2.15692202,17.9853265 1.98214404,17.6357705 L1.98214404,5.38450627 L11.0000156,2.09397466 L20.0212484,5.38450627 L20.0212484,17.6357705 Z" id="形状"></path>
            <path d="M7.27253908,10.1236784 C7.27253908,11.8580138 8.4623738,13.3133766 10.0689868,13.7267938 L10.0689868,19.9246899 C10.0689868,20.3918848 10.485765,20.775052 11.0000156,20.775052 C11.5142662,20.775052 11.9310445,20.395246 11.9310445,19.9246899 L11.9310445,17.1988256 L13.8569634,17.1988256 C14.3241584,17.1988256 14.7039644,16.7820473 14.7039644,16.2677967 C14.7039644,15.7535461 14.3241584,15.3367678 13.8569634,15.3367678 L11.9310445,15.3367678 L11.9310445,13.7267938 C13.5342964,13.3133766 14.7274922,11.8546527 14.7274922,10.1236784 C14.7274922,8.06667605 13.057018,6.39619684 11.0000156,6.39619684 C8.94301325,6.39284077 7.27253908,8.07003717 7.27253908,10.1236784 L7.27253908,10.1236784 Z M13.1309626,10.1236784 C13.1309626,11.2967076 12.1764059,12.2546254 11.0000156,12.2546254 C9.8269865,12.2546254 8.86906872,11.3000687 8.86906872,10.1236784 C8.86906872,8.9506493 9.82362539,7.99273152 11.0000156,7.99273152 C12.1730448,7.99609264 13.1309626,8.9506493 13.1309626,10.1236784 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/硬件.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584351429793" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5009" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M815.17968 159.641769H208.832361L42.670179 516.807526V873.964252h938.662653V516.807526L815.17968 159.641769z m94.118533 642.405268H114.686736v-254.735654h794.611477v254.735654z m-362.707808-179.982691h105.247789v105.238758h-105.247789v-105.238758z m182.731138 0h105.235748v105.238758H729.321543v-105.238758z" p-id="5010"></path></svg>
src/icons/svg/管理员.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793821620" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10880" width="200" height="200"><path d="M878.871 768.471c2.678 9.196 5.052 20.918 7.124 35.015 1.971 14.097 3.083 28.447 3.083 42.847 0 14.501-1.163 28.143-3.537 41.078-2.375 12.833-6.012 22.383-10.661 29.002-3.335 4.649-11.924 9.095-25.769 13.339-13.895 4.244-31.276 8.287-52.193 11.823-20.918 3.637-44.211 7.124-69.878 10.357s-51.335 6.113-76.953 8.388c-25.567 2.273-50.628 3.941-74.779 4.951-24.455 0.96-45.727 1.465-63.916 1.465s-39.259-0.708-63.259-1.971c-23.949-1.263-48.607-2.981-73.869-4.951-25.313-1.971-50.476-4.345-75.436-6.923-24.96-2.678-47.748-5.607-68.362-8.892-20.564-3.233-38.148-6.417-52.649-9.397-14.553-2.88-23.444-6.113-26.829-9.398-6.063-4.649-10.812-19.251-14.148-43.807-3.436-24.758-2.021-56.843 4.043-96.202 3.385-22.383 12.683-39.461 27.84-51.335 15.207-11.823 32.691-21.12 52.649-28.143 19.908-6.923 40.825-13.036 62.753-18.24s40.977-13.137 57.247-23.697c12.783-7.781 22.737-15.411 29.861-22.687 7.073-7.225 12.076-14.4 15.108-21.727 3.033-7.225 4.597-14.804 4.597-22.585 0-7.883-0.353-16.775-1.011-26.628-1.364-14.501-6.215-25.668-14.652-33.549-8.539-7.781-17.836-16.017-27.891-24.607-5.407-3.941-9.953-9.651-13.692-17.28-3.687-7.529-7.225-15.259-10.661-23.141-3.335-8.539-6.316-18.089-9.044-28.649-1.364-1.263-3.385-3.588-6.063-6.871-2.021-3.284-4.447-7.731-7.124-13.339-2.677-5.607-5.709-13.642-9.145-24.151-3.335-10.509-5.508-19.908-6.517-28.092-1.061-8.236-0.909-15.309 0.455-21.221 0.708-7.225 2.324-13.491 5.052-18.745 0-23.040 1.364-46.029 4.043-69.069 2.729-19.047 7.073-39.764 13.238-62.148 6.063-22.332 15.815-42.393 29.305-60.127 12.177-16.471 25.313-30.113 39.511-40.977 14.148-10.863 28.851-19.2 44.009-25.162 15.209-5.911 30.517-10.004 46.080-12.329 15.563-2.273 30.367-3.436 44.564-3.436 15.513 1.313 28.193 3.132 37.945 5.407 9.802 2.324 17.785 5.153 23.797 8.388 6.012 3.284 11.268 7.225 15.713 11.873 4.295 4.598 8.943 9.196 13.692 13.793h19.149c6.113 0 12.025 0.807 17.785 2.476 5.811 1.617 11.469 4.749 17.179 9.348 5.709 4.598 12.025 11.217 18.745 19.756 15.612 19.705 27.033 41.229 34.459 64.572s12.833 45.524 16.167 66.593c3.335 24.353 5.407 48.353 6.113 72 1.263 3.284 2.273 7.276 3.083 11.873 0.708 4.597 1.061 10.207 1.465 16.775 0.303 6.567-0.203 14.804-1.465 24.657-1.364 13.137-3.436 23.495-6.113 31.073-2.779 7.579-5.709 13.339-9.196 17.229-3.335 4.649-7.124 7.932-11.065 9.852-2.779 10.56-5.811 20.109-9.095 28.647-3.436 7.883-7.023 15.612-10.661 23.193-3.739 7.579-8.388 13.339-13.692 17.229-11.469 9.196-20.917 16.876-28.345 23.191-7.477 6.215-12.531 16.825-15.309 31.932-1.971 9.297-2.577 18.443-1.971 27.739 0.708 9.196 3.233 18.543 7.579 28.043 4.447 9.549 11.571 18.644 21.221 27.132 9.852 8.589 23.495 16.167 41.129 22.788 15.511 5.811 32.487 11.268 51.031 16.167 18.644 4.953 36.429 10.459 53.709 16.775 17.28 6.215 32.589 14.299 46.080 24.202s22.887 22.737 28.345 38.501v0 0zM553.887 735.932c1.971-3.941 2.172-8.084 0.505-12.329s-4.244-8.388-7.477-12.329c-3.436-3.941-7.478-8.185-12.228-12.833h-46.585c-4.749 4.649-8.438 8.892-11.167 12.833-2.678 3.233-4.851 6.923-6.567 10.863-1.668 3.941-1.516 7.579 0.505 10.863 4.749 9.297 8.791 17.28 12.127 24.202 3.385 6.923 7.175 12.329 11.217 16.167-1.364 6.012-3.436 14.299-6.113 25.263-2.729 10.762-5.204 22.029-7.527 33.449-2.375 11.571-4.396 22.383-6.113 32.589-1.668 10.257-2.527 17.937-2.527 23.193 0 3.233 1.516 7.225 4.548 11.823s6.569 9.397 10.661 14.299c4.043 4.951 8.236 8.993 12.631 12.327 4.447 3.233 8.287 4.953 11.621 4.953 3.385 0 7.377-1.668 12.127-4.953 4.749-3.335 9.297-7.124 13.642-11.367 4.497-4.244 8.185-8.892 11.217-13.793 2.981-4.951 4.548-8.993 4.548-12.327 0-3.941-1.061-10.661-3.082-20.109-1.971-9.549-4.143-20.211-6.619-32.185-2.375-11.823-4.8-23.292-7.579-34.459-2.677-11.167-5.052-20.109-7.124-26.628 4.043-3.233 7.983-7.983 11.722-14.299 3.687-6.265 8.236-14.652 13.643-25.212v0 0z" fill="#999999" p-id="10881"></path></svg>
src/icons/svg/行政处罚.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
  <image id="图层_1" data-name="图层 1" width="22" height="22" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAACTUlEQVQ4jaWVTYiOURTHf3caihljMcqYJPkcoTSibJQFG1kQG1NKYcWUwoaSWbEhH1mQFQs70mx87MSWmEzKggUz+cj3kGF+uuO8eeeZZ96ZOPXW+/zvOef+z73nf25iDFNbgW3ARmAR0AJ8BV4Bd4EbwM2UkmUZRiVWpwNHgL35MwcDj4A+oAGYA2wA2oCHwKGU0u2xCFaSLlB71Q/qQXVqDd+V6h11SD1aK+l89a36QJ1dk8HIuE71p3qmbLFBfaw+VBsnmrQqvsM/trO40KV+VOdWYZPVKeP86qr8T6mf1OYK0BzA4cJm19Qf6pdg81kdLGBrq/yb4ihP5O+842ZgEnC6pMpLwIr4Pw+4ClwE5hcdU0qfgPPADjVVmHWXnNv1YNYf7F6pA4H1FRlHTHvg7fXAUuBKCds9QHeIITP5HhUOAU1AProXhZgHwCCwPDvOCjUVS3sNHAe2ALtTSi+BJ8Aq4CPQERtUx2RB9QMz60uY5pJa4iyz3Qe6KrFl/mVWF1JtLazlcp4FozUppYGJJBu+tD8zpb8uyltdKOldSmk/cD0ClqjrgV7gc43cK6LDenLQLvVbmeLUC+qvuOlz/BXO4sCWFfyPRccMt9uMaP6iQHKC5zFo1lXhlyPp+5iEFXya+qYikAo4StKBN5dU0aq25flSwE+OkHSAjWrPfwyh7aVDKBYX/OPY3Bdj82wtp4Xq0wkO+izf28E0X9qIHh/racoX2RnyrfU0ZfxA2dM03mO6FdgU0yxLPwsly/9e9PitlFLefKQBvwGbyyij1+sgYgAAAABJRU5ErkJggg=="/>
</svg>
src/icons/svg/行政执法.svg
对比新文件
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20">
  <image id="图层_1" data-name="图层 1" width="20" height="20" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABgUlEQVQ4jY2UzStEYRSH7yDZUJrMQlko+UxZkQVi46OmLChZKawslLKQj2JtJTv/ALOhlI2lUsJCShFWI1IsFEV4dOp36864c+97NjP3Pb/3OR/3nOsVMmAcOADugFtgHxgteCECVC1QIdsDUq6wEuBcoAtgEKgEkkAauJLvGChyAa7owiFQGuIvA46kmXfJ7hX4BGoidHXAD/AIJKKALYp86lCJX3ptvi/Yh3L9ZuOAAU1FVNQaRb13yPBJ2mSc8FLCdIRmTJqTuMAm7gV+lUFHiL8LeNFL6YwF6tK6MvgGtoEFYBnICGS26gQTsBjYBL5CNsVGasNGzBVWH9gUsyxwDdwAD4Fz26KGOFib+mO2ZfAQTTOwI81ans8Gvsp/SGnyrcxhh0oabQ0DzwNqx65/kFHUSafe5MJ7gA8l028HTRqVM0fALDCk/+3AmyZixBcsKbtpB1gCeBZgUT23ZCaCIr/cVscMu4H3wBufyRdMWTMjP0X/oX2288BcjsPzvD9ai0rI40XDbwAAAABJRU5ErkJggg=="/>
</svg>
src/icons/svg/评价.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1585743061690" class="icon" viewBox="0 0 1045 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1947" xmlns:xlink="http://www.w3.org/1999/xlink" width="204.1015625" height="200"><defs><style type="text/css"></style></defs><path d="M1032.568392 201.781765 501.752667 753.825487 308.770872 753.825487 308.770872 560.843692 841.516415 10.729788C856.607591-4.361389 881.039086-4.361389 896.130263 10.729788L1032.568392 147.167917C1047.659568 162.259093 1047.659568 186.690588 1032.568392 201.781765ZM868.804041 92.592665 385.96359 599.440051 385.96359 676.632769 463.156308 676.632769 950.705514 174.494139 868.804041 92.592665ZM540.349026 97.648788 77.192718 97.648788 77.192718 946.768686 926.312615 946.768686 926.312615 483.612378C926.312615 455.630018 934.495044 449.840564 962.477404 449.840564 990.49836 449.840564 1003.505333 455.630018 1003.505333 483.612378L1003.505333 946.768686C1003.505333 984.052768 963.596698 1023.961404 926.312615 1023.961404L77.192718 1023.961404C39.908635 1023.961404 0 984.052768 0 946.768686L0 97.648788C0 60.326109 39.908635 20.45607 77.192718 20.45607L540.349026 20.45607C568.331386 20.45607 574.12084 33.50164 574.12084 61.484 574.12084 89.427764 568.331386 97.648788 540.349026 97.648788Z" p-id="1948"></path></svg>
src/icons/svg/试运行.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="21px" viewBox="0 0 20 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>试运行</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="试运行" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M17.5921899,14.4084003 C18.0171248,14.4084003 18.3558417,14.7545079 18.3558417,15.1880651 L18.3558417,18.6134151 C18.3558417,19.8869898 17.3384592,20.9388661 16.0772062,20.9388661 L2.4263049,20.9388661 C1.17736353,20.9388661 0.146441759,19.9005455 0.146441759,18.6134151 L0.146441759,3.15438667 C0.146441759,1.87958013 1.16505604,0.828935674 2.42507722,0.828935674 L9.92980322,0.828935674 C10.354738,0.828935674 10.6811393,1.17381145 10.6811393,1.59505096 L10.6811393,1.59505271 C10.6879456,2.0119892 10.3554685,2.35550021 9.9385341,2.36230565 C9.93562394,2.36235315 9.93271356,2.36238383 9.92980306,2.36239768 L2.43739479,2.36239768 L2.43739483,2.36239768 C2.01221446,2.36914233 1.67166421,2.71683299 1.67374308,3.14206246 L1.67374308,18.6010909 C1.67374308,19.0346481 2.01369177,19.3807557 2.43739483,19.3807557 L16.0648884,19.3807557 C16.4898232,19.3807557 16.8285401,19.0346481 16.8285401,18.6010909 L16.8285401,15.1757409 C16.8285401,14.7545014 17.1684888,14.4083938 17.5921919,14.4083938 L17.5921899,14.4084003 Z M7.96771074,5.46628612 L7.96771074,5.46628608 C7.73913718,5.95712073 7.57995415,6.4773665 7.49473883,7.01206615 L3.94130092,7.01206615 L3.94130096,7.01206615 C3.51683469,7.00938019 3.17491354,6.66310425 3.17758439,6.23863798 C3.17758439,6.23696942 3.17758439,6.23530088 3.17764809,6.23363242 C3.17764809,5.80007519 3.516365,5.45396764 3.94129983,5.45396764 L7.96649425,5.45396764 L7.96649425,5.46628463 L7.96771074,5.46628612 Z M8.39142292,11.6494146 L3.94129885,11.6494146 L3.94129889,11.6494146 C3.51683263,11.6467286 3.17491147,11.3004527 3.17758232,10.8759864 C3.17758232,10.8743179 3.17758232,10.8726493 3.17764602,10.8709809 C3.17764602,10.4386554 3.51636293,10.0925479 3.94129776,10.0925479 L7.55386893,10.0925479 C7.7607944,10.6492741 8.03915856,11.1678196 8.39142292,11.6506457 L8.39142292,11.6494146 Z M11.5199312,14.7422062 L3.94007117,14.7422062 L3.94007118,14.7422062 C3.51560491,14.7448832 3.17367762,15.09115 3.17633835,15.5156163 C3.17633835,15.517701 3.17633835,15.5197857 3.17633835,15.5218702 C3.17633835,15.9541957 3.51513575,16.3003032 3.94007059,16.3003032 L11.5174752,16.3003032 C11.9411783,16.3003032 12.2812088,15.9554275 12.2812088,15.5218702 L12.2812088,15.5218704 C12.2872577,15.0974409 11.9481597,14.7484013 11.5237282,14.7422711 C11.5216437,14.742241 11.519559,14.7422062 11.5174743,14.7422062 L11.5199312,14.7422062 Z M18.8423672,4.63858427 L18.8423672,4.63858423 C18.95075,4.44540121 19.0091755,4.22820969 19.0123415,4.00672394 C19.0246585,3.72343269 18.9384397,3.28987545 18.5147362,2.8945011 C18.5024193,2.88218414 18.4901022,2.88218414 18.4901022,2.86986709 C18.0183621,2.46094325 17.5700236,2.43630985 17.278112,2.48557665 L17.2781119,2.48557666 C17.0909916,2.52337242 16.9136465,2.59925757 16.757105,2.70851311 L16.7571054,2.70851332 C16.1211324,2.35972943 15.4270982,2.12935732 14.7088031,2.02861595 L14.7088031,1.64432551 L14.8775457,1.64432551 C15.3147983,1.64432551 15.6781486,1.27481634 15.6904663,0.828941377 L15.6904663,0.828943704 C15.6898498,0.612428013 15.6070923,0.404213485 15.4589074,0.246350206 L15.4589074,0.246350213 C15.3109743,0.0890295688 15.1045785,7.88347547e-06 14.8886296,7.88347547e-06 L12.9253033,7.88347547e-06 L12.9253033,7.88347547e-06 C12.481851,0.00520805961 12.1223105,0.360935726 12.1123827,0.80430622 L12.1123827,0.816623206 C12.1123827,1.05064561 12.2096868,1.27358207 12.3796609,1.42261833 C12.5250013,1.5581051 12.7183778,1.63200734 12.9129856,1.63200734 L13.0952768,1.63200734 L13.0952768,2.01629778 L13.0952769,2.01629776 C11.7038694,2.21256124 10.4254208,2.89079264 9.48270576,3.93281878 C9.07008661,4.39100942 8.74245565,4.89723713 8.48749516,5.44164773 L8.48749518,5.44164769 C8.25892162,5.93248234 8.09973859,6.45272811 8.01452327,6.98742776 C7.94185321,7.40866728 7.9172192,7.85331046 7.94185321,8.2868677 C7.96648722,8.90518055 8.08719354,9.51117567 8.29411962,10.0802197 C8.4874962,10.636946 8.76709152,11.1554914 9.11812615,11.6259998 C9.34845325,11.9339244 9.60341578,12.2196772 9.8817779,12.4672491 L9.88177768,12.4672489 C10.9739402,13.4773369 12.4069927,14.0381575 13.8946544,14.0376627 C14.9132687,14.0376627 15.9318829,13.7790065 16.8408818,13.2579975 L16.840882,13.2579974 C17.3918607,12.9408263 17.8904399,12.5403018 18.3189187,12.0706406 C18.3312356,12.0583236 18.3435527,12.0336896 18.3558696,12.0213727 C20.1504533,9.98045091 20.3573788,6.90121053 18.8411592,4.63857583 L18.8423672,4.63858427 Z M17.1204539,10.9818227 L16.829774,11.2798931 L16.8297743,11.2798929 C15.1698711,12.8138852 12.6095629,12.8138852 10.9496577,11.2798934 L10.9496577,11.2798934 C10.5823849,10.942441 10.2750271,10.5451228 10.040665,10.1048543 L10.040665,10.1048543 C9.7380317,9.52655978 9.56447662,8.88948593 9.53197379,8.23760013 L9.53197379,8.02697935 C9.53197379,6.92584247 9.93104345,5.88752187 10.6589779,5.07091006 L10.6589782,5.07090972 C11.1040265,4.57762381 11.6559157,4.19256607 12.2725017,3.94513944 C12.7565595,3.74806774 13.2775664,3.64953251 13.7874895,3.63721479 L13.9328298,3.63721479 C14.962528,3.64953175 15.9934498,4.03135736 16.8174686,4.78638874 L16.8174687,4.78638882 C17.6743361,5.57793959 18.1842387,6.67564306 18.2363844,7.84099989 L18.2363845,7.84100227 C18.2953252,8.99445673 17.8939579,10.1241392 17.1204643,10.9818374 L17.1204539,10.9818227 Z M16.7312384,5.66582505 C16.7435554,5.88752973 16.6708852,6.09815051 16.5255447,6.25950245 L15.1558978,7.78064912 L15.081996,7.86686786 L15.081996,7.8668681 C15.1336857,8.21790887 15.0226029,8.57337339 14.7802303,8.83251822 L14.7802303,8.83251818 C14.5531668,9.0906379 14.2261006,9.23869201 13.8823236,9.23897847 L13.8823236,9.23897847 C13.5860312,9.24175133 13.2997894,9.13165837 13.0817207,8.93105382 L13.0817206,8.93105374 C12.8406022,8.71083251 12.6970169,8.40372222 12.682651,8.07748672 C12.682651,7.95431706 12.6949679,7.83114659 12.7196019,7.70674577 C12.7676381,7.52199119 12.8649422,7.33600483 12.9979661,7.18696857 C13.2640125,6.90367731 13.5670101,6.7546431 13.9069587,6.7792765 L14.3922484,6.24718362 L15.3615938,5.17068013 C15.3862278,5.14604612 15.3985447,5.12141231 15.4231787,5.1090952 C15.7261763,4.83812167 16.1868305,4.83812167 16.500914,5.1090952 L16.500914,5.10909525 C16.6403073,5.26210531 16.721788,5.45905362 16.7312411,5.66582154 L16.7312384,5.66582505 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/车辆管理.svg
对比新文件
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="19px" viewBox="0 0 24 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>车辆管理</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="桌面端-HD" transform="translate(-91.000000, -983.000000)" fill="#FFFFFF" fill-rule="nonzero">
            <g id="车辆管理" transform="translate(91.000000, 983.000000)">
                <path d="M16.5000192,15.2618732 L7.49999998,15.2618732 L7.49999998,16.761875 C7.49999998,17.5903212 6.82842982,18.2619 5.99999998,18.2619 L2.99999998,18.2619 C2.17158065,18.2619 1.49999998,17.5903212 1.49999998,16.761875 L1.49999998,8.42359962 C1.49999998,7.96108346 1.63983003,7.53025483 1.88006469,7.17194192 L0.356273852,6.79527742 L0.356273835,6.79527741 C0.147000154,6.74355102 -1.75382312e-08,6.55576229 -1.75382312e-08,6.34019094 L-1.75382312e-08,5.67592455 C-1.75382312e-08,5.41705706 0.209859602,5.207174 0.468750528,5.207174 L2.01958827,5.207174 C2.34771365,5.207174 2.6322218,5.43414302 2.70513594,5.75404183 C2.7631907,6.00880775 2.7908001,6.22049549 2.78789385,6.38910506 L2.78789383,6.38910507 C2.91013179,6.33121883 3.03737225,6.2845505 3.16805052,6.24967522 L3.8376138,2.7144758 C4.10587974,1.29807571 5.34363899,0.272730769 6.78521098,0.272730769 L17.2137387,0.272730769 C18.6553342,0.272730769 19.8931169,1.29807571 20.1613594,2.7144758 L20.8308523,6.24939397 L20.8308523,6.24939397 C20.9615723,6.28420831 21.088862,6.33082157 21.2111496,6.38865976 C21.2083371,6.2201205 21.2359231,6.00857338 21.293931,5.75404183 C21.3668686,5.43411958 21.6513533,5.20717401 21.9794787,5.20717401 L23.5303398,5.20717401 C23.7892073,5.20717401 23.9990904,5.41705706 23.9990904,5.67592455 L23.9990904,6.34019095 L23.9990904,6.34019787 C23.9990904,6.55576054 23.8520757,6.74353427 23.6428095,6.79525621 L22.1198155,7.17170977 C22.360151,7.53006722 22.5000261,7.96096616 22.5000261,8.42359951 L22.5000261,16.7618983 C22.5000261,17.5903446 21.8284472,18.2619 21.0000244,18.2619 L18.0000209,18.2619 C17.1715981,18.2619 16.5000191,17.5903446 16.5000191,16.7618983 L16.5000191,15.2618965 L16.5000192,15.2618732 Z M18.0000209,15.2618732 L18.0000209,16.7618732 L21.0000209,16.7618732 L21.0000209,15.2618732 L18.0000209,15.2618732 Z M21.0000244,13.7618715 L21.0000244,8.42359962 C21.0000244,8.01972415 20.6801959,7.68836439 20.2765783,7.6740675 L20.2765781,7.6740675 C17.5188015,7.57637449 14.7595248,7.5274892 12.0000138,7.5274892 C9.24118247,7.5274892 6.4823277,7.57635644 3.72344949,7.67404406 C3.31983183,7.68834095 3.00000333,8.01970071 3.00000333,8.42357618 L3.00000333,13.7618715 L21.0000244,13.7618715 L21.0000244,13.7618715 Z M6.00000349,15.2618732 L3.00000349,15.2618732 L3.00000349,16.7618732 L6.00000349,16.7618732 L6.00000349,15.2618732 Z M4.71543093,6.14031609 L4.71543093,6.14031609 C9.57021002,5.98994888 14.4284813,5.98993857 19.2832604,6.14031609 L18.6873144,2.9936328 C18.5534195,2.28540464 17.9345291,1.77273217 17.2137548,1.77273217 L6.78522709,1.77273217 C6.06440594,1.77273217 5.44553803,2.28540464 5.31140506,2.99359296 L4.71543093,6.14031609 L4.71543093,6.14031609 Z M5.20313105,9.26186622 L6.79688291,9.26186622 C7.1852193,9.26186622 7.50000524,9.57667909 7.50000524,9.96499204 L7.50000524,10.4806176 C7.50000524,10.868954 7.1852193,11.1837435 6.79688291,11.1837435 L5.20313105,11.1837435 C4.81479467,11.1837435 4.50000524,10.868954 4.50000524,10.4806176 L4.50000524,9.96499204 C4.50000524,9.57667909 4.81479467,9.26186622 5.20313105,9.26186622 Z M17.203145,9.26186622 L18.7968969,9.26186622 C19.1852333,9.26186622 19.5000192,9.57667909 19.5000192,9.96499204 L19.5000192,10.4806176 C19.5000192,10.868954 19.1852333,11.1837435 18.7968969,11.1837435 L17.203145,11.1837435 C16.8148086,11.1837435 16.5000192,10.868954 16.5000192,10.4806176 L16.5000192,9.96499204 C16.5000192,9.57667909 16.8148086,9.26186622 17.203145,9.26186622 Z" id="形状"></path>
            </g>
        </g>
    </g>
</svg>
src/icons/svg/软件.svg
对比新文件
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1584351456415" class="icon" viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5774" xmlns:xlink="http://www.w3.org/1999/xlink" width="200.390625" height="200"><defs><style type="text/css"></style></defs><path d="M3.51991 74.13634A3.51991 3.51991 0 0 0 0 77.592252v412.789422c0 1.919951 1.535961 3.51991 3.51991 3.51991h409.781499c1.919951 0 3.51991-1.535961 3.51991-3.51991v-412.789422a3.51991 3.51991 0 0 0-3.51991-3.51991H3.51991zM753.836683 1.626198a5.119869 5.119869 0 0 0-7.231815-0.191995L462.260155 272.083268a5.119869 5.119869 0 0 0-0.255994 7.231815l268.793112 286.456659a5.119869 5.119869 0 0 0 7.167817 0.255994l284.408712-270.649065a5.247866 5.247866 0 0 0 0.191995-7.231815L753.836683 1.626198zM3.51991 604.170758A3.51991 3.51991 0 0 0 0 607.690668v412.789422c0 1.983949 1.535961 3.51991 3.51991 3.51991h409.781499c1.919951 0 3.51991-1.535961 3.51991-3.51991v-412.789422a3.51991 3.51991 0 0 0-3.51991-3.51991H3.51991z m533.874319 0a3.583908 3.583908 0 0 0-3.583908 3.51991v412.789422c0 1.919951 1.599959 3.51991 3.583908 3.51991H947.175729a3.51991 3.51991 0 0 0 3.519909-3.51991v-412.789422a3.583908 3.583908 0 0 0-3.519909-3.51991H537.394229z" p-id="5775"></path></svg>
src/icons/svg/防护目标.svg
对比新文件
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="25px" viewBox="0 0 22 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>防护目标</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="防护目标" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M10.3662735,14.3064733 L10.3662734,14.3064733 C10.1238859,14.3070659 9.89133311,14.2106707 9.720447,14.0387695 L7.22783228,11.5128916 L7.22783228,11.5128916 C6.8745804,11.1573444 6.87643853,10.5827503 7.23198451,10.2294984 C7.58753172,9.87624652 8.16212582,9.87810466 8.5153777,10.2336506 C8.51676109,10.235043 8.51813997,10.2364399 8.5195143,10.2378412 L11.012129,12.7622125 L11.012129,12.7622125 C11.3638004,13.1193224 11.3593929,13.6939047 11.0022818,14.0455762 C10.8326949,14.2125806 10.604287,14.3062756 10.3662718,14.3064733 L10.3662735,14.3064733 Z M10.3662735,14.3064708 L10.3662735,14.3064708 C9.86507409,14.3068519 9.45846221,13.9008601 9.45808087,13.3996607 C9.45789795,13.1589443 9.55335929,12.9280172 9.72345932,12.7576924 L14.0628328,8.4198255 L14.0628328,8.41982551 C14.4294254,8.07805033 15.0036709,8.09817074 15.3454461,8.46476365 C15.6704124,8.81333032 15.6704124,9.35387245 15.3454461,9.70243911 L11.0075792,14.0387698 L11.0075793,14.0387698 C10.8377977,14.2095599 10.6070942,14.3058628 10.3662726,14.3064708 L10.3662735,14.3064708 Z M11.0000176,24.9287822 L11.0000176,24.9287822 C10.7675112,24.9287822 10.5439097,24.8393579 10.3753425,24.6792194 L4.67926682,19.270519 L4.67926626,19.2705185 C1.91880579,16.6627203 0.344058087,13.0400156 0.320239213,9.24263183 L0.320239213,4.88358403 L0.320239213,4.88357503 C0.318202137,4.41367146 0.675204356,4.01992766 1.14306369,3.97608284 C6.45345146,3.47240793 10.4464266,0.769579105 10.4857752,0.742371798 L10.4857753,0.742371777 C10.7958529,0.528656165 11.2057054,0.528656165 11.5157831,0.74237182 C11.5535956,0.769579127 15.5466003,3.46487499 20.856988,3.97608286 L20.856988,3.97608286 C21.3248473,4.01993359 21.681845,4.41368034 21.6798037,4.88358391 L21.6798037,9.24263171 L21.6798037,9.24262916 C21.655977,13.040013 20.0812282,16.662691 17.3207766,19.2704863 L11.6246714,24.6791867 L11.6246714,24.6791867 C11.4561161,24.8393299 11.2325258,24.9287822 11.0000229,24.9287822 L11.0000176,24.9287822 Z M2.13525055,5.69126641 L2.13525055,9.24263236 L2.13525055,9.24261082 C2.15786342,12.5421393 3.52830602,15.6890292 5.92858723,17.9530848 L11.0000175,22.7689554 L16.0714477,17.9531734 L16.0714472,17.9531739 C18.4717521,15.6891035 19.8422146,12.5421988 19.8648135,9.24267032 L19.8648135,5.69127483 L19.8648135,5.69127484 C16.7324578,5.24647821 13.7194184,4.1849058 11.0000171,2.56798783 L11.0000178,2.56798783 C8.28064006,4.1849113 5.26760657,5.24649256 2.13525055,5.69130397 L2.13525055,5.69126641 Z" id="形状"></path>
        </g>
    </g>
</svg>
src/icons/svg/风险源.svg
对比新文件
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
    <title>风险源</title>
    <desc>Created with Sketch.</desc>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="风险源" fill="#FFFFFF" fill-rule="nonzero">
            <path d="M21.226506,19.5242663 L19.3471325,17.6466934 C19.1202572,17.4184677 18.818207,17.2933262 18.4952249,17.2933262 C18.173143,17.2933262 17.8708678,17.4184677 17.6444426,17.6466934 C17.1747118,18.1168744 17.1747118,18.8819032 17.6444426,19.3527594 L19.5217904,21.2321328 C19.7479905,21.4608087 20.0507159,21.5855001 20.3727978,21.5855001 C20.6948796,21.5855001 20.9978301,21.4581078 21.226506,21.2301072 C21.6957866,20.759251 21.6957866,19.9942222 21.226506,19.5242663 L21.226506,19.5242663 Z M19.6250997,10.0211637 C19.6250997,8.77312466 19.3880961,7.55727131 18.9215163,6.40488901 C18.4391813,5.2135688 17.7301961,4.14536444 16.8125667,3.22818517 C15.8976382,2.31213128 14.8278583,1.60089533 13.6367631,1.11811017 C12.4855062,0.651980535 11.2705532,0.414526762 10.0234144,0.414526762 C8.77560048,0.414526762 7.56042235,0.651980535 6.40939051,1.11811017 C5.2189706,1.60089533 4.1509913,2.31213128 3.23336189,3.22841024 C2.31843337,4.14536444 1.60742249,5.2135688 1.12508748,6.40511409 C0.657832476,7.55727131 0.421504076,8.77312466 0.421504076,10.0211637 C0.421504076,11.2680773 0.657832476,12.4841558 1.12508748,13.636313 C1.60742249,14.8274081 2.31573247,15.8958376 3.23336189,16.8130168 C4.1509913,17.7292958 5.2189706,18.4403067 6.40916543,18.9233169 C7.56019728,19.3894465 8.7753754,19.6269003 10.0231894,19.6269003 C11.2676272,19.6269003 12.4855062,19.3894465 13.6365381,18.9233169 C14.8276332,18.4405317 15.8953874,17.7292958 16.8123416,16.8130168 C17.7281704,15.8960626 18.4389562,14.8274081 18.9212912,13.636313 C19.3883212,12.4841558 19.6250997,11.2680773 19.6250997,10.0211637 Z M15.4053999,15.3349515 L15.3687127,15.3716387 C13.9394886,16.7981619 12.0430094,17.585248 10.0231894,17.585248 C8.00314422,17.585248 6.10373911,16.798387 4.6769908,15.3691628 C3.25046756,13.9399387 2.46270623,12.0432345 2.46270623,10.0229643 C2.46270623,8.00359437 3.25046756,6.10598986 4.6769908,4.67676572 C6.10621493,3.24754159 8.00291915,2.46113071 10.0231894,2.46113071 C12.032656,2.46113071 13.9248587,3.24101443 15.3540828,4.66483677 L15.4053999,4.68959498 L15.4053999,4.71615379 C16.810541,6.13997613 17.5829973,8.02295079 17.5829973,10.0256652 C17.5829973,12.0286046 16.8107661,13.9104539 15.4053999,15.3349515 Z" id="形状"></path>
            <path d="M14.0135381,9.23407757 L14.0135381,9.23160175 C13.5084706,9.23160175 13.0362639,9.57709137 12.8863642,10.0578509 L12.6034453,10.9696283 L10.7339752,5.68487516 C10.4587088,4.90251561 9.48638628,4.80460813 9.04861605,5.49806318 L6.4805141,9.56741316 L4.47307315,9.56741316 C4.02562471,9.56741316 3.6614539,9.93023352 3.6614539,10.3756563 C3.6614539,10.8217543 4.02292382,11.1845746 4.47037225,11.1845746 L6.65517204,11.1845746 C7.08348913,11.1845746 7.5307125,10.9399185 7.75938836,10.5770981 L9.6736484,7.54736802 L11.7792219,13.5602377 C12.0918506,14.4425304 13.2356801,14.4004415 13.5084706,13.5255762 L14.3428224,10.851014 L15.2998398,10.851014 C15.7472883,10.851014 16.1114591,10.4888688 16.1114591,10.0427709 C16.1114591,9.59667286 15.7475134,9.2338525 15.3018655,9.2338525 L14.0135381,9.2338525 L14.0135381,9.23407757 Z" id="路径"></path>
        </g>
    </g>
</svg>
src/icons/svg/首页.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793062762" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2059" width="200" height="200"><path d="M562.805 80.6975a72.135 72.135 0 0 0-96.93 0L73.925 452.87a36.1575 36.1575 0 0 0 48.42 53.7075l6.2325-5.9175V889.1a72.315 72.315 0 0 0 72.315 72.405h210.4425v-217.71a50.9175 50.9175 0 0 1 50.94-50.985h99.0225a50.9175 50.9175 0 0 1 50.94 50.985v217.71h215.4375a72.315 72.315 0 0 0 72.3375-72.405V505.4075c16.065 14.535 38.8575 13.4325 52.2225-1.4625a36.1575 36.1575 0 0 0-2.61-51.075L562.805 80.72z" fill="#333303" p-id="2060"></path></svg>
src/icons/svg/高中志愿管理.svg
对比新文件
@@ -0,0 +1 @@
<svg t="1608793690437" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9990" width="200" height="200"><path d="M409.953 79.384H95.268c-17.38 0-31.469 14.089-31.469 31.468v333.085c0 17.38 14.09 31.468 31.469 31.468h314.685c17.38 0 31.469-14.089 31.469-31.468V110.852c0-17.38-14.089-31.468-31.469-31.468z m-31.468 333.083H126.736V142.321h251.749v270.146zM409.953 582.88H95.268c-17.38 0-31.469 14.089-31.469 31.469v314.684c0 17.38 14.09 31.469 31.469 31.469h314.685c17.38 0 31.469-14.089 31.469-31.469V614.35c0-17.38-14.089-31.469-31.469-31.469z m-31.468 314.686H126.736V645.817h251.749v251.749zM913.45 582.88H598.764c-17.38 0-31.469 14.089-31.469 31.469v314.684c0 17.38 14.09 31.469 31.469 31.469H913.45c17.38 0 31.468-14.089 31.468-31.469V614.35c0-17.38-14.089-31.469-31.468-31.469zM881.98 897.566H630.233V645.817h251.75v251.749zM998.638 248.18L776.123 25.663c-12.29-12.29-32.214-12.29-44.504 0L509.103 248.18c-12.29 12.29-12.29 32.213 0 44.503l222.516 222.516c12.29 12.289 32.214 12.29 44.504 0l222.516-222.516c12.289-12.29 12.289-32.214-0.001-44.503zM753.87 448.444L575.858 270.432 753.87 92.419l178.014 178.013L753.87 448.444z" p-id="9991"></path></svg>
src/icons/svgo.yml
对比新文件
@@ -0,0 +1,22 @@
# replace default config
# multipass: true
# full: true
plugins:
  # - name
  #
  # or:
  # - name: false
  # - name: true
  #
  # or:
  # - name:
  #     param1: 1
  #     param2: 2
- removeAttrs:
    attrs:
      - 'fill'
      - 'fill-rule'
src/layout/components/AppMain.vue
对比新文件
@@ -0,0 +1,43 @@
<template>
  <section class="app-main">
    <transition name="fade-transform" mode="out-in">
      <router-view :key="key" />
    </transition>
  </section>
</template>
<script>
export default {
  name: 'AppMain',
  computed: {
    key() {
      return this.$route.path
    }
  }
}
</script>
<style scoped>
.app-main {
  /*50 = navbar  */
  max-height: calc(100vh - 100px);
  min-height: calc(100vh - 100px);
  /*min-height: 500px;*/
  width: 100%;
  position: relative;
  overflow-x: hidden;
  background-color: #f6f7f9;
}
.fixed-header+.app-main {
  padding-top: 50px;
}
</style>
<style lang="scss">
// fix css style bug in open el-dialog
.el-popup-parent--hidden {
  .fixed-header {
    padding-right: 15px;
  }
}
</style>
src/layout/components/Logo.vue
对比新文件
@@ -0,0 +1,223 @@
<template>
  <div class="sidebar-logo-container">
    <router-link class="sidebar-logo-link" to="/">
      <img :src="logo" class="sidebar-logo" />
      <h1 class="sidebar-title">企业信息查询系统{{ title }}</h1>
    </router-link>
    <div class="right-menu">
      <el-dropdown class="avatar-container" trigger="click">
        <!--          <div class="avatar-wrapper">-->
        <!--            <div style="line-height:30px;cursor: pointer;">{{ username }}</div>-->
        <!--            <i class="el-icon-caret-bottom" />-->
        <!--          </div>-->
        <span class="el-dropdown-link">
           {{username}}<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
        <el-dropdown-menu slot="dropdown" class="user-dropdown">
          <router-link to="/">
            <el-dropdown-item>首页</el-dropdown-item>
          </router-link>
          <router-link to="/userpermisson/user">
            <el-dropdown-item>用户管理</el-dropdown-item>
          </router-link>
          <el-dropdown-item divided>
            <span style="display:block;" @click="logout">退出</span>
          </el-dropdown-item>
          <el-dropdown-item>
            <span style="display:block;"  @click="handleEdit()">修改密码</span>
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      title="修改密码"
      :visible.sync="editDialogVisible"
      width="30%"
      :before-close="handleClose"
      :append-to-body='true'
    >
      <el-form ref="editform" :model="editFormData" :rules="editRules" label-width="80px">
        <el-form-item prop="account" label="账号">
          <el-input disabled v-model="editFormData.account" size="medium"></el-input>
        </el-form-item>
        <el-form-item prop="oldpassword" label="原密码">
          <el-input v-model="editFormData.oldpassword" size="medium" type="password"></el-input>
        </el-form-item>
        <el-form-item prop="newpassword" label="新密码">
          <el-input v-model="editFormData.newpassword" size="medium" type="password"></el-input>
        </el-form-item>
        <el-form-item prop="confirmnewpassword" label="确认密码">
          <el-input v-model="editFormData.confirmnewpassword" size="medium" type="password"></el-input>
        </el-form-item>
        <el-form-item align="center" label-width="0">
          <el-button type="primary" @click="onEditSubmit()">{{ $t('common.ok') }}</el-button>
          <el-button @click="editDialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
<script>
import { mount } from '@vue/test-utils';
import { getUser, getUserById1, updateUser } from '@/api/user';
import { rules } from '@/utils/validate';
import { deepClone } from '@/utils';
export default {
  name: 'SidebarLogo',
  props: {},
  data() {
    return {
      title: '企业信息查询系统',
      logo: require('@/assets/logo.png'),
      disabled: false,
      editDialogVisible: false,
      editFormData: {
        account: '',
        oldpassword: '',
        newpassword: '',
        confirmnewpassword: ''
      },
      editRules: {
        oldpassword: rules.empty,
        newpassword: rules.empty,
        confirmnewpassword: rules.empty
      },
      username: localStorage.getItem("name")
    };
  },
  mounted() {
    this.title = this.$store.state.park.name;
  },
  methods: {
    async logout() {
      await this.$store.dispatch('user/logout');
      this.$router.push(`/login?redirect=${this.$route.fullPath}`);
      window.location.reload();
    },
    async handleEdit() {
      this.editDialogVisible = true;
      const res = await getUserById1();
      this.editFormData.account = res.data.username;
    },
    async onEditSubmit() {
      // const res = await getUserById1();
      // if (md5(this.editFormData.oldpassword, 32) != res.data.password) {
      //     this.$message('原密码不正确,请确认', 'error');
      //     return;
      // }
      if (this.editFormData.newpassword != this.editFormData.confirmnewpassword) {
        this.$message('两次输入密码不一致,请确认', 'error');
        return;
      }
      this.$refs.editform.validate(async valid => {
        if (valid) {
          //const res1 = await findCompanyById();
          //res1.data.adminaccoutpassword = md5(this.editFormData.newpassword, 32);
          // this.editFormData.password= md5(this.editFormData.newpassword, 32)
          const res = await updateUser(this.editFormData);
          if (res.status == 200) {
            this.$message(this.$t('message.edit_success'), 'success');
          } else {
            this.$message(this.$t('message.edit_fail'), 'success');
          }
          this.editDialogVisible = false;
          this.editFormData = deepClone(EditFormData);
        }
      });
    },
    handleClose(done) {
      done();
    }
  }
};
</script>
<style lang="scss" scoped>
.sidebarLogoFade-enter-active {
  transition: opacity 1.5s;
}
.sidebarLogoFade-enter,
.sidebarLogoFade-leave-to {
  opacity: 0;
}
.sidebar-logo-container {
  position: fixed;
  z-index: 5;
  top:0;
  left: 0;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 70px;
  padding-left: 40px;
  line-height: 70px;
  background: linear-gradient(to right, #11abff, #3c50fc);
  text-align: left;
  .sidebar-logo-link {
    height: 100%;
    display: flex;
    align-items: center;
    .sidebar-logo {
      width: 32px;
      height: 32px;
      margin-right: 10px;
    }
    .sidebar-title {
      color: #fff;
      font-weight: 600;
      font-size: 18px;
      letter-spacing: 2px;
      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
    }
  }
  .right-menu {
    height: 100%;
    line-height: 70px;
    color: #fff;
    .el-dropdown-link{
      color: #fff;
      cursor: pointer;
    }
    .avatar-container {
      margin-right: 30px;
      .avatar-wrapper {
        margin-top: 10px;
        position: relative;
        .user-avatar {
          cursor: pointer;
          width: 40px;
          height: 40px;
          border-radius: 10px;
        }
        .el-icon-caret-bottom {
          cursor: pointer;
          position: absolute;
          right: -20px;
          top: 10px;
          font-size: 12px;
        }
      }
    }
  }
}
</style>
src/layout/components/index.js
对比新文件
@@ -0,0 +1 @@
export { default as AppMain } from './AppMain'
src/layout/index.vue
对比新文件
@@ -0,0 +1,94 @@
<template>
  <div :class="classObj" class="app-wrapper" style="overflow-y: hidden">
    <logo/>
    <div class="main-container" style="margin-top: 70px;">
      <app-main />
    </div>
  </div>
</template>
<script>
import { AppMain } from './components'
import ResizeMixin from './mixin/ResizeHandler'
import Logo from './components/Logo';
export default {
  name: 'Layout',
  components: {
    AppMain,
    Logo
  },
  mixins: [ResizeMixin],
  computed: {
    sidebar() {
      return this.$store.state.app.sidebar
    },
    device() {
      return this.$store.state.app.device
    },
    fixedHeader() {
      return this.$store.state.settings.fixedHeader
    },
    classObj() {
      return {
        hideSidebar: !this.sidebar.opened,
        openSidebar: this.sidebar.opened,
        withoutAnimation: this.sidebar.withoutAnimation,
        mobile: this.device === 'mobile'
      }
    }
  },
  methods: {
    // handleClickOutside() {
    //   this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
    // },
    isCollapse() {
      return !this.sidebar.opened;
    }
  }
}
</script>
<style lang="scss" scoped>
  @import "~@/styles/mixin.scss";
  @import "~@/styles/variables.scss";
  .app-wrapper {
    @include clearfix;
    position: relative;
    height: 100%;
    width: 100%;
    display: flex;
    flex-direction: column;
    &.mobile.openSidebar{
      position: fixed;
      top: 0;
    }
  }
  .drawer-bg {
    background: #000;
    opacity: 0.3;
    width: 100%;
    top: 0;
    height: 100%;
    position: absolute;
    z-index: 999;
  }
  .fixed-header {
    position: fixed;
    top: 0;
    right: 0;
    z-index: 9;
    width: calc(100% - #{$sideBarWidth});
    transition: width 0.28s;
  }
  .hideSidebar .fixed-header {
    width: calc(100% - 54px)
  }
  .mobile .fixed-header {
    width: 100%;
  }
</style>
src/layout/mixin/ResizeHandler.js
对比新文件
@@ -0,0 +1,45 @@
import store from '@/store'
const { body } = document
const WIDTH = 992 // refer to Bootstrap's responsive design
export default {
  watch: {
    $route(route) {
      if (this.device === 'mobile' && this.sidebar.opened) {
        store.dispatch('app/closeSideBar', { withoutAnimation: false })
      }
    }
  },
  beforeMount() {
    window.addEventListener('resize', this.$_resizeHandler)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.$_resizeHandler)
  },
  mounted() {
    const isMobile = this.$_isMobile()
    if (isMobile) {
      store.dispatch('app/toggleDevice', 'mobile')
      store.dispatch('app/closeSideBar', { withoutAnimation: true })
    }
  },
  methods: {
    // use $_ for mixins properties
    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
    $_isMobile() {
      const rect = body.getBoundingClientRect()
      return rect.width - 1 < WIDTH
    },
    $_resizeHandler() {
      if (!document.hidden) {
        const isMobile = this.$_isMobile()
        store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
        if (isMobile) {
          store.dispatch('app/closeSideBar', { withoutAnimation: true })
        }
      }
    }
  }
}
src/main.js
对比新文件
@@ -0,0 +1,65 @@
import Vue from 'vue';
import 'normalize.css/normalize.css'; // A modern alternative to CSS resets
import ElementUI from 'element-ui';
import { Message } from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// import locale from 'element-ui/lib/locale/lang/en'; // lang i18n
import i18n from './i18n/i18n'; // lang i18n
import '@/styles/index.scss'; // global css
import App from './App';
import store from './store';
import router from './router';
import '@/icons'; // icon
import '@/permission'; // permission control
// 注册滚动条加载触发事件v-loadmore绑定
import '@/directives';
import '@/utils/pxtorem'
import { stopReClick } from './utils/stopReClick'
Vue.use(stopReClick)
/**
 * If you don't want to use mock-server
 * you want to use MockJs for mock api
 * you can execute: mockXHR()
 *
 * Currently MockJs will be used in the production environment,
 * please remove it before going online! ! !
 */
import { mockXHR } from '../mock';
if (process.env.NODE_ENV === 'production') {
  mockXHR();
}
// set ElementUI lang to EN
// Vue.use(ElementUI, { locale });
Vue.use(ElementUI);
Vue.prototype.$message = (message, type, duration) => {
  return Message({
    message,
    type,
    duration: duration || 2000
  });
};
// 弹窗兼容行为
import { deepClone } from './utils/index';
window.deepClone = deepClone;
Vue.config.productionTip = false;
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
});
src/permission.js
对比新文件
@@ -0,0 +1,89 @@
import router, { resetRouter } from './router';
import store from './store';
import { Message } from 'element-ui';
import NProgress from 'nprogress'; // progress bar
import 'nprogress/nprogress.css'; // progress bar style
import { getToken, setToken } from '@/utils/auth'; // get token from cookie
import getPageTitle from '@/utils/get-page-title';
import { getConfigData } from './api/serverconfig';
async function setConfigDataToStorage() {
  const configdata = localStorage.getItem('configdata');
  if (!configdata) {
    const response = await getConfigData();
    if (response && response.result) {
      const list = response.data.list;
      localStorage.setItem('configdata', JSON.stringify(list));
    }
  }
}
NProgress.configure({ showSpinner: false }); // NProgress Configuration
const whiteList = ['/login','/news',]; // no redirect whitelist
router.beforeEach(async (to, from, next) => {
  // start progress bar
  NProgress.start();
  // set page title
  document.title = getPageTitle(to.meta.title);
  // determine whether the user has logged in
  const hasToken = getToken();
  if (hasToken) {
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ path: '/' });
      NProgress.done();
    } else {
      const hasGetUserInfo = store.getters.name;
      if (hasGetUserInfo) {
        // get config data
        await setConfigDataToStorage();
        next();
      } else {
        try {
          resetRouter();
          // get user online info
          const { permissionId } = await store.dispatch('user/getOnlineInfo');
          const accessRoutes = await store.dispatch('permission/generateRoutes', permissionId);
          router.addRoutes(accessRoutes, { replace: true });
          // get config data
          await setConfigDataToStorage();
          next({ ...to, replace: true });
        } catch (error) {
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken');
          Message.error(error || 'Has Error');
          next(`/login?redirect=${to.path}`);
          NProgress.done();
        }
      }
    }
  } else {
    /* has no token*/
    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next();
    } else if (to.query && to.query.from === 'tohome') {
      setToken('20201538nphycw');
      next('/');
    } else {
      // other pages that do not have permission to access are redirected to the login page.
      next(`/login?redirect=${to.path}`);
      NProgress.done();
    }
  }
});
router.afterEach(() => {
  // finish progress bar
  NProgress.done();
});
src/router/constroutes.js
对比新文件
@@ -0,0 +1,107 @@
/* Layout */
import Layout from '@/layout';
export default [
  // {
  //   path: '/login',
  //   component: () => import('@/views/login/index'),
  //   hidden: true
  // },
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    id: 2,
    parentId: 0,
    path: '/',
    component: Layout,
    redirect: '/management',
    name: '企业管理',
    meta: { title: '企业管理', icon: '首页' },
    children: [
      {
        id: 1,
        parentId: 0,
        path: 'management',
        name: '企业管理',
        component: () => import('@/views/management/index'),
        meta: { title: '企业管理', icon: '' }
      },
      {
        id: 10,
        parentId: 0,
        path: 'managementDetails',
        name: '企业管理详情',
        hidden: true,
        component: () => import('@/views/managementDetails/index'),
        meta: { title: '企业管理详情', icon: '' }
      }
    ]
  },
  {
    id: 85,
    parentId: 0,
    component: Layout,
    path: '/userpermisson',
    name: '权限管理',
    meta: { title: '权限管理', icon: '权限管理' },
    children: [
      {
        id: 86,
        parentId: 85,
        path: 'user',
        name: '用户管理',
        component: () => import('@/views/user/index'),
        meta: { title: '用户管理', icon: '' }
      },
  //     {
  //       id: 87,
  //       parentId: 85,
  //       path: 'role',
  //       name: '角色管理',
  //       component: () => import('@/views/role/index'),
  //       meta: { title: '角色管理', icon: '' }
  //     },
  //
  //     {
  //       id: 88,
  //       parentId: 85,
  //       path: 'permisson',
  //       name: '权限点管理',
  //       component: () => import('@/views/permisson/index'),
  //       meta: { title: '权限点管理', icon: '' },
  //       hidden: true
  //     }
    ]
  },
//   {
//     id: 89,
//     parentId: 0,
//     path: '/datamanage',
//     component: Layout,
//     name: '数据管理',
//     meta: { title: '数据管理', icon: '数据管理' },
//     children: [
//       {
//         id: 90,
//         parentId: 89,
//         path: 'datagroup',
//         name: '数据组',
//         component: () => import('@/views/datagroup/index'),
//         meta: { title: '数据组', icon: '' }
//       },
//       {
//         id: 91,
//         parentId: 89,
//         path: 'datadictionary',
//         name: '数据字典',
//         component: () => import('@/views/datadictionary/index'),
//         meta: { title: '数据字典', icon: '' }
//       }
//     ]
// },
];
src/router/index.js
对比新文件
@@ -0,0 +1,43 @@
import Vue from 'vue';
import Router from 'vue-router';
import ConstantRoutes from './constroutes';
Vue.use(Router);
/* Layout */
// import Layout from '@/layout';
/**
 * Note: sub-menu only appear when route children.length >= 1
 * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
 *
 * hidden: true                   if set true, item will not show in the sidebar(default is false)
 * alwaysShow: true               if set true, will always show the root menu
 *                                if not set alwaysShow, when item has more than one children route,
 *                                it will becomes nested mode, otherwise not show the root menu
 * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
 * name:'router-name'             the name is used by <keep-alive> (must set!!!)
 * meta : {
    roles: ['admin','editor']    control the page roles (you can set multiple roles)
    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
    icon: 'svg-name'             the icon show in the sidebar
    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
  }
 */
const createRouter = () =>
  new Router({
    // mode: 'history', // require service support
    scrollBehavior: () => ({ y: 0 }),
    routes: ConstantRoutes
  });
const router = createRouter();
// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter();
  router.matcher = newRouter.matcher; // reset router
}
export default router;
src/settings.js
对比新文件
@@ -0,0 +1,15 @@
module.exports = {
  title: "企业信息查询系统",
  /**
   * @type {boolean} true | false
   * @description Whether fix the header
   */
  fixedHeader: false,
  /**
   * @type {boolean} true | false
   * @description Whether show the logo in sidebar
   */
  sidebarLogo: true
};
src/store/getters.js
对比新文件
@@ -0,0 +1,11 @@
const getters = {
  sidebar: state => state.app.sidebar,
  device: state => state.app.device,
  token: state => state.user.token,
  avatar: state => state.user.avatar,
  name: state => state.user.name,
  username: state => state.user.username,
  permissionId: state => state.user.permissionId,
  permission_routes: state => state.permission.addRoutes
};
export default getters;
src/store/index.js
对比新文件
@@ -0,0 +1,23 @@
import Vue from 'vue';
import Vuex from 'vuex';
import getters from './getters';
import app from './modules/app';
import settings from './modules/settings';
import user from './modules/user';
import permission from './modules/permission';
import park from './modules/park';
Vue.use(Vuex);
const store = new Vuex.Store({
  modules: {
    app,
    settings,
    user,
    permission,
    park
  },
  getters
});
export default store;
src/store/modules/app.js
对比新文件
@@ -0,0 +1,48 @@
import Cookies from 'js-cookie'
const state = {
  sidebar: {
    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
    withoutAnimation: false
  },
  device: 'desktop'
}
const mutations = {
  TOGGLE_SIDEBAR: state => {
    state.sidebar.opened = !state.sidebar.opened
    state.sidebar.withoutAnimation = false
    if (state.sidebar.opened) {
      Cookies.set('sidebarStatus', 1)
    } else {
      Cookies.set('sidebarStatus', 0)
    }
  },
  CLOSE_SIDEBAR: (state, withoutAnimation) => {
    Cookies.set('sidebarStatus', 0)
    state.sidebar.opened = false
    state.sidebar.withoutAnimation = withoutAnimation
  },
  TOGGLE_DEVICE: (state, device) => {
    state.device = device
  }
}
const actions = {
  toggleSideBar({ commit }) {
    commit('TOGGLE_SIDEBAR')
  },
  closeSideBar({ commit }, { withoutAnimation }) {
    commit('CLOSE_SIDEBAR', withoutAnimation)
  },
  toggleDevice({ commit }, device) {
    commit('TOGGLE_DEVICE', device)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
src/store/modules/park.js
对比新文件
@@ -0,0 +1,25 @@
const state = {
  id: '',
  name: ''
};
const mutations = {
  SET_ID: (state, id) => {
    state.id = id;
  },
  SET_NAME: (state, name) => {
    state.name = name;
  }
};
const actions = {
};
export default {
  namespaced: true,
  state,
  mutations,
  actions
};
src/store/modules/permission.js
对比新文件
@@ -0,0 +1,72 @@
import { asyncRoutes, constantRoutes } from '@/router';
import ConstantRoutes from '@/router/constroutes';
import { deepClone } from '@/utils/index';
import store from '..';
/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role));
  } else {
    return true;
  }
}
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterRoutes(routers, permissionIds) {
  const result = deepClone(routers);
  for (let router of result) {
    if (!router.id) {
      continue;
    }
    if (permissionIds.includes(router.id)) {
      if (router.hasOwnProperty('children')) {
        router.children = filterRoutes(router.children, permissionIds);
      }
    } else {
      router.hidden = true;
    }
  }
  return result;
}
const state = {
  routes: [],
  addRoutes: []
};
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes;
    state.routes = ConstantRoutes.concat(routes);
  }
};
const actions = {
  generateRoutes({ commit }, permissionId) {
    return new Promise(resolve => {
      const isAdmin = store.getters.username === 'admin' || store.getters.username === 'superadmin';
      const accessedRoutes = isAdmin ? ConstantRoutes : filterRoutes(ConstantRoutes, permissionId);
      commit('SET_ROUTES', accessedRoutes);
      resolve(accessedRoutes);
    });
  }
};
export default {
  namespaced: true,
  state,
  mutations,
  actions
};
src/store/modules/settings.js
对比新文件
@@ -0,0 +1,31 @@
import defaultSettings from '@/settings'
const { showSettings, fixedHeader, sidebarLogo } = defaultSettings
const state = {
  showSettings: showSettings,
  fixedHeader: fixedHeader,
  sidebarLogo: sidebarLogo
}
const mutations = {
  CHANGE_SETTING: (state, { key, value }) => {
    if (state.hasOwnProperty(key)) {
      state[key] = value
    }
  }
}
const actions = {
  changeSetting({ commit }, data) {
    commit('CHANGE_SETTING', data)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
src/store/modules/user.js
对比新文件
@@ -0,0 +1,149 @@
import { login, elogin, logout, getInfo, getOnline } from '@/api/user';
import { getToken, setToken, removeToken, setEToken, removeSsoToken } from '@/utils/auth';
import { resetRouter } from '@/router';
const state = {
  token: getToken(),
  name: '',
  username: '',
  permissionId: [],
  avatar: '',
  id: 0
};
const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  SET_NAME: (state, name) => {
    state.name = name;
  },
  SET_USERNAME: (state, username) => {
    state.username = username;
  },
  SET_PERMISSIONID: (state, permissionId) => {
    state.permissionId = permissionId;
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar;
  },
  SET_ID: (state, id) => {
    state.id = id;
  }
};
const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo;
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password: password })
        .then(response => {
          commit('SET_TOKEN', response.token);
          setToken(response.token);
          resolve(response);
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  elogin({ commit }, userInfo) {
    const { username, password } = userInfo;
    return new Promise((resolve, reject) => {
      elogin({ username: username.trim(), password: password, type: 1 })
        .then(response => {
          setEToken(response.token);
          resolve(response);
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token)
        .then(response => {
          const { data } = response;
          if (!data) {
            reject('Verification failed, please Login again.');
          }
          const { name, avatar } = data;
          commit('SET_NAME', name);
          commit('SET_AVATAR', avatar);
          resolve(data);
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  // get online user info
  getOnlineInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getOnline()
        .then(response => {
          const { data } = response;
          if (!data) {
            reject('Verification failed, please Login again.');
          }
          const { name, username, permissionId, id } = data;
          commit('SET_NAME', name);
          commit('SET_USERNAME', username);
          commit('SET_PERMISSIONID', permissionId);
          commit('SET_ID', id);
          resetRouter();
          resolve(data);
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token)
        .then(() => {
          commit('SET_TOKEN', '');
          // commit('SET_ROUTES', '');
          // commit('SET_USERNAME', '');
          removeToken();
          removeSsoToken();
          resetRouter();
          resolve();
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '');
      removeToken();
      resolve();
    });
  }
};
export default {
  namespaced: true,
  state,
  mutations,
  actions
};
src/styles/element-ui.scss
对比新文件
@@ -0,0 +1,49 @@
// cover some element-ui styles
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
  font-weight: 400 !important;
}
.el-upload {
  input[type="file"] {
    display: none !important;
  }
}
.el-upload__input {
  display: none;
}
// to fixed https://github.com/ElemeFE/element/issues/2461
.el-dialog {
  transform: none;
  left: 0;
  position: relative;
  margin: 0 auto;
}
// refine element ui upload
.upload-container {
  .el-upload {
    width: 100%;
    .el-upload-dragger {
      width: 100%;
      height: 200px;
    }
  }
}
// dropdown
.el-dropdown-menu {
  a {
    display: block
  }
}
// to fix el-date-picker css style
.el-range-separator {
  box-sizing: content-box;
}
src/styles/index.scss
对比新文件
@@ -0,0 +1,186 @@
@import './variables.scss';
@import './mixin.scss';
@import './transition.scss';
@import './element-ui.scss';
@import './sidebar.scss';
body {
  height: 100%;
  -moz-osx-font-smoothing: grayscale;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
}
label {
  font-weight: 700;
}
html {
  height: 100%;
  box-sizing: border-box;
}
#app {
  height: 100%;
}
*,
*:before,
*:after {
  box-sizing: inherit;
}
a:focus,
a:active {
  outline: none;
}
a,
a:focus,
a:hover {
  cursor: pointer;
  color: inherit;
  text-decoration: none;
}
div:focus {
  outline: none;
}
.clearfix {
  &:after {
    visibility: hidden;
    display: block;
    font-size: 0;
    content: ' ';
    clear: both;
    height: 0;
  }
}
// main-container global css
.app-container {
  padding: 20px;
}
.filter-container {
  padding-bottom: 15px;
}
.el-form-item {
  margin-bottom: 15px;
}
.divider-title {
  color: #409eff;
  font-size: 18px;
  font-weight: 600;
}
.dialog-title {
  font-weight: 600;
}
.el-form-item__error {
  padding-top: 1px;
}
.el-table th {
  padding: 8px 0;
}
.el-table td {
  padding: 6px 0;
}
.el-button--danger {
  //margin-left: 0 !important;
}
.location-icon-container {
  margin: 5px 0 0 20px;
  cursor: pointer;
  .location-icon {
    font-size: 30px;
    color: #1296db;
  }
}
.upload-btn {
  position: absolute;
  top: 10px;
  right: -40px;
}
.sidebar-logo-container {
  h1 {
    text-align: left;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
}
.el-input.is-disabled .el-input__inner {
  background-color: white;
  cursor: default;
}
.el-range-editor.is-disabled {
  background-color: white;
  cursor: default;
}
.el-range-editor.is-disabled input {
  background-color: white;
  cursor: default;
}
.el-select .el-input.is-disabled .el-input__inner {
  cursor: default;
}
.el-textarea.is-disabled .el-textarea__inner {
  background-color: white;
  cursor: default;
}
.el-checkbox__input.is-disabled .el-checkbox__inner {
  background-color: white;
  cursor: default;
}
.el-checkbox__input.is-disabled + span.el-checkbox__label {
  cursor: default;
}
div.cell i.el-icon.el-icon-arrow-right:before {
  content: '详情';
  color: #66b1ff;
}
.el-table__expand-icon--expanded {
  transform: none;
}
/* hover hack */
#app .sidebar-container .submenu-title-noDropdown:hover,
#app .sidebar-container .nest-menu .el-submenu > .el-submenu__title:hover,
#app .sidebar-container .el-submenu .el-menu-item:hover {
  // background-color: #0167b2 !important;
  text-decoration: underline;
}
#app .el-menu .nest-menu .el-submenu .el-menu .nest-menu .el-menu-item {
  background-color: #f2f2f2 !important;
}
#app .el-menu .nest-menu .el-submenu .el-menu .nest-menu .el-menu-item:hover {
  // background-color: #0167b2 !important;
  text-decoration: underline;
}
#app .el-menu .nest-menu .el-submenu .el-menu .nest-menu .el-menu-item {
  list-style: inside;
  background-color: #f2f2f2 !important;
  color: #315f98 !important;
}
src/styles/mixin.scss
对比新文件
@@ -0,0 +1,28 @@
@mixin clearfix {
  &:after {
    content: "";
    display: table;
    clear: both;
  }
}
@mixin scrollBar {
  &::-webkit-scrollbar-track-piece {
    background: #d3dce6;
  }
  &::-webkit-scrollbar {
    width: 6px;
  }
  &::-webkit-scrollbar-thumb {
    background: #99a9bf;
    border-radius: 20px;
  }
}
@mixin relative {
  position: relative;
  width: 100%;
  height: 100%;
}
src/styles/sidebar.scss
对比新文件
@@ -0,0 +1,203 @@
#app {
  .main-container {
    min-height: 100%;
    transition: margin-left 0.28s;
    margin-left: $sideBarWidth;
    position: relative;
  }
  .sidebar-container {
    transition: width 0.28s;
    width: $sideBarWidth !important;
    background-color: $menuBg;
    height: 100%;
    position: fixed;
    font-size: 0px;
    top: 0;
    bottom: 0;
    left: 0;
    z-index: 1001;
    overflow: hidden;
    // reset element-ui css
    .horizontal-collapse-transition {
      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
    }
    .scrollbar-wrapper {
      overflow-x: hidden !important;
    }
    .el-scrollbar__bar.is-vertical {
      right: 0px;
    }
    .el-scrollbar {
      height: 100%;
    }
    &.has-logo {
      .el-scrollbar {
        height: calc(100% - 50px);
      }
    }
    .is-horizontal {
      display: none;
    }
    .svg-icon {
      margin-right: 16px;
    }
    .el-menu {
      border: none;
      height: 100%;
      width: 100% !important;
    }
    // menu hover
    .submenu-title-noDropdown,
    .el-submenu__title {
      &:hover {
        background-color: $menuHover !important;
      }
    }
    .is-active > .el-submenu__title {
      color: $subMenuActiveText !important;
    }
    & .nest-menu .el-submenu > .el-submenu__title,
    & .el-submenu .el-menu-item {
      list-style: inside;
      min-width: $sideBarWidth !important;
      background-color: $subMenuBg !important;
      &:hover {
        background-color: $subMenuHover !important;
      }
    }
  }
  .hideSidebar {
    .sidebar-container {
      width: 0px !important;
    }
    .main-container {
      margin-left: 0px;
    }
    .submenu-title-noDropdown {
      padding: 0 !important;
      position: relative;
      .el-tooltip {
        padding: 0 !important;
        .svg-icon {
          margin-left: 20px;
        }
      }
    }
    .el-submenu {
      overflow: hidden;
      & > .el-submenu__title {
        padding: 0 !important;
        .svg-icon {
          margin-left: 20px;
        }
        .el-submenu__icon-arrow {
          display: none;
        }
      }
    }
    .el-menu--collapse {
      .el-submenu {
        & > .el-submenu__title {
          & > span {
            height: 0;
            width: 0;
            overflow: hidden;
            visibility: hidden;
            display: inline-block;
          }
        }
      }
    }
  }
  .el-menu--collapse .el-menu .el-submenu {
    min-width: $sideBarWidth !important;
  }
  // mobile responsive
  .mobile {
    .main-container {
      margin-left: 0px;
    }
    .sidebar-container {
      transition: transform 0.28s;
      width: $sideBarWidth !important;
    }
    &.hideSidebar {
      .sidebar-container {
        pointer-events: none;
        transition-duration: 0.3s;
        transform: translate3d(-$sideBarWidth, 0, 0);
      }
    }
  }
  .withoutAnimation {
    .main-container,
    .sidebar-container {
      transition: none;
    }
  }
}
// when menu collapsed
.el-menu--vertical {
  & > .el-menu {
    .svg-icon {
      margin-right: 16px;
    }
  }
  .nest-menu .el-submenu > .el-submenu__title,
  .el-menu-item {
    list-style: inside;
    &:hover {
      // you can use $subMenuHover
      background-color: $menuHover !important;
    }
  }
  // the scroll bar appears when the subMenu is too long
  > .el-menu--popup {
    max-height: 100vh;
    overflow-y: auto;
    &::-webkit-scrollbar-track-piece {
      background: #d3dce6;
    }
    &::-webkit-scrollbar {
      width: 6px;
    }
    &::-webkit-scrollbar-thumb {
      background: #99a9bf;
      border-radius: 20px;
    }
  }
}
src/styles/transition.scss
对比新文件
@@ -0,0 +1,48 @@
// global transition css
/* fade */
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.28s;
}
.fade-enter,
.fade-leave-active {
  opacity: 0;
}
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {
  transition: all .5s;
}
.fade-transform-enter {
  opacity: 0;
  transform: translateX(-30px);
}
.fade-transform-leave-to {
  opacity: 0;
  transform: translateX(30px);
}
/* breadcrumb transition */
.breadcrumb-enter-active,
.breadcrumb-leave-active {
  transition: all .5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
  opacity: 0;
  transform: translateX(20px);
}
.breadcrumb-move {
  transition: all .5s;
}
.breadcrumb-leave-active {
  position: absolute;
}
src/styles/variables.scss
对比新文件
@@ -0,0 +1,25 @@
// sidebar
$menuText: #315f98;
$menuActiveText: #315f98;
$subMenuActiveText: #315f98; //https://github.com/ElemeFE/element/issues/12951
$menuBg: #f2f2f2;
$menuHover: #f2f2f2;
$subMenuBg: #f2f2f2;
$subMenuHover: #f2f2f2;
$sideBarWidth: 0px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
  menuText: $menuText;
  menuActiveText: $menuActiveText;
  subMenuActiveText: $subMenuActiveText;
  menuBg: $menuBg;
  menuHover: $menuHover;
  subMenuBg: $subMenuBg;
  subMenuHover: $subMenuHover;
  sideBarWidth: $sideBarWidth;
}
src/utils/auth.js
对比新文件
@@ -0,0 +1,33 @@
import Cookies from 'js-cookie';
const TokenKey = 'wisdom_admin_token';
const ssoTokenKey = 'sso_token';
const eTokenKey = 'wisdom_eadmin_token';
export function getToken() {
  return Cookies.get(TokenKey);
}
export function getSsoToken() {
  return Cookies.get(ssoTokenKey);
}
export function setToken(token) {
  return Cookies.set(TokenKey, token);
}
export function setSsoToken(token) {
  return Cookies.set(ssoTokenKey, token);
}
export function setEToken(token) {
  return Cookies.set(eTokenKey, token);
}
export function removeToken() {
  return Cookies.remove(TokenKey);
}
export function removeSsoToken() {
  return Cookies.remove(ssoTokenKey);
}
src/utils/get-page-title.js
对比新文件
@@ -0,0 +1,10 @@
import defaultSettings from '@/settings'
const title = defaultSettings.title || 'Vue Admin Template'
export default function getPageTitle(pageTitle) {
  if (pageTitle) {
    return `${pageTitle} - ${title}`
  }
  return `${title}`
}
src/utils/index.js
对比新文件
@@ -0,0 +1,158 @@
/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    return value.toString().padStart(2, '0');
  });
  return time_str;
}
/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000;
  } else {
    time = +time;
  }
  const d = new Date(time);
  const now = Date.now();
  const diff = (now - d) / 1000;
  if (diff < 30) {
    return '刚刚';
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前';
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前';
  } else if (diff < 3600 * 24 * 2) {
    return '1天前';
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分';
  }
}
/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = url.split('?')[1];
  if (!search) {
    return {};
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
  );
}
/**
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 * @param {Object} source
 * @returns {Object}
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone');
  }
  const targetObj = source.constructor === Array ? [] : {};
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys]);
    } else {
      targetObj[keys] = source[keys];
    }
  });
  return targetObj;
}
export function formatDateTime(date, fmt = 'yyyy-MM-dd HH:mm:ss') {
  date = date ? new Date(date) : new Date();
  let ret;
  const opt = {
    'y+': date.getFullYear().toString(), // 年
    'M+': (date.getMonth() + 1).toString(), // 月
    'd+': date.getDate().toString(), // 日
    'H+': date.getHours().toString(), // 时
    'm+': date.getMinutes().toString(), // 分
    's+': date.getSeconds().toString() // 秒
    // 有其他格式化字符需求可以继续添加,必须转化成字符串
  };
  for (let k in opt) {
    ret = new RegExp('(' + k + ')').exec(fmt);
    if (ret) {
      fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'));
    }
  }
  return fmt;
}
export function getGroupData(groupcode) {
  // mock to delete
  const contantData = [
    { id: '1', label: 'type 1' },
    { id: '2', label: 'type 2' },
    { id: '3', label: 'type 3' }
  ];
  if (!groupcode) {
    return contantData;
  }
  const configData = JSON.parse(localStorage.getItem('configdata'));
  const groupData = configData.filter(item => item.groupcode === groupcode);
  const result = groupData.map(i => {
    return { id: i.id, label: i.value };
  });
  return result.length ? result : contantData;
}
src/utils/pxtorem.js
对比新文件
@@ -0,0 +1,16 @@
// rem等比适配配置文件
// 基准大小
const baseSize = 16
// 设置 rem 函数
function setRem () {
  // 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。
  const scale = document.documentElement.clientWidth / 1920
  // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
  document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
  setRem()
}
src/utils/request.js
对比新文件
@@ -0,0 +1,137 @@
import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
import store from '@/store';
import { getToken,removeSsoToken } from '@/utils/auth';
// create an axios instance
const service = axios.create({
  baseURL: '/api/', // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
});
// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['X-Token'] = getToken();
      // config.headers['Set-Cookie'] = getToken();
    }
    return config;
  },
  error => {
    // do something with request error
    console.log(error); // for debug
    return Promise.reject(error);
  }
);
// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */
  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data;
    if (!res) {
      Message({
        message: '网络出错,请稍后重试',
        type: 'error',
        duration: 5000
      });
    }
    if (res && !res.false && res.errorCode === 'login_session_expire_faiture_001') {
      // to re-login
      Message({
        message: '登录状态已失效,请重新登录',
        type: 'error',
        duration: 5000
      });
      store.dispatch('user/resetToken').then(() => {
        //location.reload();
      });
      // to re-login
      // MessageBox.confirm(res.errorMsg, '确认登录', {
      //   confirmButtonText: '重新登录',
      //   type: 'warning',
      //   showClose: false,
      //   showCancelButton: false,
      //   closeOnClickModal: false
      // }).then(() => {
      //   store.dispatch('user/resetToken').then(() => {
      //     location.reload();
      //   });
      // });
      return null;
    }
    return typeof res === 'object'
      ? res
      : {
          result: true,
          token: res
        };
    // if the custom code is not 20000, it is judged as an error.
    // if (res.code !== 20000) {
    //   Message({
    //     message: res.message || 'Error',
    //     type: 'error',
    //     duration: 5 * 1000
    //   })
    //   // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
    //   if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
    //     // to re-login
    //     MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
    //       confirmButtonText: 'Re-Login',
    //       cancelButtonText: 'Cancel',
    //       type: 'warning'
    //     }).then(() => {
    //       store.dispatch('user/resetToken').then(() => {
    //         location.reload()
    //       })
    //     })
    //   }
    //   return Promise.reject(new Error(res.message || 'Error'))
    // } else {
    //   return res
    // }
  },
  error => {
    const statusCode = error.response.status;
    if(statusCode === 401){
        removeSsoToken();
        console.log('response is' + error.response);
        const locationUrl = error.response.headers['locationUrl'];
        console.log('location is ' + locationUrl);
        const currentUrl = window.location.href;
        window.location.href = locationUrl + '?returl=' + encodeURIComponent(currentUrl);
    }
    console.log('err' + error); // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);
export default service;
src/utils/requestUpload.js
对比新文件
@@ -0,0 +1,138 @@
import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
import store from '@/store';
import { getToken,removeSsoToken } from '@/utils/auth';
// create an axios instance
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
const service = axios.create({
  baseURL: '/api/', // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
});
// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['X-Token'] = getToken();
      config.headers['Set-Cookie'] = getToken();
    }
    return config;
  },
  error => {
    // do something with request error
    console.log(error); // for debug
    return Promise.reject(error);
  }
);
// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */
  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data;
    if (!res) {
      Message({
        message: '网络出错,请稍后重试',
        type: 'error',
        duration: 5000
      });
    }
    if (res && !res.false && res.errorCode === 'login_session_expire_faiture_001') {
      // to re-login
      Message({
        message: '登录状态已失效,请重新登录',
        type: 'error',
        duration: 5000
      });
      store.dispatch('user/resetToken').then(() => {
        location.reload();
      });
      // to re-login
      // MessageBox.confirm(res.errorMsg, '确认登录', {
      //   confirmButtonText: '重新登录',
      //   type: 'warning',
      //   showClose: false,
      //   showCancelButton: false,
      //   closeOnClickModal: false
      // }).then(() => {
      //   store.dispatch('user/resetToken').then(() => {
      //     location.reload();
      //   });
      // });
      return null;
    }
    return typeof res === 'object'
      ? res
      : {
          result: true,
          token: res
        };
    // if the custom code is not 20000, it is judged as an error.
    // if (res.code !== 20000) {
    //   Message({
    //     message: res.message || 'Error',
    //     type: 'error',
    //     duration: 5 * 1000
    //   })
    //   // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
    //   if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
    //     // to re-login
    //     MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
    //       confirmButtonText: 'Re-Login',
    //       cancelButtonText: 'Cancel',
    //       type: 'warning'
    //     }).then(() => {
    //       store.dispatch('user/resetToken').then(() => {
    //         location.reload()
    //       })
    //     })
    //   }
    //   return Promise.reject(new Error(res.message || 'Error'))
    // } else {
    //   return res
    // }
  },
  error => {
    const statusCode = error.response.status;
    if(statusCode === 401){
        removeSsoToken();
        console.log('response is' + error.response);
        const locationUrl = error.response.headers['locationUrl'];
        console.log('location is ' + locationUrl);
        const currentUrl = window.location.href;
        window.location.href = locationUrl + '?returl=' + encodeURIComponent(currentUrl);
    }
    console.log('err' + error); // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);
export default service;
src/utils/scroll-to.js
对比新文件
@@ -0,0 +1,58 @@
Math.easeInOutQuad = function(t, b, c, d) {
  t /= d / 2
  if (t < 1) {
    return c / 2 * t * t + b
  }
  t--
  return -c / 2 * (t * (t - 2) - 1) + b
}
// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
var requestAnimFrame = (function() {
  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
})()
/**
 * Because it's so fucking difficult to detect the scrolling element, just move them all
 * @param {number} amount
 */
function move(amount) {
  document.documentElement.scrollTop = amount
  document.body.parentNode.scrollTop = amount
  document.body.scrollTop = amount
}
function position() {
  return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
}
/**
 * @param {number} to
 * @param {number} duration
 * @param {Function} callback
 */
export function scrollTo(to, duration, callback) {
  const start = position()
  const change = to - start
  const increment = 20
  let currentTime = 0
  duration = (typeof (duration) === 'undefined') ? 500 : duration
  var animateScroll = function() {
    // increment the time
    currentTime += increment
    // find the value with the quadratic in-out easing function
    var val = Math.easeInOutQuad(currentTime, start, change, duration)
    // move the document.body
    move(val)
    // do the animation unless its over
    if (currentTime < duration) {
      requestAnimFrame(animateScroll)
    } else {
      if (callback && typeof (callback) === 'function') {
        // the animation is done so lets callback
        callback()
      }
    }
  }
  animateScroll()
}
src/utils/stopReClick.js
对比新文件
@@ -0,0 +1,24 @@
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// import App from './App.vue';
Vue.use(ElementUI);
// 在vue上挂载一个指量 stopReClick
// vue防止按钮重复点击
const stopReClick = Vue.directive('stopReClick', {
    inserted: function (el, binding) {
        el.addEventListener('click', () => {
            if (!el.disabled) {
                el.disabled = true
                el.style.cursor = 'not-allowed'
                setTimeout(() => {
                    el.style.cursor = 'pointer'
                    el.disabled = false
                    //设置时间
                }, binding.value || 3000)
            }
        })
    }
})
export { stopReClick }
src/utils/validate.js
对比新文件
@@ -0,0 +1,37 @@
/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path);
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  return str && str.length;
}
export const rules = {
  empty: { required: true, message: '内容不能为空', trigger: 'blur' },
  number: { pattern: /^\d+$/, message: '只能输入数字', trigger: 'blur' },
  numberdecimal: { pattern: /^(0|([1-9]\d*))(\.\d+)?$/g, message: '只能输入数字或小数', trigger: 'blur' },
  fax: { pattern: /^(\d{3,4}-)?\d{7,8}$/, message: '传真格式不正确', trigger: 'blur' },
  mobile: {
    pattern: /^(13[0-9]{1}|14[5|7|9]{1}|15[0-3|5-9]{1}|166|17[0-3|5-8]{1}|18[0-9]{1}|19[8-9]{1}){1}\d{8}$/,
    message: '手机号码格式不正确',
    trigger: 'blur'
  },
  email: {
    pattern: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
    message: '邮箱地址格式不正确',
    trigger: 'blur'
  },
  phone: {
    pattern: /(^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$)|(^\d+$)/,
    message: '电话格式不正确',
    trigger: 'blur'
  }
};
src/views/404.vue
对比新文件
@@ -0,0 +1,228 @@
<template>
  <div class="wscn-http404-container">
    <div class="wscn-http404">
      <div class="pic-404">
        <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404">
        <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404">
        <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404">
        <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404">
      </div>
      <div class="bullshit">
        <div class="bullshit__oops">OOPS!</div>
        <div class="bullshit__info">All rights reserved
          <a style="color:#20a0ff" href="https://wallstreetcn.com" target="_blank">wallstreetcn</a>
        </div>
        <div class="bullshit__headline">{{ message }}</div>
        <div class="bullshit__info">Please check that the URL you entered is correct, or click the button below to return to the homepage.</div>
        <a href="" class="bullshit__return-home">Back to home</a>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'Page404',
  computed: {
    message() {
      return 'The webmaster said that you can not enter this page...'
    }
  }
}
</script>
<style lang="scss" scoped>
.wscn-http404-container{
  transform: translate(-50%,-50%);
  position: absolute;
  top: 40%;
  left: 50%;
}
.wscn-http404 {
  position: relative;
  width: 1200px;
  padding: 0 50px;
  overflow: hidden;
  .pic-404 {
    position: relative;
    float: left;
    width: 600px;
    overflow: hidden;
    &__parent {
      width: 100%;
    }
    &__child {
      position: absolute;
      &.left {
        width: 80px;
        top: 17px;
        left: 220px;
        opacity: 0;
        animation-name: cloudLeft;
        animation-duration: 2s;
        animation-timing-function: linear;
        animation-fill-mode: forwards;
        animation-delay: 1s;
      }
      &.mid {
        width: 46px;
        top: 10px;
        left: 420px;
        opacity: 0;
        animation-name: cloudMid;
        animation-duration: 2s;
        animation-timing-function: linear;
        animation-fill-mode: forwards;
        animation-delay: 1.2s;
      }
      &.right {
        width: 62px;
        top: 100px;
        left: 500px;
        opacity: 0;
        animation-name: cloudRight;
        animation-duration: 2s;
        animation-timing-function: linear;
        animation-fill-mode: forwards;
        animation-delay: 1s;
      }
      @keyframes cloudLeft {
        0% {
          top: 17px;
          left: 220px;
          opacity: 0;
        }
        20% {
          top: 33px;
          left: 188px;
          opacity: 1;
        }
        80% {
          top: 81px;
          left: 92px;
          opacity: 1;
        }
        100% {
          top: 97px;
          left: 60px;
          opacity: 0;
        }
      }
      @keyframes cloudMid {
        0% {
          top: 10px;
          left: 420px;
          opacity: 0;
        }
        20% {
          top: 40px;
          left: 360px;
          opacity: 1;
        }
        70% {
          top: 130px;
          left: 180px;
          opacity: 1;
        }
        100% {
          top: 160px;
          left: 120px;
          opacity: 0;
        }
      }
      @keyframes cloudRight {
        0% {
          top: 100px;
          left: 500px;
          opacity: 0;
        }
        20% {
          top: 120px;
          left: 460px;
          opacity: 1;
        }
        80% {
          top: 180px;
          left: 340px;
          opacity: 1;
        }
        100% {
          top: 200px;
          left: 300px;
          opacity: 0;
        }
      }
    }
  }
  .bullshit {
    position: relative;
    float: left;
    width: 300px;
    padding: 30px 0;
    overflow: hidden;
    &__oops {
      font-size: 32px;
      font-weight: bold;
      line-height: 40px;
      color: #1482f0;
      opacity: 0;
      margin-bottom: 20px;
      animation-name: slideUp;
      animation-duration: 0.5s;
      animation-fill-mode: forwards;
    }
    &__headline {
      font-size: 20px;
      line-height: 24px;
      color: #222;
      font-weight: bold;
      opacity: 0;
      margin-bottom: 10px;
      animation-name: slideUp;
      animation-duration: 0.5s;
      animation-delay: 0.1s;
      animation-fill-mode: forwards;
    }
    &__info {
      font-size: 13px;
      line-height: 21px;
      color: grey;
      opacity: 0;
      margin-bottom: 30px;
      animation-name: slideUp;
      animation-duration: 0.5s;
      animation-delay: 0.2s;
      animation-fill-mode: forwards;
    }
    &__return-home {
      display: block;
      float: left;
      width: 110px;
      height: 36px;
      background: #1482f0;
      border-radius: 100px;
      text-align: center;
      color: #ffffff;
      opacity: 0;
      font-size: 14px;
      line-height: 36px;
      cursor: pointer;
      animation-name: slideUp;
      animation-duration: 0.5s;
      animation-delay: 0.3s;
      animation-fill-mode: forwards;
    }
    @keyframes slideUp {
      0% {
        transform: translateY(60px);
        opacity: 0;
      }
      100% {
        transform: translateY(0);
        opacity: 1;
      }
    }
  }
}
</style>
src/views/appointment/index.vue
对比新文件
@@ -0,0 +1,251 @@
<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input
        :disabled="disabled"
        v-model="listQuery.searchname"
        placeholder="输入产品搜索"
        style="width: 200px;"
        class="filter-item"
        @change="handleFilter"
        clearable
        @keyup.enter.native="handleFilter"
      />
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('common.search') }}</el-button>
      <el-button class="filter-item" style="margin-left: 2px;" type="primary" icon="el-icon-edit" @click="handleAdd">{{ $t('common.add') }}</el-button>
    </div>
    <el-table stripe :data="list" border fit style="width: 80%">
      <el-table-column label="序号" type="index" align="center" width="60">
        <template slot-scope="scope">
          <span>{{ scope.$index + 1 + (listQuery.page - 1) * 10 }}</span>
        </template>
      </el-table-column>
      <el-table-column label="产品名称" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ scope.row.product }}</span>
        </template>
      </el-table-column>
      <el-table-column label="地区" align="center" width="200">
        <template slot-scope="scope">
          <span>{{ scope.row.address }}</span>
        </template>
      </el-table-column>
      <el-table-column label="需求描述" align="center" width="200">
        <template slot-scope="scope">
          <span>{{ scope.row.assessmentDescribe }}</span>
        </template>
      </el-table-column>
      <el-table-column label="照片" align="center">
        <template slot-scope="scope">
          <img :src="'/api/file/'+scope.row.assessmentImgUrl" style="height: 40px;width: 100px" />
        </template>
      </el-table-column>
      <el-table-column label="时间" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.assessmentTime }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200">
        <template slot-scope="scope">
          <el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">{{ $t('common.edit') }}</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="disabled ? '查看信息' : dialogState === 1 ? '填写信息' : '修改信息'"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :model="form" :rules="rules" label-width="80px">
        <el-form-item prop="product" label="产品名称">
          <el-input :disabled="disabled" v-model="form.product"></el-input>
        </el-form-item>
        <el-form-item prop="address" label="地区">
          <el-input :disabled="disabled" v-model="form.address"></el-input>
        </el-form-item>
        <el-form-item prop="assessmentDescribe" label="需求描述">
          <el-input :disabled="disabled" v-model="form.assessmentDescribe"></el-input>
        </el-form-item>
        <el-form-item prop="assessmentImgUrl" label="照片">
          <Uploader ref="child"  v-bind:url="fileUrl"
                    v-bind:name="fileName" v-on:uploadSuccess="uploadSuccess" style="width: 100%"></Uploader>
        </el-form-item>
        <el-form-item prop="assessmentTime" label="新闻时间">
          <el-date-picker
            :disabled="disabled"
            v-model="form.assessmentTime"
            value-format="yyyy-MM-dd HH:mm:ss"
            type="datetime"
            placeholder="选择日期时间">
          </el-date-picker>
        </el-form-item>
        <el-form-item align="center" label-width="0">
          <el-button type="primary" @click="onSubmit(form)">{{ dialogState === 1 ? $t('common.add') : $t('common.save') }}</el-button>
          <el-button :style="disabled ? 'display:none' : ''" @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
    <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchList" />
  </div>
</template>
<script>
import { getAllAssessment, addAssessment, updateAssessment, deleteAssessmentById, getAssessmentById } from '@/api/assessment';
import Pagination from '@/components/Pagination';
import Uploader from '@/components/Uploader2';
import download from '@/api/uploadUrl';
export default {
  components: { Pagination,Uploader },
  data() {
    return {
      fileUrl:"",
      fileName:'',
      download: download,
      disabled: false,
      total: 0,
      list: [],
      listQuery: {
        searchname: '',
        page: 1,
        limit: 10
      },
      dialogState: 1, //1:add, 2:edit
      dialogVisible: false,
      form: {
        product: '',
        address: '',
        assessmentDescribe: '',
        assessmentTime: '',
        assessmentImgUrl: ''
      },
      rules: {
        product: [{ required: true, message: '产品不能为空', trigvalueger: 'blur' }],
        address: [{ required: true, message: '地区不能为空', trigger: 'blur' }],
        assessmentDescribe: [{ required: true, message: '描述不能为空', trigvalueger: 'blur' }],
        assessmentTime: [{ required: true, message: '时间不能为空', trigger: 'blur' }],
        assessmentImgUrl: [{ required: true, message: '照片不能为空', trigger: 'blur' }]
      },
      dialogImageUrl: '',
      dialogVisibleImg: false,
      disabledImg: false
    };
  },
  mounted() {
    this.fetchList();
  },
  methods: {
    uploadSuccess(data) {
      this.form.assessmentImgUrl = data.fileUrl;
      this.form.fileName=data.fileName
      console.log(this.form)
    },
    handleView(id) {
      this.handleEdit(id);
      this.disabled = true;
    },
    async fetchList() {
      const res = await getAllAssessment(this.listQuery);
      if (res && res.result) {
        console.log(res)
        this.total = res.data.total;
        this.list = res.data.list;
      }
    },
    handleFilter() {
      this.listQuery.page = 1;
      this.fetchList();
    },
    handleAdd() {
      this.form = {
        product: '',
        address: '',
        assessmentDescribe: '',
        assessmentTime: '',
        assessmentImgUrl: ''
      };
      this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      this.dialogState = 2;
      this.form = deepClone(row);
      const res = await getAssessmentById(row.id);
      if (res && res.result) {
        this.dialogVisible = true;
        this.fileUrl=res.data.assessmentImgUrl
        var name = this.fileUrl.split('/')[1]
        this.fileName=name
      }
    },
    handleDelete(index, row) {
      console.log(index, row);
      const _this = this;
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteAssessmentById(row.id).then(res => {
            if (res.result) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.fetchList();
            } else {
              this.$message(this.$t('message.delete_fail'), 'error');
            }
          });
        })
        .catch(error => {});
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(valid => {
        if (!valid) {
          this.$message('填写的信息有误,请确认', 'error');
          return;
        }
        if (this.dialogState === 1) {
          const data = Object.assign(this.form);
          console.log(data)
          addAssessment(data)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.add_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.add_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        } else {
          console.log('updataform',this.form)
          updateAssessment(this.form)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.edit_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.edit_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        }
      });
    }
  }
};
</script>
src/views/baseinfo/index.vue
对比新文件
@@ -0,0 +1,25 @@
<template>
  <div>xxxx</div>
</template>
<script>
export default {
  data() {
    return {
    };
  },
  watch: {
  },
   mounted() {
  },
  methods: {
  }
};
</script>
<style lang="scss" scoped></style>
src/views/datadictionary/index.vue
对比新文件
@@ -0,0 +1,306 @@
<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input
        :disabled="disabled"
        v-model="listQuery.searchname"
        placeholder="请输入数据组代码"
        style="width: 200px;"
        class="filter-item"
        clearable
        @change="handleFilter"
      />
      <el-input
        :disabled="disabled"
        v-model="listQuery.groupName"
        placeholder="请输入数据组名称"
        style="width: 200px;"
        class="filter-item"
        clearable
        @change="handleFilter"
      />
      <el-input
        :disabled="disabled"
        v-model="listQuery.searchValue"
        placeholder="请输入名称"
        style="width: 200px;"
        class="filter-item"
        clearable
        @change="handleFilter"
      />
      <el-button class="filter-item" style="margin-left: 5px;" type="primary" size="medium" icon="el-icon-search" @click="handleFilter">
        {{ $t('common.search') }}
      </el-button>
      <el-button class="filter-item" style="margin-left: 2px;" type="primary" size="medium" icon="el-icon-circle-plus-outline" @click="handleAdd">
        {{ $t('common.add') }}
      </el-button>
    </div>
    <el-table stripe :data="list" border fit highlight-current-row style="width: 90%">
      <el-table-column label="序号" type="index" align="center" width="80">
        <template slot-scope="scope">
          <span>{{ scope.$index + 1 + (listQuery.page - 1) * 10 }}</span>
        </template>
      </el-table-column>
      <el-table-column label="组代码" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ scope.row.groupcode }}</span>
        </template>
      </el-table-column>
      <el-table-column label="组名称" align="center" width="150">
        <template slot-scope="scope">
          <span>{{ scope.row.groupname }}</span>
        </template>
      </el-table-column>
      <el-table-column label="代码" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ scope.row.key }}</span>
        </template>
      </el-table-column>
      <el-table-column label="名称" align="center" width="250">
        <template slot-scope="scope">
          <span>{{ scope.row.value }}</span>
        </template>
      </el-table-column>
      <el-table-column label="备注" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.comment }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200">
        <template slot-scope="scope">
          <el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">{{ $t('common.edit') }}</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="disabled ? '查看信息' : dialogState === 1 ? '填写信息' : '修改信息'"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :model="form" :rules="rules" label-width="60px" style="text-align:center;">
        <el-form-item prop="group" label="数据组">
          <el-select :disabled="disabled" filterable v-model="groupValue" placeholder="请选择" style="width:100%">
            <el-option v-for="item in groupList" :key="item.value" :label="item.label" :value="item.value"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item prop="key" label="代码">
          <el-input :disabled="disabled" v-model="form.key"></el-input>
        </el-form-item>
        <el-form-item prop="value" label="名称">
          <el-input :disabled="disabled" v-model="form.value"></el-input>
        </el-form-item>
        <el-form-item prop="comment" label="备注">
          <el-input :disabled="disabled" v-model="form.comment" type="textarea"></el-input>
        </el-form-item>
        <el-form-item label-width="0">
          <el-button type="primary" @click="onSubmit(form)">{{ dialogState === 1 ? $t('common.add') : $t('common.save') }}</el-button>
          <el-button :style="disabled ? 'display:none' : ''" @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
    <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchList" />
  </div>
</template>
<script>
import { fetchList, add, deleteById, update, getById, fetchListByCode } from '@/api/datadictionary';
import { getGroupList } from '@/api/configgroup';
import Pagination from '@/components/Pagination';
import { getConfigData } from '@/api/serverconfig';
export default {
  components: { Pagination },
  data() {
    return {
      disabled: false,
      total: 0,
      list: [],
      listQuery: {
        searchname: '',
        groupName: '',
          searchValue:'',
        page: 1,
        limit: 10
      },
      dialogState: 1, //1:add, 2:edit
      dialogVisible: false,
      form: {
        key: '',
        value: '',
        comment: '',
        groupcode: ''
      },
      rules: {
        key: [{ required: true, message: '代码不能为空', trigger: 'blur' }],
        value: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
      },
      groupList: [],
      groupValue: '',
      groupListQuery: {
        page: '',
        limit: '',
        searchname: ''
      },
      hasMore: true
    };
  },
  mounted() {
    this.fetchList();
    this.getGroupList();
  },
  methods: {
    handleView(id) {
      this.handleEdit(id);
      this.disabled = true;
    },
    async fetchList() {
      const res = await fetchList(this.listQuery);
      if (res && res.result) {
        this.total = res.data.total;
        this.list = res.data.list;
      }
    },
    async getGroupList() {
      const res = await getGroupList(this.groupListQuery);
      if (res && res.result) {
        const list = res.data.list.map(item => {
          return {
            value: item.groupcode,
            label: item.groupname
          };
        });
        if (!list.length) {
          this.hasMore = false;
          return;
        }
        this.groupList = this.groupList.concat(list);
      }
    },
    loadMore() {
      if (this.hasMore) {
        this.groupListQuery.page++;
        this.getGroupList();
      }
    },
    async handleFilter() {
      this.listQuery.page = 1;
      this.fetchList();
      // if (!this.listQuery.searchname) {
      //   this.fetchList();
      // } else {
      //   const res = await fetchListByCode(this.listQuery);
      //   if (res && res.result) {
      //     this.total = res.data.total;
      //     this.list = res.data.list;
      //   }
      // }
    },
    handleAdd() {
      this.form = {
        key: '',
        value: '',
        comment: '',
        groupcode: ''
      };
      this.groupValue = '';
      this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      this.dialogState = 2;
      this.form = deepClone(row);
      const res = await getById(row.id);
      if (res && res.result) {
        const group = this.groupList.find(item => item.value === res.data.groupcode);
        this.form.groupcode = group && group.value;
        this.groupValue = group && group.value;
        this.dialogVisible = true;
      }
    },
    handleDelete(index, row) {
      console.log(index, row);
      const _this = this;
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteById(row.id).then(res => {
            if (res.result) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.fetchList();
              this.updateConfigDataToStorage();
            } else {
              this.$message(this.$t('message.delete_fail'), 'error');
            }
          });
        })
        .catch(error => {});
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(valid => {
        if (!valid) {
          this.$message('填写的信息有误,请确认', 'error');
          return;
        }
        this.form.groupcode = this.groupValue;
        if (this.dialogState === 1) {
          const data = Object.assign(this.form);
          add(data)
            .then(res => {
              if (!res || !res.result) {
                this.$message(res.errorMsg || this.$t('message.add_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.add_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
              this.updateConfigDataToStorage();
            })
            .catch(error => {});
        } else {
          update(this.form)
            .then(res => {
              if (!res || !res.result) {
                this.$message(res.errorMsg || this.$t('message.edit_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.edit_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
              this.updateConfigDataToStorage();
            })
            .catch(error => {});
        }
      });
    },
    async updateConfigDataToStorage() {
      localStorage.removeItem('configdata');
      const response = await getConfigData();
      if (response && response.result) {
        const list = response.data.list;
        localStorage.setItem('configdata', JSON.stringify(list));
      }
    }
  }
};
</script>
src/views/datagroup/index.vue
对比新文件
@@ -0,0 +1,203 @@
<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input
        :disabled="disabled"
        v-model="listQuery.searchname"
        placeholder="输入数据组名称搜索"
        style="width: 200px;"
        class="filter-item"
        @change="handleFilter"
        clearable
        @keyup.enter.native="handleFilter"
      />
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('common.search') }}</el-button>
      <el-button class="filter-item" style="margin-left: 2px;" type="primary" icon="el-icon-edit" @click="handleAdd">{{ $t('common.add') }}</el-button>
    </div>
    <el-table stripe :data="list" border fit style="width: 80%">
      <el-table-column label="序号" type="index" align="center" width="60">
        <template slot-scope="scope">
          <span>{{ scope.$index + 1 + (listQuery.page - 1) * 10 }}</span>
        </template>
      </el-table-column>
      <el-table-column label="代码" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ scope.row.groupcode }}</span>
        </template>
      </el-table-column>
      <el-table-column label="名称" align="center" width="200">
        <template slot-scope="scope">
          <span>{{ scope.row.groupname }}</span>
        </template>
      </el-table-column>
      <el-table-column label="备注" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.comment }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200">
        <template slot-scope="scope">
          <el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">{{ $t('common.edit') }}</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="disabled ? '查看信息' : dialogState === 1 ? '填写信息' : '修改信息'"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :model="form" :rules="rules" label-width="80px">
        <el-form-item prop="groupcode" label="代码">
          <el-input :disabled="disabled" v-model="form.groupcode"></el-input>
        </el-form-item>
        <el-form-item prop="groupname" label="名称">
          <el-input :disabled="disabled" v-model="form.groupname" value></el-input>
        </el-form-item>
        <el-form-item prop="comment" label="备注">
          <el-input :disabled="disabled" v-model="form.comment"></el-input>
        </el-form-item>
        <el-form-item align="center" label-width="0">
          <el-button type="primary" @click="onSubmit(form)">{{ dialogState === 1 ? $t('common.add') : $t('common.save') }}</el-button>
          <el-button :style="disabled ? 'display:none' : ''" @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
    <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchList" />
  </div>
</template>
<script>
import { getGroupList, addConfigGroup, updateConfigGroup, deleteConfigGroupById, getConfigGroupById } from '@/api/configgroup';
import Pagination from '@/components/Pagination';
export default {
  components: { Pagination },
  data() {
    return {
      disabled: false,
      total: 0,
      list: [],
      listQuery: {
        searchname: '',
        page: 1,
        limit: 10
      },
      dialogState: 1, //1:add, 2:edit
      dialogVisible: false,
      form: {
        groupcode: '',
        groupname: '',
        comment: ''
      },
      rules: {
        groupcode: [{ required: true, message: '代码不能为空', trigvalueger: 'blur' }],
        groupname: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
      }
    };
  },
  mounted() {
    this.fetchList();
  },
  methods: {
    handleView(id) {
      this.handleEdit(id);
      this.disabled = true;
    },
    async fetchList() {
      const res = await getGroupList(this.listQuery);
      if (res && res.result) {
        this.total = res.data.total;
        this.list = res.data.list;
      }
    },
    handleFilter() {
      this.listQuery.page = 1;
      this.fetchList();
    },
    handleAdd() {
      this.form = {
        groupcode: '',
        groupname: '',
        comment: ''
      };
      this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      this.dialogState = 2;
      this.form = deepClone(row);
      const res = await getConfigGroupById(row.id);
      if (res && res.result) {
        this.dialogVisible = true;
      }
    },
    handleDelete(index, row) {
      console.log(index, row);
      const _this = this;
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteConfigGroupById(row.id).then(res => {
            if (res.result) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.fetchList();
            } else {
              this.$message(this.$t('message.delete_fail'), 'error');
            }
          });
        })
        .catch(error => {});
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(valid => {
        if (!valid) {
          this.$message('填写的信息有误,请确认', 'error');
          return;
        }
        if (this.dialogState === 1) {
          const data = Object.assign(this.form);
          addConfigGroup(data)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.add_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.add_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        } else {
          updateConfigGroup(this.form)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.edit_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.edit_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        }
      });
    }
  }
};
</script>
src/views/login/index.vue
对比新文件
@@ -0,0 +1,372 @@
<template>
  <div class="login-container">
    <div class='login-bg'>
      <div class='bg-title'>企业信息查询系统</div>
      <div class='bg-pic'></div>
    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
      <div class="loginCenter">
<!--        <div class="logo">-->
<!--          LOGO-->
<!--        </div>-->
        <div class="title-container">
          <h3 class="title">欢迎登录</h3>
        </div>
        <el-form-item prop="username">
        <span class="svg-container">
          <svg-icon icon-class="user" />
        </span>
          <el-input ref="username" v-model="loginForm.username" placeholder="用户名" name="username" type="text" tabindex="1" auto-complete="off" />
        </el-form-item>
        <el-form-item prop="password">
        <span class="svg-container">
          <svg-icon icon-class="password" />
        </span>
          <el-input
            :key="passwordType"
            ref="password"
            v-model="loginForm.password"
            :type="passwordType"
            placeholder="密码"
            name="password"
            tabindex="2"
            auto-complete="off"
            @keyup.enter.native="handleLogin"
          />
          <span class="show-pwd" @click="showPwd">
          <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
        </span>
        </el-form-item>
        <el-button class="loginBtn" :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">登录</el-button>
      </div>
    </el-form>
    </div>
  </div>
</template>
<script>
import { validUsername } from '@/utils/validate';
import md5 from 'js-md5';
import { getConfigData } from '@/api/serverconfig';
export default {
  name: 'Login',
  data() {
    const validateUsername = (rule, value, callback) => {
      if (!validUsername(value)) {
        callback(new Error('用户名不能为空'));
      } else {
        callback();
      }
    };
    const validatePassword = (rule, value, callback) => {
      if (!value.length) {
        callback(new Error('密码不能为空'));
      } else {
        callback();
      }
    };
    return {
      loginForm: {
        username: '',
        password: ''
      },
      loginRules: {
        username: [{ required: true, trigger: 'blur', validator: validateUsername }],
        password: [{ required: true, trigger: 'blur', validator: validatePassword }]
      },
      loading: false,
      passwordType: 'password',
      redirect: undefined
    };
  },
  watch: {
    $route: {
      handler: function(route) {
        this.redirect = route.query && route.query.redirect;
      },
      immediate: true
    }
  },
  methods: {
    showPwd() {
      if (this.passwordType === 'password') {
        this.passwordType = '';
      } else {
        this.passwordType = 'password';
      }
      this.$nextTick(() => {
        this.$refs.password.focus();
      });
    },
    handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          this.$store
            .dispatch('user/login', {
              username: this.loginForm.username,
              password: this.loginForm.password
            })
            .then(async res => {
              if (!res || !res.result) {
                this.$message(res.msg || '用户名或密码不正确', 'error', 5 * 1000);
                this.loading = false;
                return;
              }
              await this.setConfigDataToStorage();
              this.setInfo(this.loginForm.username,this.loginForm.password)
              this.$router.push({ path: '/management' });
              this.loading = false;
            })
            .catch(() => {
              this.loading = false;
            });
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    setInfo(name,password){
      localStorage.removeItem('name');
      localStorage.removeItem('password');
      localStorage.setItem("name",name)
      localStorage.setItem("password",password)
    },
    async setConfigDataToStorage() {
      localStorage.removeItem('configdata');
      const response = await getConfigData();
      if (response && response.result) {
        const list = response.data.list;
        localStorage.setItem('configdata', JSON.stringify(list));
      }
    }
  }
};
</script>
<style lang="scss">
/* 修复input 背景不协调 和光标变色 */
/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
@keyframes right {
  100%{
    transform: translateX(50px);
    opacity: 1;
    -webkit-opacity: 1;
  }
}
@keyframes left {
  100%{
    transform: translateX(-60px);
    opacity: 1;
    -webkit-opacity: 1;
  }
}
$bg: #283443;
$light_gray: black;
$cursor: black;
@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
  .login-container .el-input input {
    color: $cursor;
  }
}
/* reset element-ui css */
.login-container {
  .el-input {
    display: inline-block;
    height: 47px;
    width: 85%;
    input {
      background: transparent;
      border: 0px;
      -webkit-appearance: none;
      border-radius: 0px;
      padding: 12px 5px 12px 15px;
      color: $light_gray;
      height: 47px;
      caret-color: $cursor;
      &:-webkit-autofill {
        box-shadow: 0 0 0px 1000px #fff inset !important;
        -webkit-text-fill-color: $cursor !important;
        // opacity: 0.1;
      }
    }
  }
  .el-form-item {
    border: 1px solid rgba(0, 0, 0, 0.1);
    background: rgba(255, 255, 255, 0.1);
    border-radius: 5px;
    color: black;
    margin-bottom: 40px;
  }
}
</style>
<style lang="scss" scoped>
$bg: #2d3a4b;
$dark_gray: #889aa4;
$light_gray: rgb(20, 133, 254);
.loginCenter{
  width:80%;
  height:100%;
  display: flex;
  flex-direction: column;
}
.login-container {
  min-height: 100%;
  width: 100%;
  position: relative;
  // background-color: $bg;
  background: url('../../assets/bg.png') no-repeat center;
  background-size: 100% 100%;
  overflow: hidden;
  display: flex;
  justify-content: center;
  align-items: center;
  .login-bg{
    position: relative;
    .bg-title{
      font-size: 52px;
      font-weight: bolder;
      color: #fff;
      margin-bottom: 20px;
      margin-left: 60px;
      opacity: 0;
      -webkit-opacity: 0;
      text-shadow: 0 8px 16px rgba(38,97,251,.8);
      animation: right .6s ease-in-out forwards;
    }
    .bg-pic{
      width: 1200px;
      height: 441px;
      background: url('../../assets/login-form-bg.png') no-repeat center;
      background-size: 100% 100%;
      filter: drop-shadow(0 15px 30px rgba(0, 0, 0, 0.2));
      -webkit-filter: drop-shadow(0 15px 30px rgba(0, 0, 0, 0.2));
    }
  }
  .login-form {
    width: 480px;
    height: 100%;
    position: absolute;
    right: -60px;
    top: 0;
    border-radius: 16px;
    z-index: 9999;
    max-width: 100%;
    /*padding: 160px 35px 0;*/
    margin: 0 auto;
    overflow: hidden;
    box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1);
    background-color: rgba(255,255,255,0);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    border: 2px solid rgba(255,255,255,.2);
    display: flex;
    justify-content: center;
    align-items: center;
    opacity: 0;
    -webkit-opacity: 0;
    animation: left .6s ease-in-out forwards;
    .el-form-item{
      background: #fff;
      box-shadow:  3px 3px 8px rgba(0,0,0,.1), -3px -3px 8px rgba(255,255,255,.2);
      border: 2px solid #fff;
    }
  }
  .tips {
    font-size: 14px;
    color: #fff;
    margin-bottom: 10px;
    span {
      &:first-of-type {
        margin-right: 16px;
      }
    }
  }
  .svg-container {
    padding: 6px 5px 6px 15px;
    color: $dark_gray;
    vertical-align: middle;
    width: 30px;
    display: inline-block;
  }
  .title-container {
    position: relative;
    .title {
      font-size: 32px;
      color: #fff;
      margin: 80px auto 50px;
      font-weight: bold;
    }
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 7px;
    font-size: 16px;
    color: $dark_gray;
    cursor: pointer;
    user-select: none;
  }
}
  .loginBtn{
    background: linear-gradient(90deg, rgb(17, 171, 255) 0%, rgb(17, 171, 255) 0%, rgb(60, 79, 252) 100%, rgb(60, 79, 252) 100%);
    border-radius: 150px;
    width: 300px;
    height: 50px;
    margin-top: 20px;
    font-size: 18px;
    box-shadow:  3px 3px 8px rgba(0,0,0,.1), -2px -2px 6px rgba(255,255,255,.1);
    &:active{
      background: linear-gradient(-90deg, rgb(17, 171, 255) 0%, rgb(17, 171, 255) 0%, rgb(60, 79, 252) 100%, rgb(60, 79, 252) 100%);
      box-shadow: -2px -2px 6px rgba(255,255,255,.1) inset,3px 3px 8px rgba(0,0,0,.1) inset;
    }
  }
  .loginInput{
    border-width: 0px;
    width: 300px;
    height: 50px;
    display: flex;
    font-family: 'FontAwesome', sans-serif;
    font-weight: 400;
    font-style: normal;
    font-size: 20px;
    color: transparent;
    text-align: right;
  }
  .logo{
    margin:0 auto;
    width: 100px;
    height: 100px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
</style>
src/views/management/component/companyDetailDialog.vue
对比新文件
@@ -0,0 +1,288 @@
<template>
  <el-dialog title="企业信息" :visible.sync="dialogVisible" width="70%" center>
    <el-form :model="companyInfo" label-width="120px">
      <el-row>
        <el-col :span="11">
          <el-form-item label="企业名称">
            <el-input v-model="companyInfo.companyName" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="法定负责人">
            <el-input v-model="companyInfo.companyLegalRepresentative" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="许可证类型">
            <el-input v-model="companyInfo.certificateType" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="许可证编号">
            <el-input v-model="companyInfo.certificateNum" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="证书有效期">
            <el-input v-model="companyInfo.validityDate" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="工艺类型">
            <el-input v-model="companyInfo.technologyType" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="所在地区">
            <el-input v-model="companyInfo.location" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="详细地址">
            <el-input v-model="companyInfo.companyAddress" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="许可范围">
            <el-input v-model="companyInfo.licenseScope" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="发证机关">
            <el-input v-model="companyInfo.licenceIssuingAuthority" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="发证日期">
            <el-input v-model="companyInfo.licenceIssuingTime" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="8" v-if="preview1List.length>0 && preview1List[0] != ''">
          <el-form-item label="企业图片">
            <el-image style="width: 100px; height: 100px" :src="companyInfo.companyImage" :preview-src-list="preview1List" fit="contain">
              <div slot="error" class="image-slot">
                <i class="el-icon-picture-outline"></i>
              </div>
            </el-image>
          </el-form-item>
        </el-col>
        <el-col :span="8" v-if="preview2List.length>0 && preview2List[0] != ''">
          <el-form-item label="营业执照">
            <el-image style="width: 100px; height: 100px" :src="companyInfo.businessLicense" :preview-src-list="preview2List" fit="contain">
              <div slot="error" class="image-slot">
                <i class="el-icon-picture-outline"></i>
              </div>
            </el-image>
          </el-form-item>
        </el-col>
        <el-col :span="8" v-if="preview3List.length>0 && preview3List[0] != ''">
          <el-form-item label="经营许可证书">
            <el-image style="width: 100px; height: 100px" :src="companyInfo.securityCertificate" :preview-src-list="preview3List" fit="contain">
              <div slot="error" class="image-slot">
                <i class="el-icon-picture-outline"></i>
              </div>
            </el-image>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-form-item label="重大危险源总数">
          <el-input v-model="companyInfo.sum" readonly></el-input>
        </el-form-item>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="一级重大危险源总数">
            <el-input v-model="companyInfo.levelOneMajorHazardSourceSum" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="一级重大危险源描述">
            <el-input v-model="companyInfo.levelOneMajorHazardSourceDesc" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="二级重大危险源总数">
            <el-input v-model="companyInfo.levelTwoMajorHazardSourceSum" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="二级重大危险源描述">
            <el-input v-model="companyInfo.levelTwoMajorHazardSourceDesc" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="三级重大危险源总数">
            <el-input v-model="companyInfo.levelThreeMajorHazardSourceSum" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="三级重大危险源描述">
            <el-input v-model="companyInfo.levelThreeMajorHazardSourceDesc" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="11">
          <el-form-item label="四级重大危险源总数">
            <el-input v-model="companyInfo.levelFourMajorHazardSourceSum" readonly></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="11" :offset="2">
          <el-form-item label="四级重大危险源描述">
            <el-input v-model="companyInfo.levelFourMajorHazardSourceDesc" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="企业基本情况">
            <el-input v-model="companyInfo.companyInfo" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="“两重点一重大”情况">
            <el-input v-model="companyInfo.keynoteGreatSituation" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="安全生产情况">
            <el-input v-model="companyInfo.safetyProductionLicenseSituation" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="主要安全风险">
            <el-input v-model="companyInfo.mainSafetyRisks" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="当前存在问题">
            <el-input v-model="companyInfo.currentProblems" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="安全风险主要控制措施">
            <el-input v-model="companyInfo.safetyRiskControlMeasures" type='textarea' readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
  </el-dialog>
</template>
<script>
import {
  getEnterpriseInfoById, getTechType
} from '@/api/company';
    export default {
      name: "companyDetailDialog",
      props: {
        typeList:{
          type: Array
        }
      },
      data(){
        return{
          companyInfo: {},
          dialogVisible: false,
          preview1List: [],
          preview2List: [],
          preview3List: []
        }
      },
      mounted() {
      },
      watch: {
      },
      methods:{
        getTechType() {
          getTechType().then(res => {
            if(res.code == 200){
              this.techTypeList = res.data;
            }else{
              this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
            }
          })
        },
        getEnterpriseInfo(id){
          const t = this
          t.preview1List = []
          t.preview2List = []
          t.preview3List = []
          getEnterpriseInfoById({ id: id }).then(res =>{
            if(res.code == 200){
              t.companyInfo = res.data
              t.companyInfo.certificateType = res.data.certificateType == 1 ? '生产' : '经营'
              t.companyInfo.technologyType = t.typeList.find((item) => item.id == res.data.technologyType).technologyName
              t.companyInfo.location = res.data.companyCity + res.data.companyArea
              t.companyInfo.sum = res.data.levelOneMajorHazardSourceSum + res.data.levelTwoMajorHazardSourceSum + res.data.levelThreeMajorHazardSourceSum + res.data.levelFourMajorHazardSourceSum
              t.companyInfo.validityDate = res.data.validityDateStart + '--' + res.data.validityDateEnd
              if(res.data.companyImage == null || res.data.companyImage == ''){
                t.companyInfo.companyImage = ''
              }else{
                t.companyInfo.companyImage = process.env.VUE_APP_BASE_API + res.data.companyImage
              }
              if(res.data.businessLicense == null || res.data.businessLicense == ''){
                t.companyInfo.businessLicense = ''
              }else{
                t.companyInfo.businessLicense = process.env.VUE_APP_BASE_API + res.data.businessLicense
              }
              if(res.data.securityCertificate == null || res.data.securityCertificate == ''){
                t.companyInfo.securityCertificate = ''
              }else{
                t.companyInfo.securityCertificate = process.env.VUE_APP_BASE_API + res.data.securityCertificate
              }
              t.preview1List.push(t.companyInfo.companyImage)
              t.preview2List.push(t.companyInfo.businessLicense)
              t.preview3List.push(t.companyInfo.securityCertificate)
            }else{
              t.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
            }
          }).catch((error)=>{
            console.log(error)
          })
        }
      },
    }
</script>
<style lang="scss" scoped>
::v-deep .el-upload--picture-card {
  background-color: #fbfdff;
  border: 1px dashed #c0ccda;
  border-radius: 6px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  line-height: 100px;
  vertical-align: top;
}
</style>
src/views/management/component/companyDialog.vue
对比新文件
@@ -0,0 +1,790 @@
<template>
  <el-dialog :title="title" :visible.sync="centerDialogVisible" width="70%" center @close='reset()'>
    <el-form :model="companyInfo" :rules="rules" ref="ruleForm" label-width="120px">
      <el-row>
        <el-col :span="10">
          <el-form-item label="企业名称" prop="companyName">
            <el-input v-model="companyInfo.companyName" placeholder="企业名称"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4">
          <el-form-item label="法定负责人" prop="companyLegalRepresentative">
            <el-input v-model="companyInfo.companyLegalRepresentative" placeholder="企业负责人"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="许可证类型" prop="certificateType">
            <el-radio-group v-model="companyInfo.certificateType">
              <el-radio border :label="1">生产</el-radio>
              <el-radio border :label="2">经营</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4">
          <el-form-item label="许可证编号" prop="certificateNum">
            <el-input v-model="companyInfo.certificateNum" placeholder="证书编号">
            </el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="证书有效期" prop="validityDate">
            <el-date-picker
              v-model="companyInfo.validityDate"
              @input="changeTime"
              @blur="changeTime"
              value-format="yyyy-MM-dd"
              type="daterange"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
            >
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4" style='display: flex;align-items: center;justify-content: space-between'>
          <el-form-item label="工艺类型" prop="technologyType" style='margin-bottom: 0'>
            <el-select clearable v-model="companyInfo.technologyType" style="width: 100%">
              <el-option v-for='(item,index) in techTypeList' :label="item.technologyName" :value="item.id" :key='index'></el-option>
            </el-select>
          </el-form-item>
          <el-button type='primary' @click='openTypeDialog()'>管理</el-button>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="所在地区" prop="companyCityValue">
            <el-cascader
              v-model="companyInfo.companyCityValue"
              :options="areaInfo"
              :props="{ expandTrigger: 'hover', value: 'label' }"
              style="width: 100%"
              @change="handleChangeAddArea"
            ></el-cascader>
            <!--              <el-input v-model="companyInfo.companyCity" style="width: 100%" placeholder="所在城市">-->
            <!--              </el-input>-->
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4">
          <el-form-item label="住所" prop='companyAddress'>
            <el-input type='textarea' v-model="companyInfo.companyAddress" style="width: 100%" placeholder="请输入详细地址"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="许可范围" prop="licenseScope">
            <el-input v-model="companyInfo.licenseScope" type="textarea" style="width: 100%;" placeholder="请描述许可范围">
            </el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="发证机关" prop="licenceIssuingAuthority">
            <el-input v-model="companyInfo.licenceIssuingAuthority" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4">
          <el-form-item label="发证时间" prop="licenceIssuingTime">
            <el-date-picker
              v-model="companyInfo.licenceIssuingTime"
              type="date"
              value-format="yyyy-MM-dd"
              placeholder="选择日期">
            </el-date-picker>
          </el-form-item>
        </el-col>
      </el-row>
<!--      <el-dialog :visible.sync="dialogVisible">-->
<!--        <img width="100%" :src="dialogImageUrl" alt="">-->
<!--      </el-dialog>-->
      <el-row>
        <el-col :span="8">
          <el-form-item label="企业图片 " prop="companyImage">
            <el-upload
              action="#" ref="upload" :http-request="httpRequestCompanyImage" list-type="picture-card"
              v-model="companyInfo.companyImage"
              :on-success="fileUploadSuccess" :before-upload="addFileList"
              :limit="1"
              :file-list="companyImageList"
              accept=".jpg,.jpeg,.png"
              :on-change="(file, fileList) => {handleChangeFile(file, fileList, 1)}"
              :on-remove="(file, fileList) => {handleRemove(file, fileList, 1)}"
            >
              <i class="el-icon-plus"></i>
            </el-upload>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="营业执照 " prop="businessLicense">
            <el-upload size="small"
                       action="#" ref="upload" :http-request="httpRequestBusinessLicense" list-type="picture-card"
                       v-model="companyInfo.businessLicense"
                       :on-success="fileUploadSuccess"
                       :before-upload="addFileList"
                       :limit="1"
                       :file-list="businessLicenseList"
                       :on-change="(file, fileList) => {handleChangeFile(file, fileList, 2)}"
                       accept=".jpg,.jpeg,.png"
                       :on-remove="(file, fileList) => {handleRemove(file, fileList, 2)}"
            >
              <i class="el-icon-plus"></i>
            </el-upload>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="经营许可证书 " prop="securityCertificate">
            <el-upload
              action="#" ref="upload" :http-request="httpRequestSecurityCertificate" list-type="picture-card"
              v-model="companyInfo.securityCertificate"
              :on-success="fileUploadSuccess" :before-upload="addFileList"
              :limit="1"
              :file-list="securityCertificateList"
              :on-change="(file, fileList) => {handleChangeFile(file, fileList, 3)}"
              accept=".jpg,.jpeg,.png"
              :on-remove="(file, fileList) => {handleRemove(file, fileList, 3)}"
            >
              <i class="el-icon-plus"></i>
            </el-upload>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="重大危险源总数" label-width='140px'>
            <el-input readonly v-model.number="totalRisk" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="一级重大危险源总数" label-width='140px' prop='levelOneMajorHazardSourceSum'>
            <el-input type='number' v-model.number="companyInfo.levelOneMajorHazardSourceSum" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4" v-if='companyInfo.levelOneMajorHazardSourceSum > 0'>
          <el-form-item label="一级重大危险源描述" label-width='140px' prop='levelOneMajorHazardSourceDesc'>
            <el-input type='textarea' v-model="companyInfo.levelOneMajorHazardSourceDesc" style="width: 100%" placeholder="请简单描述一级重大危险源"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="二级重大危险源总数" label-width='140px' prop='levelTwoMajorHazardSourceSum'>
            <el-input type='number'v-model.number="companyInfo.levelTwoMajorHazardSourceSum" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4" v-if='companyInfo.levelTwoMajorHazardSourceSum > 0'>
          <el-form-item label="二级重大危险源描述" label-width='140px' prop='levelTwoMajorHazardSourceDesc'>
            <el-input type='textarea' v-model="companyInfo.levelTwoMajorHazardSourceDesc" style="width: 100%" placeholder="请简单描述二级重大危险源"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="三级重大危险源总数" label-width='140px' prop='levelThreeMajorHazardSourceSum'>
            <el-input type='number' v-model.number="companyInfo.levelThreeMajorHazardSourceSum" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4" v-if='companyInfo.levelThreeMajorHazardSourceSum > 0'>
          <el-form-item label="三级重大危险源描述" label-width='140px' prop='levelThreeMajorHazardSourceDesc'>
            <el-input type='textarea' v-model="companyInfo.levelThreeMajorHazardSourceDesc" style="width: 100%" placeholder="请简单描述三级重大危险源"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="10">
          <el-form-item label="四级重大危险源总数" label-width='140px' prop='levelFourMajorHazardSourceSum'>
            <el-input type='number' v-model.number="companyInfo.levelFourMajorHazardSourceSum" style="width: 100%" placeholder=""></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="10" :offset="4" v-if='companyInfo.levelFourMajorHazardSourceSum > 0'>
          <el-form-item label="四级重大危险源描述" label-width='140px' prop='levelFourMajorHazardSourceDesc'>
            <el-input type='textarea' v-model="companyInfo.levelFourMajorHazardSourceDesc" style="width: 100%" placeholder="请简单描述四级重大危险源"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <el-form :model="companyInfo" class="demo-form-inline" style="padding-left: 40px;">
      <el-row>
        <el-col :span="24">
          <el-form-item label="企业基本情况">
            <el-input v-model="companyInfo.companyInfo" type="textarea" style="width: 100%;" placeholder="">
            </el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="“两重点一重大”情况">
            <el-input v-model="companyInfo.keynoteGreatSituation" type="textarea" style="width: 100%"
                      placeholder=""
            ></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="安全生产情况">
            <el-input v-model="companyInfo.safetyProductionLicenseSituation" type="textarea" style="width: 100%"
                      placeholder=""
            ></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="主要安全风险">
            <el-input v-model="companyInfo.mainSafetyRisks" style="width: 100%" type="textarea" placeholder="">
            </el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="当前存在问题">
            <el-input v-model="companyInfo.currentProblems" style="width: 100%" type="textarea"
                      placeholder=""
            ></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="安全风险主要控制措施">
            <el-input v-model="companyInfo.safetyRiskControlMeasures" style="width: 100%" type="textarea"
                      placeholder=""
            ></el-input>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <span slot="footer" class="dialog-footer">
                <el-button @click="centerDialogVisible = false">取 消</el-button>
                <el-button v-stop-re-click type="primary" @click="saveData">确 定</el-button>
            </span>
    <el-dialog title="工艺类型管理" :visible.sync="typeDialog" :append-to-body="true">
      <el-button type="primary" size="medium" @click='editType(null)'>新增</el-button>
      <el-table :data="techTypeList" border :header-cell-style="{ background: '#f4f4f4' }" style="width: 100%; margin-top: 20px">
        <el-table-column prop="technologyName" label="工艺类型" align='center'></el-table-column>
        <el-table-column label="操作" align='center'>
          <template slot-scope="scope">
            <el-button type="text" size="medium" @click='editType(scope.row)'>编辑</el-button>
            <el-button type="text" size="medium" @click='deleteType(scope.row.id)'>删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>
    <el-dialog title="工艺类型编辑" :visible.sync="typeEditDialog" @close='closeEdit()' :append-to-body="true">
      <el-form ref="typeForm" :model="typeForm" :rules="typeRules" label-width="80px">
        <el-form-item label="类型名称" prop="technologyName">
          <el-input v-model="typeForm.technologyName"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="typeEditDialog = false">取 消</el-button>
        <el-button v-stop-re-click type="primary" @click="confirmTypeAdd('typeForm')">确 定</el-button>
      </div>
    </el-dialog>
  </el-dialog>
</template>
<script>
import {
  getTechType,
  addTechType,
  updateTechType,
  deleteTechType,
  saveCompanyInfo,
  updateCompanyInfo,
  getAreaInfo,
  getEnterpriseInfoById
} from '@/api/company';
    export default {
      name: "companyDialog",
      props: {
        typeList:{
          type: Array
        }
      },
      data(){
        return{
          centerDialogVisible:false,
          techTypeList: [],
          areaInfo: [],
          typeForm: {
            id: null,
            technologyName: ''
          },
          typeDialog: false,
          typeEditDialog: false,
          typeRules: {
            technologyName: [{ required: true, message: '请输入工艺类型名称', trigger: 'blur' }],
          },
          title: '',
          companyInfo: {
            id: null,
            companyName: '',
            companyLegalRepresentative: '',
            certificateType: null,
            certificateNum: '',
            validityDate: [],
            validityDateStart: '',
            validityDateEnd: '',
            technologyType: null,
            companyCityValue: [],
            companyCity: '',
            companyArea: '',
            companyAddress: '',
            licenseScope: '',
            licenceIssuingAuthority: '',
            licenceIssuingTime: '',
            levelOneMajorHazardSourceSum: 0,
            levelOneMajorHazardSourceDesc: '',
            levelTwoMajorHazardSourceSum: 0,
            levelTwoMajorHazardSourceDesc: '',
            levelThreeMajorHazardSourceSum: 0,
            levelThreeMajorHazardSourceDesc: '',
            levelFourMajorHazardSourceSum: 0,
            levelFourMajorHazardSourceDesc: '',
            companyInfo: '',
            keynoteGreatSituation: '',
            safetyProductionLicenseSituation: '',
            mainSafetyRisks: '',
            currentProblems: '',
            safetyRiskControlMeasures: '',
            companyImageFile: null,
            businessLicenseFile: null,
            securityCertificateFile: null
          },
          rules: {
            companyCityValue: [{required: true, message: '请选择企业所在区域', trigger: 'blur'}],
            companyName: [{required: true, message: '请输入企业名称', trigger: 'blur'}],
            companyLegalRepresentative: [{required: true, message: '请输入企业负责人', trigger: 'blur'}],
            certificateType: [{required: true, message: '请选择许可证类型', trigger: 'blur'}],
            certificateNum: [{required: true, message: '请输入证书编号', trigger: 'blur'}],
            validityDate: [{required: true, message: '请选择日期区间', trigger: 'blur'}],
            technologyType: [{required: true, message: '请输入工艺类型', trigger: 'blur'}],
            companyAddress: [{required: true, message: '请输入详细地址', trigger: 'blur'}],
            licenseScope: [{required: true, message: '请输入许可范围', trigger: 'blur'}],
            licenceIssuingAuthority: [{required: true, message: '请输入发证机关', trigger: 'blur'}],
            licenceIssuingTime: [{required: true, message: '请选择发证时间', trigger: 'blur'}],
            levelOneMajorHazardSourceSum: [{required: true, message: '请输入一级重大危险源总数', trigger: 'blur'}],
            levelTwoMajorHazardSourceSum: [{required: true, message: '请输入二级重大危险源总数', trigger: 'blur'}],
            levelThreeMajorHazardSourceSum: [{required: true, message: '请输入三级重大危险源总数', trigger: 'blur'}],
            levelFourMajorHazardSourceSum: [{required: true, message: '请输入四级重大危险源总数', trigger: 'blur'}],
            levelOneMajorHazardSourceDesc: [{required: true, message: '请填写描述信息', trigger: 'blur'}],
            levelTwoMajorHazardSourceDesc: [{required: true, message: '请填写描述信息', trigger: 'blur'}],
            levelThreeMajorHazardSourceDesc: [{required: true, message: '请填写描述信息', trigger: 'blur'}],
            levelFourMajorHazardSourceDesc: [{required: true, message: '请填写描述信息', trigger: 'blur'}]
          },
          dialogImageUrl: '',
          fileList: [],
          companyImageList: [],
          businessLicenseList: [],
          securityCertificateList: [],
        }
      },
      created() {
      },
      mounted() {
        const t = this
        t.getAreaInfo()
      },
      watch: {
      },
      computed:{
        totalRisk:{
          get(){
            return Number(this.companyInfo.levelOneMajorHazardSourceSum) + Number(this.companyInfo.levelTwoMajorHazardSourceSum) + Number(this.companyInfo.levelThreeMajorHazardSourceSum) + Number(this.companyInfo.levelFourMajorHazardSourceSum)
          },
          set(newValue){
            return newValue;
          }
        }
      },
      methods:{
        changeTime(e) {
          if (this.companyInfo.validityDate == null) {
            this.companyInfo.validityDate = new Array()
            this.companyInfo.validityDate[0] = ''
            this.companyInfo.validityDate[1] = ''
          }
          this.$forceUpdate()
        },
        getTechType() {
          getTechType().then(res => {
            if(res.code == 200){
              this.techTypeList = res.data;
            }else{
              this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
            }
          })
        },
        getAreaInfo() {
          getAreaInfo().then(res => {
            if(res.code == 200){
              this.areaInfo = res.data;
            }else{
              this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
            }
          })
        },
        getEnterpriseInfo(id){
          const t = this
          getEnterpriseInfoById({ id: id }).then(res =>{
            if(res.code == 200){
              t.companyInfo=res.data
              // t.companyInfo.technologyType = t.typeList.find((item) => item.id == res.data.technologyType).technologyName
              t.companyInfo.technologyType = res.data.technologyType
              t.companyInfo.companyCityValue = new Array()
              t.companyInfo.companyCityValue[0] = res.data.companyCity
              t.companyInfo.companyCityValue[1] = res.data.companyArea
              t.totalRisk = res.data.levelOneMajorHazardSourceSum + res.data.levelTwoMajorHazardSourceSum + res.data.levelThreeMajorHazardSourceSum + res.data.levelFourMajorHazardSourceSum
              t.companyInfo.validityDate = new Array()
              t.companyInfo.validityDate[0] = res.data.validityDateStart
              t.companyInfo.validityDate[1] = res.data.validityDateEnd
              if (res.data.companyImage) {
                t.companyImageList.push({'url': process.env.VUE_APP_BASE_API + res.data.companyImage})
              }
              if (res.data.businessLicense) {
                t.businessLicenseList.push({'url': process.env.VUE_APP_BASE_API + res.data.businessLicense})
              }
              if (res.data.securityCertificate) {
                t.securityCertificateList.push({'url': process.env.VUE_APP_BASE_API + res.data.securityCertificate})
              }
              // t.$set(t.companyInfo, 'validityDate', [t.companyInfo.validityDateStart != null ?t.companyInfo.validityDateStart : '', t.companyInfo.validityDateEnd != null ? t.companyInfo.validityDateEnd : ''])
            }else{
              t.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
            }
          }).catch((error)=>{
            console.log(error)
          })
        },
        openTypeDialog(){
          const t = this
          t.getTechType()
          t.typeDialog = true
        },
        editType(row){
          const t = this
          if(row != null){
            t.typeForm.id = row.id
            t.typeForm.technologyName = row.technologyName
          }
          t.typeEditDialog = true
        },
        confirmTypeAdd(formName) {
          this.$refs[formName].validate((valid) => {
            if (valid) {
              const t = this
              if(t.typeForm.id == null){
                addTechType(t.typeForm).then((res)=>{
                  if(res.code == 200){
                    t.$message(res.msg || '添加成功!')
                    t.typeEditDialog = false
                    t.getTechType()
                  }else{
                    t.$message(res.msg || '添加失败,请重试', 'error', 3 * 1000)
                  }
                }).catch((error)=>{
                  console.log(error)
                })
              }else{
                updateTechType(t.typeForm).then((res)=>{
                  if(res.code == 200){
                    t.$message(res.msg || '修改成功!')
                    t.typeEditDialog = false
                    t.getTechType()
                  }else{
                    t.$message(res.msg || '修改失败,请重试', 'error', 3 * 1000)
                  }
                }).catch((error)=>{
                  console.log(error)
                })
              }
            } else {
              console.log('error submit!!');
              return false;
            }
          });
        },
        deleteType(id){
          const t = this
          t.$confirm('此操作将删除该工艺类型, 是否继续?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            deleteTechType({ id: id }).then((res)=>{
              if(res.code == 200){
                t.$message(res.msg || '删除成功!')
                t.getTechType()
              }else{
                t.$message(res.msg || '删除失败,请重试', 'error', 3 * 1000)
              }
            }).catch((error)=>{
              console.log(error)
            })
          }).catch(() => {
            t.$message({
              type: 'info',
              message: '已取消删除'
            });
          });
        },
        closeEdit(){
          this.typeForm = {
            id: null,
            technologyName: ''
          }
        },
        handleChangeAddArea(row) {
          if(row){
            this.companyInfo.companyCity = row[0];
            this.companyInfo.companyArea = row[1];
          }
        },
        httpRequestCompanyImage(data) {
          let t = this
          let rd = new FileReader() // 创建文件读取对象
          let file = data.file
          const isLt2M = file.size / 1024 / 1024 < 3
          if (!isLt2M) {
            // this.$refs.upload.clearFiles()
            t.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
            t.companyImageList = [];
            return;
          }
          t.companyInfo.companyImageFile = file
          rd.readAsDataURL(file) // 文件读取装换为base64类型
          rd.onloadend = function (e) {
            t.imageUrl = this.result // this指向当前方法onloadend的作用域
          }
        },
        httpRequestBusinessLicense(data) {
          let t = this
          let rd = new FileReader() // 创建文件读取对象
          let file = data.file
          const isLt2M = file.size / 1024 / 1024 < 3
          if (!isLt2M) {
            // this.$refs.upload.clearFiles()
            t.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
            t.businessLicenseList = [];
            return;
          }
          t.companyInfo.businessLicenseFile = file
          rd.readAsDataURL(file) // 文件读取装换为base64类型
          rd.onloadend = function (e) {
            t.imageUrl = t.result // this指向当前方法onloadend的作用域
          }
        },
        httpRequestSecurityCertificate(data) {
          let t = this
          let rd = new FileReader() // 创建文件读取对象
          let file = data.file
          const isLt2M = file.size / 1024 / 1024 < 3
          if (!isLt2M) {
            // this.$refs.upload.clearFiles()
            t.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
            t.securityCertificateList = [];
            return;
          }
          t.companyInfo.securityCertificateFile = file
          rd.readAsDataURL(file) // 文件读取装换为base64类型
          rd.onloadend = function (e) {
            t.imageUrl = t.result // this指向当前方法onloadend的作用域
          }
        },
        fileUploadSuccess(response, file, fileList) {
        },
        addFileList(file) {
        },
        handleRemove(file, fileList, index) {
          if (index == 1) {
            this.companyInfo.deleteCompanyImage = true
          }
          if (index == 2) {
            this.companyInfo.deleteBusinessLicense = true
          }
          if (index == 3) {
            this.companyInfo.deleteSecurityCertificate = true
          }
        },
        handleChangeFile(file, fileList, index) {
          this.isDisabled = false
          if (!file) return
          const isLt2M = file.size / 1024 / 1024 < 3
          if (!isLt2M) {
            // this.$refs.upload.clearFiles()
            this.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
            if (index == 1) {
              console.log(index)
              this.companyImageList = []
              this.companyInfo.companyImageFile = null;
            }
            if (index == 2) {
              console.log(index)
              this.businessLicenseList = []
              this.companyInfo.businessLicenseFile = null;
            }
            if (index == 3) {
              console.log(index)
              this.securityCertificateList = []
              this.companyInfo.securityCertificateFile = null;
            }
          }
          this.fileName = file.name
        },
        // handlePictureCardPreview(file) {
        //   this.dialogImageUrl = file.url
        //   this.dialogVisible = true
        // },
        saveData() {
          const t = this
          t.loading = true
          t.$refs['ruleForm'].validate((valid) => {
            if (valid) {
              t.companyInfo.validityDateStart = t.companyInfo.validityDate[0]
              t.companyInfo.validityDateEnd = t.companyInfo.validityDate[1]
              t.companyInfo.companyCity = t.companyInfo.companyCityValue[0]
              t.companyInfo.companyArea = t.companyInfo.companyCityValue[1]
              if(t.companyInfo.levelOneMajorHazardSourceSum == 0){
                t.companyInfo.levelOneMajorHazardSourceDesc = ''
              }
              if(t.companyInfo.levelTwoMajorHazardSourceSum == 0){
                t.companyInfo.levelTwoMajorHazardSourceDesc = ''
              }
              if(t.companyInfo.levelThreeMajorHazardSourceSum == 0){
                t.companyInfo.levelThreeMajorHazardSourceDesc = ''
              }
              if(t.companyInfo.levelFourMajorHazardSourceSum == 0){
                t.companyInfo.levelFourMajorHazardSourceDesc = ''
              }
              // const {validityDate,companyCityValue, ...data} = t.companyInfo
              var formData = t.initFile()
              // return
              if (t.companyInfo.id == null) {
                saveCompanyInfo(formData).then(res => {
                  if (res.code == 200) {
                    t.loading = false
                    t.$message(res.msg, 'success', 3 * 1000)
                  } else {
                    t.loading = false
                    t.$message(res.msg, 'errot', 3 * 1000)
                  }
                }).catch(function () {
                  this.$message('添加失败!请重试', 'error', 3 * 1000)
                  this.loading = false
                })
              } else {
                updateCompanyInfo(formData).then(res => {
                  if (res.code == 200) {
                    t.loading = false
                    t.$message(res.msg, 'success', 3 * 1000)
                  } else {
                    t.loading = false
                    t.$message(res.msg, 'errot', 3 * 1000)
                  }
                }).catch(function () {
                  t.$message('修改失败!请重试', 'error', 3 * 1000)
                  t.loading = false
                })
              }
              t.$parent.getProInfo()
              if(t.$parent.pageStatus==1){
                t.$parent.getData()
              }else{
                t.$parent.getAllCompany()
              }
              t.centerDialogVisible = false
            } else {
              t.loading = false
              return false
            }
          })
        },
        initFile() {
          let formData = new FormData()
          for (const fileName in this.companyInfo) {
            if (this.companyInfo[fileName] != null && fileName != 'params' && fileName != 'imageBase64') {
              formData.append(fileName, this.companyInfo[fileName])
            }
          }
          return formData
        },
        reset(){
          this.companyImageList = []
          this.businessLicenseList = []
          this.securityCertificateList = []
          this.companyInfo = {
              id: null,
              companyName: '',
              companyLegalRepresentative: '',
              certificateType: null,
              certificateNum: '',
              validityDate: [],
              validityDateStart: '',
              validityDateEnd: '',
              technologyType: null,
              companyCityValue: [],
              companyCity: '',
              companyArea: '',
              companyAddress: '',
              licenseScope: '',
              licenceIssuingAuthority: '',
              licenceIssuingTime: '',
              levelOneMajorHazardSourceSum: 0,
              levelOneMajorHazardSourceDesc: '',
              levelTwoMajorHazardSourceSum: 0,
              levelTwoMajorHazardSourceDesc: '',
              levelThreeMajorHazardSourceSum: 0,
              levelThreeMajorHazardSourceDesc: '',
              levelFourMajorHazardSourceSum: 0,
              levelFourMajorHazardSourceDesc: '',
              companyInfo: '',
              keynoteGreatSituation: '',
              safetyProductionLicenseSituation: '',
              mainSafetyRisks: '',
              currentProblems: '',
              safetyRiskControlMeasures: '',
              companyImageFile: null,
              businessLicenseFile: null,
              securityCertificateFile: null
          }
        }
      },
    }
</script>
<style lang="scss" scoped>
::v-deep .el-upload--picture-card {
  background-color: #fbfdff;
  border: 1px dashed #c0ccda;
  border-radius: 6px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  line-height: 100px;
  vertical-align: top;
}
.el-date-editor.el-input {
  width: 100%;
}
</style>
src/views/management/index.vue
对比新文件
@@ -0,0 +1,602 @@
<template>
  <div class="app-container">
    <div class="hand">
      <PageTitle title="企业管理"></PageTitle>
      <div class='searchBar'>
        <el-row :gutter="20">
          <el-col :span="6">
            <span style='white-space: nowrap'>公司名称:</span>
            <el-input v-model="searchParams.companyName"></el-input>
          </el-col>
          <el-col :span="6">
            <span style='white-space: nowrap'>证书编号:</span>
            <el-input v-model="searchParams.certificateNum"></el-input>
          </el-col>
          <el-col :span="6">
            <span style='white-space: nowrap'>工艺类型:</span>
            <el-select clearable v-model="searchParams.technologyType" style="width: 100%" @change='getAllCompany()'>
              <el-option v-for='(item,index) in techTypeList' :label="item.technologyName" :value="item.id" :key='index'></el-option>
            </el-select>
          </el-col>
          <el-col :span="6">
            <span style='white-space: nowrap'>许可证状态:</span>
            <el-select clearable v-model="searchParams.validityState" style="width: 100%" @change='getAllCompany()'>
              <el-option label="正常在期(非临期)" :value="4"></el-option>
              <el-option label="30天内到期" :value="1"></el-option>
              <el-option label="31~60天内到期" :value="2"></el-option>
              <el-option label="61~90天内到期" :value="3"></el-option>
              <el-option label="已到期" :value="0"></el-option>
            </el-select>
          </el-col>
        </el-row>
        <el-row style='margin-top: 20px'>
          <el-col style='display: flex;align-items: center;justify-content: end'>
            <el-button v-stop-re-click type="primary" size="medium" icon="el-icon-search" @click="getAllCompany()">查询</el-button>
            <el-button v-stop-re-click type="primary" size="medium" icon="el-icon-search" @click="resetSearch()" style="margin: 0 0 0 10px">重置</el-button>
            <el-button v-stop-re-click type="primary" size="medium" icon="el-icon-plus" @click="addCompany" style="margin: 0 10px">新增</el-button>
            <el-button v-stop-re-click icon="el-icon-upload" size="medium" type="primary" style='margin-left: 0' @click="uploadDialog = true">导入</el-button>
            <el-button v-stop-re-click v-if='pageStatus==1' icon="el-icon-download" size="medium" type="primary" @click="handleDownload" style='margin-left: 10px'>导出</el-button>
          </el-col>
        </el-row>
      </div>
    </div>
    <div class='wholeProvince'>
      全疆共计危险化学品生产与经营企业<span style='color: red'>{{provinceInfo.enterpriseNum}}</span>家,含重大危险源<span style='color: blue'>{{provinceInfo.majorHazardSourceNum}}</span>个,预计:许可证30天内到期企业共<span class='underline redColor' @click='getSearchData(1)'>{{provinceInfo.oneMonthEnterpriseNum}}</span>家,31~60天内到期企业<span class='underline yellowColor' @click='getSearchData(2)'>{{provinceInfo.twoMonthEnterpriseNum}}</span>家,61~90天内到期企业<span class='underline blueColor' @click='getSearchData(3)'>{{provinceInfo.threeMonthEnterpriseNum}}</span>家。
    </div>
    <div v-if='pageStatus == 1'>
      <el-row class='filter-bar'>
        <el-col :span='4'>
          <el-select clearable v-model="search.city" style="width: 100%" @change="changeCity">
            <el-option v-for='(item,index) in areaInfo' :label="item.label" :value="item.label" :key='index'></el-option>
          </el-select>
        </el-col>
        <el-col :span='20' class='city-info'>
          许可证到期提醒:本市许可证30天内到期企业<span class='underline redColor' @click='filterData(1)'>{{oneMonthCity}}</span>家,60天内到期企业<span class='underline yellowColor' @click='filterData(2)'>{{twoMonthCity}}</span>家,90天内到期企业<span class='underline blueColor' @click='filterData(3)'>{{threeMonthCity}}</span>家。
        </el-col>
      </el-row>
      <el-table class="areaSheet" :data="tableRowData" :span-method="objectSpanMethod" :cell-class-name="tableRowClassName" @cell-mouse-leave="cellMouseLeave"  @cell-mouse-enter="cellMouseEnter" border :header-cell-style="{ background: '#f4f4f4' }" style="width: 100%; margin-top: 20px">
        <el-table-column prop="area" label="区县" align='center'></el-table-column>
        <el-table-column prop="enterpriseNum" label="企业总数" align='center'></el-table-column>
        <el-table-column prop="companyName" label="企业名称" align='center'>
          <template slot-scope="scope">
            <span style='color: #11abff;text-decoration: underline;cursor: pointer' @click='viewDetails(scope.row)'>{{ scope.row.companyName }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="validityState" label="许可证状态" align='center'>
          <template slot-scope="scope">
            {{scope.row.validityState == 0 ? '已到期':(scope.row.validityState == 1 ? '30天内到期' :(scope.row.validityState == 2 ? '31~60天内到期' : (scope.row.validityState == 3 ? '61~90天内到期' : '正常在期(非临期)')))}}
          </template>
        </el-table-column>
        <el-table-column prop="certificateNum" label="证书编号" align='center'></el-table-column>
        <el-table-column prop="technologyType" label="工艺类型" :formatter='toNames' align='center'></el-table-column>
        <el-table-column prop="majorHazardSourceLevel" label="重大危险源等级" align='center'>
          <template slot-scope="scope">
            {{scope.row.majorHazardSourceLevel==0 ? '无重大危险源' : scope.row.majorHazardSourceLevel}}
          </template>
        </el-table-column>
        <el-table-column label="操作" width="150" align='center'>
          <template slot-scope="scope">
            <el-button v-stop-re-click type="primary" icon="el-icon-edit" size="medium" circle @click='editCompany(scope.row)'></el-button>
            <el-button v-stop-re-click type="danger" icon="el-icon-delete" size="medium" circle @click='deleteCompany(scope.row.id)'></el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div v-else>
      <div v-for='(item,index) in allData' :key='index' style='margin-bottom: 20px'>
        <div style='font-size: 16px;font-weight: bolder'>
          {{item.city}}
        </div>
        <el-table class="areaSheet" :data="item.enterprisesList" :span-method="objectSpanMethod" :cell-class-name="tableRowClassName" @cell-mouse-leave="cellMouseLeave"  @cell-mouse-enter="cellMouseEnter" border :header-cell-style="{ background: '#f4f4f4' }" style="width: 100%; margin-top: 10px">
          <el-table-column prop="area" label="区县" align='center'></el-table-column>
          <el-table-column prop="enterpriseNum" label="企业总数" align='center'></el-table-column>
          <el-table-column prop="companyName" label="企业名称" align='center'>
            <template slot-scope="scope">
              <span style='color: #11abff;text-decoration: underline;cursor: pointer' @click='viewDetails(scope.row)'>{{ scope.row.companyName }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="validityState" label="许可证状态" align='center'>
            <template slot-scope="scope">
              {{scope.row.validityState == 0 ? '已到期':(scope.row.validityState == 1 ? '30天内到期' :(scope.row.validityState == 2 ? '31~60天内到期' : (scope.row.validityState == 3 ? '61~90天内到期' : '正常在期(非临期)')))}}
            </template>
          </el-table-column>
          <el-table-column prop="certificateNum" label="证书编号" align='center'></el-table-column>
          <el-table-column prop="technologyType" label="工艺类型" :formatter='toNames' align='center'></el-table-column>
          <el-table-column prop="majorHazardSourceLevel" label="重大危险源等级" align='center'>
            <template slot-scope="scope">
              {{scope.row.majorHazardSourceLevel==0 ? '无重大危险源' : scope.row.majorHazardSourceLevel}}
            </template>
          </el-table-column>
          <el-table-column label="操作" width="150" align='center'>
            <template slot-scope="scope">
              <el-button type="primary" icon="el-icon-edit" size="medium" circle @click='editCompany(scope.row)'></el-button>
              <el-button type="danger" icon="el-icon-delete" size="medium" circle @click='deleteCompany(scope.row.id)'></el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </div>
    <company-dialog :typeList='techTypeList' ref="company"></company-dialog>
    <company-detail-dialog :typeList='techTypeList' ref="detail"></company-detail-dialog>
    <el-dialog title="数据导入" :visible.sync="uploadDialog" width="40%" center>
      <el-form
        ref="importForm"
        label-position="right"
        label-width="120px"
        style="margin-left:50px;width:500px;"
        element-loading-text="导入中..."
      >
        <el-form-item label="导入文件:">
          <input ref="importLabInput" type="file" accept=".xls, .xlsx">
        </el-form-item>
        <el-form-item label="excel参考模板:">
          <el-button v-stop-re-click type="text" @click="downLoadTemplate">下载模板</el-button>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="uploadDialog = false">取消</el-button>
        <el-button v-stop-re-click :disabled="importDisabled" type="primary" @click="importHandle()">导入</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import PageTitle from '@/components/PageTitle/index.vue'
import FileSaver from 'file-saver'
import XLSX from 'xlsx'
import {
  searchCompanyList,
  getOneCompany,
  getAllCompany,
  deleteById,
  importCompanyData,
  getAreaInfo,
  getProvinceInfo,
  getTechType,
  downLoadTemplate
} from '@/api/company';
import companyDialog from './component/companyDialog'
import companyDetailDialog from './component/companyDetailDialog'
export default {
  components: {
    PageTitle,
    companyDialog,
    companyDetailDialog
  },
  data() {
    return {
      pageStatus: 1,
      searchParams: {
        companyName: null,
        certificateNum: null,
        technologyType: null,
        validityState: null
      },
      search: {
        city: '乌鲁木齐市',
        validityState: null
      },
      oneMonthCity: null,
      twoMonthCity: null,
      threeMonthCity: null,
      areaInfo: [],
      provinceInfo: {},
      techTypeList: [],
      alPosition: 'left',
      dataList: [],
      loading: false,
      uploadDialog: false,
      importDisabled: false,
      allData: [],
      tableRowData: [],
      rowIndex: '-1',
      OrderIndexArr: [],
      hoverOrderArr: []
    }
  },
  mounted() {
    const t = this
    t.getAreaInfo()
    t.getProInfo()
    t.getData()
    t.getTechType()
  },
  watch: {},
  methods: {
    getAreaInfo() {
      getAreaInfo().then(res => {
        if(res.code == 200){
          this.areaInfo = res.data;
        }else{
          this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
        }
      })
    },
    changeCity(val){
      this.search.city = val
      this.search.validityState = null
      this.getData()
    },
    getProInfo() {
      getProvinceInfo().then(res => {
        if(res.code == 200){
          this.provinceInfo = res.data
        }else{
          this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
        }
      })
    },
    getAllCompany() {
      const t = this
      t.allData = []
      t.pageStatus = 2
      getAllCompany(t.searchParams).then(res => {
        if(res.code == 200){
          t.allData = res.data;
          if(Array.isArray(t.allData)){
            for(let item of t.allData){
              item['enterprisesList'] = []
              if(Array.isArray(item.companyInfoResults)){
                item.companyInfoResults.map(i=>{
                  if(Array.isArray(i.enterprises)){
                    i.enterprises.map((subRes, subIndex)=>{
                      let content = {}
                      content = subRes
                      content['area'] = i.area
                      content['enterpriseNum'] = i.enterpriseNum
                      // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可
                      if(subIndex == 0){
                        content['rowNum'] = i.enterprises.length
                      }
                      item.enterprisesList.push(content)
                    })
                  }
                })
              }else{
                t.allData = []
              }
            }
          }
        }else{
          t.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
        }
      })
    },
    getSearchData(type){
      const t = this
      t.searchParams = {
        companyName: null,
        certificateNum: null,
        technologyType: null,
        validityState: type
      }
      t.getAllCompany()
    },
    resetSearch(){
      const t = this
      t.pageStatus = 1
      t.searchParams = {
        companyName: null,
        certificateNum: null,
        technologyType: null,
        validityState: null
      }
      t.search = {
          city: '乌鲁木齐市',
          validityState: null
      },
      t.getData()
    },
    async getTechType() {
      await getTechType().then(res => {
        if(res.code == 200){
          this.techTypeList = res.data;
        }else{
          this.$message(res.msg || '查询失败!请重试', 'error', 3 * 1000)
        }
      })
    },
    getData() {
      const t = this
      t.tableRowData = []
      t.loading = true;
      getOneCompany(t.search).then(res => {
        t.loading = false;
        const tableData = res.data.companyInfoResults || []
        t.oneMonthCity = res.data.oneMonthEnterpriseNum || 0
        t.twoMonthCity = res.data.twoMonthEnterpriseNum || 0
        t.threeMonthCity = res.data.threeMonthEnterpriseNum || 0
        if(Array.isArray(tableData)){
          tableData.map(item=>{
            if(Array.isArray(item.enterprises)){
              item.enterprises.map((subRes, subIndex)=>{
                let content = {}
                content = subRes
                content['area'] = item.area
                content['enterpriseNum'] = item.enterpriseNum
                // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可
                if(subIndex == 0){
                  content['rowNum'] = item.enterprises.length
                }
                t.tableRowData.push(content)
              })
            }
          })
        }
      })
    },
    viewDetails(row){
      const t = this
      t.$refs.detail.companyInfo = {}
      t.$refs.detail.getEnterpriseInfo(row.id)
      t.$refs.detail.dialogVisible = true
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // columnIndex 代表列数,从0开始计数,我们要合并的字段属于第一列,取0
      if(columnIndex == 0 || columnIndex == 1){
        return {
          rowspan: row.rowNum, // 待合并行数 -- 合并的行数长度就等于之前赋值的子数据的长度;未赋值的即表示0,不显示
          colspan: row.rowNum>0?1:0  // 待合并列数 -- 合并的列数自身占一列,被合并的要返回0,表示不显示
        };
      }
    },
    load() {
      this.searchParams.pageNum++
      var _this = this
      this.loading = true;
      searchCompanyList(this.searchParams).then(res => {
        this.loading = false;
          if (res.code == 200) {
            if (res.data.list.length > 0) {
              for (let i = 0; i < res.data.list.length; i++) {
                _this.dataList.push(res.data.list[i])
                _this.dataList.forEach(n => {
                  if (n.companyImage) {
                    n.companyImageUrl = process.env.VUE_APP_BASE_API + n.companyImage
                  }
                })
              }
            }
          }else {
            this.$message(res.msg || '查询失败!请重试', 'errot', 3 * 1000)
          }
      })
    },
    toNames(row, column, cellValue, index){
      // this.getTechType()
      const obj = this.techTypeList.find((item) => item.id == row.technologyType)
      if(obj&&obj.technologyName){
        return obj.technologyName
      }
    },
    addCompany() {
      const t = this
      // t.$refs.company.companyInfo = {}
      // t.$refs.company.companyInfo.levelOneMajorHazardSourceSum = 0
      // t.$refs.company.companyInfo.levelTwoMajorHazardSourceSum = 0
      // t.$refs.company.companyInfo.levelThreeMajorHazardSourceSum = 0
      // t.$refs.company.companyInfo.levelFourMajorHazardSourceSum = 0
      t.$refs.company.title = '企业信息新增'
      t.$refs.company.getTechType()
      t.$refs.company.centerDialogVisible = true
    },
    editCompany(row) {
      const t = this
      t.$refs.company.title = '企业信息修改'
      t.$refs.company.companyInfo = {}
      t.$refs.company.getTechType()
      t.$refs.company.getEnterpriseInfo(row.id)
      t.$refs.company.companyImageList = []
      t.$refs.company.businessLicenseList = []
      t.$refs.company.securityCertificateList = []
      t.$refs.company.centerDialogVisible = true
      t.$refs.company.$forceUpdate()
    },
    deleteCompany(id) {
      const t = this
      t.$confirm('此操作将删除该企业信息, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteById({ id: id }).then((res)=>{
          if(res.code == 200){
            t.$message(res.msg || '删除成功!')
            t.getProInfo()
            if(t.pageStatus==1){
              t.getData()
            }else{
              t.getAllCompany()
            }
          }else{
            t.$message(res.msg || '删除失败,请重试', 'error', 3 * 1000)
          }
        })
      }).catch(() => {
        t.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    handleDownload() { //导出
      let sheetName = this.search.city + '企业统计表'
      let wb = XLSX.utils.table_to_book(document.querySelector('.areaSheet'))
      let wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
      try {
        FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), sheetName + '.xlsx')
      } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
    },
    tableRowClassName({row,rowIndex}) {
      let arr = this.hoverOrderArr
      for (let i = 0; i < arr.length; i++) {
        if (rowIndex == arr[i]) {
          return 'hovered-row'
        }
      }
    },
    cellMouseEnter(row, column, cell, event) {
      this.rowIndex = row.rowIndex;
      this.hoverOrderArr = [];
      this.OrderIndexArr.forEach(element => {
        if (element.indexOf(this.rowIndex) >= 0) {
          this.hoverOrderArr = element
        }
      })
    },
    cellMouseLeave(row, column, cell, event) {
      this.rowIndex = '-1'
      this.hoverOrderArr = [];
    },
    handleChangeArea(row) {
      this.searchParams.companyCity = row[1];
    },
    downLoadTemplate() {
      downLoadTemplate().then(res => {
        var blob = new Blob([res])
        var downloadElement = document.createElement('a')
        var href = window.URL.createObjectURL(blob) //创建下载的链接
        downloadElement.href = href
        downloadElement.download = '导入模板.xlsx' //下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() //点击下载
        document.body.removeChild(downloadElement) //下载完成移除元素
        window.URL.revokeObjectURL(href) //释放掉blob对象
      }).catch(err => {
        this.$message("模板下载失败!请联系管理员", 'error', 3 * 1000)
      })
    },
    importHandle() {
      const t = this
      const formData = new FormData()
      const files = t.$refs['importLabInput'].files
      if (files && files.length > 0) {
        formData.append('file', files[0])
      } else {
        t.$message("请选择需要导入的文件", 'error', 3 * 1000)
        return;
      }
      importCompanyData(formData).then((res) => {
        t.$refs['importLabInput'].value = "";
        if (res.code == 200) {
          t.$message(res.msg, 'success', 3 * 1000)
          //调用表格方法,刷新页面
          t.getProInfo()
          if(t.pageStatus==1){
            t.getData()
          }else{
            t.getAllCompany()
          }
          t.uploadDialog = false;
        } else {
          t.$message(res.msg, 'error', 3 * 1000)
        }
      })
    }
  }
}
</script>
<style lang='scss' scoped>
.hand {
  width: 100%;
  background-color: #fff;
  margin-bottom: 20px;
  .searchBar{
    padding: 10px 20px;
    .el-col{
      display: flex;
      align-items: center;
    }
  }
}
.wholeProvince{
  width: 100%;
  padding: 20px;
  background: #fff3b5;
  border-radius: 4px;
  font-size: 16px;
  margin-bottom: 20px;
  span{
    font-size: 20px;
    margin: 0 10px;
  }
}
.filter-bar{
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  .city-info{
      display: flex;
      align-items: center;
      justify-content: end;
      font-size: 16px;
    span{
      font-size: 20px;
      margin: 0 10px;
    }
  }
}
.underline{
  text-decoration: underline;
  cursor: pointer;
}
.redColor{
  color: #ef1515
}
.yellowColor{
  color: #ff8d00;
}
.blueColor{
  color: #2af;
}
.el-select{
  width: 100% !important;
}
::v-deep .el-dialog__header {
  text-align: left;
  padding: 20px 31px 10px;
}
.el-date-editor{
  width: 100%;
}
::v-deep .el-dialog__title:before {
  content: '';
  position: absolute;
  left: 20px;
  top: 22px;
  width: 4px;
  height: 18px;
  background-color: #108EE9;
}
::v-deep .el-textarea__inner {
  height: 110px;
}
</style>
<style>
.el-table .hovered-row {
  background: #f5f7fa;
}
</style>
src/views/managementCopy/index.vue
对比新文件
@@ -0,0 +1,863 @@
<template>
  <div class="app-container">
    <div class="hand">
      <PageTitle title="企业管理"></PageTitle>
      <el-form ref="form" :model="searchParams" label-width="90px" style="padding:10px 0 5px 0">
        <el-row>
          <el-col :span="6">
            <el-form-item label="公司名称">
              <el-input v-model="searchParams.companyName"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="负责人">
              <el-input v-model="searchParams.companyDirector"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="证书编号">
              <el-input v-model="searchParams.certificateNum"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="是否到期">
              <el-select clearable v-model="searchParams.isValid" style="width: 100%">
                <el-option label="否" value="0"></el-option>
                <el-option label="是" value="1"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="6">
            <el-form-item label="所在地区">
              <el-cascader
                v-model="searchParams.areaInfo"
                style="width: 100%"
                :options="areaInfo"
                :props="{ expandTrigger: 'hover' }"
                clearable
                @change="handleChangeArea"
              ></el-cascader>
            </el-form-item>
          </el-col>
          <el-col :span="7" :offset="11" align="center">
            <el-form-item>
              <el-button plain type="primary" icon="el-icon-search" size="small" @click="getData">
                查询
              </el-button>
              <el-button plain type="primary" size="small" icon="el-icon-plus" @click="addCompany"
                         style="margin-left: 0px"
              >
                新增
              </el-button>
              <!--              <el-upload action="" :auto-upload="false" :multiple="false" :show-file-list="false"-->
              <!--                         :on-change="uploadByJsqd" :file-list="fileList" style="display: inline;"-->
              <!--              >-->
              <el-button plain icon="el-icon-upload2" @click="showExportDiv=true" type="primary" size="small">
                导入
              </el-button>
              <!--              </el-upload>-->
              <el-button plain icon="el-icon-download" type="primary" size="small" @click="handleDownload">
                导出
              </el-button>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </div>
    <ul class="infinite-list" v-infinite-scroll="load" :infinite-scroll-delay="200" infinite-scroll-distance="1">
      <li v-for="(item,index) in dataList" :key="index" class="infinite-list-item">
        <div class="box">
          <el-row class="box-net">
            <el-col :span="4">
              <img v-show="item.companyImageUrl!= null && item.companyImageUrl != ''" class="images"
                   :src="item.companyImageUrl" alt=""
              />
              <img v-show="item.companyImageUrl== null || item.companyImageUrl == ''" class="images"
                   src="../../assets/bg.png" alt=""
              />
            </el-col>
            <el-col :span="19" :offset="1">
              <div>
                <img class="expireImages" v-show="item.isExpire" src="../../assets/expire.png"
                     style="" alt=""
                />
              </div>
              <div class="className">
                <span @click="showDetails(item)">{{ item.companyName }}</span>
                <el-button style="float: right;margin-left: 10px;" type="danger" icon="el-icon-delete" circle
                           @click="deleteCompany(item)"
                ></el-button>
                <el-button style="float: right;" type="primary" icon="el-icon-edit" circle
                           @click="editCompany(item)"
                ></el-button>
              </div>
              <el-row class="title">
                <el-col :span="6">负责人:<span>{{ item.companyDirector }}</span></el-col>
                <el-col :span="6">证书编号:<span>{{ item.certificateNum }}</span></el-col>
                <el-col :span="6">有效期:<span>{{ item.validityDateStart }} - {{ item.validityDateEnd }}</span></el-col>
                <el-col :span="6">重大危险源数量:<span style="color: red">{{ item.majorHazardSources }}</span></el-col>
              </el-row>
              <el-row class="title">
                <el-col :span="6">所在地区:<span>{{ item.companyCity }}</span></el-col>
              </el-row>
              <p class="information">
                {{ item.companyInfo }}
              </p>
            </el-col>
          </el-row>
        </div>
      </li>
    </ul>
    <el-dialog title="数据导入" :visible.sync="showExportDiv" width="30%" center>
      <el-form
        ref="importForm"
        label-position="right"
        label-width="120px"
        style="margin-left:50px;width:500px;"
        element-loading-text="导入中..."
      >
        <el-form-item label="导入文件:">
          <input ref="importLabInput" type="file" accept=".xls, .xlsx" style="color: red">
        </el-form-item>
        <el-form-item label="excel参考模板:">
          <el-button type="text" @click="downLoadTemplate">下载模板</el-button>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="showExportDiv = false">取消</el-button>
        <el-button :disabled="importDisabled" type="primary" @click="importHandle()">导入</el-button>
      </div>
    </el-dialog>
    <el-dialog :title="title" :visible.sync="centerDialogVisible" width="70%" center>
      <el-form :model="companyInfo" :rules="rules" ref="ruleForm" label-position="center" label-width="120 rpm"
               class="demo-form-inline"
      >
        <el-row>
          <el-col :span="10">
            <el-form-item label="企业名称 " prop="companyName">
              <el-input v-model="companyInfo.companyName" placeholder="企业名称"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="10" :offset="4">
            <el-form-item label="企业负责人" prop="companyDirector">
              <el-input v-model="companyInfo.companyDirector" placeholder="企业负责人"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="10">
            <el-form-item label=" 证书编号" prop="certificateNum">
              <el-input v-model="companyInfo.certificateNum" placeholder="证书编号">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="10" :offset="4">
            <el-form-item label="证书有效期" prop="validityDate">
              <el-date-picker
                v-model="companyInfo.validityDate"
                @input="changeTime"
                @blur="changeTime"
                value-format="yyyy-MM-dd"
                type="daterange"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="10">
            <el-form-item label="所在地区" prop="companyCity">
              <el-cascader
                v-model="companyInfo.companyCityValue"
                :options="areaInfo"
                :props="{ expandTrigger: 'hover' }"
                style="width: 100%"
                @change="handleChangeAddArea"
              ></el-cascader>
              <!--              <el-input v-model="companyInfo.companyCity" style="width: 100%" placeholder="所在城市">-->
              <!--              </el-input>-->
            </el-form-item>
          </el-col>
          <el-col :span="10" :offset="4">
            <el-form-item label="重大危险源数量" prop="majorHazardSources">
              <el-input v-model="companyInfo.majorHazardSources" style="width: 100%"
                        placeholder="重大危险源数量"
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-dialog :visible.sync="dialogVisible" style="z-index: 999999">
          <img width="100%" :src="dialogImageUrl" alt="">
        </el-dialog>
        <el-row>
          <el-col :span="8">
            <el-form-item label="企业图片 " prop="companyImage">
              <el-upload
                action="#" ref="upload" :http-request="httpRequestCompanyImage" list-type="picture-card"
                v-model="companyInfo.companyImage"
                :on-success="fileUploadSuccess" :before-upload="addFileList"
                :limit="1"
                :file-list="companyImageList"
                accept=".jpg,.jpeg,.png"
                :on-change="(file, fileList) => {handleChangeFile(file, fileList, 1)}"
                :on-remove="(file, fileList) => {handleRemove(file, fileList, 1)}"
              >
                <i class="el-icon-plus"></i>
              </el-upload>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="营业执照 " prop="businessLicense">
              <el-upload size="small"
                         action="#" ref="upload" :http-request="httpRequestBusinessLicense" list-type="picture-card"
                         v-model="companyInfo.businessLicense"
                         :on-success="fileUploadSuccess"
                         :before-upload="addFileList"
                         :limit="1"
                         :file-list="businessLicenseList"
                         :on-change="(file, fileList) => {handleChangeFile(file, fileList, 2)}"
                         accept=".jpg,.jpeg,.png"
                         :on-remove="(file, fileList) => {handleRemove(file, fileList, 2)}"
              >
                <i class="el-icon-plus"></i>
              </el-upload>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="经营许可证书 " prop="securityCertificate">
              <el-upload
                action="#" ref="upload" :http-request="httpRequestSecurityCertificate" list-type="picture-card"
                v-model="companyInfo.securityCertificate"
                :on-success="fileUploadSuccess" :before-upload="addFileList"
                :limit="1"
                :file-list="securityCertificateList"
                :on-change="(file, fileList) => {handleChangeFile(file, fileList, 3)}"
                accept=".jpg,.jpeg,.png"
                :on-remove="(file, fileList) => {handleRemove(file, fileList, 3)}"
              >
                <i class="el-icon-plus"></i>
              </el-upload>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <el-form :model="companyInfo" class="demo-form-inline" style="padding-left: 40px;">
        <el-row>
          <el-col :span="24">
            <el-form-item label="企业基本情况">
              <el-input v-model="companyInfo.companyInfo" type="textarea" style="width: 100%;" placeholder="">
              </el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="“两重点一重大”情况">
              <el-input v-model="companyInfo.keynoteGreatSituation" type="textarea" style="width: 100%"
                        placeholder=""
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="安全生产情况">
              <el-input v-model="companyInfo.safetyProductionLicenseSituation" type="textarea" style="width: 100%"
                        placeholder=""
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="主要安全风险">
              <el-input v-model="companyInfo.mainSafetyRisks" style="width: 100%" type="textarea" placeholder="">
              </el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="当前存在问题">
              <el-input v-model="companyInfo.currentProblems" style="width: 100%" type="textarea"
                        placeholder=""
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="安全风险主要控制措施">
              <el-input v-model="companyInfo.safetyRiskControlMeasures" style="width: 100%" type="textarea"
                        placeholder=""
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
                <el-button @click="centerDialogVisible = false">取 消</el-button>
                <el-button type="primary" :loading="loading" @click="saveData">确 定</el-button>
            </span>
    </el-dialog>
  </div>
</template>
<script>
import PageTitle from '@/components/PageTitle/index.vue'
import FileSaver from 'file-saver'
import XLSX from 'xlsx'
import {
  searchCompanyList,
  saveCompanyInfo,
  updateCompanyInfo,
  deleteById,
  importCompanyData,
  exportCompanyData,
  getAreaInfo,
  downLoadTemplate
} from '@/api/company'
export default {
  components: {
    PageTitle
  },
  data() {
    return {
      fileList: [],
      companyImageList: [],
      businessLicenseList: [],
      securityCertificateList: [],
      dialogVisible: false,
      dialogImageUrl: '',
      importFile: {},
      importDisabled: false,
      searchParams: {
        companyName: '',
        companyDirector: '',
        certificateNum: '',
        pageNum: 1,
        pageSize: 5
      },
      areaInfo: [],
      companyInfo: {
        areaInfo: null
      },
      centerDialogVisible: false,
      showExportDiv: false,
      title: '',
      alPosition: 'left',
      dataList: [],
      loading: false,
      rules: {
        companyCity: [
          {required: true, message: '请输入企业所在城市', trigger: 'blur'}
        ],
        companyName: [
          {required: true, message: '请输入企业名称', trigger: 'blur'}
        ],
        companyDirector: [
          {required: true, message: '请输入企业负责人', trigger: 'blur'}
        ],
        certificateNum: [
          {required: true, message: '请输入证书编号', trigger: 'blur'}
        ],
        validityDate: [
          {
            type: 'array',
            required: true,
            message: '请选择日期区间',
            fields: {
              //tpye类型试情况而定,所以如果返回的是date就改成date
              0: {type: 'string', required: true, message: '请选择开始日期'},
              1: {type: 'string', required: true, message: '请选择结束日期'}
            }
          }
        ],
        majorHazardSources: [
          {required: true, message: '请输入重大危险源数量', trigger: 'blur'}
        ]
      }
    }
  },
  mounted() {
    this.getAreaInfo();
    this.getData()
  },
  watch: {
    centerDialogVisible(newValue, oldValue) {
      if (!newValue) {
        this.companyImageList = []
        this.businessLicenseList = []
        this.securityCertificateList = []
      }
    }
  },
  methods: {
    getAreaInfo() {
      getAreaInfo().then(res => {
        this.areaInfo = res.data;
      })
    },
    fileUploadSuccess(response, file, fileList) {
    },
    addFileList(file) {
    },
    handleRemove(file, fileList, index) {
      if (index == 1) {
        this.companyInfo.deleteCompanyImage = true
      }
      if (index == 2) {
        this.companyInfo.deleteBusinessLicense = true
      }
      if (index == 3) {
        this.companyInfo.deleteSecurityCertificate = true
      }
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.dialogVisible = true
    },
    getData() {
      this.searchParams.pageNum = 1
      this.dataList = []
      this.loading = true;
      searchCompanyList(this.searchParams).then(res => {
        this.loading = false;
        this.dataList = res.data.list
        this.dataList.forEach(n => {
          if (n.companyImage) {
            n.companyImageUrl = process.env.VUE_APP_BASE_API + n.companyImage
          }
        })
      })
    },
    load() {
      this.searchParams.pageNum++
      var _this = this
      this.loading = true;
      searchCompanyList(this.searchParams).then(res => {
        this.loading = false;
          if (res.code == 200) {
            if (res.data.list.length > 0) {
              for (let i = 0; i < res.data.list.length; i++) {
                _this.dataList.push(res.data.list[i])
                _this.dataList.forEach(n => {
                  if (n.companyImage) {
                    n.companyImageUrl = process.env.VUE_APP_BASE_API + n.companyImage
                  }
                })
              }
            }
          }else {
            this.$message(res.msg || '查询失败!请重试', 'errot', 3 * 1000)
          }
      })
    },
    changeTime(e) {
      if (this.companyInfo.validityDate == null) {
        this.companyInfo.validityDate = new Array()
        this.companyInfo.validityDate[0] = ''
        this.companyInfo.validityDate[1] = ''
      }
      this.$forceUpdate()
    },
    addCompany() {
      this.companyInfo = {}
      this.title = '企业信息新增'
      this.centerDialogVisible = true
    },
    editCompany(row) {
      this.title = '企业信息修改'
      this.companyInfo = row
      this.companyImageList = []
      this.businessLicenseList = []
      this.securityCertificateList = []
      if (row.companyImage) {
        this.companyImageList.push({'url': process.env.VUE_APP_BASE_API + row.companyImage})
      }
      if (row.businessLicense) {
        this.businessLicenseList.push({'url': process.env.VUE_APP_BASE_API + row.businessLicense})
      }
      if (row.securityCertificate) {
        this.securityCertificateList.push({'url': process.env.VUE_APP_BASE_API + row.securityCertificate})
      }
      this.$set(this.companyInfo, 'validityDate', [row.validityDateStart != null ? row.validityDateStart : '', row.validityDateEnd != null ? row.validityDateEnd : ''])
      this.centerDialogVisible = true
      this.$forceUpdate()
    },
    initFile() {
      let formData = new FormData()
      for (const fileName in this.companyInfo) {
        if (this.companyInfo[fileName] != null && fileName != 'params' && fileName != 'imageBase64') {
          formData.append(fileName, this.companyInfo[fileName])
        }
      }
      return formData
    },
    saveData() {
      this.loading = true
      this.$refs['ruleForm'].validate((valid) => {
        if (valid) {
          this.companyInfo.validityDateStart = this.companyInfo.validityDate[0]
          this.companyInfo.validityDateEnd = this.companyInfo.validityDate[1]
          var formData = this.initFile()
          if (this.companyInfo.id == null) {
            saveCompanyInfo(formData).then(res => {
              if (res.code == 200) {
                this.loading = false
                this.$message(res.msg, 'success', 3 * 1000)
                this.centerDialogVisible = false
                this.getData()
              } else {
                this.loading = false
                this.$message(res.msg, 'errot', 3 * 1000)
              }
            }).catch(function () {
              this.$message('添加失败!请重试', 'error', 3 * 1000)
              this.loading = false
            })
          } else {
            updateCompanyInfo(formData).then(res => {
              if (res.code == 200) {
                this.loading = false
                this.$message(res.msg, 'success', 3 * 1000)
                this.centerDialogVisible = false
                this.getData()
              } else {
                this.loading = false
                this.$message(res.msg, 'errot', 3 * 1000)
              }
            }).catch(function () {
              this.$message('修改失败!请重试', 'error', 3 * 1000)
              this.loading = false
            })
          }
        } else {
          this.loading = false
          return false
        }
      })
    },
    handleChangeFile(file, fileList, index) {
      // this.isDisabled = false
      // if (!file) return
      // const isLt2M = file.size / 1024 / 1024 < 3
      // if (!isLt2M) {
      //   // this.$refs.upload.clearFiles()
      //   this.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
      //   if (index == 1) {
      //     console.log(index)
      //     this.companyImageList = []
      //     this.companyInfo.companyImageFile = null;
      //     console.log(this.companyInfo.companyImageFile)
      //   }
      //   if (index == 2) {
      //     console.log(index)
      //     this.businessLicenseList = []
      //     this.companyInfo.businessLicenseFile = null;
      //   }
      //   if (index == 3) {
      //     console.log(index)
      //     this.securityCertificateList = []
      //     this.companyInfo.securityCertificateFile = null;
      //   }
      // }
      // this.fileName = file.name
    },
    httpRequestCompanyImage(data) {
      let _this = this
      let rd = new FileReader() // 创建文件读取对象
      let file = data.file
      const isLt2M = file.size / 1024 / 1024 < 3
      if (!isLt2M) {
        // this.$refs.upload.clearFiles()
        this.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
        this.companyImageList = [];
        return;
      }
      _this.companyInfo.companyImageFile = file
      rd.readAsDataURL(file) // 文件读取装换为base64类型
      rd.onloadend = function (e) {
        _this.imageUrl = this.result // this指向当前方法onloadend的作用域
      }
    },
    httpRequestBusinessLicense(data) {
      let _this = this
      let rd = new FileReader() // 创建文件读取对象
      let file = data.file
      const isLt2M = file.size / 1024 / 1024 < 3
      if (!isLt2M) {
        // this.$refs.upload.clearFiles()
        this.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
        this.businessLicenseList = [];
        return;
      }
      _this.companyInfo.businessLicenseFile = file
      rd.readAsDataURL(file) // 文件读取装换为base64类型
      rd.onloadend = function (e) {
        _this.imageUrl = this.result // this指向当前方法onloadend的作用域
      }
    },
    httpRequestSecurityCertificate(data) {
      let _this = this
      let rd = new FileReader() // 创建文件读取对象
      let file = data.file
      const isLt2M = file.size / 1024 / 1024 < 3
      if (!isLt2M) {
        // this.$refs.upload.clearFiles()
        this.$message('上传图片大小不能超过 3MB!', 'warn', 3 * 1000)
        this.securityCertificateList = [];
        return;
      }
      _this.companyInfo.securityCertificateFile = file
      rd.readAsDataURL(file) // 文件读取装换为base64类型
      rd.onloadend = function (e) {
        _this.imageUrl = this.result // this指向当前方法onloadend的作用域
      }
    },
    showDetails(item) {
      this.$router.push({path: '/managementDetails', query: {'data': item}})
    },
    deleteCompany(item) {
      this.$confirm('确定要删除数据吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteById(item).then(res => {
          this.$message(res.msg, 'success', 5 * 1000)
          this.getData()
        })
      })
    },
    //文件校验方法
    beforeAvatarUpload(file) {
      // 通过split方法和fileArr方法获取到文件的后缀名
      let fileArr = file.name.split('.')
      let suffix = fileArr[fileArr.length - 1]
      //只能导入.xls和.xlsx文件
      if (!/(xls|xlsx)/i.test(suffix)) {
        this.$message('文件格式不正确', 'warn', 3 * 1000)
        return false
      }
      //不能导入大小超过2Mb的文件
      if (file.size > 2 * 1024 * 1024) {
        this.$message('文件过大,请上传小于2MB的文件〜', 'warn', 3 * 1000)
        return false
      }
      return true
    },
    //文件发生改变就会触发的事件
    uploadByJsqd(file) {
      //判断是否符合beforeAvatarUpload方法中的条件
      if (this.beforeAvatarUpload(file)) {
        this.fileList.name = file.name
        this.fileList.url = ''
        var formdata = new FormData()
        formdata.append('file', file.raw)
        //importDevice:请求接口 formdata:传递参数
        importCompanyData(formdata).then((res) => {
          if (res.code == 200) {
            this.$message(res.msg, 'success', 3 * 1000)
            this.getData()//调用表格方法,刷新页面
          } else {
            this.$message(res.msg, 'error', 3 * 1000)
          }
        })
      }
    },
    handleDownload() { //导出
      exportCompanyData(this.searchParams).then(res => {
        var blob = new Blob([res])
        var downloadElement = document.createElement('a')
        var href = window.URL.createObjectURL(blob) //创建下载的链接
        downloadElement.href = href
        downloadElement.download = '企业管理.xlsx' //下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() //点击下载
        document.body.removeChild(downloadElement) //下载完成移除元素
        window.URL.revokeObjectURL(href) //释放掉blob对象
      }).catch(err => {
        this.$message("导出失败!请联系管理员", 'error', 3 * 1000)
      })
    },
    handleChangeArea(row) {
      this.searchParams.companyCity = row[1];
    },
    handleChangeAddArea(row) {
      this.companyInfo.companyCity = row[1];
    },
    downLoadTemplate() {
      downLoadTemplate(this.searchParams).then(res => {
        var blob = new Blob([res])
        var downloadElement = document.createElement('a')
        var href = window.URL.createObjectURL(blob) //创建下载的链接
        downloadElement.href = href
        downloadElement.download = '导入模板.xlsx' //下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() //点击下载
        document.body.removeChild(downloadElement) //下载完成移除元素
        window.URL.revokeObjectURL(href) //释放掉blob对象
      }).catch(err => {
        this.$message("模板下载失败!请联系管理员", 'error', 3 * 1000)
      })
    },
    importHandle() {
      const _this = this
      const formData = new FormData()
      const files = this.$refs['importLabInput'].files
      if (files && files.length > 0) {
        formData.append('file', files[0])
      } else {
        this.$message("请选择需要导入的文件", 'error', 3 * 1000)
        return;
      }
      importCompanyData(formData).then((res) => {
        this.$refs['importLabInput'].value = "";
        if (res.code == 200) {
          this.$message(res.msg, 'success', 3 * 1000)
          this.getData()//调用表格方法,刷新页面
          this.showExportDiv = false;
        } else {
          this.$message(res.msg, 'error', 3 * 1000)
        }
      })
    }
  }
}
</script>
<style scoped>
.hand {
  background-color: #fff;
  margin-bottom: 20px;
}
.box {
  background-color: #fff;
}
.box-net {
  padding: 20px;
}
.images {
  width: 263px;
  height: 170px;
  padding: 10px;
}
.className {
  font-size: 18px;
  font-weight: bolder;
  line-height: 30px;
}
.className:hover {
  cursor: pointer
}
.title {
  padding: 10px 0;
}
.information {
  width: 100%;
  margin: 0px;
  word-wrap: break-word;
  word-break: break-all;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
  position: relative;
}
.types {
  position: absolute;
  top: 38px;
  right: 4px;
  background-color: #fff;
}
.types span {
  color: dodgerblue;
}
.expireImages {
  position: absolute;
  width: 50px;
  height: 50px;
  left: 23%;
  top: -5%
}
.infinite-list {
  overflow: auto;
  list-style-type: none;
  height: 650px
}
::v-deep .el-dialog__header {
  text-align: left;
  padding: 20px 31px 10px;
}
::v-deep .el-dialog__title:before {
  content: '';
  position: absolute;
  left: 20px;
  top: 22px;
  width: 4px;
  height: 18px;
  background-color: #108EE9;
}
::v-deep .el-upload--picture-card {
  background-color: #fbfdff;
  border: 1px dashed #c0ccda;
  border-radius: 6px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  line-height: 100px;
  vertical-align: top;
}
::v-deep .el-date-editor.el-input, .el-date-editor.el-input__inner {
  width: 100%;
}
::v-deep .el-textarea__inner {
  height: 110px;
}
</style>
src/views/managementDetails/index.vue
对比新文件
@@ -0,0 +1,330 @@
<template>
  <div class="app-container">
    <div class="whole">
      <div class="jieshao">
        <el-row class="box-net">
          <el-col :span="4">
            <img v-show="companyInfo.companyImageUrl!= null && companyInfo.companyImageUrl != ''" class="images"
                 :src="companyInfo.companyImageUrl" alt=""/>
            <img v-show="companyInfo.companyImageUrl== null || companyInfo.companyImageUrl == ''" class="images"
                 src="../../assets/bg.png" alt=""/>
          </el-col>
          <el-col :span="20">
            <div class="className">{{ companyInfo.companyName }}</div>
            <div class="text-whole">
              <div class="line-txt">
                <div class="left-txt">负责人:</div>
                <div class="right-txt">{{ companyInfo.companyDirector }}</div>
              </div>
              <div class="line-txt">
                <div class="left-txt">证书编号:</div>
                <div class="right-txt">{{ companyInfo.certificateNum }}</div>
              </div>
              <div class="line-txt">
                <div class="left-txt">有效期:</div>
                <div class="right-txt">{{ companyInfo.validityDateStart }} - {{ companyInfo.validityDateStart }}</div>
              </div>
              <div class="line-txt">
                <div class="left-txt">重大危险源数量:</div>
                <div class="txt-red">{{ companyInfo.majorHazardSources }}</div>
              </div>
              <div class="line-txt">
                <div class="left-txt">所在地区:</div>
                <div class="right-txt">{{ companyInfo.companyCity }}</div>
              </div>
            </div>
          </el-col>
        </el-row>
      </div>
      <section class="">
        <div class="content list_whole">
          <div ref="left">
            <ul class="list_ul">
              <li v-for="(item, index) in left" :key="item" :class="{current: currentIndex == index}"
                  @click="selectItem(index, $event)">
                {{ item }}
              </li>
            </ul>
          </div>
          <div class="right_box" ref="right">
            <ul class="list_right">
              <li v-for="(item,index) in right" style="height:auto;min-height:400px;" class="right-item-hook" :key="index">
                <div class="list_tit">{{ item.name }}</div>
                <div class="list_txt">{{ item.content }}</div>
                <div>
                  <img
                    v-show="item.prop == 'companyInfo' && companyInfo.businessLicenseImageUrl!= null && companyInfo.businessLicenseImageUrl != ''"
                    class="images" :src="companyInfo.businessLicenseImageUrl" alt=""/>
                  <img
                      v-show="item.prop == 'safetyProductionLicenseSituation' && companyInfo.securityCertificateImageUrl!= null && companyInfo.securityCertificateImageUrl != ''"
                    class="images" :src="companyInfo.securityCertificateImageUrl" alt=""/>
                </div>
              </li>
            </ul>
          </div>
        </div>
      </section>
    </div>
  </div>
</template>
<script>
import {
  getOneCompany
} from '@/api/company'
import BScroll from 'better-scroll'
export default {
  name: "details",
  data() {
    return {
      left: ['一、企业介绍', '二、“两重点一重大”情况', '三、生产安全许可证情况', '四、主要安全风险', '五、当前存在问题', '六、主要安全风险防控措施'],
      right: [
        {
          name: '一、企业介绍',
          prop: "companyInfo",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '二、“两重点一重大”情况',
          prop: "keynoteGreatSituation",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '三、生产安全许可证情况',
          prop: "safetyProductionLicenseSituation",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '四、主要安全风险',
          prop: "keynoteGreatSituation",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '五、当前存在问题',
          prop: "currentProblems",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '六、主要安全风险防控措施',
          prop: "safetyRiskControlMeasures",
          // content: "国家管网集团联合管道有限责任公司西部塔里木输油气分公司机关位于新疆巴州库尔勒市建设路辖区塔指东路塔指院内五区,公司成立于2003年4月,2019年1月1日,轮库复线、轮库气线等资产及管理划转到塔里木油田公司,2020年10月1日,整建制划入国家管网集团公司,业务实现了从“以油为主”到“油气并举”的转变。 主要负责西部管道南疆原油及天然气的交接计量、管道储运管理及维修抢修工作。分公司所辖油气阀室34座,其中气线阀室24座,油线阀室10座。现有员工247人,其中党员119人,占员工总数的48%,安全管理人员48人。塔里木输油气分公司库尔勒原油站位于新疆巴州库尔勒市上户镇库尔勒西立交桥东南1公里处,占地面积三万平方米,年输送原油能力为500万方,共有三座5万方原油储罐,总罐容15万方。"
        },
        {
          name: '',
          content: ""
        },
      ],
      listHeight: [],
      scrollY: 0, //实时获取当前y轴的高度
      clickEvent: false,
      companyInfo: {}
    }
  },
  methods: {
    _initScroll() {
      //better-scroll的实现原理是监听了touchStart,touchend事件,所以阻止了默认的事件(preventDefault)
      //所以在这里做点击的话,需要在初始化的时候传递属性click,派发一个点击事件
      //在pc网页浏览模式下,点击事件是不会阻止的,所以可能会出现2次事件,所以为了避免2次,可以在绑定事件的时候把$event传递过去
      this.lefts = new BScroll(this.$refs.left, {
        click: true
      })
      this.rights = new BScroll(this.$refs.right, {
        probeType: 3  //探针的效果,实时获取滚动高度
      })
      //rights这个对象监听事件,实时获取位置pos.y
      this.rights.on('scroll', (pos) => {
        this.scrollY = Math.abs(Math.round(pos.y))
      })
    },
    _getHeight() {
      let rightItems = this.$refs.right.getElementsByClassName('right-item-hook')
      let height = 0
      this.listHeight.push(height)
      for (let i = 0; i < rightItems.length; i++) {
        let item = rightItems[i]
        height += item.clientHeight
        this.listHeight.push(height)
      }
    },
    selectItem(index, event) {
      this.clickEvent = true
      //在better-scroll的派发事件的event和普通浏览器的点击事件event有个属性区别_constructed
      //浏览器原生点击事件没有_constructed所以当时浏览器监听到该属性的时候return掉
      if (!event._constructed) {
        return
      } else {
        let rightItems = this.$refs.right.getElementsByClassName('right-item-hook')
        let el = rightItems[index]
        this.rights.scrollToElement(el, 300)
      }
    },
    getOneData(data) {
      getOneCompany(data).then(res => {
        this.companyInfo = res.data
        if (this.companyInfo.companyImage) {
          this.companyInfo.companyImageUrl = process.env.VUE_APP_BASE_API + this.companyInfo.companyImage
        }
        if (this.companyInfo.businessLicense) {
          this.companyInfo.businessLicenseImageUrl = process.env.VUE_APP_BASE_API + this.companyInfo.businessLicense
        }
        if (this.companyInfo.securityCertificate) {
          this.companyInfo.securityCertificateImageUrl = process.env.VUE_APP_BASE_API + this.companyInfo.securityCertificate
        }
        for (let item of this.right) {
          item.content = this.companyInfo[item.prop]
        }
      }).catch(function () {
      })
    }
  },
  mounted() {
    if (this.$route.query.data != null) {
      this.getOneData(this.$route.query.data);
    } else {
      this.getOneData({});
    }
    this.$nextTick(() => {
      this._initScroll()
      this._getHeight()
    })
    // scroll() {
    new BScroll(document.querySelector('.right_box'), {
      mouseWheel: true,//开启鼠标滚轮
      disableTouch: false
    })
    // }
  },
  computed: {
    currentIndex() {
      for (let i = 0; i < this.listHeight.length; i++) {
        let height = this.listHeight[i]
        let height2 = this.listHeight[i + 1]
        //当height2不存在的时候,或者落在height和height2之间的时候,直接返回当前索引
        //>=height,是因为一开始this.scrollY=0,height=0
        if (!height2 || (this.scrollY >= height && this.scrollY < height2)) {
          return i
        }
        if (this.listHeight[this.listHeight.length - 1] - this.$refs.right.clientHeight <= this.scrollY) {
          if (this.clickTrue) {
            return this.currentNum
          } else {
            return (this.listHeight.length - 1)
          }
        }
      }
      //如果this.listHeight没有的话,就返回0
      return 0
    }
  },
}
</script>
<style scoped>
ul, li, ol {
  list-style: none;
}
.whole {
  background: #ffffff;
}
.jieshao {
  padding: 20px;
}
.box-net {
  padding: 10px;
  background: #fbfcff;
}
.images {
  width: 250px;
  padding: 10px;
}
.className {
  font-size: 18px;
  font-weight: bolder;
  line-height: 30px;
}
.text-whole {
  margin: 10px 0;
  border-radius: 5px;
}
.line-txt {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  line-height: 30px;
  color: #808183;
}
.right-txt {
  /*font-weight: bold;*/
  color: #000000;
}
.txt-red {
  color: red;
}
/* .list_whole{
  display: flex;
  justify-content: space-between;
} */
.list_ul {
  width: 15vw;
  margin: 0;
  padding: 0 25px 0 47px;
}
.list_ul li {
  padding: 20px 0;
  border-bottom: 1px solid #e4e8eb;
}
.list_right {
  width: 100%;
  padding-left: 0;
}
.list_tit {
  text-align: center;
  font-size: 20px;
  font-weight: bold;
  margin-bottom: 20px;
}
.list_txt {
  margin-bottom: 30px;
}
.content {
  display: flex;
  position: absolute;
  top: 30%;
  bottom: 0;
  width: 98%;
  height: 500px;
  overflow: hidden;
  background: #fff;
  padding: 10px 0;
}
.current {
  color: dodgerblue;
}
.right_box {
  overflow: hidden;
  height: 100%;
  width: 100%;
  padding: 10px 40px;
}
</style>
src/views/news/index.vue
对比新文件
@@ -0,0 +1,249 @@
<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input
        :disabled="disabled"
        v-model="listQuery.searchname"
        placeholder="输入新闻标题搜索"
        style="width: 200px;"
        class="filter-item"
        @change="handleFilter"
        clearable
        @keyup.enter.native="handleFilter"
      />
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('common.search') }}</el-button>
      <el-button class="filter-item" style="margin-left: 2px;" type="primary" icon="el-icon-edit" @click="handleAdd">{{ $t('common.add') }}</el-button>
    </div>
    <el-table stripe :data="list" border fit style="width: 80%">
      <el-table-column label="序号" type="index" align="center" width="60">
        <template slot-scope="scope">
          <span>{{ scope.$index + 1 + (listQuery.page - 1) * 10 }}</span>
        </template>
      </el-table-column>
      <el-table-column label="新闻标题" align="center" width="100">
        <template slot-scope="scope">
          <span>{{ scope.row.newsTitle }}</span>
        </template>
      </el-table-column>
      <el-table-column label="新闻照片" align="center" width="200">
        <template slot-scope="scope">
          <img :src="'/api/file/'+scope.row.newsImgUrl" style="height: 40px;width: 100px" />
        </template>
      </el-table-column>
      <el-table-column label="新闻内容" align="center" width="200">
        <template slot-scope="scope">
          <span>{{ scope.row.newsContent }}</span>
        </template>
      </el-table-column>
      <el-table-column label="新闻时间" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.newsTime }}</span>
        </template>
      </el-table-column>
      <el-table-column label="阅读量" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.readNum }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200">
        <template slot-scope="scope">
          <el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">{{ $t('common.edit') }}</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="disabled ? '查看信息' : dialogState === 1 ? '填写信息' : '修改信息'"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :model="form" :rules="rules" label-width="80px">
        <el-form-item prop="newsTitle" label="新闻标题">
          <el-input :disabled="disabled" v-model="form.newsTitle"></el-input>
        </el-form-item>
        <el-form-item prop="newsImgUrl" label="新闻照片">
          <Uploader ref="child"  v-bind:url="fileUrl"
                    v-bind:name="fileName" v-on:uploadSuccess="uploadSuccess" style="width: 100%"></Uploader>
        </el-form-item>
        <el-form-item prop="newsContent" label="新闻内容">
          <el-input :disabled="disabled" v-model="form.newsContent"></el-input>
        </el-form-item>
        <el-form-item prop="newsTime" label="新闻时间">
          <el-date-picker
            :disabled="disabled"
            v-model="form.newsTime"
            value-format="yyyy-MM-dd HH:mm:ss"
            type="datetime"
            placeholder="选择日期时间">
          </el-date-picker>
        </el-form-item>
        <el-form-item prop="readNum" label="阅读量">
          <el-input :disabled="disabled" v-model="form.readNum"></el-input>
        </el-form-item>
        <el-form-item align="center" label-width="0">
          <el-button type="primary" @click="onSubmit(form)">{{ dialogState === 1 ? $t('common.add') : $t('common.save') }}</el-button>
          <el-button :style="disabled ? 'display:none' : ''" @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
    <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchList" />
  </div>
</template>
<script>
import { getAllNews, addNews, updateNews, deleteNewsById, getNewsById } from '@/api/news';
import Pagination from '@/components/Pagination';
import Uploader from '@/components/Uploader2';
import download from '@/api/uploadUrl';
export default {
  components: { Pagination,Uploader },
  data() {
    return {
      fileUrl:"",
      fileName:'',
      download: download,
      disabled: false,
      total: 0,
      list: [],
      listQuery: {
        searchname: '',
        page: 1,
        limit: 10
      },
      dialogState: 1, //1:add, 2:edit
      dialogVisible: false,
      form: {
        newsTitle: '',
        newsImgUrl: '',
        newsContent: '',
        newsTime: '',
        readNum: ''
      },
      rules: {
        newsTitle: [{ required: true, message: '新闻标题不能为空', trigvalueger: 'blur' }],
        newsImgUrl: [{ required: true, message: '新闻照片不能为空', trigger: 'blur' }],
        newsContent: [{ required: true, message: '新闻内容不能为空', trigvalueger: 'blur' }],
        newsTime: [{ required: true, message: '新闻时间不能为空', trigger: 'blur' }]
      },
      dialogImageUrl: '',
      dialogVisibleImg: false,
      disabledImg: false
    };
  },
  mounted() {
    this.fetchList();
  },
  methods: {
    uploadSuccess(data) {
      this.form.newsImgUrl = data.fileUrl;
      this.form.fileName=data.fileName
      console.log(this.form)
    },
    handleView(id) {
      this.handleEdit(id);
      this.disabled = true;
    },
    async fetchList() {
      const res = await getAllNews(this.listQuery);
      if (res && res.result) {
        console.log(res)
        this.total = res.data.total;
        this.list = res.data.list;
      }
    },
    handleFilter() {
      this.listQuery.page = 1;
      this.fetchList();
    },
    handleAdd() {
      this.form = {
        newsTitle: '',
        newsImg: '',
        newsContent: '',
        newsTime: ''
      };
      this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      this.dialogState = 2;
      this.form = deepClone(row);
      const res = await getNewsById(row.id);
      if (res && res.result) {
        this.dialogVisible = true;
        this.fileUrl=res.data.newsImgUrl
        var name = this.fileUrl.split('/')[1]
        this.fileName=name
      }
    },
    handleDelete(index, row) {
      console.log(index, row);
      const _this = this;
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteNewsById(row.id).then(res => {
            if (res.result) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.fetchList();
            } else {
              this.$message(this.$t('message.delete_fail'), 'error');
            }
          });
        })
        .catch(error => {});
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(valid => {
        if (!valid) {
          this.$message('填写的信息有误,请确认', 'error');
          return;
        }
        if (this.dialogState === 1) {
          const data = Object.assign(this.form);
          console.log(data)
          addNews(data)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.add_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.add_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        } else {
          console.log('updataform',this.form)
          updateNews(this.form)
            .then(res => {
              if (!res.result) {
                this.$message(res.errorMsg || this.$t('message.edit_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.edit_success'), 'success');
              this.fetchList();
              this.dialogVisible = false;
            })
            .catch(error => {});
        }
      });
    }
  }
};
</script>
src/views/permisson/index.vue
对比新文件
@@ -0,0 +1,95 @@
<template>
  <div class="app-container">
    <el-card class="box-card">
      <div slot="header" class="clearfix">
        <span style="float:left">请选择下列菜单:</span>
        <el-button style="float: right;" type="primary" @click="onSubmit">{{ $t('common.save') }}</el-button>
      </div>
      <el-tree
        ref="tree"
        :data="routerTree"
        show-checkbox
        node-key="id"
        :default-expanded-keys="[2]"
        :default-checked-keys="[1]"
        :props="defaultProps"
      ></el-tree>
    </el-card>
  </div>
</template>
<script>
import constantRoutes from '@/router/constroutes';
import { batchAddPermission, getPermissionList } from '@/api/permisson';
export default {
  data() {
    return {
      disabled: false,
      routerTree: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    };
  },
  mounted() {
    this.getPermissionList();
    this.getRouterTree();
  },
  methods: {
    handleView(id) {
      this.handleEdit(id);
      this.disabled = true;
    },
    getRouterTree() {
      const filterRoutes = [];
      for (let i = 0; i < constantRoutes.length; i++) {
        let item = constantRoutes[i];
        if (i > 1 && item.children) {
          item.children = item.children.filter(i => !i.hidden);
          if (item.children.length === 1) {
            filterRoutes.push(item.children[0]);
          } else {
            filterRoutes.push(item);
          }
        }
      }
      this.routerTree = filterRoutes;
    },
    async getPermissionList() {
      const res = await getPermissionList();
      if (!res || !res.result) {
        return;
      }
      let keys = res.data && res.data.list.map(item => item.targetid);
      const username = this.$store.getters.username;
      if (username === 'admin' || username === 'superadmin') {
        keys = Array.from(Array(100), (v, k) => k);
      }
      this.$refs.tree.setCheckedKeys(keys);
    },
    async onSubmit() {
      const checkedNodes = this.$refs.tree.getCheckedNodes();
      const data = checkedNodes.map(item => {
        return {
          targetid: item.id,
          parentid: item.parentId,
          permissiontype: item.name
        };
      });
      const res = await batchAddPermission(data);
      if (!res || !res.result) {
        this.$message(this.$t('message.save_fail'), 'error');
        return;
      }
      this.$message(this.$t('message.save_success'), 'success');
    }
  }
};
</script>
src/views/role/index.vue
对比新文件
@@ -0,0 +1,263 @@
<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input
        v-model="searchRolename"
        placeholder="输入角色名称"
        style="width: 200px;margin-right: 10px;"
        class="filter-item"
        clearable
        size="medium"
      />
      <el-button class="filter-item" type="primary" icon="el-icon-search" size="medium"  @click="handleFilter">{{ $t('common.search') }}</el-button>
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" size="medium"  icon="el-icon-edit" @click="handleAdd">{{ $t('common.add') }}</el-button>
    </div>
    <el-table stripe :data="roleList" border style="width: 50%">
      <el-table-column label="序号" type="index" align="center" width="60"></el-table-column>
      <el-table-column label="角色名称" align="center" width="">
        <template slot-scope="scope">
          <span>{{ scope.row.rolename }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200">
        <template slot-scope="scope">
          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">{{ $t('common.edit') }}</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{ $t('common.delete') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="dialogState === 1 ? '填写信息' : '修改信息'"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :model="form" :rules="rules" label-width="80px">
        <el-form-item prop="rolename" label="角色名称">
          <el-input v-model="form.rolename"></el-input>
        </el-form-item>
        <el-form-item label="菜单权限">
          <el-tree
            ref="tree"
            :data="routerTree"
            show-checkbox
            node-key="id"
            :default-expanded-keys="[2]"
            :default-checked-keys="defaultCheckedKeys"
            :props="defaultProps"
          ></el-tree>
        </el-form-item>
        <el-form-item align="center" label-width="0">
          <el-button type="primary" @click="onSubmit()">{{ dialogState === 1 ? $t('common.add') : $t('common.save') }}</el-button>
          <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
<script>
import constantRoutes from '@/router/constroutes';
import { getRoleList, addRole, deleteRoleById, updateRole, getRolebyId } from '@/api/role';
import { addRolePermission, updateRolePermission } from '@/api/permisson';
import { deepClone } from '../../utils';
export default {
  data() {
    return {
      roleList: [],
      dialogState: 1, // 1:add , 2:edit
      dialogVisible: false,
      editRoleId: 0,
      searchRolename: '',
      form: {
        rolename: '',
        permissionId: []
      },
      rules: {
        rolename: [{ require: true, message: '角色名称不能为空', trigger: 'blur' }]
      },
      routerTree: [],
      constantTree: [],
      defaultCheckedKeys: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    };
  },
  watch: {
    dialogVisible: function(bool) {
      if (!bool) {
        this.routerTree = this.constantTree;
      }
    }
  },
  mounted() {
    this.getRoleList();
    this.routerTree = this.constantTree = this.getRouterTree();
  },
  methods: {
    getRouterTree() {
      const filterRoutes = [];
      for (let i = 0; i < constantRoutes.length; i++) {
        let item = constantRoutes[i];
        if (i > 1 && item.children) {
          item.children = item.children.filter(i => !i.hidden);
          if (item.children.length === 1) {
            filterRoutes.push(item.children[0]);
          } else {
            filterRoutes.push(item);
          }
        }
      }
      return filterRoutes;
    },
    getRoleList() {
      getRoleList(this.searchRolename).then(res => {
        if (!res.result) {
          return;
        }
        this.roleList = res.data.list;
      });
    },
    handleFilter() {
      //this.roleList = this.roleList.filter(item => item.rolename.includes(this.searchRolename));
      this.getRoleList()
    },
    handleAdd() {
      this.form = {
        rolename: '',
        permissionId: []
      };
      this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      this.dialogState = 2;
      this.form = deepClone(row);
      this.editRoleId = row.id;
      this.defaultCheckedKeys = [];
      this.routerTree = row.id === '60010' || row.rolename === '管理员' ? this.getDisabledTree() : this.routerTree;
      const res = await getRolebyId(row.id);
      if (res && res.result && res.data) {
        this.defaultCheckedKeys = res.data.permissionId;
        this.$nextTick(() => {
          this.$refs.tree.setCheckedNodes(this.convertCheckedNodes(this.defaultCheckedKeys));
        });
        this.dialogVisible = true;
      }
    },
    convertCheckedNodes(permissionId) {
      const nodes = [];
      this.routerTree.forEach(item => {
        if (!item.children) {
          if (permissionId.includes(item.id)) {
            nodes.push(item);
          }
        } else {
          item.children.forEach(node => {
            if (permissionId.includes(node.id)) {
              nodes.push(node);
            }
          });
        }
      });
      return nodes;
    },
    handleDelete(index, row) {
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteRoleById(row.id).then(res => {
            if (res.result) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.getRoleList();
            } else {
              this.$message(this.$t('message.delete_fail'), 'error');
            }
          });
        })
        .catch(() => {});
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(async valid => {
        if (!valid) {
          return;
        }
        console.log('getCheckedNodes', this.$refs.tree.getCheckedNodes());
        console.log('getCheckedKeys', this.$refs.tree.getCheckedKeys());
        console.log('convertCheckedKeys', this.convertCheckedKeys());
        if (this.dialogState === 1) {
          this.form.permissionId = this.convertCheckedKeys();
          const res = await addRole(this.form);
          if (!res || !res.result) {
            this.$message(res.errorMsg || this.$t('message.add_fail'), 'error');
            return;
          }
          this.dialogVisible = false;
          this.$message(this.$t('message.add_success'), 'success');
          this.getRoleList();
        } else {
          const res = await updateRole({
            permissionId: this.convertCheckedKeys(),
            id: this.editRoleId
          });
          if (!res || !res.result) {
            this.$message(this.$t('message.edit_fail'), 'error');
            return;
          }
          this.$message(this.$t('message.edit_success'), 'success');
          this.getRoleList();
          this.dialogVisible = false;
        }
      });
    },
    convertCheckedKeys() {
      const keys = [];
      const nodes = this.$refs.tree.getCheckedNodes();
      nodes.forEach(node => {
        keys.push(node.id);
        keys.push(node.parentId);
      });
      return [...new Set(keys.sort())];
    },
    getDisabledTree() {
      let tree = deepClone(this.routerTree);
      const recursion = function(tree) {
        tree.forEach(item => {
          item['disabled'] = true;
          if (item.children) {
            item.children = recursion(item.children);
          }
        });
        return tree;
      };
      return recursion(tree);
    }
  }
};
</script>
src/views/tempsecondview/index.vue
对比新文件
@@ -0,0 +1,5 @@
<template>
  <div>
    <router-view />
  </div>
</template>
src/views/tempsecondview/index2.vue
对比新文件
@@ -0,0 +1,5 @@
<template>
  <div class="app-container">
    <router-view />
  </div>
</template>
src/views/tempsecondview/index3.vue
对比新文件
@@ -0,0 +1,5 @@
<template>
  <div class="app-container">
    <router-view />
  </div>
</template>
src/views/user/index.vue
对比新文件
@@ -0,0 +1,444 @@
<template>
  <div class="app-container">
    <div class="filter-container select">
      <!--      <el-input v-model="searchusername" placeholder="输入用户名,回车搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />-->
      <!--      <el-input v-model="searchname" placeholder="输入姓名,回车搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />-->
      <!--      <div class="select xian">-->
      <PageTitle title="用户管理"></PageTitle>
      <div class='searchBar'>
        <el-row :gutter="20">
          <el-col :span="6">
            <span style='white-space: nowrap'>用户名:</span>
            <el-input
              v-model="listQuery.searchusername"
              clearable
            />
          </el-col>
          <el-col :span="6">
            <span style='white-space: nowrap'>姓名:</span>
            <el-input
              v-model="listQuery.searchname"
              clearable
            />
          </el-col>
          <el-col :span="6" style='display: flex;align-items: center;justify-content: end'>
            <el-button class="filter-item" type="primary" size="medium" icon="el-icon-search" @click="handleFilter">
              {{ $t('common.search') }}
            </el-button>
            <el-button class="filter-item" style="margin-left: 10px;" type="primary" size="medium" icon="el-icon-edit"
                       @click="handleAdd">
              {{ $t('common.add') }}
            </el-button>
          </el-col>
        </el-row>
      </div>
    </div>
    <el-table stripe :data="userList" style="width: 97%" :header-cell-style="{background:'#f4f4f4'}" border>
      <el-table-column label="序号" type="index" align="center" width="80"></el-table-column>
      <el-table-column label="用户名" align="center" min-width="10%">
        <template slot-scope="scope">
          <el-popover trigger="hover" placement="top">
            <p>{{ scope.row.password }}</p>
            <div slot="reference" class="name-wrapper">
              <el-tag size="medium">{{ scope.row.userName }}</el-tag>
            </div>
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column label="姓名" align="center" min-width="10%">
        <template slot-scope="scope">
          <span>{{ scope.row.nickName }}</span>
        </template>
      </el-table-column>
      <el-table-column label="手机号" align="center" min-width="20%">
        <template slot-scope="scope">
          <span>{{ scope.row.phonenumber }}</span>
        </template>
      </el-table-column>
      <el-table-column label="邮箱" align="center" min-width="20%">
        <template slot-scope="scope">
          <span>{{ scope.row.email }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" min-width="30%">
        <template slot-scope="scope">
          <el-button size="mini" type="primary" @click="handleView(scope.$index, scope.row)">查看</el-button>
          <el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">{{
              $t('common.edit')
            }}
          </el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">{{
              $t('common.delete')
            }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="listQuery.page"
      :page-sizes="[10, 20, 25, 50]"
      :page-size="listQuery.size"
      layout="total, sizes, prev, pager, next, jumper"
      :total="total">
    </el-pagination>
    <el-dialog
      :close-on-click-modal="false"
      :destroy-on-close="true"
      :title="dialogState === 1 ? '用户信息添加' : (dialogState === 2 ? '用户信息修改' : '用户信息查看')"
      :visible.sync="dialogVisible"
      width="50%"
      :before-close="handleClose"
    >
      <el-form ref="dialogform" :disabled="disabled" :model="form" :rules="rules" label-width="100px"
               class="dialog_form">
        <el-row :gutter="40">
          <el-col :span="12">
            <el-form-item prop="userName" label="账号">
              <el-input v-model="form.userName"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item prop="password" label="密码">
              <el-input v-model="form.password" show-password :disabled="dialogState === 1 ? false : true"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="40">
          <el-col :span="12">
            <el-form-item prop="nickName" label="姓名">
              <el-input v-model="form.nickName"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item prop="sex" label="性别">
              <el-select v-model="form.sex" filterable placeholder="请选择" style="width: 100%">
                <el-option v-for="item in teacherSexValue" :key="item.id" :label="item.label"
                           :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="40">
          <el-col :span="12">
            <el-form-item prop="phonenumber" label="手机号">
              <el-input v-model="form.phonenumber"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item prop="email" label="邮箱">
              <el-input v-model="form.email"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-form-item prop="remark" label="备注">
            <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="form.remark"></el-input>
          </el-form-item>
        </el-row>
        <el-row>
          <el-form-item align="right" v-show="!disabled">
            <el-button type="primary" @click="onSubmit(form)">
              {{ dialogState === 1 ? $t('common.add') : $t('common.save') }}
            </el-button>
            <el-button @click="dialogVisible = false">{{ $t('common.cancel') }}</el-button>
          </el-form-item>
        </el-row>
      </el-form>
    </el-dialog>
  </div>
</template>
<script>
import md5 from 'js-md5';
import {getUserList, addUser, deleteUserById, updateUser, getUserById, fetchList} from '@/api/user';
import {getRoleList} from '@/api/role';
import {getGroupData} from '../../utils';
import Uploader from '@/components/Uploader';
import download from '@/api/uploadUrl';
import PageTitle from '@/components/PageTitle/index.vue'
export default {
  components: {Uploader, PageTitle},
  data() {
    return {
      fileUrl: "",
      fileName: '',
      total: 0,
      download: download,
      teacherSexValue: [
        {
          id: "1",
          label: '男'
        },
        {
          id: "0",
          label: '女'
        }
      ],
      listQuery: {
        searchusername: '',
        searchname: '',
        // page: 1,
        // limit: 10
      },
      educationValue: getGroupData('XL'),
      userList: [],
      dialogState: 1, //1:add, 2:edit
      dialogVisible: false,
      disabled: false,
      form: {
        id: "",
        username: '',
        password: '',
        name: '',
        roleid: '',
        phone: '',
        email: '',
        teacherSex: '',
        cardId: '',
        workingTime: '',
        education: '',
        photoUrl: '',
        personalProfile: '',
        remark: '',
      },
      rules: {
        userName: [{required: true, message: '用户名不能为空', trigger: 'blur'}],
        password: [{required: true, message: '密码不能为空', trigger: 'blur'}],
        nickName: [{required: true, message: '姓名不能为空', trigger: 'blur'}],
        phonenumber: [
          {required: true, message: '手机号码不能为空', trigger: 'blur'},
          {
            pattern: /^(13[0-9]{1}|14[5|7|9]{1}|15[0-3|5-9]{1}|166|17[0-3|5-8]{1}|18[0-9]{1}|19[8-9]{1}){1}\d{8}$/,
            message: '手机号码格式不正确'
          }
        ],
        email: [
          {required: true, message: '邮箱地址不能为空', trigger: 'blur'},
          {
            pattern: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
            message: '邮箱地址格式不正确'
          }
        ]
      },
      roleList: [],
      roleValue: null,
    };
  },
  mounted() {
    this.getList();
    this.getRoleList();
  },
  methods: {
    handleSizeChange(size) {
      this.listQuery.size = size
      this.getList();
    },
    handleCurrentChange(page) {
      this.listQuery.page = page
      this.getList();
    },
    getList() {
      getUserList({}).then(res => {
        if (res.code != 200) {
          this.$message("数据查询失败!请重试", 'error', 3 * 1000);
          return;
        }
        this.userList = res.data.list;
      });
    },
    getRoleList() {
      getRoleList().then(res => {
        if (!res.result) {
          return;
        }
        this.roleList = res.data.list.map(item => {
          return {
            value: item.id,
            label: item.rolename
          };
        });
      });
    },
    handleFilter() {
      this.listQuery.page = 1;
      this.fetchList();
    },
    async fetchList() {
      this.listLoading = true;
      const res = await fetchList(this.listQuery);
      if (res.code == 200) {
        this.userList = res.data.list;
        this.total = res.data.total || 0;
      }
      this.listLoading = false;
    },
    handleAdd() {
      this.form = {
        id: "",
        username: '',
        password: '',
        name: '',
        roleid: '',
        phone: '',
        email: '',
        teacherSex: '',
        cardId: '',
        workingTime: '',
        education: '',
        logoUrl: "",
        logoName: "",
        personalProfile: '',
        remark: '',
      };
      this.disabled = false
      this.fileUrl = "",
        this.fileName = "",
        this.dialogState = 1;
      this.dialogVisible = true;
    },
    async handleEdit(index, row) {
      console.log(row)
      this.disabled = false
      this.dialogState = 2;
      //this.form = deepClone(row);
      const res = await getUserById(row.userId);
      if (res.code == 200) {
        this.form = res.data
        this.form.password = "*********";
        this.fileUrl = this.form.photoUrl
        this.fileName = this.form.photoName
        this.dialogVisible = true;
      }
    },
    async handleView(index, row) {
      this.disabled = true
      this.dialogState = 3;
      this.dialogVisible = true
      this.form = deepClone(row);
      const res = await getUserById(row.userId);
      if (res) {
        console.log(res.data.phonenumber);
        this.form = res.data
        console.log(this.form)
        this.fileUrl = this.form.photoUrl
        this.fileName = this.form.photoName
        this.dialogVisible = true;
      }
    },
    handleDelete(index, row) {
      console.log(index, row);
      const _this = this;
      this.$confirm(this.$t('message.delete_confirm'), this.$t('common.tip'), {
        confirmButtonText: this.$t('common.ok'),
        cancelButtonText: this.$t('common.cancel'),
        type: 'warning'
      })
        .then(() => {
          deleteUserById(row.userId).then(res => {
            if (res.code == 200) {
              this.$message(this.$t('message.delete_success'), 'success');
              this.getList();
            } else {
              this.$message(res.msg, 'error');
            }
          });
        })
        .catch(error => {
        });
    },
    handleClose(done) {
      done();
    },
    onSubmit() {
      this.$refs.dialogform.validate(valid => {
        if (!valid) {
          this.$message('填写的信息有误,请确认', 'error');
          return;
        }
        //this.form.roleid = this.roleValue;
        this.form.photoUrl = this.fileUrl
        this.form.photoName = this.fileName
        if (this.dialogState === 1) {
          const data = Object.assign(this.form);
          addUser(data)
            .then(res => {
              if (res.code != 200) {
                this.$message(res.msg || this.$t('message.add_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.add_success'), 'success');
              this.getList();
              this.dialogVisible = false;
            })
            .catch(error => {
            });
        } else {
          updateUser(this.form)
            .then(res => {
              if (res.code != 200) {
                this.$message(res.msg || this.$t('message.edit_fail'), 'error');
                return;
              }
              this.$message(this.$t('message.edit_success'), 'success');
              this.getList();
              this.dialogVisible = false;
            })
            .catch(error => {
            });
        }
      });
    },
    uploadSuccess(data) {
      this.fileUrl = data.fileUrl;
      this.fileName = data.fileName
    }
  }
};
</script>
<style lang='scss' scoped>
.select {
  width: 100%;
  background-color: white;
  margin-bottom: 20px;
  .searchBar{
    padding: 10px 20px;
    .el-col{
      display: flex;
      align-items: center;
    }
  }
}
.filter-container {
  padding-bottom: 0px;
}
.dialog_form {
  width: 90%;
  margin: 0 auto;
}
::v-deep .el-dialog__header {
  font-weight: bolder;
}
::v-deep .el-dialog {
  border-radius: 10px
}
</style>
tests/unit/.eslintrc.js
对比新文件
@@ -0,0 +1,5 @@
module.exports = {
  env: {
    jest: true
  }
}
tests/unit/components/Breadcrumb.spec.js
对比新文件
@@ -0,0 +1,98 @@
import { mount, createLocalVue } from '@vue/test-utils'
import VueRouter from 'vue-router'
import ElementUI from 'element-ui'
import Breadcrumb from '@/components/Breadcrumb/index.vue'
const localVue = createLocalVue()
localVue.use(VueRouter)
localVue.use(ElementUI)
const routes = [
  {
    path: '/',
    name: 'home',
    children: [{
      path: 'dashboard',
      name: 'dashboard'
    }]
  },
  {
    path: '/menu',
    name: 'menu',
    children: [{
      path: 'menu1',
      name: 'menu1',
      meta: { title: 'menu1' },
      children: [{
        path: 'menu1-1',
        name: 'menu1-1',
        meta: { title: 'menu1-1' }
      },
      {
        path: 'menu1-2',
        name: 'menu1-2',
        redirect: 'noredirect',
        meta: { title: 'menu1-2' },
        children: [{
          path: 'menu1-2-1',
          name: 'menu1-2-1',
          meta: { title: 'menu1-2-1' }
        },
        {
          path: 'menu1-2-2',
          name: 'menu1-2-2'
        }]
      }]
    }]
  }]
const router = new VueRouter({
  routes
})
describe('Breadcrumb.vue', () => {
  const wrapper = mount(Breadcrumb, {
    localVue,
    router
  })
  it('dashboard', () => {
    router.push('/dashboard')
    const len = wrapper.findAll('.el-breadcrumb__inner').length
    expect(len).toBe(1)
  })
  it('normal route', () => {
    router.push('/menu/menu1')
    const len = wrapper.findAll('.el-breadcrumb__inner').length
    expect(len).toBe(2)
  })
  it('nested route', () => {
    router.push('/menu/menu1/menu1-2/menu1-2-1')
    const len = wrapper.findAll('.el-breadcrumb__inner').length
    expect(len).toBe(4)
  })
  it('no meta.title', () => {
    router.push('/menu/menu1/menu1-2/menu1-2-2')
    const len = wrapper.findAll('.el-breadcrumb__inner').length
    expect(len).toBe(3)
  })
  // it('click link', () => {
  //   router.push('/menu/menu1/menu1-2/menu1-2-2')
  //   const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
  //   const second = breadcrumbArray.at(1)
  //   console.log(breadcrumbArray)
  //   const href = second.find('a').attributes().href
  //   expect(href).toBe('#/menu/menu1')
  // })
  // it('noRedirect', () => {
  //   router.push('/menu/menu1/menu1-2/menu1-2-1')
  //   const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
  //   const redirectBreadcrumb = breadcrumbArray.at(2)
  //   expect(redirectBreadcrumb.contains('a')).toBe(false)
  // })
  it('last breadcrumb', () => {
    router.push('/menu/menu1/menu1-2/menu1-2-1')
    const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
    const redirectBreadcrumb = breadcrumbArray.at(3)
    expect(redirectBreadcrumb.contains('a')).toBe(false)
  })
})
tests/unit/components/Hamburger.spec.js
对比新文件
@@ -0,0 +1,18 @@
import { shallowMount } from '@vue/test-utils'
import Hamburger from '@/components/Hamburger/index.vue'
describe('Hamburger.vue', () => {
  it('toggle click', () => {
    const wrapper = shallowMount(Hamburger)
    const mockFn = jest.fn()
    wrapper.vm.$on('toggleClick', mockFn)
    wrapper.find('.hamburger').trigger('click')
    expect(mockFn).toBeCalled()
  })
  it('prop isActive', () => {
    const wrapper = shallowMount(Hamburger)
    wrapper.setProps({ isActive: true })
    expect(wrapper.contains('.is-active')).toBe(true)
    wrapper.setProps({ isActive: false })
    expect(wrapper.contains('.is-active')).toBe(false)
  })
})
tests/unit/components/SvgIcon.spec.js
对比新文件
@@ -0,0 +1,22 @@
import { shallowMount } from '@vue/test-utils'
import SvgIcon from '@/components/SvgIcon/index.vue'
describe('SvgIcon.vue', () => {
  it('iconClass', () => {
    const wrapper = shallowMount(SvgIcon, {
      propsData: {
        iconClass: 'test'
      }
    })
    expect(wrapper.find('use').attributes().href).toBe('#icon-test')
  })
  it('className', () => {
    const wrapper = shallowMount(SvgIcon, {
      propsData: {
        iconClass: 'test'
      }
    })
    expect(wrapper.classes().length).toBe(1)
    wrapper.setProps({ className: 'test' })
    expect(wrapper.classes().includes('test')).toBe(true)
  })
})
tests/unit/utils/formatTime.spec.js
对比新文件
@@ -0,0 +1,30 @@
import { formatTime } from '@/utils/index.js'
describe('Utils:formatTime', () => {
  const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01"
  const retrofit = 5 * 1000
  it('ten digits timestamp', () => {
    expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分')
  })
  it('test now', () => {
    expect(formatTime(+new Date() - 1)).toBe('刚刚')
  })
  it('less two minute', () => {
    expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前')
  })
  it('less two hour', () => {
    expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前')
  })
  it('less one day', () => {
    expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前')
  })
  it('more than one day', () => {
    expect(formatTime(d)).toBe('7月13日17时54分')
  })
  it('format', () => {
    expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')
    expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')
    expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')
  })
})
tests/unit/utils/parseTime.spec.js
对比新文件
@@ -0,0 +1,28 @@
import { parseTime } from '@/utils/index.js'
describe('Utils:parseTime', () => {
  const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01"
  it('timestamp', () => {
    expect(parseTime(d)).toBe('2018-07-13 17:54:01')
  })
  it('ten digits timestamp', () => {
    expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01')
  })
  it('new Date', () => {
    expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01')
  })
  it('format', () => {
    expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')
    expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')
    expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')
  })
  it('get the day of the week', () => {
    expect(parseTime(d, '{a}')).toBe('五') // 星期五
  })
  it('get the day of the week', () => {
    expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日
  })
  it('empty argument', () => {
    expect(parseTime()).toBeNull()
  })
})
tests/unit/utils/validate.spec.js
对比新文件
@@ -0,0 +1,17 @@
import { validUsername, isExternal } from '@/utils/validate.js'
describe('Utils:validate', () => {
  it('validUsername', () => {
    expect(validUsername('admin')).toBe(true)
    expect(validUsername('editor')).toBe(true)
    expect(validUsername('xxxx')).toBe(false)
  })
  it('isExternal', () => {
    expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true)
    expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true)
    expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false)
    expect(isExternal('/dashboard')).toBe(false)
    expect(isExternal('./dashboard')).toBe(false)
    expect(isExternal('dashboard')).toBe(false)
  })
})
vue.config.js
对比新文件
@@ -0,0 +1,153 @@
'use strict';
const path = require('path');
const defaultSettings = require('./src/settings.js');
function resolve(dir) {
  return path.join(__dirname, dir);
}
const name = defaultSettings.title || 'vue Admin Template'; // page title
// If your port is set to 80,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following methods:
// port = 9528 npm run dev OR npm run dev --port = 9528
const port = process.env.port || process.env.npm_config_port || 3000; // dev port
// 引入等比适配插件
const px2rem = require('postcss-px2rem')
// 配置基本大小
const postcss = px2rem({
  // 基准大小 baseSize,需要和rem.js中相同
  remUnit: 16
})
// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: 'http://192.168.0.29:6703/',
    // proxy: 'http://120.77.153.67:8258/',
    after: require('./mock/mock-server.js')
  },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          postcss
        ]
      }
    }
  },
  chainWebpack(config) {
    config.plugins.delete('preload'); // TODO: need test
    config.plugins.delete('prefetch'); // TODO: need test
    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end();
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end();
    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true;
        return options;
      })
      .end();
    // set image-webpack-loader
    config.module
      .rule('images')
      .use('image-webpack-loader')
      .loader('image-webpack-loader')
      .options({ bypassOnDebug: true })
      .end();
    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === 'development', config => config.devtool('cheap-source-map'));
    config.when(process.env.NODE_ENV !== 'development', config => {
      config
        .plugin('ScriptExtHtmlWebpackPlugin')
        .after('html')
        .use('script-ext-html-webpack-plugin', [
          {
            // `runtime` must same as runtimeChunk name. default is `runtime`
            inline: /runtime\..*\.js$/
          }
        ])
        .end();
      config.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
          libs: {
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: 'initial' // only package third parties that are initially dependent
          },
          elementUI: {
            name: 'chunk-elementUI', // split elementUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
          },
          commons: {
            name: 'chunk-commons',
            test: resolve('src/components'), // can customize your rules
            minChunks: 3, //  minimum common number
            priority: 5,
            reuseExistingChunk: true
          }
        }
      });
      config.optimization.runtimeChunk('single');
    });
  }
};
yarn-error.log
对比新文件
文件太大
yarn.lock
对比新文件
文件太大