From 87e3d52c62233ad44bd7bac3f43e5348a2de4e94 Mon Sep 17 00:00:00 2001
From: luohairen <3399054449@qq.com>
Date: 星期一, 25 十一月 2024 10:36:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/assets/styles/mixin.scss                          |   14 
 src/views/index.vue                                   | 1446 +++---------
 src/assets/styles/index.scss                          |   58 
 src/assets/styles/btn.scss                            |   20 
 src/layout/components/Navbar.vue                      |  409 ++-
 src/utils/ruoyi.js                                    |   30 
 src/layout/components/Notice/index.vue                |  155 +
 src/layout/index.vue                                  |  149 
 src/views/process/modelManagement.vue                 |  432 +-
 src/assets/styles/variables.module.scss               |    2 
 src/assets/images/file1.png                           |    0 
 src/assets/styles/ruoyi.scss                          |  114 
 src/views/process/api/model.js                        |    8 
 src/api/projectInfo.js                                |   44 
 src/views/process/deployManagement.vue                |    8 
 src/views/components/noticeTable.vue                  |  183 +
 src/layout/components/Sidebar/index.vue               |   71 
 src/layout/components/TopBar/search.vue               |  157 +
 src/views/projectEngineering/projectLibrary/index.vue |  493 ++++
 src/api/login.js                                      |   19 
 src/assets/styles/variables.scss                      |    2 
 src/assets/styles/sidebar.scss                        |  126 
 src/components/VisibilityToolbar/index.vue            |  173 +
 src/assets/styles/element-ui.scss                     |  117 
 src/assets/styles/transition.scss                     |    6 
 src/settings.js                                       |    2 
 src/layout/components/TagsView/index.vue              |  629 ++--
 src/views/projectEngineering/projectLibrary/list.js   |  176 +
 src/utils/validate.js                                 |    4 
 src/views/projectEngineering/component/FileDialog.vue |  176 +
 .env.development                                      |    3 
 src/views/login.vue                                   |  652 ++--
 src/main.js                                           |   19 
 .env.production                                       |    3 
 src/components/TopNav/index.vue                       |    2 
 src/views/components/Map/index.vue                    |  585 ++++
 src/views/process/api/deployService.js                |   12 
 src/views/components/tidingsTable.vue                 |  283 ++
 src/api/message/index.js                              |   50 
 src/views/components/projectOverview.vue              |  339 ++
 40 files changed, 4,833 insertions(+), 2,338 deletions(-)

diff --git a/.env.development b/.env.development
index 4214a89..b573e4e 100644
--- a/.env.development
+++ b/.env.development
@@ -12,3 +12,6 @@
 
 # 寮�鎵撴柊鐨則ab鐨剈rl鍓嶇紑
 VUE_APP_TAB_URL_PREFIX = http://127.0.0.1:8080
+
+# flowable璁捐椤甸潰鍓嶇紑
+VUE_APP_FLOWABLE_PREFIX = http://127.0.0.1:10076
diff --git a/.env.production b/.env.production
index 0a50ac3..8332f47 100644
--- a/.env.production
+++ b/.env.production
@@ -9,3 +9,6 @@
 
 # 寮�鎵撴柊鐨則ab鐨剈rl鍓嶇紑
 VUE_APP_TAB_URL_PREFIX = http://127.0.0.1:9999
+
+# flowable璁捐椤甸潰鍓嶇紑
+VUE_APP_FLOWABLE_PREFIX = http://127.0.0.1:10076
diff --git a/src/api/login.js b/src/api/login.js
index 7b7388f..ead6dd7 100644
--- a/src/api/login.js
+++ b/src/api/login.js
@@ -57,4 +57,21 @@
     method: 'get',
     timeout: 20000
   })
-}
\ No newline at end of file
+}
+
+export function getCalculatioln(data) {
+  return request({
+    url: '/count',
+    method: 'post',
+    data: data
+  });
+}
+
+// 鑾峰彇寮傚父鏁版嵁缁熻
+export function getAbnormalData(query) {
+  return request({
+    url: '/countExceptionProject',
+    method: 'get',
+    params: query
+  });
+}
diff --git a/src/api/message/index.js b/src/api/message/index.js
new file mode 100644
index 0000000..2f6c537
--- /dev/null
+++ b/src/api/message/index.js
@@ -0,0 +1,50 @@
+import request from '@/utils/request';
+import {
+  AxiosPromise
+} from 'axios';
+
+// 鑾峰彇娑堟伅璇︽儏
+export function getMessage(params) {
+  return request({
+    url: '/audit-message',
+    method: 'get',
+    params: params
+  });
+}
+
+//娑堟伅鏁伴噺
+export function getMessageCount() {
+  return request({
+    url: '/message-count',
+    method: 'get'
+  });
+}
+
+//鑾峰彇闃呰
+export function getRead(id) {
+  return request({
+    url: '/read-message',
+    method: 'get',
+    params: {
+      id
+    }
+  });
+}
+
+//浠e姙
+export function getTodo(params) {
+  return request({
+    url: '/getPageByAllTaskWait',
+    method: 'get',
+    params: params
+  });
+}
+
+// 寮傚父椤圭洰缁熻
+export function getCountExceptionProject(params) {
+  return request({
+    url: '/countExceptionProject',
+    method: 'get',
+    params: params
+  });
+}
diff --git a/src/api/projectInfo.js b/src/api/projectInfo.js
new file mode 100644
index 0000000..52bb876
--- /dev/null
+++ b/src/api/projectInfo.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ椤圭洰绠$悊鍩虹淇℃伅鍒楄〃
+export function listInfo(query) {
+  return request({
+    url: '/code/info/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ椤圭洰绠$悊鍩虹淇℃伅璇︾粏
+export function getInfo(id) {
+  return request({
+    url: '/code/info/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板椤圭洰绠$悊鍩虹淇℃伅
+export function addInfo(data) {
+  return request({
+    url: '/code/info',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼椤圭洰绠$悊鍩虹淇℃伅
+export function updateInfo(data) {
+  return request({
+    url: '/code/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎椤圭洰绠$悊鍩虹淇℃伅
+export function delInfo(id) {
+  return request({
+    url: '/code/info/' + id,
+    method: 'delete'
+  })
+}
diff --git a/src/assets/images/file1.png b/src/assets/images/file1.png
new file mode 100644
index 0000000..3e4c568
--- /dev/null
+++ b/src/assets/images/file1.png
Binary files differ
diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss
index e6ba1a8..6ceb1e6 100644
--- a/src/assets/styles/btn.scss
+++ b/src/assets/styles/btn.scss
@@ -1,4 +1,4 @@
-@import './variables.scss';
+@import './variables.module.scss';
 
 @mixin colorBtn($color) {
   background: $color;
@@ -14,35 +14,35 @@
 }
 
 .blue-btn {
-  @include colorBtn($blue)
+  @include colorBtn($blue);
 }
 
 .light-blue-btn {
-  @include colorBtn($light-blue)
+  @include colorBtn($light-blue);
 }
 
 .red-btn {
-  @include colorBtn($red)
+  @include colorBtn($red);
 }
 
 .pink-btn {
-  @include colorBtn($pink)
+  @include colorBtn($pink);
 }
 
 .green-btn {
-  @include colorBtn($green)
+  @include colorBtn($green);
 }
 
 .tiffany-btn {
-  @include colorBtn($tiffany)
+  @include colorBtn($tiffany);
 }
 
 .yellow-btn {
-  @include colorBtn($yellow)
+  @include colorBtn($yellow);
 }
 
 .pan-btn {
-  font-size: 14px;
+  font-size: 12px;
   color: #fff;
   padding: 14px 36px;
   border-radius: 8px;
@@ -94,6 +94,6 @@
   outline: 0;
   margin: 0;
   padding: 10px 15px;
-  font-size: 14px;
+  font-size: 12px;
   border-radius: 4px;
 }
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
index c3102f4..3aa5514 100644
--- a/src/assets/styles/element-ui.scss
+++ b/src/assets/styles/element-ui.scss
@@ -1,4 +1,20 @@
-// cover some element-ui styles
+
+.el-collapse {
+  .collapse__title {
+    font-weight: 600;
+    padding: 0 8px;
+    font-size: 1.2em;
+    line-height: 1.1em;
+  }
+  .el-collapse-item__content {
+    padding: 0 8px;
+  }
+}
+
+.el-divider--horizontal {
+  margin-bottom: 10px;
+  margin-top: 10px;
+}
 
 .el-breadcrumb__inner,
 .el-breadcrumb__inner a {
@@ -6,7 +22,7 @@
 }
 
 .el-upload {
-  input[type="file"] {
+  input[type='file'] {
     display: none !important;
   }
 }
@@ -46,12 +62,37 @@
   }
 }
 
-// to fixed https://github.com/ElemeFE/element/issues/2461
-.el-dialog {
-  transform: none;
-  left: 0;
-  position: relative;
-  margin: 0 auto;
+/*-------------Dialog-------------**/
+.el-overlay {
+  overflow: hidden;
+
+  .el-overlay-dialog {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    height: 100%;
+
+    .el-dialog {
+      margin: 0 auto !important;
+
+      .el-dialog__body {
+        padding: 15px !important;
+      }
+      .el-dialog__header {
+        padding: 16px 16px 8px 16px;
+        box-sizing: border-box;
+        border-bottom: 1px solid var(--brder-color);
+        margin-right: 0;
+      }
+    }
+  }
+}
+
+.el-dialog__body {
+  max-height: calc(90vh - 111px) !important;
+  overflow-y: auto;
+  overflow-x: hidden;
 }
 
 // refine element ui upload
@@ -69,7 +110,7 @@
 // dropdown
 .el-dropdown-menu {
   a {
-    display: block
+    display: block;
   }
 }
 
@@ -83,19 +124,57 @@
   box-sizing: content-box;
 }
 
-.el-menu--collapse
-  > div
-  > .el-submenu
-  > .el-submenu__title
-  .el-submenu__icon-arrow {
+.el-menu--collapse > div > .el-submenu > .el-submenu__title .el-submenu__icon-arrow {
   display: none;
 }
 
-
-.el-tabs--border-card > .el-tabs__content {
-  padding: 0;
+.el-dropdown .el-dropdown-link {
+  color: var(--el-color-primary) !important;
 }
-.search-bar .el-button {
-  height: 32px;
+
+/* 褰� el-form 鐨� inline 灞炴�т负 true 鏃� */
+/* 璁剧疆 label 鐨勫搴﹂粯璁や负 68px */
+.el-form--inline .el-form-item__label {
+  width: 68px;
+}
+
+/* 璁剧疆 el-select 鐨勫搴﹂粯璁や负 240px */
+.el-form--inline .el-select {
+  width: 240px;
+}
+
+/* 璁剧疆 el-input 鐨勫搴﹂粯璁や负 240px */
+.el-form--inline .el-input {
+  width: 240px;
+}
+
+// 寮圭獥鍏ㄥ眬鏍峰紡
+.el-dialog__header {
+  height: 55px;
+  line-height: 55px;
+  margin-bottom: 0px !important;
+  border-bottom: 1px solid #e6f2fd;
+  padding-top: 0 !important;
+  justify-content: space-between;
+}
+.el-dialog__header > :first-child {
+  flex: none !important;
+  border-bottom: 2px solid #0068ff;
+  color: #333333;
+}
+
+// 鍙充晶寮圭獥鍏ㄥ眬鏍峰紡
+.el-drawer__header {
+  height: 55px;
+  line-height: 55px;
+  margin-bottom: 0px !important;
+  border-bottom: 1px solid #e6f2fd;
+  padding-top: 0 !important;
+  justify-content: space-between;
+}
+.el-drawer__header > :first-child {
+  flex: none !important;
+  border-bottom: 2px solid #0068ff;
+  color: #333333;
 }
 
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index 2f3b9ef..61bf7ef 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -1,25 +1,41 @@
-@import './variables.scss';
+@import './variables.module.scss';
 @import './mixin.scss';
 @import './transition.scss';
 @import './element-ui.scss';
 @import './sidebar.scss';
 @import './btn.scss';
+@import './ruoyi.scss';
+// @import 'animate.css';
+// @import 'element-plus/dist/index.css';
+:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","寰蒋闆呴粦",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:0.3s;--el-transition-duration-fast:0.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(0.645,0.045,0.355,1);--el-transition-function-fast-bezier:cubic-bezier(0.23,1,0.32,1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,0.04),0px 8px 20px rgba(0,0,0,0.08);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,0.12);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,0.12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,0.08),0px 12px 32px rgba(0,0,0,0.12),0px 8px 16px -8px rgba(0,0,0,0.16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0,0,0,0.8);--el-overlay-color-light:rgba(0,0,0,0.7);--el-overlay-color-lighter:rgba(0,0,0,0.5);--el-mask-color:rgba(255,255,255,0.9);--el-mask-color-extra-light:rgba(255,255,255,0.3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-icon{--color:inherit;align-items:center;display:inline-flex;height:1em;justify-content:center;line-height:1em;position:relative;width:1em;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}
 
 body {
   height: 100%;
+  margin: 0;
   -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;
+  font-family: Helvetica Neue,
+  Helvetica,
+  PingFang SC,
+  Hiragino Sans GB,
+  Microsoft YaHei,
+  Arial,
+  sans-serif;
 }
 
 label {
-  font-weight: 700;
+  font-weight: 400;
 }
 
 html {
   height: 100%;
   box-sizing: border-box;
+}
+
+html.dark .svg-icon,
+html.dark svg {
+  fill: var(--el-text-color-regular);
 }
 
 #app {
@@ -90,7 +106,7 @@
     visibility: hidden;
     display: block;
     font-size: 0;
-    content: " ";
+    content: ' ';
     clear: both;
     height: 0;
   }
@@ -104,7 +120,8 @@
   display: block;
   line-height: 32px;
   font-size: 16px;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+  sans-serif;
   color: #2c3e50;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
@@ -124,6 +141,22 @@
   padding: 20px;
 }
 
+// search闈㈡澘鏍峰紡
+.panel,
+.search {
+  margin-bottom: 0.75rem;
+  border-radius: 0.25rem;
+  border: 1px solid var(--el-border-color-light);
+  background-color: var(--el-bg-color-overlay);
+  padding: 0.75rem;
+  transition: all ease 0.3s;
+
+  &:hover {
+    box-shadow: 0 2px 12px #0000001a;
+    transition: all ease 0.3s;
+  }
+}
+
 .components-container {
   margin: 30px 50px;
   position: relative;
@@ -134,7 +167,7 @@
 }
 
 .text-center {
-  text-align: center
+  text-align: center;
 }
 
 .sub-navbar {
@@ -180,3 +213,16 @@
     margin-bottom: 10px;
   }
 }
+
+.el-drawer__header {
+  display: flex;
+  justify-content: space-between;
+  border-bottom: 1px solid #E9F4FD;
+  padding: 100px;
+}
+
+.el-drawer__close-btn {
+  width: 88%;
+  display: flex;
+  justify-content: flex-end;
+}
diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss
index 06fa061..5250e71 100644
--- a/src/assets/styles/mixin.scss
+++ b/src/assets/styles/mixin.scss
@@ -1,6 +1,6 @@
 @mixin clearfix {
   &:after {
-    content: "";
+    content: '';
     display: table;
     clear: both;
   }
@@ -44,21 +44,15 @@
     border-bottom: $color-border-style;
     border-left: $transparent-border-style;
     border-right: $transparent-border-style;
-  }
-
-  @else if $direction==right {
+  } @else if $direction==right {
     border-left: $color-border-style;
     border-top: $transparent-border-style;
     border-bottom: $transparent-border-style;
-  }
-
-  @else if $direction==down {
+  } @else if $direction==down {
     border-top: $color-border-style;
     border-left: $transparent-border-style;
     border-right: $transparent-border-style;
-  }
-
-  @else if $direction==left {
+  } @else if $direction==left {
     border-right: $color-border-style;
     border-top: $transparent-border-style;
     border-bottom: $transparent-border-style;
diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss
index 4e29874..3a16ea5 100644
--- a/src/assets/styles/ruoyi.scss
+++ b/src/assets/styles/ruoyi.scss
@@ -1,106 +1,108 @@
 /**
-* 閫氱敤css鏍峰紡甯冨眬澶勭悊
-* Copyright (c) 2019 ruoyi
-*/
+ * 閫氱敤css鏍峰紡甯冨眬澶勭悊
+ * Copyright (c) 2019 ruoyi
+ */
 
 /** 鍩虹閫氱敤 **/
 .pt5 {
   padding-top: 5px;
 }
-
 .pr5 {
   padding-right: 5px;
 }
-
 .pb5 {
   padding-bottom: 5px;
 }
-
 .mt5 {
   margin-top: 5px;
 }
-
 .mr5 {
   margin-right: 5px;
 }
-
 .mb5 {
   margin-bottom: 5px;
 }
-
 .mb8 {
   margin-bottom: 8px;
 }
-
 .ml5 {
   margin-left: 5px;
 }
-
 .mt10 {
   margin-top: 10px;
 }
-
 .mr10 {
   margin-right: 10px;
 }
-
 .mb10 {
   margin-bottom: 10px;
 }
 .ml10 {
-	margin-left: 10px;
+  margin-left: 10px;
 }
-
 .mt20 {
   margin-top: 20px;
 }
-
 .mr20 {
   margin-right: 20px;
 }
-
 .mb20 {
   margin-bottom: 20px;
 }
 .ml20 {
-	margin-left: 20px;
+  margin-left: 20px;
 }
 
-.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
   font-family: inherit;
   font-weight: 500;
   line-height: 1.1;
   color: inherit;
 }
 
-.el-message-box__status + .el-message-box__message{
-  word-break: break-word;
+.el-form .el-form-item__label {
+  font-size: 12px;
+  font-weight: 400;
+  color: #454B5E;
 }
-
 .el-dialog:not(.is-fullscreen) {
   margin-top: 6vh !important;
 }
 
-.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body {
+.el-dialog.scrollbar .el-dialog__body {
   overflow: auto;
   overflow-x: hidden;
   max-height: 70vh;
   padding: 10px 20px 0;
+  .el-form .el-form-item__label{
+    color: red;
+  }
 }
 
 .el-table {
-  .el-table__header-wrapper, .el-table__fixed-header-wrapper {
+  .el-table__header-wrapper,
+  .el-table__fixed-header-wrapper {
     th {
       word-break: break-word;
-      background-color: #f8f8f9;
+      background-color: #f8f8f9 !important;
       color: #515a6e;
-      height: 40px;
+      height: 40px !important;
       font-size: 13px;
     }
   }
-
   .el-table__body-wrapper {
-    .el-button [class*="el-icon-"] + span {
+    .el-button [class*='el-icon-'] + span {
       margin-left: 1px;
     }
   }
@@ -112,12 +114,12 @@
   color: #6379bb;
   border-bottom: 1px solid #ddd;
   margin: 8px 10px 25px 10px;
-  padding-bottom: 5px
+  padding-bottom: 5px;
 }
 
 /** 琛ㄦ牸甯冨眬 **/
 .pagination-container {
-  position: relative;
+  // position: relative;
   height: 25px;
   margin-bottom: 10px;
   margin-top: 15px;
@@ -128,13 +130,14 @@
 .tree-border {
   margin-top: 5px;
   border: 1px solid #e5e6e7;
-  background: #FFFFFF none;
+  background: #ffffff none;
   border-radius: 4px;
+  width: 100%;
 }
 
 .pagination-container .el-pagination {
-  right: 0;
-  position: absolute;
+  //right: 0;
+  //position: absolute;
 }
 
 @media (max-width: 768px) {
@@ -146,19 +149,21 @@
   }
 }
 
-.el-table .fixed-width .el-button--mini {
+.el-table .fixed-width .el-button--small {
   padding-left: 0;
   padding-right: 0;
   width: inherit;
 }
 
 /** 琛ㄦ牸鏇村鎿嶄綔涓嬫媺鏍峰紡 */
-.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine {
-	cursor: pointer;
-	margin-left: 5px;
+.el-table .el-dropdown-link {
+  cursor: pointer;
+  color: #409eff;
+  margin-left: 10px;
 }
 
-.el-table .el-dropdown, .el-icon-arrow-down {
+.el-table .el-dropdown,
+.el-icon-arrow-down {
   font-size: 12px;
 }
 
@@ -192,12 +197,12 @@
 }
 
 .el-card__header {
-  padding: 14px 15px 7px;
+  padding: 14px 15px 7px !important;
   min-height: 40px;
 }
 
 .el-card__body {
-  padding: 15px 20px 20px 20px;
+  padding: 15px 20px 20px 20px !important;
 }
 
 .card-box {
@@ -209,22 +214,22 @@
 /* button color */
 .el-button--cyan.is-active,
 .el-button--cyan:active {
-  background: #20B2AA;
-  border-color: #20B2AA;
-  color: #FFFFFF;
+  background: #20b2aa;
+  border-color: #20b2aa;
+  color: #ffffff;
 }
 
 .el-button--cyan:focus,
 .el-button--cyan:hover {
-  background: #48D1CC;
-  border-color: #48D1CC;
-  color: #FFFFFF;
+  background: #48d1cc;
+  border-color: #48d1cc;
+  color: #ffffff;
 }
 
 .el-button--cyan {
-  background-color: #20B2AA;
-  border-color: #20B2AA;
-  color: #FFFFFF;
+  background-color: #20b2aa;
+  border-color: #20b2aa;
+  color: #ffffff;
 }
 
 /* text color */
@@ -267,10 +272,9 @@
 }
 
 .avatar-upload-preview {
-  position: relative;
+  position: absolute;
   top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
+  transform: translate(50%, -50%);
   width: 200px;
   height: 200px;
   border-radius: 50%;
@@ -280,12 +284,12 @@
 
 /* 鎷栨嫿鍒楁牱寮� */
 .sortable-ghost {
-  opacity: .8;
+  opacity: 0.8;
   color: #fff !important;
   background: #42b983 !important;
 }
 
+/* 琛ㄦ牸鍙充晶宸ュ叿鏍忔牱寮� */
 .top-right-btn {
-  position: relative;
-  float: right;
+  margin-left: auto;
 }
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
index abe5b63..2db4a1e 100644
--- a/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -1,32 +1,31 @@
 #app {
-
   .main-container {
-    height: 100%;
-    transition: margin-left .28s;
-    margin-left: $base-sidebar-width;
+    // height: 100%;
+    transition: padding-left 0.28s;
+    padding-left: $base-sidebar-width;
     position: relative;
+    background-color: #F3F7FC;
   }
 
   .sidebarHide {
-    margin-left: 0!important;
+    margin-left: 0 !important;
   }
 
   .sidebar-container {
-    -webkit-transition: width .28s;
+    -webkit-transition: width 0.28s;
     transition: width 0.28s;
     width: $base-sidebar-width !important;
     background-color: $base-menu-background;
     height: 100%;
-    position: fixed;
-    font-size: 0px;
+    position: absolute;
+    font-size: 0;
     top: 0;
     bottom: 0;
     left: 0;
     z-index: 1001;
     overflow: hidden;
-    -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
-    box-shadow: 2px 0 6px rgba(0,21,41,.35);
-
+    -webkit-box-shadow: 5px 0 10px -5px #d3d7de;
+    box-shadow: 5px 0 10px -5px #d3d7de;
     // 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;
@@ -37,7 +36,7 @@
     }
 
     .el-scrollbar__bar.is-vertical {
-      right: 0px;
+      right: 0;
     }
 
     .el-scrollbar {
@@ -70,39 +69,64 @@
       width: 100% !important;
     }
 
-    .el-menu-item, .el-submenu__title {
+    .el-menu-item,
+    .menu-title {
       overflow: hidden !important;
       text-overflow: ellipsis !important;
       white-space: nowrap !important;
     }
 
+    .el-menu-item .el-menu-tooltip__trigger {
+      display: inline-block !important;
+    }
+
     // menu hover
-    .submenu-title-noDropdown,
-    .el-submenu__title {
+    .theme-dark .sub-menu-title-noDropdown,
+    .theme-dark .el-sub-menu__title {
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        background-color: $base-sub-menu-title-hover !important;
+      }
+    }
+    .sub-menu-title-noDropdown,
+    .el-sub-menu__title {
+      &:hover {
+        background-color: rgba(0, 0, 0, 0.05) !important;
       }
     }
 
-    & .theme-dark .is-active > .el-submenu__title {
+    & .theme-dark .is-active > .el-sub-menu__title {
       color: $base-menu-color-active !important;
     }
 
-    & .nest-menu .el-submenu>.el-submenu__title,
-    & .el-submenu .el-menu-item {
+    & .nest-menu .el-sub-menu > .el-sub-menu__title,
+    & .el-sub-menu .el-menu-item {
       min-width: $base-sidebar-width !important;
-
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        background-color: rgba(0, 0, 0, 0.1) !important;
       }
     }
 
-    & .theme-dark .nest-menu .el-submenu>.el-submenu__title,
-    & .theme-dark .el-submenu .el-menu-item {
+    & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
+    & .theme-dark .el-sub-menu .el-menu-item {
       background-color: $base-sub-menu-background !important;
 
       &:hover {
         background-color: $base-sub-menu-hover !important;
+      }
+    }
+
+    & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
+    & .theme-dark .el-menu-item {
+      &:hover {
+        // you can use $sub-menuHover
+        background-color: $base-menu-hover !important;
+      }
+    }
+    & .nest-menu .el-sub-menu > .el-sub-menu__title,
+    & .el-menu-item {
+      &:hover {
+        // you can use $sub-menuHover
+        background-color: rgba(0, 0, 0, 0.04) !important;
       }
     }
   }
@@ -113,10 +137,10 @@
     }
 
     .main-container {
-      margin-left: 54px;
+      padding-left: 54px;
     }
 
-    .submenu-title-noDropdown {
+    .sub-menu-title-noDropdown {
       padding: 0 !important;
       position: relative;
 
@@ -129,23 +153,29 @@
       }
     }
 
-    .el-submenu {
+    .el-sub-menu {
       overflow: hidden;
 
-      &>.el-submenu__title {
+      & > .el-sub-menu__title {
         padding: 0 !important;
 
         .svg-icon {
           margin-left: 20px;
         }
-
       }
     }
 
     .el-menu--collapse {
-      .el-submenu {
-        &>.el-submenu__title {
-          &>span {
+      .el-sub-menu {
+        & > .el-sub-menu__title {
+          & > span {
+            height: 0;
+            width: 0;
+            overflow: hidden;
+            visibility: hidden;
+            display: inline-block;
+          }
+          & > i {
             height: 0;
             width: 0;
             overflow: hidden;
@@ -157,7 +187,7 @@
     }
   }
 
-  .el-menu--collapse .el-menu .el-submenu {
+  .el-menu--collapse .el-menu .el-sub-menu {
     min-width: $base-sidebar-width !important;
   }
 
@@ -168,7 +198,7 @@
     }
 
     .sidebar-container {
-      transition: transform .28s;
+      transition: transform 0.28s;
       width: $base-sidebar-width !important;
     }
 
@@ -182,7 +212,6 @@
   }
 
   .withoutAnimation {
-
     .main-container,
     .sidebar-container {
       transition: none;
@@ -192,36 +221,9 @@
 
 // when menu collapsed
 .el-menu--vertical {
-  &>.el-menu {
+  & > .el-menu {
     .svg-icon {
       margin-right: 16px;
-    }
-  }
-
-  .nest-menu .el-submenu>.el-submenu__title,
-  .el-menu-item {
-    &:hover {
-      // you can use $subMenuHover
-      background-color: rgba(0, 0, 0, 0.06) !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;
     }
   }
 }
diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss
index 073f8c6..468ad3c 100644
--- a/src/assets/styles/transition.scss
+++ b/src/assets/styles/transition.scss
@@ -15,7 +15,7 @@
 .fade-transform--move,
 .fade-transform-leave-active,
 .fade-transform-enter-active {
-  transition: all .5s;
+  transition: all 0.5s;
 }
 
 .fade-transform-enter {
@@ -31,7 +31,7 @@
 /* breadcrumb transition */
 .breadcrumb-enter-active,
 .breadcrumb-leave-active {
-  transition: all .5s;
+  transition: all 0.5s;
 }
 
 .breadcrumb-enter,
@@ -41,7 +41,7 @@
 }
 
 .breadcrumb-move {
-  transition: all .5s;
+  transition: all 0.5s;
 }
 
 .breadcrumb-leave-active {
diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss
index 0181402..37d8f5a 100644
--- a/src/assets/styles/variables.module.scss
+++ b/src/assets/styles/variables.module.scss
@@ -80,7 +80,7 @@
 $base-menu-background: var(--menuBg);
 $base-logo-title-color: #283146;
 
-$base-menu-light-color: rgba(0, 0, 0, 0.7);
+$base-menu-light-color: rgba(0, 0, 0);
 $base-menu-light-background: #ffffff;
 $base-logo-light-title-color: #001529;
 
diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss
index 34484d4..1bae12d 100644
--- a/src/assets/styles/variables.scss
+++ b/src/assets/styles/variables.scss
@@ -14,7 +14,7 @@
 $base-menu-background:#304156;
 $base-logo-title-color: #ffffff;
 
-$base-menu-light-color:rgba(0,0,0,.70);
+$base-menu-light-color:rgba(0,0,0);
 $base-menu-light-background:#ffffff;
 $base-logo-light-title-color: #001529;
 
diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
index 3d5b7b9..37937d6 100644
--- a/src/components/TopNav/index.vue
+++ b/src/components/TopNav/index.vue
@@ -181,7 +181,7 @@
 
 .topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
   border-bottom: 2px solid #{'var(--theme)'} !important;
-  color: #303133;
+  color: #000000;
 }
 
 /* submenu item */
diff --git a/src/components/VisibilityToolbar/index.vue b/src/components/VisibilityToolbar/index.vue
new file mode 100644
index 0000000..2773bb6
--- /dev/null
+++ b/src/components/VisibilityToolbar/index.vue
@@ -0,0 +1,173 @@
+<template>
+  <div class="top-right-btn">
+    <el-row>
+      <el-tooltip v-if="search" class="item" effect="dark" :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'" placement="top">
+        <el-button size="small" circle icon="el-icon-search" @click="toggleSearch"></el-button>
+      </el-tooltip>
+      <el-tooltip class="item" effect="dark" content="鍒锋柊" placement="top">
+        <el-button size="small" circle icon="el-icon-refresh" @click="refresh"></el-button>
+      </el-tooltip>
+      <el-tooltip v-if="columns" class="item" effect="dark" content="鏄剧ず/闅愯棌鍒�" placement="top">
+        <el-button size="small" circle icon="el-icon-menu" @click="openDrawer"></el-button>
+      </el-tooltip>
+    </el-row>
+
+    <el-drawer
+      :visible.sync="table"
+      title="淇℃伅鏄鹃殣绛涢��"
+      size="30%"
+      append-to-body
+      :wrapperCLosable="false"
+      :with-header="true">
+      <div slot="header">
+        <span>淇℃伅鏄鹃殣绛涢��</span>
+      </div>
+      <div slot="default" style="margin-left: 20px;margin-top: 20px">
+        <el-table :data="pagedColumns" style="width: 95%; height: 80%;;margin-bottom: 40px;">
+          <el-table-column prop="index" label="搴忓彿" width="80"></el-table-column>
+          <el-table-column prop="label" label="鏁版嵁鍚嶇О"></el-table-column>
+          <el-table-column prop="visible" label="鏄惁鏄剧ず">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.visible"
+                class="ml-2"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+                @change="switchChange(scope.row)"
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column prop="date" label="鎺掑簭">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.serialNumber" :min="0" style="width: 120px" @change="sortChange(scope.row, $event)"></el-input-number>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          v-if="total > pageSize"
+          :page-size="pageSize"
+          :current-page="currentPage"
+          :total="total"
+          layout="total, prev, pager, next"
+          @current-change="handlePageChange"
+        ></el-pagination>
+      </div>
+      <div style="position: absolute; bottom: 0; left: 0; right: 0; padding: 20px; text-align: right;">
+        <el-button @click="table = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="resetSort">閲� 缃�</el-button>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+
+export default {
+  data() {
+    return {
+      table: false,
+      currentPage: 1,
+      columnRef: null,
+    };
+  },
+  props: {
+    showSearch: {
+      type: Boolean,
+      default: true,
+    },
+    columns: {
+      type: Array,
+      default: () => [],
+    },
+    search: {
+      type: Boolean,
+      default: false,
+    },
+    gutter: {
+      type: Number,
+      default: 10,
+    },
+  },
+  computed: {
+    style() {
+      return {
+        marginRight: this.gutter ? `${this.gutter / 2}px` : '',
+      };
+    },
+    pageSize() {
+      return 10;
+    },
+    total() {
+      return this.columns.length;
+    },
+    pagedColumns() {
+      const start = (this.currentPage - 1) * this.pageSize;
+      const end = start + this.pageSize;
+      return this.columns.slice(start, end);
+    },
+  },
+  methods: {
+    toggleSearch() {
+      this.$emit('update:showSearch', !this.showSearch);
+    },
+    refresh() {
+      this.$emit('queryTable');
+    },
+    openDrawer() {
+      this.table = true;
+    },
+    switchChange(row) {
+      this.$emit('update:columns', row);
+    },
+    handlePageChange(page) {
+      this.currentPage = page;
+    },
+    sortChange(row, val) {
+      this.$emit('update:sort', { key: row.key, serialNumber: val });
+    },
+    resetSort() {
+      this.$emit('update:resetSort');
+    },
+  },
+  mounted() {
+    this.columns.forEach((item, index) => {
+      if (item.visible) {
+
+      }
+    });
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-transfer__button) {
+  border-radius: 50%;
+  display: block;
+  margin-left: 0px;
+}
+:deep(.el-transfer__button:first-child) {
+  margin-bottom: 10px;
+}
+
+.my-el-transfer {
+  text-align: center;
+}
+.tree-header {
+  width: 100%;
+  line-height: 24px;
+  text-align: center;
+}
+.show-btn {
+  margin-left: 12px;
+}
+.drawer-footer {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  padding: 20px;
+  background: #fff;
+  border-top: 1px solid #e8e8e8;
+  text-align: right;
+}
+</style>
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 466cd98..9a5141b 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -1,49 +1,75 @@
 <template>
-  <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
-    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
-
-    <div class="right-menu">
-      <template v-if="device!=='mobile'">
-        <search id="header-search" class="right-menu-item" />
-
-        <el-tooltip content="婧愮爜鍦板潃" effect="dark" placement="bottom">
-          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <el-tooltip content="鏂囨。鍦板潃" effect="dark" placement="bottom">
-          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <screenfull id="screenfull" class="right-menu-item hover-effect" />
-
-        <el-tooltip content="甯冨眬澶у皬" effect="dark" placement="bottom">
-          <size-select id="size-select" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-      </template>
-
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-        <div class="avatar-wrapper">
-          <img :src="avatar" class="user-avatar">
-          <i class="el-icon-caret-bottom" />
+    <div class="navbar">
+        <div class="ruoyi-logo">
+            <img src="@/assets/logo/logo.png" alt="" />
+            <span>灏勬椽椤圭洰绠$悊绯荤粺</span>
         </div>
-        <el-dropdown-menu slot="dropdown">
-          <router-link to="/user/profile">
-            <el-dropdown-item>涓汉涓績</el-dropdown-item>
-          </router-link>
-          <el-dropdown-item @click.native="setting = true">
-            <span>甯冨眬璁剧疆</span>
-          </el-dropdown-item>
-          <el-dropdown-item divided @click.native="logout">
-            <span>閫�鍑虹櫥褰�</span>
-          </el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
+        <div class="right-menu flex align-center">
+            <template>
+                <search-menu ref="searchMenuRef" />
+                <el-tooltip content="鎼滅储" effect="dark" placement="bottom">
+                    <div
+                        class="right-menu-item hover-effect"
+                        @click="openSearchMenu"
+                    >
+                        <svg-icon
+                            class-name="search-icon"
+                            icon-class="search"
+                        />
+                    </div>
+                </el-tooltip>
+                <!-- 娑堟伅 -->
+                <el-tooltip content="娑堟伅" effect="dark" placement="bottom">
+                    <div class="right-menu-item hover-effect">
+                        <el-popover
+                            placement="bottom"
+                            trigger="click"
+                            transition="el-zoom-in-top"
+                            :width="300"
+                            :persistent="false"
+                        >
+                            <template #reference>
+                                <el-badge
+                                    :value="newNotice > 0 ? newNotice : ''"
+                                    :max="99"
+                                >
+                                    <svg-icon icon-class="message" />
+                                </el-badge>
+                            </template>
+                            <template #default>
+                                <notice></notice>
+                            </template>
+                        </el-popover>
+                    </div>
+                </el-tooltip>
+                <el-tooltip content="鍏ㄥ睆" effect="dark" placement="bottom">
+                    <screenfull
+                        id="screenfull"
+                        class="right-menu-item hover-effect"
+                    />
+                </el-tooltip>
+            </template>
+            <div class="avatar-container">
+                <el-dropdown
+                    class="avatar-container right-menu-item hover-effect"
+                    trigger="click"
+                >
+                    <div class="avatar-wrapper">
+                        <img :src="avatar" class="user-avatar" />
+                        <i class="el-icon-caret-bottom" />
+                    </div>
+                    <el-dropdown-menu slot="dropdown">
+                        <router-link to="/user/profile">
+                            <el-dropdown-item>涓汉涓績</el-dropdown-item>
+                        </router-link>
+                        <el-dropdown-item divided @click.native="logout">
+                            <span>閫�鍑虹櫥褰�</span>
+                        </el-dropdown-item>
+                    </el-dropdown-menu>
+                </el-dropdown>
+            </div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
@@ -56,145 +82,198 @@
 import Search from '@/components/HeaderSearch'
 import RuoYiGit from '@/components/RuoYi/Git'
 import RuoYiDoc from '@/components/RuoYi/Doc'
+import SearchMenu from './TopBar/search.vue';
+import Notice from './Notice/index.vue';
 
 export default {
-  components: {
-    Breadcrumb,
-    TopNav,
-    Hamburger,
-    Screenfull,
-    SizeSelect,
-    Search,
-    RuoYiGit,
-    RuoYiDoc
-  },
-  computed: {
-    ...mapGetters([
-      'sidebar',
-      'avatar',
-      'device'
-    ]),
-    setting: {
-      get() {
-        return this.$store.state.settings.showSettings
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'showSettings',
-          value: val
-        })
-      }
+    data() {
+        return {
+            newNotice: 0
+        }
     },
-    topNav: {
-      get() {
-        return this.$store.state.settings.topNav
-      }
-    }
-  },
-  methods: {
-    toggleSideBar() {
-      this.$store.dispatch('app/toggleSideBar')
+    components: {
+        Breadcrumb,
+        TopNav,
+        Hamburger,
+        Screenfull,
+        SizeSelect,
+        Search,
+        RuoYiGit,
+        RuoYiDoc,
+        SearchMenu,
+        Notice
     },
-    async logout() {
-      this.$confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      }).then(() => {
-        this.$store.dispatch('LogOut').then(() => {
-          location.href = '/index';
-        })
-      }).catch(() => {});
+    computed: {
+        ...mapGetters([
+            'sidebar',
+            'avatar',
+            'device'
+        ]),
+        setting: {
+            get() {
+                return this.$store.state.settings.showSettings
+            },
+            set(val) {
+                this.$store.dispatch('settings/changeSetting', {
+                    key: 'showSettings',
+                    value: val
+                })
+            }
+        },
+        topNav: {
+            get() {
+                return this.$store.state.settings.topNav
+            }
+        }
+    },
+    methods: {
+        toggleSideBar() {
+            this.$store.dispatch('app/toggleSideBar')
+        },
+        async logout() {
+            this.$confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning'
+            }).then(() => {
+                this.$store.dispatch('LogOut').then(() => {
+                    location.href = '/index';
+                })
+            }).catch(() => { });
+        },
+        openSearchMenu() {
+            this.searchMenuRef.value?.openSearch();
+        },
     }
-  }
 }
 </script>
 
 <style lang="scss" scoped>
+::v-deep.el-select .el-input__wrapper {
+    height: 30px;
+}
+
+::v-deep .el-badge__content.is-fixed {
+    top: 12px;
+}
+
+.flex {
+    display: flex;
+}
+
+.align-center {
+    align-items: center;
+}
+
+.ruoyi-logo {
+    float: left;
+    line-height: 54px;
+    font-weight: 400;
+    font-size: 24px;
+    font-style: italic;
+    font-family: PangMenZhengDao;
+    // color: #ffffff;
+    // width: 220px;
+    display: flex;
+    align-items: center;
+    > img {
+        margin: 0 10px 0 21px;
+    }
+    > div {
+        margin: 0 0 0 21px;
+    }
+    .down {
+        margin-top: 22px;
+        color: #ffffff;
+    }
+}
 .navbar {
-  height: 50px;
-  overflow: hidden;
-  position: relative;
-  background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
+    height: 50px;
+    overflow: hidden;
+    position: relative;
+    //background: #fff;
+    box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
 
-  .hamburger-container {
-    line-height: 46px;
-    height: 100%;
-    float: left;
-    cursor: pointer;
-    transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
-
-    &:hover {
-      background: rgba(0, 0, 0, .025)
-    }
-  }
-
-  .breadcrumb-container {
-    float: left;
-  }
-
-  .topmenu-container {
-    position: absolute;
-    left: 50px;
-  }
-
-  .errLog-container {
-    display: inline-block;
-    vertical-align: top;
-  }
-
-  .right-menu {
-    float: right;
-    height: 100%;
-    line-height: 50px;
-
-    &:focus {
-      outline: none;
-    }
-
-    .right-menu-item {
-      display: inline-block;
-      padding: 0 8px;
-      height: 100%;
-      font-size: 18px;
-      color: #5a5e66;
-      vertical-align: text-bottom;
-
-      &.hover-effect {
+    .hamburger-container {
+        line-height: 46px;
+        height: 100%;
+        float: left;
         cursor: pointer;
-        transition: background .3s;
+        transition: background 0.3s;
+        -webkit-tap-highlight-color: transparent;
 
         &:hover {
-          background: rgba(0, 0, 0, .025)
+            background: rgba(0, 0, 0, 0.025);
         }
-      }
     }
 
-    .avatar-container {
-      margin-right: 30px;
-
-      .avatar-wrapper {
-        margin-top: 5px;
-        position: relative;
-
-        .user-avatar {
-          cursor: pointer;
-          width: 40px;
-          height: 40px;
-          border-radius: 10px;
-        }
-
-        .el-icon-caret-bottom {
-          cursor: pointer;
-          position: absolute;
-          right: -20px;
-          top: 25px;
-          font-size: 12px;
-        }
-      }
+    .breadcrumb-container {
+        float: left;
     }
-  }
+
+    .topmenu-container {
+        position: absolute;
+        left: 50px;
+    }
+
+    .errLog-container {
+        display: inline-block;
+        vertical-align: top;
+    }
+
+    .right-menu {
+        float: right;
+        height: 100%;
+        line-height: 50px;
+        display: flex;
+
+        &:focus {
+            outline: none;
+        }
+
+        .right-menu-item {
+            display: inline-block;
+            padding: 0 8px;
+            height: 100%;
+            font-size: 18px;
+            color: #5a5e66;
+            vertical-align: text-bottom;
+
+            &.hover-effect {
+                cursor: pointer;
+                transition: background 0.3s;
+
+                &:hover {
+                    background: rgba(0, 0, 0, 0.025);
+                }
+            }
+        }
+
+        .avatar-container {
+            margin-right: 40px;
+            margin-top: 10px;
+
+            .avatar-wrapper {
+                margin-top: 5px;
+                position: relative;
+
+                .user-avatar {
+                    cursor: pointer;
+                    width: 40px;
+                    height: 40px;
+                    border-radius: 10px;
+                    margin-top: 10px;
+                }
+
+                i {
+                    cursor: pointer;
+                    position: absolute;
+                    right: -20px;
+                    top: 25px;
+                    font-size: 12px;
+                }
+            }
+        }
+    }
 }
 </style>
diff --git a/src/layout/components/Notice/index.vue b/src/layout/components/Notice/index.vue
new file mode 100644
index 0000000..40aea86
--- /dev/null
+++ b/src/layout/components/Notice/index.vue
@@ -0,0 +1,155 @@
+<template>
+    <div v-loading="state.loading" class="layout-navbars-breadcrumb-user-news">
+        <div class="head-box">
+            <div class="head-box-title">閫氱煡鍏憡</div>
+            <div class="head-box-btn" @click="readAll">鍏ㄩ儴宸茶</div>
+        </div>
+        <div v-loading="state.loading" class="content-box">
+            <template v-if="newsList.length > 0">
+                <div
+                    v-for="(v, k) in newsList"
+                    :key="k"
+                    class="content-box-item"
+                    @click="onNewsClick(k)"
+                >
+                    <div class="item-conten">
+                        <div>{{ v.message }}</div>
+                        <div class="content-box-msg"></div>
+                        <div class="content-box-time">{{ v.time }}</div>
+                    </div>
+                    <!-- 宸茶/鏈 -->
+                    <span
+                        v-if="v.read"
+                        class="el-tag el-tag--success el-tag--mini read"
+                        >宸茶</span
+                    >
+                    <span v-else class="el-tag el-tag--danger el-tag--mini read"
+                        >鏈</span
+                    >
+                </div>
+            </template>
+            <el-empty v-else :description="'娑堟伅涓虹┖'"></el-empty>
+        </div>
+    </div>
+</template>
+
+<script >
+// import { storeToRefs } from 'pinia';
+// import useNoticeStore from '@/store/modules/notice';
+
+export default {
+    data() {
+        return {
+            state: {
+                loading: false
+            },
+            newsList: []
+        }
+    },
+    methods: {
+        /**
+         * 鍒濆鍖栨暟鎹�
+         * @returns
+         */
+        getTableData() {
+            this.state.loading = true;
+            // this.newsList.value = noticeStore.state.value.notices;
+            this.state.loading = false;
+        },
+        //鐐瑰嚮娑堟伅锛屽啓鍏ュ凡璇�
+        onNewsClick(item) {
+            this.newsList.value[item].read = true;
+            //骞朵笖鍐欏叆pinia
+            this.noticeStore.state.value.notices = newsList.value;
+        },
+        readAll() {
+
+        },
+        // 鍓嶅線閫氱煡涓績鐐瑰嚮
+        onGoToGiteeClick() {
+            window.open('https://gitee.com/dromara/RuoYi-Vue-Plus/tree/5.X/');
+        }
+    },
+    mounted: function () {
+        this.$nextTick(() => {
+            this.getTableData();
+        });
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.layout-navbars-breadcrumb-user-news {
+    .head-box {
+        display: flex;
+        border-bottom: 1px solid var(--el-border-color-lighter);
+        box-sizing: border-box;
+        color: var(--el-text-color-primary);
+        justify-content: space-between;
+        height: 35px;
+        align-items: center;
+
+        .head-box-btn {
+            color: var(--el-color-primary);
+            font-size: 13px;
+            cursor: pointer;
+            opacity: 0.8;
+
+            &:hover {
+                opacity: 1;
+            }
+        }
+    }
+
+    .content-box {
+        height: 300px;
+        overflow: auto;
+        font-size: 13px;
+
+        .content-box-item {
+            padding-top: 12px;
+            display: flex;
+
+            &:last-of-type {
+                padding-bottom: 12px;
+            }
+
+            .content-box-msg {
+                color: var(--el-text-color-secondary);
+                margin-top: 5px;
+                margin-bottom: 5px;
+            }
+
+            .content-box-time {
+                color: var(--el-text-color-secondary);
+            }
+
+            .item-conten {
+                width: 100%;
+                display: flex;
+                flex-direction: column;
+            }
+        }
+    }
+
+    .foot-box {
+        height: 35px;
+        color: var(--el-color-primary);
+        font-size: 13px;
+        cursor: pointer;
+        opacity: 0.8;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-top: 1px solid var(--el-border-color-lighter);
+
+        &:hover {
+            opacity: 1;
+        }
+    }
+
+    ::v-deep .el-empty__description p {
+        font-size: 13px;
+    }
+}
+</style>
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
index 51d0839..8ee9d82 100644
--- a/src/layout/components/Sidebar/index.vue
+++ b/src/layout/components/Sidebar/index.vue
@@ -1,12 +1,29 @@
 <template>
-    <div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
-        <logo v-if="showLogo" :collapse="isCollapse" />
-        <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
+    <div
+        :class="{ 'has-logo': showLogo }"
+        :style="{ backgroundColor: variables.menuLightBackground }"
+    >
+        <!-- <logo v-if="showLogo" :collapse="isCollapse" /> -->
+        <div class="hamburger-container">
+            <div class="border">
+                <div class="menu-tip" v-show="sidebar.opened">鑿滃崟绠$悊</div>
+                <hamburger
+                    id="hamburger-container"
+                    :is-active="sidebar.opened"
+                    class="hamburger-icon"
+                    @toggleClick="toggleSideBar"
+                />
+            </div>
+        </div>
+        <el-scrollbar
+            :class="settings.sideTheme"
+            wrap-class="scrollbar-wrapper"
+        >
             <el-menu
                 :default-active="activeMenu"
                 :collapse="isCollapse"
-                :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
-                :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor"
+                :background-color="variables.menuLightBackground"
+                :text-color="variables.menuLightColor"
                 :unique-opened="true"
                 :active-text-color="settings.theme"
                 :collapse-transition="false"
@@ -14,7 +31,7 @@
             >
                 <sidebar-item
                     v-for="(route, index) in sidebarRouters"
-                    :key="route.path  + index"
+                    :key="route.path + index"
                     :item="route"
                     :base-path="route.path"
                 />
@@ -28,9 +45,10 @@
 import Logo from "./Logo";
 import SidebarItem from "./SidebarItem";
 import variables from "@/assets/styles/variables.scss";
+import Hamburger from '@/components/Hamburger'
 
 export default {
-    components: { SidebarItem, Logo },
+    components: { SidebarItem, Logo, Hamburger },
     computed: {
         ...mapState(["settings"]),
         ...mapGetters(["sidebarRouters", "sidebar"]),
@@ -52,6 +70,45 @@
         isCollapse() {
             return !this.sidebar.opened;
         }
+    },
+    created() {
+        // console.log(this.settings.sideTheme);
+    },
+    methods: {
+        toggleSideBar() {
+            this.$store.dispatch('app/toggleSideBar')
+        },
     }
 };
 </script>
+<style scoped>
+.hamburger-container {
+    display: flex;
+    color: #fff;
+    justify-content: space-between;
+    height: 59px;
+    line-height: 59px;
+    .border {
+        margin: 0 auto;
+        display: flex;
+        justify-content: space-between;
+        width: 180px;
+        border-bottom: 1px solid #e6eaf5;
+    }
+    .menu-tip {
+        height: 50px;
+        font-size: 14px;
+        font-weight: 400;
+        color: #000000;
+        padding-left: 20px;
+    }
+    .hamburger-icon {
+        width: 54px;
+        text-align: center;
+        cursor: pointer;
+        &:hover {
+            background: rgba(0, 0, 0, 0.025);
+        }
+    }
+}
+</style>
\ No newline at end of file
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
index 96585a5..87257c9 100644
--- a/src/layout/components/TagsView/index.vue
+++ b/src/layout/components/TagsView/index.vue
@@ -1,31 +1,64 @@
 <template>
-  <div id="tags-view-container" class="tags-view-container">
-    <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
-      <router-link
-        v-for="tag in visitedViews"
-        ref="tag"
-        :key="tag.path"
-        :class="isActive(tag)?'active':''"
-        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
-        tag="span"
-        class="tags-view-item"
-        :style="activeStyle(tag)"
-        @click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
-        @contextmenu.prevent.native="openMenu(tag,$event)"
-      >
-        {{ tag.title }}
-        <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
-      </router-link>
-    </scroll-pane>
-    <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
-      <li @click="refreshSelectedTag(selectedTag)"><i class="el-icon-refresh-right"></i> 鍒锋柊椤甸潰</li>
-      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><i class="el-icon-close"></i> 鍏抽棴褰撳墠</li>
-      <li @click="closeOthersTags"><i class="el-icon-circle-close"></i> 鍏抽棴鍏朵粬</li>
-      <li v-if="!isFirstView()" @click="closeLeftTags"><i class="el-icon-back"></i> 鍏抽棴宸︿晶</li>
-      <li v-if="!isLastView()" @click="closeRightTags"><i class="el-icon-right"></i> 鍏抽棴鍙充晶</li>
-      <li @click="closeAllTags(selectedTag)"><i class="el-icon-circle-close"></i> 鍏ㄩ儴鍏抽棴</li>
-    </ul>
-  </div>
+    <div id="tags-view-container" class="tags-view-container">
+        <scroll-pane
+            ref="scrollPane"
+            class="tags-view-wrapper"
+            @scroll="handleScroll"
+        >
+            <router-link
+                v-for="tag in visitedViews"
+                ref="tag"
+                :key="tag.path"
+                :class="isActive(tag) ? 'active' : ''"
+                :to="{
+                    path: tag.path,
+                    query: tag.query,
+                    fullPath: tag.fullPath
+                }"
+                tag="span"
+                class="tags-view-item"
+                :style="activeStyle(tag)"
+                @click.middle.native="
+                    !isAffix(tag) ? closeSelectedTag(tag) : ''
+                "
+                @contextmenu.prevent.native="openMenu(tag, $event)"
+            >
+                {{ tag.title }}
+                <span
+                    v-if="!isAffix(tag)"
+                    class="el-icon-close"
+                    @click.prevent.stop="closeSelectedTag(tag)"
+                />
+            </router-link>
+        </scroll-pane>
+        <ul
+            v-show="visible"
+            :style="{ left: left + 'px', top: top + 'px' }"
+            class="contextmenu"
+        >
+            <li @click="refreshSelectedTag(selectedTag)">
+                <i class="el-icon-refresh-right"></i> 鍒锋柊椤甸潰
+            </li>
+            <li
+                v-if="!isAffix(selectedTag)"
+                @click="closeSelectedTag(selectedTag)"
+            >
+                <i class="el-icon-close"></i> 鍏抽棴褰撳墠
+            </li>
+            <li @click="closeOthersTags">
+                <i class="el-icon-circle-close"></i> 鍏抽棴鍏朵粬
+            </li>
+            <li v-if="!isFirstView()" @click="closeLeftTags">
+                <i class="el-icon-back"></i> 鍏抽棴宸︿晶
+            </li>
+            <li v-if="!isLastView()" @click="closeRightTags">
+                <i class="el-icon-right"></i> 鍏抽棴鍙充晶
+            </li>
+            <li @click="closeAllTags(selectedTag)">
+                <i class="el-icon-circle-close"></i> 鍏ㄩ儴鍏抽棴
+            </li>
+        </ul>
+    </div>
 </template>
 
 <script>
@@ -33,300 +66,304 @@
 import path from 'path'
 
 export default {
-  components: { ScrollPane },
-  data() {
-    return {
-      visible: false,
-      top: 0,
-      left: 0,
-      selectedTag: {},
-      affixTags: []
-    }
-  },
-  computed: {
-    visitedViews() {
-      return this.$store.state.tagsView.visitedViews
-    },
-    routes() {
-      return this.$store.state.permission.routes
-    },
-    theme() {
-      return this.$store.state.settings.theme;
-    }
-  },
-  watch: {
-    $route() {
-      this.addTags()
-      this.moveToCurrentTag()
-    },
-    visible(value) {
-      if (value) {
-        document.body.addEventListener('click', this.closeMenu)
-      } else {
-        document.body.removeEventListener('click', this.closeMenu)
-      }
-    }
-  },
-  mounted() {
-    this.initTags()
-    this.addTags()
-  },
-  methods: {
-    isActive(route) {
-      return route.path === this.$route.path
-    },
-    activeStyle(tag) {
-      if (!this.isActive(tag)) return {};
-      return {
-        "background-color": this.theme,
-        "border-color": this.theme
-      };
-    },
-    isAffix(tag) {
-      return tag.meta && tag.meta.affix
-    },
-    isFirstView() {
-      try {
-        return this.selectedTag.fullPath === '/index' || this.selectedTag.fullPath === this.visitedViews[1].fullPath
-      } catch (err) {
-        return false
-      }
-    },
-    isLastView() {
-      try {
-        return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath
-      } catch (err) {
-        return false
-      }
-    },
-    filterAffixTags(routes, basePath = '/') {
-      let tags = []
-      routes.forEach(route => {
-        if (route.meta && route.meta.affix) {
-          const tagPath = path.resolve(basePath, route.path)
-          tags.push({
-            fullPath: tagPath,
-            path: tagPath,
-            name: route.name,
-            meta: { ...route.meta }
-          })
+    components: { ScrollPane },
+    data() {
+        return {
+            visible: false,
+            top: 0,
+            left: 0,
+            selectedTag: {},
+            affixTags: []
         }
-        if (route.children) {
-          const tempTags = this.filterAffixTags(route.children, route.path)
-          if (tempTags.length >= 1) {
-            tags = [...tags, ...tempTags]
-          }
-        }
-      })
-      return tags
     },
-    initTags() {
-      const affixTags = this.affixTags = this.filterAffixTags(this.routes)
-      for (const tag of affixTags) {
-        // Must have tag name
-        if (tag.name) {
-          this.$store.dispatch('tagsView/addVisitedView', tag)
+    computed: {
+        visitedViews() {
+            return this.$store.state.tagsView.visitedViews
+        },
+        routes() {
+            return this.$store.state.permission.routes
+        },
+        theme() {
+            return this.$store.state.settings.theme;
         }
-      }
     },
-    addTags() {
-      const { name } = this.$route
-      if (name) {
-        this.$store.dispatch('tagsView/addView', this.$route)
-        if (this.$route.meta.link) {
-          this.$store.dispatch('tagsView/addIframeView', this.$route)
-        }
-      }
-      return false
-    },
-    moveToCurrentTag() {
-      const tags = this.$refs.tag
-      this.$nextTick(() => {
-        for (const tag of tags) {
-          if (tag.to.path === this.$route.path) {
-            this.$refs.scrollPane.moveToTarget(tag)
-            // when query is different then update
-            if (tag.to.fullPath !== this.$route.fullPath) {
-              this.$store.dispatch('tagsView/updateVisitedView', this.$route)
+    watch: {
+        $route() {
+            this.addTags()
+            this.moveToCurrentTag()
+        },
+        visible(value) {
+            if (value) {
+                document.body.addEventListener('click', this.closeMenu)
+            } else {
+                document.body.removeEventListener('click', this.closeMenu)
             }
-            break
-          }
         }
-      })
     },
-    refreshSelectedTag(view) {
-      this.$tab.refreshPage(view);
-      if (this.$route.meta.link) {
-        this.$store.dispatch('tagsView/delIframeView', this.$route)
-      }
+    mounted() {
+        this.initTags()
+        this.addTags()
     },
-    closeSelectedTag(view) {
-      this.$tab.closePage(view).then(({ visitedViews }) => {
-        if (this.isActive(view)) {
-          this.toLastView(visitedViews, view)
-        }
-      })
-    },
-    closeRightTags() {
-      this.$tab.closeRightPage(this.selectedTag).then(visitedViews => {
-        if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
-          this.toLastView(visitedViews)
-        }
-      })
-    },
-    closeLeftTags() {
-      this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => {
-        if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
-          this.toLastView(visitedViews)
-        }
-      })
-    },
-    closeOthersTags() {
-      this.$router.push(this.selectedTag.fullPath).catch(()=>{});
-      this.$tab.closeOtherPage(this.selectedTag).then(() => {
-        this.moveToCurrentTag()
-      })
-    },
-    closeAllTags(view) {
-      this.$tab.closeAllPage().then(({ visitedViews }) => {
-        if (this.affixTags.some(tag => tag.path === this.$route.path)) {
-          return
-        }
-        this.toLastView(visitedViews, view)
-      })
-    },
-    toLastView(visitedViews, view) {
-      const latestView = visitedViews.slice(-1)[0]
-      if (latestView) {
-        this.$router.push(latestView.fullPath)
-      } else {
-        // now the default is to redirect to the home page if there is no tags-view,
-        // you can adjust it according to your needs.
-        if (view.name === 'Dashboard') {
-          // to reload home page
-          this.$router.replace({ path: '/redirect' + view.fullPath })
-        } else {
-          this.$router.push('/')
-        }
-      }
-    },
-    openMenu(tag, e) {
-      const menuMinWidth = 105
-      const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
-      const offsetWidth = this.$el.offsetWidth // container width
-      const maxLeft = offsetWidth - menuMinWidth // left boundary
-      const left = e.clientX - offsetLeft + 15 // 15: margin right
+    methods: {
+        isActive(route) {
+            return route.path === this.$route.path
+        },
+        activeStyle(tag) {
+            if (!this.isActive(tag)) return {};
+            return {
+                "background-color": this.theme,
+                "border-color": this.theme
+            };
+        },
+        isAffix(tag) {
+            return tag.meta && tag.meta.affix
+        },
+        isFirstView() {
+            try {
+                return this.selectedTag.fullPath === '/index' || this.selectedTag.fullPath === this.visitedViews[1].fullPath
+            } catch (err) {
+                return false
+            }
+        },
+        isLastView() {
+            try {
+                return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath
+            } catch (err) {
+                return false
+            }
+        },
+        filterAffixTags(routes, basePath = '/') {
+            let tags = []
+            routes.forEach(route => {
+                if (route.meta && route.meta.affix) {
+                    const tagPath = path.resolve(basePath, route.path)
+                    tags.push({
+                        fullPath: tagPath,
+                        path: tagPath,
+                        name: route.name,
+                        meta: { ...route.meta }
+                    })
+                }
+                if (route.children) {
+                    const tempTags = this.filterAffixTags(route.children, route.path)
+                    if (tempTags.length >= 1) {
+                        tags = [...tags, ...tempTags]
+                    }
+                }
+            })
+            return tags
+        },
+        initTags() {
+            const affixTags = this.affixTags = this.filterAffixTags(this.routes)
+            for (const tag of affixTags) {
+                // Must have tag name
+                if (tag.name) {
+                    this.$store.dispatch('tagsView/addVisitedView', tag)
+                }
+            }
+        },
+        addTags() {
+            const { name } = this.$route
+            if (name) {
+                this.$store.dispatch('tagsView/addView', this.$route)
+                if (this.$route.meta.link) {
+                    this.$store.dispatch('tagsView/addIframeView', this.$route)
+                }
+            }
+            return false
+        },
+        moveToCurrentTag() {
+            const tags = this.$refs.tag
+            this.$nextTick(() => {
+                for (const tag of tags) {
+                    if (tag.to.path === this.$route.path) {
+                        this.$refs.scrollPane.moveToTarget(tag)
+                        // when query is different then update
+                        if (tag.to.fullPath !== this.$route.fullPath) {
+                            this.$store.dispatch('tagsView/updateVisitedView', this.$route)
+                        }
+                        break
+                    }
+                }
+            })
+        },
+        refreshSelectedTag(view) {
+            this.$tab.refreshPage(view);
+            if (this.$route.meta.link) {
+                this.$store.dispatch('tagsView/delIframeView', this.$route)
+            }
+        },
+        closeSelectedTag(view) {
+            this.$tab.closePage(view).then(({ visitedViews }) => {
+                if (this.isActive(view)) {
+                    this.toLastView(visitedViews, view)
+                }
+            })
+        },
+        closeRightTags() {
+            this.$tab.closeRightPage(this.selectedTag).then(visitedViews => {
+                if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
+                    this.toLastView(visitedViews)
+                }
+            })
+        },
+        closeLeftTags() {
+            this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => {
+                if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
+                    this.toLastView(visitedViews)
+                }
+            })
+        },
+        closeOthersTags() {
+            this.$router.push(this.selectedTag.fullPath).catch(() => { });
+            this.$tab.closeOtherPage(this.selectedTag).then(() => {
+                this.moveToCurrentTag()
+            })
+        },
+        closeAllTags(view) {
+            this.$tab.closeAllPage().then(({ visitedViews }) => {
+                if (this.affixTags.some(tag => tag.path === this.$route.path)) {
+                    return
+                }
+                this.toLastView(visitedViews, view)
+            })
+        },
+        toLastView(visitedViews, view) {
+            const latestView = visitedViews.slice(-1)[0]
+            if (latestView) {
+                this.$router.push(latestView.fullPath)
+            } else {
+                // now the default is to redirect to the home page if there is no tags-view,
+                // you can adjust it according to your needs.
+                if (view.name === 'Dashboard') {
+                    // to reload home page
+                    this.$router.replace({ path: '/redirect' + view.fullPath })
+                } else {
+                    this.$router.push('/')
+                }
+            }
+        },
+        openMenu(tag, e) {
+            const menuMinWidth = 105
+            const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
+            const offsetWidth = this.$el.offsetWidth // container width
+            const maxLeft = offsetWidth - menuMinWidth // left boundary
+            const left = e.clientX - offsetLeft + 15 // 15: margin right
 
-      if (left > maxLeft) {
-        this.left = maxLeft
-      } else {
-        this.left = left
-      }
+            if (left > maxLeft) {
+                this.left = maxLeft
+            } else {
+                this.left = left
+            }
 
-      this.top = e.clientY
-      this.visible = true
-      this.selectedTag = tag
-    },
-    closeMenu() {
-      this.visible = false
-    },
-    handleScroll() {
-      this.closeMenu()
+            this.top = e.clientY
+            this.visible = true
+            this.selectedTag = tag
+        },
+        closeMenu() {
+            this.visible = false
+        },
+        handleScroll() {
+            this.closeMenu()
+        }
     }
-  }
 }
 </script>
 
 <style lang="scss" scoped>
 .tags-view-container {
-  height: 34px;
-  width: 100%;
-  background: #fff;
-  border-bottom: 1px solid #d8dce5;
-  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
-  .tags-view-wrapper {
-    .tags-view-item {
-      display: inline-block;
-      position: relative;
-      cursor: pointer;
-      height: 26px;
-      line-height: 26px;
-      border: 1px solid #d8dce5;
-      color: #495060;
-      background: #fff;
-      padding: 0 8px;
-      font-size: 12px;
-      margin-left: 5px;
-      margin-top: 4px;
-      &:first-of-type {
-        margin-left: 15px;
-      }
-      &:last-of-type {
-        margin-right: 15px;
-      }
-      &.active {
-        background-color: #42b983;
-        color: #fff;
-        border-color: #42b983;
-        &::before {
-          content: '';
-          background: #fff;
-          display: inline-block;
-          width: 8px;
-          height: 8px;
-          border-radius: 50%;
-          position: relative;
-          margin-right: 2px;
+    height: 44px;
+    width: 100%;
+    background-color: var(--el-bg-color);
+    border: 1px solid var(--el-border-color-light);
+    line-height: 44px;
+
+    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
+    .tags-view-wrapper {
+        .tags-view-item {
+            display: inline-block;
+            position: relative;
+            cursor: pointer;
+            height: 26px;
+            line-height: 23px;
+            background-color: var(--el-bg-color);
+            border: 1px solid var(--el-border-color-light);
+            color: #495060;
+            padding: 0 8px;
+            font-size: 12px;
+            margin-left: 5px;
+            margin-top: 4px;
+            &:hover {
+                color: var(--el-color-primary);
+            }
+            &:first-of-type {
+                margin-left: 15px;
+            }
+            &:last-of-type {
+                margin-right: 15px;
+            }
+            &.active {
+                background-color: #42b983;
+                color: #fff;
+                border-color: #42b983;
+                &::before {
+                    content: '';
+                    background: #fff;
+                    display: inline-block;
+                    width: 8px;
+                    height: 8px;
+                    border-radius: 50%;
+                    position: relative;
+                    margin-right: 5px;
+                }
+            }
         }
-      }
     }
-  }
-  .contextmenu {
-    margin: 0;
-    background: #fff;
-    z-index: 3000;
-    position: absolute;
-    list-style-type: none;
-    padding: 5px 0;
-    border-radius: 4px;
-    font-size: 12px;
-    font-weight: 400;
-    color: #333;
-    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
-    li {
-      margin: 0;
-      padding: 7px 16px;
-      cursor: pointer;
-      &:hover {
-        background: #eee;
-      }
+    .contextmenu {
+        margin: 0;
+        background: var(--el-bg-color);
+        z-index: 3000;
+        position: absolute;
+        list-style-type: none;
+        padding: 5px 0;
+        border-radius: 4px;
+        font-size: 12px;
+        font-weight: 400;
+        box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+        li {
+            margin: 0;
+            padding: 7px 16px;
+            cursor: pointer;
+            &:hover {
+                background: #eee;
+            }
+        }
     }
-  }
 }
 </style>
 
 <style lang="scss">
 //reset element css of el-icon-close
 .tags-view-wrapper {
-  .tags-view-item {
-    .el-icon-close {
-      width: 16px;
-      height: 16px;
-      vertical-align: 2px;
-      border-radius: 50%;
-      text-align: center;
-      transition: all .3s cubic-bezier(.645, .045, .355, 1);
-      transform-origin: 100% 50%;
-      &:before {
-        transform: scale(.6);
-        display: inline-block;
-        vertical-align: -3px;
-      }
-      &:hover {
-        background-color: #b4bccc;
-        color: #fff;
-      }
+    .tags-view-item {
+        .el-icon-close {
+            width: 16px;
+            height: 16px;
+            vertical-align: 2px;
+            border-radius: 50%;
+            text-align: center;
+            transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+            transform-origin: 100% 50%;
+            &:before {
+                transform: scale(0.6);
+                display: inline-block;
+                vertical-align: -3px;
+            }
+            &:hover {
+                background-color: #b4bccc;
+                color: #fff;
+            }
+        }
     }
-  }
 }
 </style>
diff --git a/src/layout/components/TopBar/search.vue b/src/layout/components/TopBar/search.vue
new file mode 100644
index 0000000..001f91e
--- /dev/null
+++ b/src/layout/components/TopBar/search.vue
@@ -0,0 +1,157 @@
+<template>
+    <div class="layout-search-dialog">
+        <el-dialog
+            v-model="state.isShowSearch"
+            destroy-on-close
+            :show-close="false"
+        >
+            <template #footer>
+                <el-autocomplete
+                    ref="layoutMenuAutocompleteRef"
+                    v-model="state.menuQuery"
+                    :fetch-suggestions="menuSearch"
+                    placeholder="鎼滅储"
+                    :fit-input-width="true"
+                    @select="onHandleSelect"
+                >
+                    <template #prefix>
+                        <svg-icon
+                            class-name="search-icon"
+                            icon-class="search"
+                        />
+                    </template>
+                    <template #default="{ item }">
+                        <div>
+                            <svg-icon :icon-class="item.icon" class="mr5" />
+                            {{ item.title }}
+                        </div>
+                    </template>
+                </el-autocomplete>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getNormalPath } from '@/utils/ruoyi';
+import { isHttp } from '@/utils/validate';
+import usePermissionStore from '@/store/modules/permission';
+import { RouteRecordRaw } from 'vue-router';
+
+export default {
+    data() {
+        return {
+            state: {
+                isShowSearch: false,
+                menuQuery: '',
+                menuList: []
+            }
+        }
+    },
+    created() {
+        // this.openSearch()
+    },
+    methods: {
+        // 鎼滅储寮圭獥鎵撳紑
+        openSearch() {
+            this.state.menuQuery = '';
+            this.state.isShowSearch = true;
+            
+            this.state.menuList = this.generateRoutes(usePermissionStore.state.routes);
+            this.$nextTick(() => {
+                setTimeout(() => {
+                    this.layoutMenuAutocompleteRef.value.focus();
+                });
+            });
+        },
+        // 鎼滅储寮圭獥鍏抽棴
+        closeSearch() {
+            this.state.isShowSearch = false;
+        },
+        // 鑿滃崟鎼滅储鏁版嵁杩囨护
+        menuSearch(queryString, cb) {
+            let options = state.menuList.filter((item) => {
+                return item.title.indexOf(queryString) > -1;
+            });
+            this.cb(options);
+        },
+        // Filter out the routes that can be displayed in the sidebar
+        // And generate the internationalized title
+        generateRoutes(routes, basePath, prefixTitle) {
+            let res = [];
+            routes.forEach((r) => {
+                // skip hidden router
+                if (!r.hidden) {
+                    const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path;
+                    const data = {
+                        path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path,
+                        icon: r.meta?.icon,
+                        title: [...prefixTitle]
+                    };
+                    if (r.meta && r.meta.title) {
+                        data.title = [...data.title, r.meta.title];
+                        if (r.redirect !== 'noRedirect') {
+                            // only push the routes with title
+                            // special case: need to exclude parent router without redirect
+                            res.push(data);
+                        }
+                    }
+                    // recursive child routes
+                    if (r.children) {
+                        const tempRoutes = generateRoutes(r.children, data.path, data.title);
+                        if (tempRoutes.length >= 1) {
+                            res = [...res, ...tempRoutes];
+                        }
+                    }
+                }
+            });
+            res.forEach((item) => {
+                if (item.title instanceof Array) {
+                    item.title = item.title.join('/');
+                }
+            });
+            return res;
+        },
+        // 褰撳墠鑿滃崟閫変腑鏃�
+        onHandleSelect(val) {
+            const paths = val.path;
+            if (isHttp(paths)) {
+                // http(s):// 璺緞鏂扮獥鍙f墦寮�
+                const pindex = paths.indexOf('http');
+                window.open(paths.substring(pindex, paths.length), '_blank');
+            } else {
+                router.push(paths);
+            }
+            state.menuQuery = '';
+            closeSearch();
+        }
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.layout-search-dialog {
+    position: relative;
+    ::v-deep .el-dialog {
+        padding: 0;
+        .el-dialog__header,
+        .el-dialog__body {
+            display: none;
+        }
+        .el-dialog__footer {
+            width: 100%;
+            position: absolute;
+            left: 50%;
+            transform: translateX(-50%);
+            top: -53vh;
+        }
+    }
+    ::v-deep.el-autocomplete {
+        width: 560px;
+        position: absolute;
+        top: 150px;
+        left: 50%;
+        transform: translateX(-50%);
+    }
+}
+</style>
diff --git a/src/layout/index.vue b/src/layout/index.vue
index dba4393..3d5c4ef 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -1,18 +1,36 @@
 <template>
-  <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
-    <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
-    <sidebar v-if="!sidebar.hide" class="sidebar-container"/>
-    <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
-      <div :class="{'fixed-header':fixedHeader}">
-        <navbar/>
-        <tags-view v-if="needTagsView"/>
-      </div>
-      <app-main/>
-      <right-panel>
-        <settings/>
-      </right-panel>
+    <div
+        :class="classObj"
+        class="app-wrapper"
+        :style="{ '--current-color': theme }"
+    >
+        <div
+            v-if="device === 'mobile' && sidebar.opened"
+            class="drawer-bg"
+            @click="handleClickOutside"
+        />
+        <navbar ref="navbarRef" @set-layout="setLayout" />
+
+        <div
+            :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }"
+            class="main-container"
+        >
+            <!-- <el-scrollbar>
+        <div :class="{ 'fixed-header': fixedHeader }">
+          <navbar ref="navbarRef" @setLayout="setLayout" />
+          <tags-view v-if="needTagsView" />
+        </div>
+        <app-main />
+        <settings ref="settingRef" />
+      </el-scrollbar> -->
+            <side-bar v-if="!sidebar.hide" class="sidebar-container" />
+            <div :class="{ 'fixed-header': fixedHeader }">
+                <tags-view v-if="needTagsView" />
+            </div>
+            <app-main />
+            <settings ref="settingRef" />
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
@@ -21,64 +39,69 @@
 import ResizeMixin from './mixin/ResizeHandler'
 import { mapState } from 'vuex'
 import variables from '@/assets/styles/variables.scss'
+import SideBar from './components/Sidebar/index.vue';
 
 export default {
-  name: 'Layout',
-  components: {
-    AppMain,
-    Navbar,
-    RightPanel,
-    Settings,
-    Sidebar,
-    TagsView
-  },
-  mixins: [ResizeMixin],
-  computed: {
-    ...mapState({
-      theme: state => state.settings.theme,
-      sideTheme: state => state.settings.sideTheme,
-      sidebar: state => state.app.sidebar,
-      device: state => state.app.device,
-      needTagsView: state => state.settings.tagsView,
-      fixedHeader: state => state.settings.fixedHeader
-    }),
-    classObj() {
-      return {
-        hideSidebar: !this.sidebar.opened,
-        openSidebar: this.sidebar.opened,
-        withoutAnimation: this.sidebar.withoutAnimation,
-        mobile: this.device === 'mobile'
-      }
+    name: 'Layout',
+    components: {
+        AppMain,
+        Navbar,
+        RightPanel,
+        Settings,
+        Sidebar,
+        TagsView,
+        SideBar
     },
-    variables() {
-      return variables;
+    mixins: [ResizeMixin],
+    computed: {
+        ...mapState({
+            theme: state => state.settings.theme,
+            sideTheme: state => state.settings.sideTheme,
+            sidebar: state => state.app.sidebar,
+            device: state => state.app.device,
+            needTagsView: state => state.settings.tagsView,
+            fixedHeader: state => state.settings.fixedHeader
+        }),
+        classObj() {
+            return {
+                hideSidebar: !this.sidebar.opened,
+                openSidebar: this.sidebar.opened,
+                withoutAnimation: this.sidebar.withoutAnimation,
+                mobile: this.device === 'mobile'
+            }
+        },
+        variables() {
+            return variables;
+        }
+    },
+    methods: {
+        setLayout() {
+            this.settingRef.value?.openSetting();
+        },
+        handleClickOutside() {
+            this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
+        }
     }
-  },
-  methods: {
-    handleClickOutside() {
-      this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
-    }
-  }
 }
 </script>
 
 <style lang="scss" scoped>
-  @import "~@/assets/styles/mixin.scss";
-  @import "~@/assets/styles/variables.scss";
+@import '~@/assets/styles/mixin.scss';
+@import '~@/assets/styles/variables.scss';
 
-  .app-wrapper {
+.app-wrapper {
     @include clearfix;
     position: relative;
     height: 100%;
     width: 100%;
 
     &.mobile.openSidebar {
-      position: fixed;
-      top: 0;
+        position: fixed;
+        top: 0;
     }
-  }
+}
 
-  .drawer-bg {
+.drawer-bg {
     background: #000;
     opacity: 0.3;
     width: 100%;
@@ -86,26 +109,26 @@
     height: 100%;
     position: absolute;
     z-index: 999;
-  }
+}
 
-  .fixed-header {
+.fixed-header {
     position: fixed;
     top: 0;
     right: 0;
     z-index: 9;
     width: calc(100% - #{$base-sidebar-width});
     transition: width 0.28s;
-  }
+}
 
-  .hideSidebar .fixed-header {
+.hideSidebar .fixed-header {
     width: calc(100% - 54px);
-  }
+}
 
-  .sidebarHide .fixed-header {
+.sidebarHide .fixed-header {
     width: 100%;
-  }
+}
 
-  .mobile .fixed-header {
+.mobile .fixed-header {
     width: 100%;
-  }
+}
 </style>
diff --git a/src/main.js b/src/main.js
index 13c6cf2..ac9ce83 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,9 +1,21 @@
 import Vue from 'vue'
 
 import Cookies from 'js-cookie'
-
+// global css
+// import 'virtual:uno.css';
+import '@/assets/styles/index.scss';
 import Element from 'element-ui'
 import './assets/styles/element-variables.scss'
+
+// 楂樹寒缁勪欢
+// import 'highlight.js/styles/a11y-light.css';
+// import 'highlight.js/styles/atom-one-dark.css';
+// import 'highlight.js/lib/common';
+// import HighLight from '@highlightjs/vue-plugin';
+
+// // svg鍥炬爣
+// import 'virtual:svg-icons-register';
+// import ElementIcons from '@/plugins/svgicon';
 
 import '@/assets/styles/index.scss' // global css
 import '@/assets/styles/ruoyi.scss' // ruoyi css
@@ -37,6 +49,8 @@
 import VueMeta from 'vue-meta'
 // 瀛楀吀鏁版嵁缁勪欢
 import DictData from '@/components/DictData'
+// 鑷畾涔夋悳绱€�佹帶鍒惰〃澶存樉闅愭寜閽�
+import VisibilityToolbar from '@/components/VisibilityToolbar'
 
 // 鍏ㄥ眬鏂规硶鎸傝浇
 Vue.prototype.getDicts = getDicts
@@ -57,10 +71,13 @@
 Vue.component('FileUpload', FileUpload)
 Vue.component('ImageUpload', ImageUpload)
 Vue.component('ImagePreview', ImagePreview)
+Vue.component('VisibilityToolbar', VisibilityToolbar)
 
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)
+// Vue.use(HighLight);
+// Vue.use(ElementIcons);
 DictData.install()
 
 /**
diff --git a/src/settings.js b/src/settings.js
index 6a0b09f..78a8bc1 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -2,7 +2,7 @@
   /**
    * 渚ц竟鏍忎富棰� 娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light
    */
-  sideTheme: 'theme-dark',
+  sideTheme: 'theme-light',
 
   /**
    * 鏄惁绯荤粺甯冨眬閰嶇疆
diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js
index 44bf9c4..40fbf45 100644
--- a/src/utils/ruoyi.js
+++ b/src/utils/ruoyi.js
@@ -1,5 +1,3 @@
-
-
 /**
  * 閫氱敤js鏂规硶灏佽澶勭悊
  * Copyright (c) 2019 ruoyi
@@ -37,7 +35,9 @@
   const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
     let value = formatObj[key]
     // Note: getDay() returns 0 on Sunday
-    if (key === 'a') { return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value] }
+    if (key === 'a') {
+      return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value]
+    }
     if (result.length > 0 && value < 10) {
       value = '0' + value
     }
@@ -88,7 +88,7 @@
 
 // 鍥炴樉鏁版嵁瀛楀吀锛堝瓧绗︿覆銆佹暟缁勶級
 export function selectDictLabels(datas, value, separator) {
-  if (value === undefined || value.length ===0) {
+  if (value === undefined || value.length === 0) {
     return "";
   }
   if (Array.isArray(value)) {
@@ -114,7 +114,9 @@
 
 // 瀛楃涓叉牸寮忓寲(%s )
 export function sprintf(str) {
-  var args = arguments, flag = true, i = 1;
+  var args = arguments,
+    flag = true,
+    i = 1;
   str = str.replace(/%s/g, function () {
     var arg = args[i++];
     if (typeof arg === 'undefined') {
@@ -202,9 +204,9 @@
 }
 
 /**
-* 鍙傛暟澶勭悊
-* @param {*} params  鍙傛暟
-*/
+ * 鍙傛暟澶勭悊
+ * @param {*} params  鍙傛暟
+ */
 export function tansParams(params) {
   let result = ''
   for (const propName of Object.keys(params)) {
@@ -231,3 +233,15 @@
 export function blobValidate(data) {
   return data.type !== 'application/json'
 }
+
+
+export function getNormalPath(p) {
+  if (p.length === 0 || !p || p === 'undefined') {
+    return p;
+  }
+  const res = p.replace('//', '/');
+  if (res[res.length - 1] === '/') {
+    return res.slice(0, res.length - 1);
+  }
+  return res;
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
index 57a568e..2f80643 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -78,3 +78,7 @@
   }
   return Array.isArray(arg)
 }
+
+export function isHttp(url) {
+  return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1;
+}
diff --git a/src/views/components/Map/index.vue b/src/views/components/Map/index.vue
new file mode 100644
index 0000000..38f61f6
--- /dev/null
+++ b/src/views/components/Map/index.vue
@@ -0,0 +1,585 @@
+<template>
+    <div :id="id" ref="contentRef" style="height: 100%; width: 100%">
+        <div
+            v-if="isShowControl"
+            :class="controlPosition"
+            class="control-container bottom-right"
+        >
+            <div
+                v-for="item in controlMapping"
+                :key="item.id"
+                class="control-content"
+            >
+                <template v-if="item.children">
+                    <div
+                        v-for="child in item.children"
+                        :key="child.id"
+                        class="control-item"
+                        @click="child.event"
+                    >
+                        <img :src="child.img" />
+                    </div>
+                </template>
+                <template v-else>
+                    <div class="control-item" @click="item.event">
+                        <img :src="item.img" />
+                    </div>
+                </template>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import Location from "@/assets/images/location.png";
+import FileImg from "@/assets/images/file1.png";
+import MinusImg from "@/assets/images/minus.png";
+import PlusImg from "@/assets/images/plus.png";
+import FullScreenImg from "@/assets/images/fullScreen.png";
+import PositionImg from "@/assets/images/position.png";
+export default {
+    data() {
+        return {
+            zoom: 15,
+            map: null,
+            contentRef: {},
+            infoWin: {},
+            defaultMaskInfo: {},
+            mapKey: "ffb871cd7ca48883db3b04cfd00d469f",
+            controlMapping: [
+                {
+                    id: "瀹氫綅",
+                    img: PositionImg,
+                    event: this.getCurrentPosition,
+                },
+                {
+                    id: "缂╂斁",
+                    children: [
+                        {
+                            id: "鏀惧ぇ",
+                            img: PlusImg,
+                            event: this.zoomIn,
+                        },
+                        {
+                            id: "缂╁皬",
+                            img: MinusImg,
+                            event: this.zoomOut,
+                        },
+                    ],
+                },
+                {
+                    id: "鍏ㄥ睆",
+                    img: FullScreenImg,
+                    event: this.fullScreen,
+                },
+            ],
+        };
+    },
+    props: {
+        id: String,
+        mapList: Array,
+        listType: Boolean,
+        isShowControl: Boolean,
+        controlPosition: Object,
+        isImmediateLoad: { type: Boolean, default: true },
+        mapType: Boolean,
+    },
+
+    created() {
+        this.defaultMaskInfo = {
+            lon: this.$props.mapList[0]?.lon
+                ? this.$props.mapList[0].lon
+                : "105.37281",
+            lat: this.$props.mapList[0]?.lat
+                ? this.$props.mapList[0].lat
+                : "30.87145",
+            name: this.$props.mapList[0]?.name ? this.$props.mapList[0].name : "鍒涘缓",
+        };
+        if (this.$props.isImmediateLoad) this.onLoad();
+    },
+    methods: {
+        async onLoad() {
+            const scripts = document.body.querySelectorAll("script");
+            if (!this.mapKey) {
+                // const res = await getDicts('map_key')
+                // mapKey = res[0].dictLabel
+                this.mapKey = "ffb871cd7ca48883db3b04cfd00d469f";
+            }
+
+            const scriptSrc = `http://api.tianditu.gov.cn/api?v=4.0&tk=${this.mapKey}`;
+            const mapScript = Array.from(scripts).find((item) => {
+                return item.getAttribute("src") === scriptSrc;
+            });
+
+            if (!mapScript) {
+                // 鍒涘缓script鏍囩
+                const script = document.createElement("script");
+                // 璁剧疆API鐨刄RL
+                script.src = scriptSrc;
+                script.type = "text/javascript";
+                // 灏唖cript鏍囩娣诲姞鍒癏TML涓�
+                document.body.appendChild(script);
+                script.onload = () => {
+                    this.initTianMap();
+                };
+            } else {
+                this.initTianMap();
+            }
+        },
+
+        initTianMap() {
+            var T = window.T;
+            setTimeout(async () => {
+                // this.map = new T.Map(this.id, {
+                //     projection: "EPSG:4326",
+                // });
+                this.map = new T.Map(this.id);
+                this.map.centerAndZoom(
+                    new T.LngLat(this.defaultMaskInfo.lon, this.defaultMaskInfo.lat),
+                    this.zoom
+                );
+                if (!this.$props.listType) {
+                    // 娓呴櫎涔嬪墠鐨勬爣璁�
+                    // map && map.clearOverLays()
+                    //form琛ㄥ崟涓槸鍚︽湁鍧愭爣锛屾湁鍒欏畾浣嶅埌瀵瑰簲浣嶇疆锛屾病鏈夊垯浣跨敤榛樿鐨�
+                    // 104.65417 28.75572 娴嬭瘯鏁版嵁
+                    // 鍥涘窛鐪佸疁瀹惧競缈犲睆鍖哄ぇ瑙傛ゼ琛楅亾澶栧崡琛�71
+                    if (this.$props.mapList[0].addr) {
+                        const { lng: lon, lat } = await this.getGeocode(
+                            this.$props.mapList[0].addr
+                        );
+                        this.defaultMaskInfo.lon = String(lon);
+                        this.defaultMaskInfo.lat = String(lat);
+                    }
+
+                    this.map && this.makeDefaultMask(this.defaultMaskInfo);
+                    this.addEvent(this.map, "click", (e) => this.mapClick(e));
+                } else {
+                    this.$props.mapList.length && this.makeAllMask(this.$props.mapList);
+                }
+            }, 1500);
+        },
+
+        zoomIn() {
+            this.map && this.map.zoomIn();
+        },
+
+        zoomOut() {
+            this.map && this.map.zoomOut();
+        },
+
+        fullScreen() {
+            this.map && this.contentRef?.requestFullscreen();
+        },
+
+        getCurrentPosition() {
+            if (navigator.geolocation) {
+                ElMessage.warning("璇ュ姛鑳芥殏鏈紑鍙�");
+                // TODO 鍦板浘瀹氫綅
+                // navigator.geolocation.getCurrentPosition(function (position) {
+                //   var latitude = position.coords.latitude
+                //   var longitude = position.coords.longitude
+                //
+                //   moveTo(String(longitude), String(latitude))
+                // })
+            } else {
+                ElMessage.warning("褰撳墠娴忚鍣ㄤ笉鏀寔瀹氫綅鍔熻兘");
+            }
+        },
+
+        moveTo(lon, lat) {
+            this.map && this.map.panTo(new T.LngLat(lon, lat));
+        },
+
+        // 榛樿鐨勭偣鏍囪
+        makeDefaultMask(mapInfo) {
+            const { name, lon, lat } = mapInfo
+            const option = {
+                text: name,
+                offset: [-35, -45],
+                labelBg: "#3369FF",
+                labelColor: "#fff",
+                labelClick,
+            };
+            // 娓呴櫎涔嬪墠鐨勬爣璁�
+            this.map && this.map.clearOverLays();
+            this.map.panTo(new T.LngLat(lon, lat));
+            this.makeMask(lon, lat, { labelOptions: option });
+        },
+
+        // 鍦板浘鐐瑰嚮浜嬩欢
+        mapClick(e) {
+            e.originalEvent.stopPropagation();
+
+            const { lat, lng: lon } = e.lnglat;
+
+            this.makeDefaultMask({
+                ...defaultMaskInfo,
+                lon: String(lon),
+                lat: String(lat),
+            });
+            this.getReverseGeocode(e).then((addr) => {
+                this.$emit("mapClick", { e, addr });
+            });
+            console.log("鐐瑰嚮浜嬩欢", e);
+        },
+
+        // 閫嗗湴鐞嗙紪鐮� 鑾峰彇鍦板潃
+        getReverseGeocode(e) {
+            return new Promise((resolve) => {
+                const geocode = new T.Geocoder();
+                geocode.getLocation(e.lnglat, (result) => {
+                    if (result.status === "0") {
+                        resolve(result.getAddress());
+                    }
+                });
+            });
+        },
+
+        // 鍦扮悊缂栫爜
+        getGeocode(addr) {
+            return new Promise((resolve) => {
+                const geocoder = new T.Geocoder();
+                geocoder.getPoint(addr, (result) => {
+                    if (result.status === "0") {
+                        resolve(result.getLocationPoint());
+                    }
+                });
+            });
+        },
+
+        // 鐢熸垚鐐逛綅鍐呭
+        // 鐢熸垚鐐逛綅鍐呭
+        generateContent(row, random) {
+            if (row) {
+                return `
+    <div class="map-window-info">
+      <div class='title-block'>
+        <div class="title truncate-content">
+          ${row.projectName ?? "鏆傛棤鏁版嵁"}
+        </div>
+        <div class='close-btn close-btn-${random}'>
+          脳
+        </div>
+      </div>
+      <div class="detail-info">
+        <span class="truncate-content">鎬绘姇璧勶細${row.totalMoney ?? "鏆傛棤鏁版嵁"
+                    }</span>
+        <span class="truncate-content">
+          椤圭洰鐘舵�侊細
+        </span>
+         <span class="truncate-content">
+          椤圭洰鍦板潃锛�${row.projectAddr ?? "鏆傛棤鏁版嵁"}
+        </span>
+      </div>
+    </div>`;
+            } else {
+                return `<div style="display: flex; justify-content:center; align-items:center; opacity: 0;">
+
+    </div>`;
+            }
+        },
+
+        // 鍞竴鏍囪瘑
+        getUniqueId() {
+            return Math.random().toString(36).substr(2) + Date.now();
+        },
+
+        markerMouseover(_e, infoWin, info, random) {
+            // 鐐逛綅鏍囪绉诲叆鏄剧ず涓嶅悓鍐呭
+            if (this.$props.isShowControl) {
+                infoWin.setContent(this.generateContent(info, random));
+                const contentWrapper = document.querySelector(
+                    ".tdt-infowindow-content-wrapper"
+                );
+                if (contentWrapper) {
+                    contentWrapper.style.opacity = "1";
+                }
+                // 鏌ユ壘鍒伴偅涓猧nfo 鐣岄潰
+                // const allCloseBtn = document.querySelectorAll(`.close-btn-${random}`);
+                // allCloseBtn[allCloseBtn.length - 1].onclick = (_e) => {
+                //   infoWin.setContent(generateContent());
+                // };
+            }
+        },
+
+        markerMouseout(_e, infoWin) {
+            infoWin.setContent(this.generateContent());
+            const contentWrapper = document.querySelector(
+                ".tdt-infowindow-content-wrapper"
+            );
+            if (contentWrapper) {
+                contentWrapper.style.opacity = "0";
+            }
+        },
+
+        // 鎵撴爣璁�
+        makeMask(lon, lat, options) {
+
+            const { markerOptions, labelOptions } = options;
+            console.log("options", markerOptions, labelOptions);
+            const icon = new T.Icon({
+                iconUrl: Location,
+                iconSize: new T.Point(19, 27),
+                iconAnchor: new T.Point(10, 25),
+            });
+            var marker = new T.Marker(new T.LngLat(lon, lat), {
+                icon,
+                id: markerOptions?.id,
+            });
+
+            this.map && this.map.addOverLay(marker);
+            const label = new T.Label({
+                text: labelOptions.text,
+                position: new T.LngLat(lon, lat),
+                offset: new T.Point(...labelOptions.offset),
+                id: labelOptions?.id,
+            });
+
+            labelOptions.labelBg && label.setBackgroundColor(labelOptions.labelBg);
+            labelOptions.labelColor && label.setFontColor(labelOptions.labelColor);
+            //鍒涘缓鍦板浘鏂囨湰瀵硅薄
+            if (!this.$props.mapType) {
+                this.map && this.map.addOverLay(label);
+            }
+            markerOptions?.markerClick &&
+                this.addEvent(marker, "click", (e) => markerOptions.markerClick(label, e));
+            labelOptions?.labelClick &&
+                this.addEvent(label, "click", (e) => labelOptions.labelClick(label, e));
+
+            const lnglat = new T.LngLat(lon, lat);
+            const infoWin = new T.InfoWindow(this.generateContent(), {
+                id: markerOptions?.id,
+                offset: new T.Point(0, -15),
+                closeButton: false,
+            });
+
+            infoWin.setLngLat(lnglat);
+            // 鍚戝湴鍥句笂娣诲姞淇℃伅绐楀彛
+            if (this.$props.mapType) {
+                this.map && this.map.addOverLay(infoWin);
+            }
+
+            this.addEvent(marker, "mouseover", (e) =>
+                markerMouseover(e, infoWin, labelOptions, getUniqueId())
+            );
+            this.addEvent(marker, "mouseout", (e) => markerMouseout(e, infoWin));
+        },
+
+        // 鏍囪鎵�鏈夌偣
+        makeAllMask(mapList) {
+            var _this = this;
+            this.mapList.map((item) => {
+                const config = {
+                    markerOptions: {
+                        id: item.id,
+                        markerClick: _this.markerClick,
+                    },
+                    labelOptions: {
+                        text: item.name,
+                        offset: [-45, -45],
+                        id: item.id,
+                        markerClick: _this.labelClick,
+                    },
+                };
+                _this.makeMask(item.lon, item.lat, config);
+            });
+        },
+
+        // 閫氱敤娣诲姞浜嬩欢鐨勬柟娉�
+        addEvent(component, name, func) {
+            // 绉诲嚭浜嬩欢
+            this.removeEvent(component, name, func);
+            // 娣诲姞浜嬩欢
+            component.addEventListener(name, func);
+        },
+
+        // 閫氱敤绉诲嚭浜嬩欢鐨勬柟娉�
+        removeEvent(component, name, func) {
+            component.removeEventListener(name, func);
+        },
+
+        //鏍囪鐐瑰嚮浜嬩欢
+        markerClick(currentLabel, e) {
+            const id = e.target.options.id;
+            currentLabelStyleChange(currentLabel);
+            console.log("鐐瑰嚮浜嬩欢", e, currentLabel);
+            this.getReverseGeocode(e).then((addr) => {
+                this.$emit(
+                    "markClick",
+                    id
+                        ? this.$props.mapList?.find((item) => item.id === id)
+                        : { e, addr: addr }
+                );
+            });
+        },
+
+        // label鐐瑰嚮浜嬩欢
+        labelClick(currentLabel, e) {
+            const id = e.target.options.id;
+            currentLabelStyleChange(currentLabel);
+            getReverseGeocode(e).then((addr) => {
+                this.$emit(
+                    "labelClick",
+                    id
+                        ? this.$props.mapList?.find((item) => {
+                            return String(item.id) === String(id);
+                        })
+                        : { e, addr: addr }
+                );
+            });
+        },
+
+        currentLabelStyleChange(currentLabel) {
+            this.$emit("currentLabelStyleChange", currentLabel);
+        },
+
+        resizeMap() {
+            this.map.checkResize();
+        },
+    },
+    watch: {
+        listType: {
+            handler(val) {
+                if (val) {
+                    this.map && this.map.clearOverLays();
+                    if (this.$props.mapList.length && T) {
+                        this.makeAllMask(this.$props.mapList);
+                    }
+                }
+            },
+        },
+    },
+    beforeUnmount() {
+        this.map = null;
+    },
+};
+
+// const emits = defineEmits<{
+//   (e: 'labelClick', value: any): void;
+//   (e: 'markClick', value: any): void;
+//   (e: 'mapClick', value: any): void;
+//   (e: 'currentLabelStyleChange', value: any): void;
+// }>();
+</script>
+<style lang="scss" scoped>
+:deep(.tdt-label) {
+    border-radius: 15px;
+    color: var(--el-color-primary);
+    cursor: pointer;
+}
+
+// #53547f
+:deep(.tdt-bar a, .tdt-bar a:hover) {
+    border-bottom: 0;
+    color: #53547f;
+}
+
+:deep(.tdt-touch .tdt-control-zoom-in) {
+    font-size: 18px;
+}
+
+:deep(.tdt-bar) {
+    border-radius: 3px;
+    box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+}
+
+.tdt-bar a.tdt-disabled,
+.tdt-bar a:hover {
+    background-color: #f4f4f4;
+}
+
+.control-container {
+    position: absolute;
+    display: flex;
+    flex-direction: column;
+    gap: 10px;
+    z-index: 999;
+}
+
+.top-left {
+    top: 10px;
+    left: 10px;
+}
+
+.top-right {
+    top: 10px;
+    right: 10px;
+}
+
+.bottom-left {
+    bottom: 10px;
+    left: 10px;
+}
+
+.bottom-right {
+    bottom: 10px;
+    right: 10px;
+}
+
+.control-content {
+    border-radius: 3px;
+    box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+    background-color: #fff;
+}
+
+.control-item {
+    box-sizing: border-box;
+    width: 30px;
+    height: 30px;
+    line-height: 28px;
+    padding: 0 9px;
+
+    img {
+        display: inline-block;
+    }
+}
+
+.control-item:hover {
+    background-color: #f4f4f4;
+}
+</style>
+<style lang="scss">
+.map-window-info {
+    padding: 0 20px;
+    width: 300px;
+    cursor: default;
+
+    .title {
+        color: #3369ff;
+        font-size: 18px;
+        margin-bottom: 13px;
+    }
+
+    .detail-info {
+        display: flex;
+        flex-direction: column;
+        color: #7e809c;
+        font-size: 12px;
+        gap: 8px;
+    }
+}
+
+.title-block {
+    display: flex;
+    justify-content: space-between;
+
+    .close-btn {
+        font-size: 18px;
+        color: #d8dde6;
+        cursor: pointer;
+        z-index: 999999;
+    }
+}
+
+//.tdt-control-copyright {
+//  display: none;
+//}
+
+.tdt-infowindow-tip-container {
+    opacity: 0;
+}
+
+.tdt-infowindow-content-wrapper {
+    opacity: 0;
+}
+</style>
diff --git a/src/views/components/noticeTable.vue b/src/views/components/noticeTable.vue
new file mode 100644
index 0000000..099f0ac
--- /dev/null
+++ b/src/views/components/noticeTable.vue
@@ -0,0 +1,183 @@
+<template>
+    <div>
+        <div class="flex justify-between mb-[15px]">
+            <div class="block mb-3 font-semibold fonts">寰呭姙浜嬮」</div>
+            <div class="flex text-[12px]">
+                <div
+                    :class="{ active: currentTab === 'process' }"
+                    class="tab"
+                    @click="switchTab('process')"
+                >
+                    娴佺▼寰呭姙
+                </div>
+                <!-- <div
+                    :class="{ active: currentTab === 'progress' }"
+                    class="tab"
+                    @click="switchTab('progress')"
+                >
+                    杩涘害寰呭姙
+                </div> -->
+            </div>
+        </div>
+        <el-table
+            :data="tableData"
+            :header-cell-style="{
+                background: '#F5F7FC',
+                color: '#454B5E',
+                fontSize: '12px'
+            }"
+            height="280"
+            max-height="280"
+        >
+            <el-table-column
+                v-for="column in currentTableHeaders"
+                :key="column.prop"
+                :align="column.align"
+                :label="column.label"
+                :min-width="column.minWidth"
+                :prop="column.prop"
+                :show-overflow-tooltip="true"
+            >
+            </el-table-column>
+
+            <el-table-column
+                align="center"
+                fixed="right"
+                label="鎿嶄綔"
+                min-width="150"
+            >
+                <template #default="scope">
+                    <el-button
+                        plain
+                        size="small"
+                        type="primary"
+                        @click="handleDetail(scope.row)"
+                    >
+                        鏌ョ湅</el-button
+                    >
+                    <el-button
+                        plain
+                        size="small"
+                        type="primary"
+                        @click="handleUpdate(scope.row)"
+                    >
+                        澶勭疆</el-button
+                    >
+                </template>
+            </el-table-column>
+        </el-table>
+        <pagination
+            v-show="total >= 0"
+            :limit="queryParams.pageSize"
+            :page="queryParams.pageNum"
+            :total="total"
+            @pagination="getList"
+        />
+    </div>
+</template>
+<script>
+
+import { getTodo } from '@/api/message';
+export default {
+    data() {
+        return {
+            currentTab: "process",
+            total: 0,
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10
+            },
+            tableData: [],
+            currentTableHeaders: [
+                { label: '娴佺▼鐜妭', prop: 'name', minWidth: 150, align: 'left' },
+                { label: '鐢宠椤圭洰', prop: 'businessName', minWidth: 150, align: 'left' },
+                { label: '瀹℃壒浜�', prop: 'assigneeName', minWidth: 100, align: 'left' },
+                { label: '鍓╀綑鏃堕棿', prop: 'remainingTime', minWidth: 143, align: 'left' }
+            ]
+        }
+    },
+    props: {
+        calculation: Array,
+        countExceptionProjectData:Object,
+    },
+    created() {
+        this.getList();
+    },
+    methods: {
+        async getList() {
+            const resp = await getTodo(this.queryParams);
+            if (resp.code === 200) {
+                this.total.value = resp.total;
+                this.tableData.value = resp.rows;
+            }
+        },
+        handleDetail(row) {
+            console.log(111);
+            this.$router.push({
+                path: '/projectManage/nodeDetails',
+                query: {
+                    taskId: row.id,
+                    id: row.businessKey,
+                    disabled: 'true'
+                }
+            });
+        },
+        handleUpdate(row) {
+            this.$router.push({
+                path: '/projectManage/nodeDetails',
+                query: {
+                    taskId: row.id,
+                    id: row.businessKey
+                }
+            });
+            console.log(111);
+        },
+        switchTab(tab) {
+            this.currentTab = tab;
+        }
+    }
+}
+
+</script>
+
+<style lang="scss" scoped>
+.tab {
+    padding: 8px;
+    border: 1px solid #dbdeea;
+    cursor: pointer;
+    width: 72px;
+}
+
+.active {
+    border: 1px solid #3369ff;
+    color: #3369ff;
+}
+
+.fonts {
+    font-size: 16px;
+    color: #212a40;
+    display: flex;
+    align-items: center;
+}
+
+::v-deep .el-table__row {
+    font-size: 12px;
+}
+
+::v-deep .el-pagination {
+    margin: -15px;
+    text-align: end;
+}
+
+::v-deep .el-pagination .btn-prev .el-icon,
+ ::v-deep .el-pagination .btn-next .el-icon 
+{
+    display: inline;
+}
+.flex {
+    display: flex;
+    justify-content: space-between;
+    font-size: 12px;
+}
+
+</style>
diff --git a/src/views/components/projectOverview.vue b/src/views/components/projectOverview.vue
new file mode 100644
index 0000000..3bda1ba
--- /dev/null
+++ b/src/views/components/projectOverview.vue
@@ -0,0 +1,339 @@
+<template>
+    <div class="overview-bottom">
+        <div class="abnormal" @click="showAbnormal">
+            <div style="margin-bottom: 30px">寮傚父椤圭洰鎯呭喌缁熻</div>
+            <div>
+                <div class="abnormal-center">
+                    娴佺▼寮傚父椤圭洰锛�<span
+                        style="font-size: 16px; font-weight: 700"
+                        >{{
+                            countExceptionProjectData.processExceptionProject
+                        }}</span
+                    >
+                </div>
+                <div class="abnormal-center">
+                    璧勯噾寮傚父椤圭洰锛�<span
+                        style="font-size: 16px; font-weight: 700"
+                        >0</span
+                    >
+                </div>
+                <div class="abnormal-center">
+                    杩涘害寮傚父椤圭洰锛�<span
+                        style="font-size: 16px; font-weight: 700"
+                        >0</span
+                    >
+                </div>
+            </div>
+            <div class="abnormal-img"></div>
+        </div>
+        <div class="overview-div custom-min-width">
+            <div
+                v-for="i in calculation"
+                :key="i.text"
+                :style="setbcStyle(i.text)"
+                class="listings"
+                @click="showDetail(i.text)"
+            >
+                <div :style="setTextStyle(i.text)" class="title">
+                    {{ i.text }}
+                </div>
+                <div class="conter">
+                    <div :style="setTextColor(i.text)" class="mun">
+                        {{ i.mun }}
+                    </div>
+                    <div class="statistics">
+                        <div>{{ i.statistics }}</div>
+                        <div :style="setTextColor(i.text)">
+                            {{ i.statisticsMun
+                            }}<span style="font-size: 18px">浜�</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!-- <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div>
+            <div class="listings">
+                <div class="title active">
+                    鍌�
+                </div>
+                <div class="conter">
+                    <div class="mun">44</div>
+                    <div class="statistics">
+                        <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div>
+                        <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div>
+                    </div>
+                </div>
+            </div> -->
+        </div>
+    </div>
+</template>
+
+<script >
+export default {
+    name: "Index",
+    data() {
+        return {}
+    },
+    props: {
+        calculation: Array,
+        countExceptionProjectData: Object,
+    },
+    watch: {
+        // calculation: {
+        //     handler(val) {
+        //         console.log("11111" + val);
+
+        //     },
+        // },
+        // countExceptionProjectData: {
+        //     handler(val) {
+        //         console.log("22222" + val);
+
+        //     },
+        // },
+    },
+    methods: {
+        setTextStyle(text) {
+            if (text === '鍌�') return 'background-color:#3369FF';
+            if (text === '寤�') return 'background-color:#64ADFD';
+            if (text === '鐪�') return 'background-color:#FF5E57';
+            if (text === '甯�') return 'background-color:#FFA83F';
+            if (text === '鏂�') return 'background-color:#5DD1E5';
+            if (text === '绔�') return 'background-color:#576BF5';
+            if (text === '鍘�') return 'background-color:#3369FF';
+            if (text === '鏅�') return 'background-color:#64ADFD';
+            return '';
+        },
+
+        setTextColor(text) {
+            if (text === '鍌�') return 'color:#3369FF';
+            if (text === '寤�') return 'color:#64ADFD';
+            if (text === '鐪�') return 'color:#FF5E57';
+            if (text === '甯�') return 'color:#FFA83F';
+            if (text === '鏂�') return 'color:#5DD1E5';
+            if (text === '绔�') return 'color:#576BF5';
+            if (text === '鍘�') return 'color:#3369FF';
+            if (text === '鏅�') return 'color:#64ADFD';
+            return '';
+        },
+
+        setbcStyle(text) {
+            if (text === '鍌�') return 'background-color:#EAF0FF';
+            if (text === '寤�') return 'background-color:#EFF7FF';
+            if (text === '鐪�') return 'background-color:#FEEEED';
+            if (text === '甯�') return 'background-color:#FFF6EB';
+            if (text === '鏂�') return 'background-color:#EEFAFC';
+            if (text === '绔�') return 'background-color:#EEF0FE';
+            if (text === '鍘�') return 'background-color:#EAF0FF';
+            if (text === '鏅�') return 'background-color:#EFF7FF';
+            return '';
+        },
+        // 璺宠浆鍒板紓甯搁」鐩�
+        showAbnormal() {
+            console.log('璺宠浆寮傚父椤圭洰');
+            this.$router.push({
+                path: 'projectEngineering/project/abnormalProject'
+            });
+        },
+
+        // 璺宠浆鍒板搴旂殑椤圭洰搴�
+        showDetail(text) {
+            console.log('璺宠浆鍒板搴旂殑椤圭洰搴�', text);
+            switch (text) {
+                case '鍌�':
+                    this.$router.push({
+                        path: '/projectEngineering/project/reserveProjects',
+                        query: {
+                            projectCategory: '1'
+                        }
+                    });
+                    break;
+                case '鏂�':
+                    this.$router.push({
+                        path: '/projectEngineering/project/previousProjects',
+                        query: {
+                            projectCategory: '2'
+                        }
+                    });
+                    break;
+                case '寤�':
+                    this.$router.push({
+                        path: '/projectEngineering/project/implementationProject',
+                        query: {
+                            projectCategory: '3'
+                        }
+                    });
+                    break;
+                case '绔�':
+                    this.$router.push({
+                        path: '/projectEngineering/project/completedProjects',
+                        query: {
+                            projectCategory: '4'
+                        }
+                    });
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.overview-bottom {
+    display: flex;
+    justify-content: space-between;
+
+    .abnormal {
+        position: relative;
+        width: 25%;
+        min-width: 342px;
+        height: 200px;
+        background-image: url(../../assets/images/b.png);
+        background-size: 100% auto;
+        border-radius: 6px;
+        font-size: 16px;
+        color: #ffffff;
+        padding: 20px 0 0 20px;
+
+        .abnormal-center {
+            margin-bottom: 15px;
+        }
+
+        .abnormal-img {
+            position: absolute;
+            right: 50px;
+            bottom: 20px;
+            width: 100px;
+            height: 100px;
+            background-image: url(../../assets/images/c.png);
+        }
+    }
+
+    .custom-min-width {
+        min-width: 1250px;
+        width: 1250px;
+    }
+
+    .listings {
+        width: 300px;
+        height: 90px;
+        border-radius: 6px;
+        display: flex;
+        align-items: center;
+
+        .title {
+            width: 45px;
+            height: 45px;
+            font-size: 24px;
+            border-radius: 8px;
+            line-height: 45px;
+            text-align: center;
+            margin-left: 15px;
+            color: #ffffff;
+        }
+
+        .active {
+            background-color: #3369ff;
+        }
+
+        .conter {
+            margin-left: 10px;
+
+            .mun {
+                font-size: 30px;
+                line-height: 32px;
+            }
+
+            .statistics {
+                width: 200px;
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+
+                // .statistics-mun {
+                //     // color: #3369FF;
+                // }
+            }
+        }
+    }
+}
+.overview-div {
+    min-width: 1250px;
+    width: 1250px;
+    gap: 10px;
+    flex-wrap: wrap;
+    display: flex;
+    margin-left: 10px;
+}
+</style>
diff --git a/src/views/components/tidingsTable.vue b/src/views/components/tidingsTable.vue
new file mode 100644
index 0000000..8009d8e
--- /dev/null
+++ b/src/views/components/tidingsTable.vue
@@ -0,0 +1,283 @@
+<template>
+    <div>
+        <div class="flex justify-between mb-[15px]">
+            <div class="block mb-3 font-semibold fonts">娑堟伅涓績</div>
+            <div class="flex text-[12px]">
+                <div
+                    v-for="tab in tabs"
+                    :key="tab.id"
+                    :class="{ active: currentTabId === tab.id }"
+                    class="tab relative"
+                    @click="switchTab(tab.id)"
+                >
+                    {{ tab.label }}
+                    <div v-if="tab.num" class="w-[15px] h-[15px] num">
+                        {{ tab.num }}
+                    </div>
+                </div>
+            </div>
+        </div>
+        <el-table
+            :data="tableData"
+            :header-cell-style="{
+                background: '#F5F7FC',
+                color: '#454B5E',
+                fontSize: '12px'
+            }"
+            height="280"
+            max-height="280"
+        >
+            <el-table-column
+                v-for="column in currentTableHeaders"
+                :key="column.prop"
+                :align="column.align"
+                :label="column.label"
+                :min-width="column.minWidth"
+                :prop="column.prop"
+            >
+                <template v-if="column.slot === 'sort'" #default="scope">
+                    <div
+                        :class="
+                            getSortClass(
+                                (queryParams.pageNum - 1) *
+                                    queryParams.pageSize +
+                                    scope.$index +
+                                    1
+                            )
+                        "
+                        class="sort"
+                    >
+                        <span>{{
+                            (queryParams.pageNum - 1) * queryParams.pageSize +
+                            scope.$index +
+                            1
+                        }}</span>
+                    </div>
+                </template>
+            </el-table-column>
+
+            <el-table-column
+                align="center"
+                class="relative"
+                fixed="right"
+                label="鎿嶄綔"
+                min-width="72"
+            >
+                <template #default="scope">
+                    <el-button
+                        plain
+                        size="small"
+                        type="primary"
+                        @click="handleDetail(scope.row)"
+                    >
+                        鏌ョ湅</el-button
+                    >
+                    <div v-if="scope.row.isRead === '0'" class="viewRead"></div>
+                </template>
+            </el-table-column>
+        </el-table>
+        <pagination
+            v-show="total >= 0"
+            :limit="queryParams.pageSize"
+            :page="queryParams.pageNum"
+            :total="total"
+            @pagination="getList"
+        />
+    </div>
+</template>
+<script>
+import { getMessage, getMessageCount, getRead } from '@/api/message';
+
+export default {
+    name: "Index",
+    data() {
+        return {
+            total: 0,
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10
+            },
+            tableData: [],
+            tabs: [
+                // { id: 'process', label: '閫氱煡鍏憡', num: '2' },
+                { id: 'review', label: '瀹℃牳娑堟伅', num: '6' }
+                // { id: 'supervision', label: '鐫e姙娑堟伅', num: '9' },
+                // { id: 'progress', label: '杩涘害娑堟伅', num: '7' }
+            ],
+            currentTabId: 0,
+            //閰嶇疆琛ㄦ牸琛ㄥご鏁版嵁
+            currentTableHeaders: [
+                { label: '鎺掑簭', prop: 'index', minWidth: 50, align: 'center', slot: 'sort' },
+                { label: '鍙戝竷鍗曚綅', prop: 'commitDept', minWidth: 150, align: 'left' },
+                { label: '鍐呭', prop: 'content', minWidth: 300, align: 'left' },
+                { label: '鏃堕棿', prop: 'createTime', minWidth: 143, align: 'left' }
+            ]
+        }
+    },
+    props: {
+        calculation: Array,
+        countExceptionProjectData:Object,
+    },
+    created() {
+        this.currentTabId = this.tabs[0].id; // 榛樿閫変腑鐨則ab鐨刬d
+        this.getList();
+        this.getMessageCountFun();
+    },
+    methods: {
+
+
+        async getList() {
+            const resp = await getMessage(this.queryParams);
+            if (resp.code === 200) {
+                this.total = resp.total;
+                this.tableData = resp.rows;
+            }
+        },
+
+        async getMessageCountFun() {
+            const resp = await getMessageCount();
+            if (resp.code === 200) {
+                this.tabs = this.tabs.map((tab) => {
+                    if (tab.label === '瀹℃牳娑堟伅') {
+                        tab.num = resp.data.auditCount;
+                    }
+                    return tab;
+                });
+            }
+        },
+
+
+        switchTab(tabId) {
+            currentTabId = tabId;
+        },
+
+        getSortClass(index) {
+            if (index === 1) {
+                return 'actives';
+            } else if (index === 2) {
+                return 'two';
+            } else if (index === 3) {
+                return 'three';
+            } else {
+                return '';
+            }
+        },
+
+        async getReadFun(id) {
+            const resp = await this.getRead(id);
+            if (resp.code === 200) {
+                await this.getMessageCountFun();
+            }
+        },
+        handleDetail(row) {
+            this.getReadFun(row.id);
+            if (row.auditType === '2') {
+                this.$router.push({
+                    path: '/projectManage/nodeDetails',
+                    query: { taskId: row.taskId, id: row.businessKey, auditType: row.auditType, disabled: 'true' }
+                });
+            } else {
+                this.$router.push({
+                    path: '/projectManage/nodeDetails',
+                    query: { taskId: row.taskId, id: row.businessKey, disabled: 'true' }
+                });
+            }
+        }
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+    padding: 8px;
+    border: 1px solid #dbdeea;
+    cursor: pointer;
+    width: 72px;
+}
+
+.active {
+    border: 1px solid #3369ff;
+    color: #3369ff;
+}
+
+.fonts {
+    font-size: 16px;
+    color: #212a40;
+    display: flex;
+    align-items: center;
+}
+
+.num {
+    position: absolute;
+    z-index: 999;
+    top: -5px;
+    right: -5px;
+    border-radius: 50%;
+    background: #f63f41;
+    color: #fff;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 12px;
+}
+
+::v-deep .el-table__row {
+    font-size: 12px;
+}
+
+.sort {
+    width: 20px;
+    height: 20px;
+    border-radius: 50%;
+    background-color: #eaf0ff;
+    text-align: center;
+    color: #3369ff;
+}
+
+.actives {
+    background-color: #3369ff;
+    color: #fff;
+}
+
+.two {
+    background-color: #5c87ff;
+    color: #fff;
+}
+
+.three {
+    background-color: #85a5ff;
+    color: #fff;
+}
+
+::v-deep .el-pagination {
+    margin: -15px;
+    text-align: end;
+}
+::v-deep .el-pagination .btn-prev .el-icon,
+ ::v-deep .el-pagination .btn-next .el-icon 
+{
+    display: inline;
+}
+.viewRead {
+    width: 4px;
+    height: 4px;
+    position: absolute;
+    z-index: 999;
+    top: 10px;
+    right: 20px;
+    border-radius: 50%;
+    background: #f63f41;
+    color: #fff;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 12px;
+}
+
+.flex {
+    display: flex;
+    justify-content: space-between;
+    font-size: 12px;
+}
+</style>
diff --git a/src/views/index.vue b/src/views/index.vue
index a7d3732..b4cd025 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,1097 +1,381 @@
 <template>
-  <div class="app-container home">
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="24">
-        <blockquote class="text-warning" style="font-size: 14px">
-          棰嗗彇闃块噷浜戦�氱敤浜戜骇鍝�1888浼樻儬鍒�
-          <br />
-          <el-link
-            href="https://www.aliyun.com/minisite/goods?userCode=brki8iof"
-            type="primary"
-            target="_blank"
-            >https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link
-          >
-          <br />
-          棰嗗彇鑵捐浜戦�氱敤浜戜骇鍝�2860浼樻儬鍒�
-          <br />
-          <el-link
-            href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console"
-            type="primary"
-            target="_blank"
-            >https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link
-          >
-          <br />
-          闃块噷浜戞湇鍔″櫒鎶樻墸鍖�
-          <el-link href="http://aly.ruoyi.vip" type="primary" target="_blank"
-            >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link
-          >
-          &nbsp;&nbsp;&nbsp; 鑵捐浜戞湇鍔″櫒绉掓潃鍖�
-          <el-link href="http://txy.ruoyi.vip" type="primary" target="_blank"
-            >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link
-          ><br />
-          <h4 class="text-danger">
-            浜戜骇鍝侀�氱敤绾㈠寘锛屽彲鍙犲姞瀹樼綉甯歌浼樻儬浣跨敤銆�(浠呴檺鏂扮敤鎴�)
-          </h4>
-        </blockquote>
-
-        <hr />
-      </el-col>
-    </el-row>
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>灏勬椽椤圭洰鍚庡彴绠$悊妗嗘灦</h2>
-        <p>
-          涓�鐩存兂鍋氫竴娆惧悗鍙扮鐞嗙郴缁燂紝鐪嬩簡寰堝浼樼鐨勫紑婧愰」鐩絾鏄彂鐜版病鏈夊悎閫傝嚜宸辩殑銆備簬鏄埄鐢ㄧ┖闂蹭紤鎭椂闂村紑濮嬭嚜宸卞啓涓�濂楀悗鍙扮郴缁熴�傚姝ゆ湁浜嗗皠娲」鐩鐞嗙郴缁燂紝濂瑰彲浠ョ敤浜庢墍鏈夌殑Web搴旂敤绋嬪簭锛屽缃戠珯绠$悊鍚庡彴锛岀綉绔欎細鍛樹腑蹇冿紝CMS锛孋RM锛孫A绛夌瓑锛屽綋鐒讹紝鎮ㄤ篃鍙互瀵瑰ス杩涜娣卞害瀹氬埗锛屼互鍋氬嚭鏇村己绯荤粺銆傛墍鏈夊墠绔悗鍙颁唬鐮佸皝瑁呰繃鍚庡崄鍒嗙簿绠�鏄撲笂鎵嬶紝鍑洪敊姒傜巼浣庛�傚悓鏃舵敮鎸佺Щ鍔ㄥ鎴风璁块棶銆傜郴缁熶細闄嗙画鏇存柊涓�浜涘疄鐢ㄥ姛鑳姐��
-        </p>
-        <p>
-          <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span>
-        </p>
-        <p>
-          <el-tag type="danger">&yen;鍏嶈垂寮�婧�</el-tag>
-        </p>
-        <p>
-          <el-button
-            type="primary"
-            size="mini"
-            icon="el-icon-cloudy"
-            plain
-            @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')"
-            >璁块棶鐮佷簯</el-button
-          >
-          <el-button
-            size="mini"
-            icon="el-icon-s-home"
-            plain
-            @click="goTarget('http://ruoyi.vip')"
-            >璁块棶涓婚〉</el-button
-          >
-        </p>
-      </el-col>
-
-      <el-col :sm="24" :lg="12" style="padding-left: 50px">
-        <el-row>
-          <el-col :span="12">
-            <h2>鎶�鏈�夊瀷</h2>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="6">
-            <h4>鍚庣鎶�鏈�</h4>
-            <ul>
-              <li>SpringBoot</li>
-              <li>Spring Security</li>
-              <li>JWT</li>
-              <li>MyBatis</li>
-              <li>Druid</li>
-              <li>Fastjson</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-          <el-col :span="6">
-            <h4>鍓嶇鎶�鏈�</h4>
-            <ul>
-              <li>Vue</li>
-              <li>Vuex</li>
-              <li>Element-ui</li>
-              <li>Axios</li>
-              <li>Sass</li>
-              <li>Quill</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-        </el-row>
-      </el-col>
-    </el-row>
-    <el-divider />
-    <el-row :gutter="20">
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>鑱旂郴淇℃伅</span>
-          </div>
-          <div class="body">
-            <p>
-              <i class="el-icon-s-promotion"></i> 瀹樼綉锛�<el-link
-                href="http://www.ruoyi.vip"
-                target="_blank"
-                >http://www.ruoyi.vip</el-link
-              >
-            </p>
-            <p>
-              <i class="el-icon-user-solid"></i> QQ缇わ細<s> 婊�937441 </s> <s> 婊�887144332 </s>
-              <s> 婊�180251782 </s> <s> 婊�104180207 </s> <s> 婊�186866453 </s> <s> 婊�201396349 </s>
-              <s> 婊�101456076 </s> <s> 婊�101539465 </s> <s> 婊�264312783 </s> <s> 婊�167385320 </s> 
-              <s> 婊�104748341 </s> <s> 婊�160110482 </s> <s> 婊�170801498 </s> <s> 婊�108482800 </s> 
-              <s> 婊�101046199 </s> <s> 婊�136919097 </s> <s> 婊�143961921 </s> <s> 婊�174951577 </s> 
-              <s> 婊�161281055 </s> <s> 婊�138988063 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=SUc-msaypcqB2UTFif4eqGlBHkKcvMNP&authKey=JdQBouY2PG%2BS%2BCzAfIgbCGNgxyahpfh24IW%2F03rPxGilhqVbisLma%2FFFnt79DHNh&noverify=0&group_code=151450850" target="_blank">151450850</a>
-            </p>
-            <p>
-              <i class="el-icon-chat-dot-round"></i> 寰俊锛�<a
-                href="javascript:;"
-                >/ *灏勬椽椤圭洰</a
-              >
-            </p>
-            <p>
-              <i class="el-icon-money"></i> 鏀粯瀹濓細<a
-                href="javascript:;"
-                class="鏀粯瀹濅俊鎭�"
-                >/ *灏勬椽椤圭洰</a
-              >
-            </p>
-          </div>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>鏇存柊鏃ュ織</span>
-          </div>
-          <el-collapse accordion>
-            <el-collapse-item title="v3.8.8 - 2024-06-30">
-              <ol>
-                <li>鑿滃崟绠$悊鏂板璺敱鍚嶇О</li>
-                <li>鏂板鏁版嵁鑴辨晱杩囨护娉ㄨВ</li>
-                <li>鐢ㄦ埛瀵嗙爜鏂板闈炴硶瀛楃楠岃瘉</li>
-                <li>闄愬埗鐢ㄦ埛鎿嶄綔鏁版嵁鏉冮檺鑼冨洿</li>
-                <li>浠g爜鐢熸垚鏂板鍒涘缓琛ㄧ粨鏋勫姛鑳�</li>
-                <li>瀹氭椂浠诲姟鐧藉悕鍗曢厤缃寖鍥寸缉灏�</li>
-                <li>浼樺寲浠g爜鐢熸垚涓诲瓙琛ㄥ叧鑱旀煡璇㈡柟寮�</li>
-                <li>Excel娉ㄨВ鏂板灞炴�omboReadDict</li>
-                <li>Excel娉ㄨВColumnType绫诲瀷鏂板鏂囨湰</li>
-                <li>鏂板鍥介檯鍖栬祫婧愭枃浠堕厤缃�</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.1</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.23</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.37.1</li>
-                <li>鏇存柊HttpUtils涓殑User-Agent</li>
-                <li>鏇存柊compressionPlugin鍒�6.1.2浠ュ吋瀹筺ode18+</li>
-                <li>鍗囩骇spring-security鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li>
-                <li>鍗囩骇spring-framework鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li>
-                <li>浼樺寲鑷畾涔塜SS娉ㄨВ鍖归厤鏂瑰紡</li>
-                <li>浼樺寲缂撳瓨鐩戞帶閿悕鍒楄〃鎺掑簭鏄剧ず</li>
-                <li>浼樺寲瀹氭椂浠诲姟鏃ュ織榛樿鎸夋椂闂存帓搴�</li>
-                <li>浼樺寲榛樿鏂囦欢澶у皬瓒呰繃2G鏃犳晥鐨勯棶棰�</li>
-                <li>浼樺寲鏌ヨ〃鐗规畩瀛楃浣跨敤鍙嶆枩鏉犺繘琛岃浆涔�</li>
-                <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃堕厤缃樉绀洪敊璇棶棰�</li>
-                <li>浼樺寲澶氫釜鑷畾鏁版嵁鏉冮檺浣跨敤in鏌ヨ,閬垮厤澶氭鎷兼帴</li>
-                <li>浼樺寲瀵煎叆Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.7 - 2023-12-08">
-              <ol>
-                <li>鎿嶄綔鏃ュ織璁板綍閮ㄩ棬鍚嶇О</li>
-                <li>鍏ㄥ眬鏁版嵁瀛樺偍鐢ㄦ埛缂栧彿</li>
-                <li>鏂板缂栫▼寮忓垽鏂祫婧愯闂潈闄�</li>
-                <li>鎿嶄綔鏃ュ織鍒楄〃鏂板IP鍦板潃鏌ヨ</li>
-                <li>瀹氭椂浠诲姟鏂板椤靛幓闄ょ姸鎬侀�夐」</li>
-                <li>浠g爜鐢熸垚鏀寔閫夋嫨鍓嶇妯℃澘绫诲瀷</li>
-                <li>鏄鹃殣鍒楃粍浠舵敮鎸佸閫夋寮瑰嚭绫诲瀷</li>
-                <li>閫氱敤鎺掑簭灞炴�rderBy鍙傛暟闄愬埗闀垮害</li>
-                <li>Excel鑷畾涔夋暟鎹鐞嗗櫒澧炲姞鍗曞厓鏍�/宸ヤ綔绨垮璞�</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.8</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.20</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.43</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.7</li>
-                <li>鍗囩骇commons.io鍒版渶鏂扮増鏈�2.13.0</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.14</li>
-                <li>淇浜旂骇璺敱缂撳瓨鏃犳晥闂</li>
-                <li>淇澶栭摼甯︾鍙e嚭鐜扮殑寮傚父</li>
-                <li>淇鏍戞ā鏉跨埗绾х紪鐮佸彉閲忛敊璇�</li>
-                <li>淇瀛楀吀琛ㄨ鎯呴〉闈㈡悳绱㈤棶棰�</li>
-                <li>淇鍐呴摼iframe娌℃湁浼犻�掑弬鏁伴棶棰�</li>
-                <li>淇鑷畾涔夊瓧鍏告牱寮忎笉鐢熸晥鐨勯棶棰�</li>
-                <li>淇瀛楀吀缂撳瓨鍒犻櫎鏂规硶鍙傛暟閿欒闂</li>
-                <li>淇Excel瀵煎叆鏁版嵁涓存椂鏂囦欢鏃犳硶鍒犻櫎闂</li>
-                <li>淇鏈櫥褰曞甫鍙傛暟璁块棶鎴愬姛鍚庡弬鏁颁涪澶遍棶棰�</li>
-                <li>淇HeaderSearch缁勪欢璺宠浆query鍙傛暟涓㈠け闂</li>
-                <li>淇浠g爜鐢熸垚瀵煎叆鍚庡繀濉」涓庢暟鎹簱涓嶅尮閰嶉棶棰�</li>
-                <li>淇Excels瀵煎叆鏃舵棤娉曡幏鍙栧埌dictType瀛楀吀鍊奸棶棰�</li>
-                <li>浼樺寲涓嬭浇zip鏂规硶鏂板閬僵灞�</li>
-                <li>浼樺寲澶村儚涓婁紶鍙傛暟鏂板鏂囦欢鍚嶇О</li>
-                <li>浼樺寲瀛楀吀鏍囩鏀寔鑷畾涔夊垎闅旂</li>
-                <li>浼樺寲鑿滃崟绠$悊绫诲瀷涓烘寜閽姸鎬佸彲閫�</li>
-                <li>浼樺寲鍓嶇闃查噸澶嶆彁浜ゆ暟鎹ぇ灏忛檺鍒�</li>
-                <li>浼樺寲TopNav鑿滃崟娌℃湁鍥炬爣svg涓嶆樉绀�</li>
-                <li>浼樺寲鏁板瓧閲戦澶у啓杞崲绮惧害涓㈠け闂</li>
-                <li>浼樺寲瀵屾枃鏈珽ditor缁勪欢妫�楠屽浘鐗囨牸寮�</li>
-                <li>浼樺寲椤电鍦‵irefox娴忚鍣ㄨ閬尅鐨勯棶棰�</li>
-                <li>浼樺寲涓汉涓績/鍩烘湰璧勬枡淇敼鏃舵暟鎹樉绀洪棶棰�</li>
-                <li>浼樺寲缂撳瓨鐩戞帶鍥捐〃鏀寔璺熼殢灞忓箷澶у皬鑷�傚簲璋冩暣</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.6 - 2023-06-30">
-              <ol>
-                <li>鏀寔鐧诲綍IP榛戝悕鍗曢檺鍒�</li>
-                <li>鏂板鐩戞帶椤甸潰鍥炬爣鏄剧ず</li>
-                <li>鎿嶄綔鏃ュ織鏂板娑堣�楁椂闂村睘鎬�</li>
-                <li>灞忚斀瀹氭椂浠诲姟bean杩濊鐨勫瓧绗�</li>
-                <li>鏃ュ織绠$悊浣跨敤绱㈠紩鎻愬崌鏌ヨ鎬ц兘</li>
-                <li>鏃ュ織娉ㄨВ鏀寔鎺掗櫎鎸囧畾鐨勮姹傚弬鏁�</li>
-                <li>鏀寔鑷畾涔夐殣钘忓睘鎬у垪杩囨护瀛愬璞�</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.3</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.16</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.34</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.15</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.13</li>
-                <li>绉婚櫎apache/commons-fileupload渚濊禆</li>
-                <li>淇椤甸潰鍒囨崲鏃跺竷灞�閿欎贡鐨勯棶棰�</li>
-                <li>淇鍖垮悕娉ㄨВAnonymous绌烘寚閽堥棶棰�</li>
-                <li>淇璺敱璺宠浆琚樆姝㈡椂鍐呴儴浜х敓鎶ラ敊淇℃伅闂</li>
-                <li>淇isMatchedIp鐨勫弬鏁板垽鏂骇鐢熺┖鎸囬拡鐨勯棶棰�</li>
-                <li>淇鐢ㄦ埛澶氳鑹叉暟鎹潈闄愬彲鑳藉嚭鐜版潈闄愭姮鍗囩殑鎯呭喌</li>
-                <li>淇寮�鍚疶opNav鍚庝竴绾ц彍鍗曡矾鐢卞弬鏁拌缃棤鏁堥棶棰�</li>
-                <li>淇DictTag缁勪欢value娌℃湁鍖归厤鐨勫�兼椂鍒欏睍绀簐alue</li>
-                <li>浼樺寲鏂囦欢涓嬭浇鍑虹幇鐨勫紓甯�</li>
-                <li>浼樺寲閫夋嫨鍥炬爣缁勪欢楂樹寒鍥炴樉</li>
-                <li>浼樺寲寮圭獥鍚庡鑸爮鍋忕Щ鐨勯棶棰�</li>
-                <li>浼樺寲淇敼瀵嗙爜鏃ュ織瀛樺偍鏄庢枃闂</li>
-                <li>浼樺寲椤电鏍忓叧闂叾浠栧嚭鐜扮殑寮傚父闂</li>
-                <li>浼樺寲椤电鍏抽棴宸︿晶閫夐」鎺掗櫎棣栭〉閫夐」</li>
-                <li>浼樺寲鍏抽棴褰撳墠tab椤佃烦杞渶鍙充晶tab椤�</li>
-                <li>浼樺寲缂撳瓨鍒楄〃娓呴櫎鎿嶄綔鎻愮ず涓嶅彉鐨勯棶棰�</li>
-                <li>浼樺寲瀛楃鏈娇鐢ㄤ笅鍒掔嚎涓嶈繘琛岄┘宄板紡澶勭悊</li>
-                <li>浼樺寲鐢ㄦ埛瀵煎叆鏇存柊鏃堕渶鑾峰彇鐢ㄦ埛缂栧彿闂</li>
-                <li>浼樺寲渚ц竟鏍忕殑骞冲彴鏍囬涓嶸UE_APP_TITLE淇濇寔鍚屾</li>
-                <li>浼樺寲瀵煎嚭Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li>
-                <li>杩炴帴姹燚ruid鏀寔鏂扮殑閰嶇疆connectTimeout鍜宻ocketTimeout</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.5 - 2023-01-01">
-              <ol>
-                <li>瀹氭椂浠诲姟杩濊鐨勫瓧绗�</li>
-                <li>閲嶇疆鏃跺彇娑堥儴闂ㄩ�変腑</li>
-                <li>鏂板杩斿洖璀﹀憡娑堟伅鎻愮ず</li>
-                <li>蹇界暐涓嶅繀瑕佺殑灞炴�ф暟鎹繑鍥�</li>
-                <li>淇敼鍙傛暟閿悕鏃剁Щ闄ゅ墠缂撳瓨閰嶇疆</li>
-                <li>瀵煎叆鏇存柊鐢ㄦ埛鏁版嵁鍓嶆牎楠屾暟鎹潈闄�</li>
-                <li>鍏煎Excel涓嬫媺妗嗗唴瀹硅繃澶氭棤娉曟樉绀虹殑闂</li>
-                <li>鍗囩骇echarts鍒版渶鏂扮増鏈�5.4.0</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.3</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.0</li>
-                <li>鍗囩骇kaptcha鍒版渶鏂扮増2.3.3</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.15</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.20</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.6</li>
-                <li>浼樺寲寮圭獥鍐呭杩囧灞曠ず涓嶅叏闂</li>
-                <li>浼樺寲swagger-ui闈欐�佽祫婧愪娇鐢ㄧ紦瀛�</li>
-                <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曢殣钘忎晶杈规爮</li>
-                <li>鍒犻櫎fuse鏃犳晥閫夐」maxPatternLength</li>
-                <li>浼樺寲瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃涓虹┖浼氬嚭鐜癧]闂</li>
-                <li>浼樺寲缂栬緫澶村儚鏃堕�忔槑閮ㄥ垎浼氬彉鎴愰粦鑹查棶棰�</li>
-                <li>浼樺寲灏忓睆骞曚笂淇敼澶村儚鐣岄潰甯冨眬閿欎綅鐨勯棶棰�</li>
-                <li>淇浠g爜鐢熸垚鍕鹃�夊睘鎬ф棤鏁堥棶棰�</li>
-                <li>淇鏂囦欢涓婁紶缁勪欢鏍煎紡楠岃瘉闂</li>
-                <li>淇鍥炴樉鏁版嵁瀛楀吀鏁扮粍寮傚父闂</li>
-                <li>淇sheet瓒呭嚭鏈�澶ц鏁板紓甯搁棶棰�</li>
-                <li>淇Log娉ㄨВGET璇锋眰璁板綍涓嶅埌鍙傛暟闂</li>
-                <li>淇璋冨害鏃ュ織鐐瑰嚮澶氭鏁版嵁涓嶅彉鍖栫殑闂</li>
-                <li>淇涓婚棰滆壊鍦―rawer缁勪欢涓嶄細鍔犺浇闂</li>
-                <li>淇鏂囦欢鍚嶅寘鍚壒娈婂瓧绗︾殑鏂囦欢鏃犳硶涓嬭浇闂</li>
-                <li>淇table涓洿澶氭寜閽垏鎹富棰樿壊鏈敓鏁堜慨澶嶉棶棰�</li>
-                <li>淇鏌愪簺鐗规�х殑鐜鐢熸垚浠g爜鍙樹贡鐮乀XT鏂囦欢闂</li>
-                <li>淇浠g爜鐢熸垚鍥剧墖/鏂囦欢/鍗曢�夋椂閫夋嫨蹇呭~鏃犳硶鏍¢獙闂</li>
-                <li>淇鏌愪簺鐗规�х殑鎯呭喌鐢ㄦ埛缂栬緫瀵硅瘽妗嗕腑瑙掕壊鍜岄儴闂ㄦ棤娉曚慨鏀归棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.4 - 2022-09-26">
-              <ol>
-                <li>鏁版嵁閫昏緫鍒犻櫎涓嶈繘琛屽敮涓�楠岃瘉</li>
-                <li>Excel娉ㄨВ鏀寔瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃鏂规硶</li>
-                <li>Excel娉ㄨВ鏀寔鑷畾涔夐殣钘忓睘鎬у垪</li>
-                <li>Excel娉ㄨВ鏀寔backgroundColor灞炴�ц缃儗鏅壊</li>
-                <li>鏀寔閰嶇疆瀵嗙爜鏈�澶ч敊璇鏁�/閿佸畾鏃堕棿</li>
-                <li>鐧诲綍鏃ュ織鏂板瑙i攣璐︽埛鍔熻兘</li>
-                <li>閫氱敤涓嬭浇鏂规硶鏂板config閰嶇疆閫夐」</li>
-                <li>鏀寔澶氭潈闄愬瓧绗﹀尮閰嶈鑹叉暟鎹潈闄�</li>
-                <li>椤甸潰鍐呭祵iframe鍒囨崲tab涓嶅埛鏂版暟鎹�</li>
-                <li>鎿嶄綔鏃ュ織璁板綍鏀寔鎺掗櫎鏁忔劅灞炴�у瓧娈�</li>
-                <li>淇澶氭枃浠朵笂浼犳姤閿欏嚭鐜扮殑寮傚父闂</li>
-                <li>淇鍥剧墖棰勮缁勪欢src灞炴�т负null鍊兼帶鍒跺彴鎶ラ敊闂</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.2.2</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.14</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.3</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.2</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.10</li>
-                <li>浼樺寲浠诲姟杩囨湡涓嶆墽琛岃皟搴�</li>
-                <li>浼樺寲瀛楀吀鏁版嵁浣跨敤store瀛樺彇</li>
-                <li>浼樺寲淇敼璧勬枡澶村儚琚鐩栫殑闂</li>
-                <li>浼樺寲淇敼鐢ㄦ埛鐧诲綍璐﹀彿閲嶅楠岃瘉</li>
-                <li>浼樺寲浠g爜鐢熸垚鍚屾鍚庡�糔ULL闂</li>
-                <li>浼樺寲瀹氭椂浠诲姟鏀寔鎵ц鐖剁被鏂规硶</li>
-                <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼閮ㄩ棬</li>
-                <li>浼樺寲甯冨眬璁剧疆浣跨敤el-drawer鎶藉眽鏄剧ず</li>
-                <li>浼樺寲娌℃湁鏉冮檺鐨勭敤鎴风紪杈戦儴闂ㄧ己灏戞暟鎹�</li>
-                <li>浼樺寲鏃ュ織娉ㄨВ璁板綍闄愬埗璇锋眰鍦板潃鐨勯暱搴�</li>
-                <li>浼樺寲excel/scale灞炴�у鍑哄崟鍏冩牸鏁板�肩被鍨�</li>
-                <li>浼樺寲鏃ュ織鎿嶄綔涓噸缃寜閽椂閲嶅鏌ヨ鐨勯棶棰�</li>
-                <li>浼樺寲澶氫釜鐩稿悓瑙掕壊鏁版嵁瀵艰嚧鏉冮檺SQL閲嶅闂</li>
-                <li>浼樺寲琛ㄦ牸涓婂彸渚у伐鍏锋潯锛堟悳绱㈡寜閽樉闅�&鍙充晶鏍峰紡鍑稿嚭锛�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.3 - 2022-06-27">
-              <ol>
-                <li>鏂板缂撳瓨鍒楄〃鑿滃崟鍔熻兘</li>
-                <li>浠g爜鐢熸垚鏍戣〃鏂板(灞曞紑/鎶樺彔)</li>
-                <li>Excel娉ㄨВ鏀寔color瀛椾綋棰滆壊</li>
-                <li>鏂板Anonymous鍖垮悕璁块棶涓嶉壌鏉冩敞瑙�</li>
-                <li>鐢ㄦ埛澶村儚涓婁紶闄愬埗鍙兘涓哄浘鐗囨牸寮�</li>
-                <li>鎺ュ彛浣跨敤娉涘瀷浣垮叾鐪嬪埌鍝嶅簲灞炴�у瓧娈�</li>
-                <li>妫�鏌ュ畾鏃朵换鍔ean鎵�鍦ㄥ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�</li>
-                <li>娣诲姞椤电openPage鏀寔浼犻�掑弬鏁�</li>
-                <li>鐢ㄦ埛缂撳瓨淇℃伅娣诲姞閮ㄩ棬ancestors绁栫骇鍒楄〃</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.8</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.6</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.11</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.8</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.14</li>
-                <li>闄嶇骇jsencrypt鐗堟湰鍏煎IE娴忚鍣�</li>
-                <li>鍒犻櫎澶氫綑鐨剆alt瀛楁</li>
-                <li>鏂板鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О鏂规硶</li>
-                <li>鏂板鑾峰彇閰嶇疆鏂囦欢涓殑灞炴�у�兼柟娉�</li>
-                <li>鏂板鍐呭缂栫爜/瑙g爜鏂逛究鎻掍欢闆嗘垚浣跨敤</li>
-                <li>瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛�</li>
-                <li>浼樺寲璁剧疆鍒嗛〉鍙傛暟榛樿鍊�</li>
-                <li>浼樺寲瀵圭┖瀛楃涓插弬鏁板鐞嗙殑杩囨护</li>
-                <li>浼樺寲鏄剧ず椤哄簭orderNum绫诲瀷涓烘暣鍨�</li>
-                <li>浼樺寲琛ㄥ崟鏋勫缓鎸夐挳涓嶆樉绀烘鍒欐牎楠�</li>
-                <li>浼樺寲瀛楀吀鏁版嵁鍥炴樉鏍峰紡涓嬫媺妗嗘樉绀哄��</li>
-                <li>浼樺寲R鍝嶅簲鎴愬姛鐘舵�佺爜涓庡叏灞�淇濇寔涓�鑷�</li>
-                <li>浼樺寲druid寮�鍚痺all杩囨护鍣ㄥ嚭鐜扮殑寮傚父闂</li>
-                <li>浼樺寲鐢ㄦ埛绠$悊宸︿晶鏍戝瀷缁勪欢澧炲姞閫変腑楂樹寒淇濇寔</li>
-                <li>浼樺寲鏂板鐢ㄦ埛涓庤鑹蹭俊鎭�&鐢ㄦ埛涓庡矖浣嶄俊鎭�昏緫</li>
-                <li>浼樺寲榛樿涓嶅惎鐢ㄥ帇缂╂枃浠剁紦瀛橀槻姝ode_modules杩囧ぇ</li>
-                <li>淇瀛楀吀鏁版嵁鏄剧ず涓嶅叏闂</li>
-                <li>淇鎿嶄綔鏃ュ織鏌ヨ绫诲瀷鏉′欢涓�0鏃朵細鏌ュ埌鎵�鏈夋暟鎹�</li>
-                <li>淇Excel娉ㄨВprompt/combo鍚屾椂浣跨敤涓嶇敓鏁堥棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.2 - 2022-04-01">
-              <ol>
-                <li>鍓嶇鏀寔璁剧疆鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�</li>
-                <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曟儏鍐甸殣钘忎晶杈规爮</li>
-                <li>渚ц竟鏍忚彍鍗曞悕绉拌繃闀挎偓鍋滄樉绀烘爣棰�</li>
-                <li>鐢ㄦ埛璁块棶鎺у埗鏃舵牎楠屾暟鎹潈闄愶紝闃叉瓒婃潈</li>
-                <li>瀵煎嚭Excel鏃跺睆钄藉叕寮忥紝闃叉CSV娉ㄥ叆椋庨櫓</li>
-                <li>缁勪欢ImagePreview鏀寔澶氬浘棰勮鏄剧ず</li>
-                <li>缁勪欢ImageUpload鏀寔澶氬浘鍚屾椂閫夋嫨涓婁紶</li>
-                <li>缁勪欢FileUpload鏀寔澶氭枃浠跺悓鏃堕�夋嫨涓婁紶</li>
-                <li>鏈嶅姟鐩戞帶鏂板杩愯鍙傛暟淇℃伅鏄剧ず</li>
-                <li>瀹氭椂浠诲姟鐩爣瀛楃涓茶繃婊ょ壒娈婂瓧绗�</li>
-                <li>瀹氭椂浠诲姟鐩爣瀛楃涓查獙璇佸寘鍚嶇櫧鍚嶅崟</li>
-                <li>浠g爜鐢熸垚鍒楄〃鍥剧墖鏀寔棰勮</li>
-                <li>浠g爜鐢熸垚缂栬緫淇敼鎵撳紑鏂伴〉绛�</li>
-                <li>浠g爜鐢熸垚鏂板Java绫诲瀷Boolean</li>
-                <li>浠g爜鐢熸垚瀛愯〃鏀寔鏃ユ湡/瀛楀吀閰嶇疆</li>
-                <li>浠g爜鐢熸垚鍚屾淇濈暀蹇呭~/绫诲瀷閫夐」</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.2</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.80</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.1</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.11</li>
-                <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.2</li>
-                <li>娣诲姞閬楁紡鐨勫垎椤靛弬鏁板悎鐞嗗寲灞炴��</li>
-                <li>淇敼npm鍗冲皢杩囨湡鐨勬敞鍐屾簮鍦板潃</li>
-                <li>淇鍒嗛〉缁勪欢璇锋眰涓ゆ闂</li>
-                <li>淇閫氱敤鏂囦欢涓嬭浇鎺ュ彛璺ㄥ煙闂</li>
-                <li>淇Xss娉ㄨВ瀛楁鍊间负绌烘椂鐨勫紓甯搁棶棰�</li>
-                <li>淇閫夐」鍗$偣鍑诲彸閿埛鏂颁涪澶卞弬鏁伴棶棰�</li>
-                <li>淇琛ㄥ崟娓呴櫎鍏冪礌浣嶇疆鏈瀭鐩村眳涓棶棰�</li>
-                <li>淇鏈嶅姟鐩戞帶涓繍琛屽弬鏁版樉绀烘潯浠堕敊璇�</li>
-                <li>淇瀵煎叆Excel鏃跺瓧鍏稿瓧娈电被鍨嬩负Long杞箟涓虹┖闂</li>
-                <li>淇鐧诲綍瓒呮椂鍒锋柊椤甸潰璺宠浆鐧诲綍椤甸潰杩樻彁绀洪噸鏂扮櫥褰曢棶棰�</li>
-                <li>浼樺寲鍔犺浇瀛楀吀缂撳瓨鏁版嵁</li>
-                <li>浼樺寲IP鍦板潃鑾峰彇鍒板涓殑闂</li>
-                <li>浼樺寲浠诲姟闃熷垪婊℃椂浠诲姟鎷掔粷绛栫暐</li>
-                <li>浼樺寲鏂囦欢涓婁紶鍏煎Weblogic鐜</li>
-                <li>浼樺寲瀹氭椂浠诲姟榛樿淇濆瓨鍒板唴瀛樹腑鎵ц</li>
-                <li>浼樺寲閮ㄩ棬淇敼缂╂斁鍚庡嚭鐜扮殑閿欎綅闂</li>
-                <li>浼樺寲Excel鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄</li>
-                <li>浼樺寲鑿滃崟琛ㄥ叧閿瓧瀵艰嚧鐨勬彃浠舵姤閿欓棶棰�</li>
-                <li>浼樺寲Oracle鐢ㄦ埛澶村儚鍒椾负绌烘椂涓嶆樉绀洪棶棰�</li>
-                <li>浼樺寲椤甸潰鑻ユ湭鍖归厤鍒板瓧鍏告爣绛惧垯杩斿洖鍘熷瓧鍏稿��</li>
-                <li>浼樺寲淇鐧诲綍澶辨晥鍚庡娆¤姹傛彁绀哄娆″脊绐楅棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.1 - 2022-01-01">
-              <ol>
-                <li>鏂板Vue3鍓嶇浠g爜鐢熸垚妯℃澘</li>
-                <li>鏂板鍥剧墖棰勮缁勪欢</li>
-                <li>鏂板鍘嬬缉鎻掍欢瀹炵幇鎵撳寘Gzip</li>
-                <li>鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇</li>
-                <li>鑷畾涔夋枃瀛楀鍒跺壀璐存寚浠�</li>
-                <li>浠g爜鐢熸垚棰勮鏀寔澶嶅埗鍐呭</li>
-                <li>璺敱鏀寔鍗曠嫭閰嶇疆鑿滃崟鎴栬鑹叉潈闄�</li>
-                <li>鐢ㄦ埛绠$悊閮ㄩ棬鏌ヨ閫夋嫨鑺傜偣鍚庡垎椤靛弬鏁板垵濮�</li>
-                <li>淇鐢ㄦ埛鍒嗛厤瑙掕壊灞炴�ч敊璇�</li>
-                <li>淇鎵撳寘鍚庡瓧浣撳浘鏍囧伓鐜扮殑涔辩爜闂</li>
-                <li>淇鑿滃崟绠$悊閲嶇疆琛ㄥ崟鍑虹幇鐨勯敊璇�</li>
-                <li>淇鐗堟湰宸紓瀵艰嚧鐨勬噿鍔犺浇鎶ラ敊闂</li>
-                <li>淇Cron缁勪欢涓懆鍥炴樉闂</li>
-                <li>淇瀹氭椂浠诲姟澶氬弬鏁伴�楀彿鍒嗛殧鐨勯棶棰�</li>
-                <li>淇鏍规嵁ID鏌ヨ鍒楄〃鍙兘鍑虹幇鐨勪富閿孩鍑洪棶棰�</li>
-                <li>淇tomcat閰嶇疆鍙傛暟宸茶繃鏈熼棶棰�</li>
-                <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.8</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.6</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.79</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.8</li>
-                <li>鍗囩骇log4j2鍒�2.17.1锛岄槻姝㈡紡娲為闄�</li>
-                <li>浼樺寲涓嬭浇瑙f瀽blob寮傚父鎻愮ず</li>
-                <li>浼樺寲浠g爜鐢熸垚瀛楀吀缁勯噸澶嶉棶棰�</li>
-                <li>浼樺寲鏌ヨ鐢ㄦ埛鐨勮鑹茬粍&宀椾綅缁勪唬鐮�</li>
-                <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃惰缃�24</li>
-                <li>浼樺寲鐢ㄦ埛瀵煎叆鎻愮ず婧㈠嚭鍒欐樉绀烘粴鍔ㄦ潯</li>
-                <li>浼樺寲闃查噸澶嶆彁浜ゆ爣璇嗙粍鍚堜负(key+url+header)</li>
-                <li>浼樺寲鍒嗛〉鏂规硶璁剧疆鎴愰�氱敤鏂逛究鐏垫椿璋冪敤</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.0 - 2021-12-01">
-              <ol>
-                <li>鏂板閰嶅骞跺悓姝ョ殑Vue3鍓嶇鐗堟湰</li>
-                <li>鏂板閫氱敤鏂规硶绠�鍖栨ā鎬�/缂撳瓨/涓嬭浇/鏉冮檺/椤电浣跨敤</li>
-                <li>浼樺寲瀵煎嚭鏁版嵁/浣跨敤閫氱敤涓嬭浇鏂规硶</li>
-                <li>Excel娉ㄨВ鏀寔鑷畾涔夋暟鎹鐞嗗櫒</li>
-                <li>Excel娉ㄨВ鏀寔瀵煎叆瀵煎嚭鏍囬淇℃伅</li>
-                <li>Excel瀵煎叆鏀寔@Excels娉ㄨВ</li>
-                <li>鏂板缁勪欢data-dict锛岀畝鍖栨暟鎹瓧鍏镐娇鐢�</li>
-                <li>鏂板Jaxb渚濊禆锛岄槻姝dk8浠ヤ笂鍑虹幇鐨勫吋瀹归敊璇�</li>
-                <li>鐢熶骇鐜浣跨敤璺敱鎳掑姞杞芥彁鍗囬〉闈㈠搷搴旈�熷害</li>
-                <li>淇浜旂骇浠ヤ笂鑿滃崟鍑虹幇鐨�404闂</li>
-                <li>闃查噸鎻愪氦娉ㄨВ鏀寔閰嶇疆闂撮殧鏃堕棿/鎻愮ず娑堟伅</li>
-                <li>鏃ュ織娉ㄨВ鏂板鏄惁淇濆瓨鍝嶅簲鍙傛暟</li>
-                <li>浠诲姟灞忚斀杩濊瀛楃&鍙傛暟蹇界暐鍙屽紩鍙蜂腑鐨勯�楀彿</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.5.6</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.0</li>
-                <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.0</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.2</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増1.2.8</li>
-                <li>鍗囩骇velocity鍒版渶鏂扮増鏈�2.3</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.78</li>
-                <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.24.0</li>
-                <li>鍗囩骇dart-sass鍒扮増鏈�1.32.13</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.19.1</li>
-                <li>鍗囩骇jsencrypt鍒版渶鏂扮増鏈�3.2.1</li>
-                <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�3.0.1</li>
-                <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.5</li>
-                <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.1</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.6</li>
-                <li>鏂板sendGet鏃犲弬璇锋眰鏂规硶</li>
-                <li>绂佺敤el-tag缁勪欢鐨勬笎鍙樺姩鐢�</li>
-                <li>浠g爜鐢熸垚鐐瑰嚮棰勮閲嶇疆婵�娲籺ab</li>
-                <li>AjaxResult閲嶅啓put鏂规硶锛屼互鏂逛究閾惧紡璋冪敤</li>
-                <li>浼樺寲鐧诲綍/楠岃瘉鐮佽姹俬eaders涓嶈缃畉oken</li>
-                <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼鐢ㄦ埛鍚�</li>
-                <li>浼樺寲Cron琛ㄨ揪寮忕敓鎴愬櫒鍏抽棴鏃堕攢姣侀伩鍏嶇紦瀛�</li>
-                <li>浼樺寲娉ㄥ唽鎴愬姛鎻愮ず娑堟伅绫诲瀷success</li>
-                <li>浼樺寲aop璇硶锛屼娇鐢╯pring鑷姩娉ㄥ叆娉ㄨВ</li>
-                <li>浼樺寲璁板綍鐧诲綍淇℃伅锛岀Щ闄や笉蹇呰鐨勪慨鏀�</li>
-                <li>浼樺寲mybatis鍏ㄥ眬榛樿鐨勬墽琛屽櫒</li>
-                <li>浼樺寲Excel瀵煎叆鍥剧墖鍙兘鍑虹幇鐨勫紓甯�</li>
-                <li>淇浠g爜鐢熸垚妯℃澘涓诲瓙琛ㄥ垹闄ょ己灏戜簨鍔�</li>
-                <li>淇鏃ュ織璁板綍鍙兘鍑虹幇鐨勮浆鎹㈠紓甯�</li>
-                <li>淇浠g爜鐢熸垚澶嶉�夋瀛楀吀閬楁紡闂</li>
-                <li>淇鍏抽棴xss鍔熻兘瀵艰嚧鍙噸澶嶈RepeatableFilter澶辨晥</li>
-                <li>淇瀛楃涓叉棤娉曡鍙嶈浆涔夐棶棰�</li>
-                <li>淇鍚庣涓诲瓙琛ㄤ唬鐮佹ā鏉挎柟娉曞悕鐢熸垚閿欒闂</li>
-                <li>淇xss杩囨护鍚庢牸寮忓嚭鐜扮殑寮傚父</li>
-                <li>淇swagger娌℃湁鎸囧畾dataTypeClass瀵艰嚧鍚姩鍑虹幇warn鏃ュ織</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.7.0 - 2021-09-13">
-              <ol>
-                <li>鍙傛暟绠$悊鏀寔閰嶇疆楠岃瘉鐮佸紑鍏�</li>
-                <li>鏂板鏄惁寮�鍚敤鎴锋敞鍐屽姛鑳�</li>
-                <li>瀹氭椂浠诲姟鏀寔鍦ㄧ嚎鐢熸垚cron琛ㄨ揪寮�</li>
-                <li>鑿滃崟绠$悊鏀寔閰嶇疆璺敱鍙傛暟</li>
-                <li>鏀寔鑷畾涔夋敞瑙e疄鐜版帴鍙i檺娴�</li>
-                <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎叆</li>
-                <li>鑷畾涔夊脊灞傛孩鍑烘粴鍔ㄦ牱寮�</li>
-                <li>鑷畾涔夊彲鎷栧姩寮圭獥瀹藉害鎸囦护</li>
-                <li>鑷畾涔夊彲鎷栧姩寮圭獥楂樺害鎸囦护</li>
-                <li>淇浠绘剰璐︽埛瓒婃潈闂</li>
-                <li>淇敼鏃舵鏌ョ敤鎴锋暟鎹潈闄愯寖鍥�</li>
-                <li>淇淇濆瓨閰嶇疆涓婚棰滆壊澶辨晥闂</li>
-                <li>鏂板鏆楄壊鑿滃崟椋庢牸涓婚</li>
-                <li>鑿滃崟&閮ㄩ棬鏂板灞曞紑/鎶樺彔鍔熻兘</li>
-                <li>椤电鏂板鍏抽棴宸︿晶&娣诲姞鍥炬爣</li>
-                <li>椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li>
-                <li>椤堕儴鑿滃崟鍚屾绯荤粺涓婚鏍峰紡</li>
-                <li>璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li>
-                <li>浠g爜鐢熸垚涓诲瓙琛ㄥ閫夎鏁版嵁</li>
-                <li>鏃ユ湡鑼冨洿鏀寔娣诲姞澶氱粍</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.5</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.0</li>
-                <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.11.0</li>
-                <li>瀹氭椂浠诲姟灞忚斀ldap杩滅▼璋冪敤</li>
-                <li>瀹氭椂浠诲姟灞忚斀http(s)杩滅▼璋冪敤</li>
-                <li>琛ュ厖瀹氭椂浠诲姟琛ㄥ瓧娈垫敞閲�</li>
-                <li>瀹氭椂浠诲姟瀵规鏌ュ紓甯歌繘琛屼簨鍔″洖婊�</li>
-                <li>鍚敤鐖堕儴闂ㄧ姸鎬佹帓闄ら《绾ц妭鐐�</li>
-                <li>瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li>
-                <li>榛樿棣栭〉浣跨敤keep-alive缂撳瓨</li>
-                <li>淇敼浠g爜鐢熸垚瀛楀吀鍥炴樉鏍峰紡</li>
-                <li>鑷畾涔夊垎椤靛悎鐞嗗寲浼犲叆鍙傛暟</li>
-                <li>淇瀛楀吀缁勪欢鍊间负鏁村舰涓嶆樉绀洪棶棰�</li>
-                <li>淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li>
-                <li>瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li>
-                <li>淇瑙掕壊鍒嗛厤鐢ㄦ埛椤甸潰鍙傛暟绫诲瀷閿欒鎻愰啋</li>
-                <li>浼樺寲甯冨眬璁剧疆鍔ㄧ敾鐗规晥</li>
-                <li>浼樺寲寮傚父澶勭悊淇℃伅</li>
-                <li>浼樺寲閿欒token瀵艰嚧鐨勮В鏋愬紓甯�</li>
-                <li>瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li>
-                <li>瀹氭椂浠诲姟鏂板鏇村鎿嶄綔</li>
-                <li>鏇村鎿嶄綔鎸夐挳娣诲姞鏉冮檺鎺у埗</li>
-                <li>瀵煎叆鐢ㄦ埛鏍峰紡浼樺寲</li>
-                <li>鎻愬彇閫氱敤鏂规硶鍒板熀绫绘帶鍒跺櫒</li>
-                <li>浼樺寲浣跨敤鏉冮檺宸ュ叿鑾峰彇鐢ㄦ埛淇℃伅</li>
-                <li>浼樺寲鐢ㄦ埛涓嶈兘鍒犻櫎鑷繁</li>
-                <li>浼樺寲XSS璺ㄧ珯鑴氭湰杩囨护</li>
-                <li>浼樺寲浠g爜鐢熸垚妯℃澘</li>
-                <li>楠岃瘉鐮侀粯璁�20s瓒呮椂</li>
-                <li>BLOB涓嬭浇鏃舵竻闄RL瀵硅薄寮曠敤</li>
-                <li>浠g爜鐢熸垚瀵煎叆琛ㄦ寜鍒涘缓鏃堕棿鎺掑簭</li>
-                <li>淇浠g爜鐢熸垚椤甸潰鏁版嵁缂栬緫淇濆瓨涔嬪悗鎬绘槸璺宠浆绗竴椤电殑闂</li>
-                <li>淇甯afari娴忚鍣ㄦ棤娉曟牸寮忓寲utc鏃ユ湡鏍煎紡yyyy-MM-dd'T'HH:mm:ss.SSS闂</li>
-                <li>澶氬浘涓婁紶缁勪欢绉婚櫎澶氫綑鐨刟pi鍦板潃&楠岃瘉澶辫触瀵艰嚧鍥剧墖鍒犻櫎闂&鏃犳硶鍒犻櫎鐩稿簲鍥剧墖淇</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.0 - 2021-07-12">
-              <ol>
-                <li>瑙掕壊绠$悊鏂板鍒嗛厤鐢ㄦ埛鍔熻兘</li>
-                <li>鐢ㄦ埛绠$悊鏂板鍒嗛厤瑙掕壊鍔熻兘</li>
-                <li>鏃ュ織鍒楄〃鏀寔鎺掑簭鎿嶄綔</li>
-                <li>浼樺寲鍙傛暟&瀛楀吀缂撳瓨鎿嶄綔</li>
-                <li>绯荤粺甯冨眬閰嶇疆鏀寔鍔ㄦ�佹爣棰樺紑鍏�</li>
-                <li>鑿滃崟璺敱閰嶇疆鏀寔鍐呴摼璁块棶</li>
-                <li>榛樿璁块棶鍚庣棣栭〉鏂板鎻愮ず璇�</li>
-                <li>瀵屾枃鏈粯璁や笂浼犺繑鍥瀠rl绫诲瀷</li>
-                <li>鏂板鑷畾涔夊脊绐楁嫋鎷芥寚浠�</li>
-                <li>鍏ㄥ眬娉ㄥ唽甯哥敤閫氱敤缁勪欢</li>
-                <li>鍏ㄥ眬鎸傝浇瀛楀吀鏍囩缁勪欢</li>
-                <li>ImageUpload缁勪欢鏀寔澶氬浘鐗囦笂浼�</li>
-                <li>FileUpload缁勪欢鏀寔澶氭枃浠朵笂浼�</li>
-                <li>鏂囦欢涓婁紶缁勪欢娣诲姞鏁伴噺闄愬埗灞炴��</li>
-                <li>瀵屾枃鏈紪杈戠粍浠舵坊鍔犵被鍨嬪睘鎬�</li>
-                <li>瀵屾枃鏈粍浠跺伐鍏锋爮閰嶇疆瑙嗛</li>
-                <li>灏佽閫氱敤iframe缁勪欢</li>
-                <li>闄愬埗瓒呯骇绠$悊鍛樹笉鍏佽鎿嶄綔</li>
-                <li>鐢ㄦ埛淇℃伅闀垮害鏍¢獙闄愬埗</li>
-                <li>鍒嗛〉缁勪欢鏂板pagerCount灞炴��</li>
-                <li>娣诲姞bat鑴氭湰鎵ц搴旂敤</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.7.4</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.2</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.1</li>
-                <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.10.0</li>
-                <li>鍗囩骇commons.fileupload鍒版渶鏂扮増鏈瑅1.4</li>
-                <li>鍗囩骇swagger鍒版渶鏂扮増鏈瑅3.0.0</li>
-                <li>淇鍏抽棴confirm鎻愮ず妗嗘帶鍒跺彴鎶ラ敊闂</li>
-                <li>淇瀛樺湪鐨凷QL娉ㄥ叆婕忔礊闂</li>
-                <li>瀹氭椂浠诲姟灞忚斀rmi杩滅▼璋冪敤</li>
-                <li>淇鐢ㄦ埛鎼滅储鍒嗛〉鍙橀噺閿欒</li>
-                <li>淇瀵煎嚭瑙掕壊鏁版嵁鑼冨洿缈昏瘧缂哄皯浠呮湰浜�</li>
-                <li>淇琛ㄥ崟鏋勫缓閫夋嫨涓嬫媺閫夋嫨鎺у埗鍙版姤閿欓棶棰�</li>
-                <li>浼樺寲鍥剧墖宸ュ叿绫昏鍙栨枃浠�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.5.0 - 2021-05-25">
-              <ol>
-                <li>鏂板鑿滃崟瀵艰埅鏄剧ず椋庢牸TopNav锛坒alse涓哄乏渚у鑸彍鍗曪紝true涓洪《閮ㄥ鑸彍鍗曪級</li>
-                <li>甯冨眬璁剧疆鏀寔淇濆瓨&閲嶇疆閰嶇疆</li>
-                <li>淇鏍戣〃鏁版嵁鏄剧ず涓嶅叏&鍔犺浇鎱㈤棶棰�</li>
-                <li>鏂板IE娴忚鍣ㄧ増鏈繃浣庢彁绀洪〉闈�</li>
-                <li>鐢ㄦ埛鐧诲綍鍚庤褰曟渶鍚庣櫥褰旾P&鏃堕棿</li>
-                <li>椤甸潰瀵煎嚭鎸夐挳鐐瑰嚮涔嬪悗娣诲姞閬僵</li>
-                <li>瀵屾枃鏈紪杈戝櫒鏀寔鑷畾涔変笂浼犲湴鍧�</li>
-                <li>瀵屾枃鏈紪杈戠粍浠舵柊澧瀝eadOnly灞炴��</li>
-                <li>椤电TagsView鏂板鍏抽棴鍙充晶鍔熻兘</li>
-                <li>鏄鹃殣鍒楃粍浠跺姞杞藉垵濮嬮粯璁ら殣钘忓垪</li>
-                <li>鍏抽棴澶村儚涓婁紶绐楀彛杩樺師榛樿鍥剧墖</li>
-                <li>涓汉淇℃伅娣诲姞鎵嬫満&閭閲嶅楠岃瘉</li>
-                <li>浠g爜鐢熸垚妯℃澘瀵煎嚭鎸夐挳鐐瑰嚮鍚庢坊鍔犻伄缃�</li>
-                <li>浠g爜鐢熸垚妯℃澘鏍戣〃鎿嶄綔鍒楁坊鍔犳柊澧炴寜閽�</li>
-                <li>浠g爜鐢熸垚妯℃澘淇涓诲瓙琛ㄥ瓧娈甸噸鍚嶉棶棰�</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.76</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.6</li>
-                <li>鍗囩骇mybatis鍒版渶鏂扮増3.5.6 闃绘杩滅▼浠g爜鎵ц婕忔礊</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.6.0</li>
-                <li>velocity鍓旈櫎commons-collections鐗堟湰锛岄槻姝�3.2.1鐗堟湰鐨勫弽搴忓垪鍖栨紡娲�</li>
-                <li>鏁版嵁鐩戞帶椤甸粯璁よ处鎴峰瘑鐮侀槻姝㈣秺鏉冭闂�</li>
-                <li>淇firefox涓嬭〃鍗曟瀯寤烘嫋鎷戒細鏂版墦鍗′竴涓�夐」鍗�</li>
-                <li>淇鍚庣瀵煎叆琛ㄦ潈闄愭爣璇�</li>
-                <li>淇鍓嶇鎿嶄綔鏃ュ織&鐧诲綍鏃ュ織鏉冮檺鏍囪瘑</li>
-                <li>璁剧疆Redis閰嶇疆HashKey搴忓垪鍖�</li>
-                <li>鍒犻櫎鎿嶄綔鏃ュ織璁板綍淇℃伅</li>
-                <li>涓婁紶濯掍綋绫诲瀷娣诲姞瑙嗛鏍煎紡</li>
-                <li>淇璇锋眰褰㈠弬鏈紶鍊艰褰曟棩蹇楀紓甯搁棶棰�</li>
-                <li>浼樺寲xss鏍¢獙json璇锋眰鏉′欢</li>
-                <li>鏍戠骇缁撴瀯鏇存柊瀛愯妭鐐逛娇鐢╮eplaceFirst</li>
-                <li>浼樺寲ExcelUtil绌哄�煎鐞�</li>
-                <li>鏃ュ織璁板綍杩囨护BindingResult瀵硅薄锛岄槻姝㈠紓甯�</li>
-                <li>淇敼涓婚鍚巑ini绫诲瀷鎸夐挳鏃犳晥闂</li>
-                <li>浼樺寲閫氱敤涓嬭浇瀹屾垚鍚庡垹闄よ妭鐐�</li>
-                <li>閫氱敤Controller娣诲姞鍝嶅簲杩斿洖娑堟伅</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.4.0 - 2021-02-22">
-              <ol>
-                <li>浠g爜鐢熸垚妯℃澘鏀寔涓诲瓙琛�</li>
-                <li>琛ㄦ牸鍙充晶宸ュ叿鏍忕粍浠舵敮鎸佹樉闅愬垪</li>
-                <li>鍥剧墖缁勪欢娣诲姞棰勮&绉婚櫎鍔熻兘</li>
-                <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎嚭</li>
-                <li>鎿嶄綔鎸夐挳缁勮皟鏁翠负鏈寸礌鎸夐挳鏍峰紡</li>
-                <li>浠g爜鐢熸垚鏀寔鏂囦欢涓婁紶缁勪欢</li>
-                <li>浠g爜鐢熸垚鏃ユ湡鎺т欢鍖哄垎鑼冨洿</li>
-                <li>浠g爜鐢熸垚鏁版嵁搴撴枃鏈被鍨嬬敓鎴愯〃鍗曟枃鏈煙</li>
-                <li>鐢ㄦ埛鎵嬫満閭&鑿滃崟缁勪欢淇敼鍏佽绌哄瓧绗︿覆</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.2.13 鎻愬崌鍚姩閫熷害</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.4</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.75</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.0</li>
-                <li>淇IE11娴忚鍣ㄦ姤閿欓棶棰�</li>
-                <li>浼樺寲澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
-                <li>淇鍥涚骇鑿滃崟鏃犳硶鏄剧ず闂</li>
-                <li>淇渚ц竟鏍忛潤鎬佽矾鐢变涪澶遍棶棰�</li>
-                <li>淇瑙掕壊绠$悊-缂栬緫瑙掕壊-鍔熻兘鏉冮檺鏄剧ず寮傚父</li>
-                <li>閰嶇疆鏂囦欢鏂板redis鏁版嵁搴撶储寮曞睘鎬�</li>
-                <li>鏉冮檺宸ュ叿绫诲鍔燼dmin鍒ゆ柇</li>
-                <li>瑙掕壊闈炶嚜瀹氫箟鏉冮檺鑼冨洿娓呯┖閫夋嫨鍊�</li>
-                <li>淇瀵煎叆鏁版嵁涓鸿礋娴偣鏁版椂涓㈠け绮惧害闂</li>
-                <li>绉婚櫎path-to-regexp姝e垯鍖归厤鎻掍欢</li>
-                <li>淇鐢熸垚鏍戣〃浠g爜寮傚父</li>
-                <li>淇敼ip瀛楁闀垮害闃叉ipv6鍦板潃闀垮害涓嶅</li>
-                <li>闃叉get璇锋眰鍙傛暟鍊间负false鎴�0绛夌壒娈婂�间細瀵艰嚧鏃犳硶姝g‘鐨勪紶鍙�</li>
-                <li>鐧诲綍鍚巔ush娣诲姞catch闃叉鍑虹幇妫�鏌ラ敊璇�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.3.0 - 2020-12-14">
-              <ol>
-                <li>鏂板缂撳瓨鐩戞帶鍔熻兘</li>
-                <li>鏀寔涓婚椋庢牸閰嶇疆</li>
-                <li>淇澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
-                <li>澶氱骇鑿滃崟鑷姩閰嶇疆缁勪欢</li>
-                <li>浠g爜鐢熸垚棰勮鏀寔楂樹寒鏄剧ず</li>
-                <li>鏀寔Get璇锋眰鏄犲皠Params鍙傛暟</li>
-                <li>鍒犻櫎鐢ㄦ埛鍜岃鑹茶В缁戝叧鑱�</li>
-                <li>鍘婚櫎鐢ㄦ埛鎵嬫満閭閮ㄩ棬蹇呭~楠岃瘉</li>
-                <li>Excel鏀寔娉ㄨВalign瀵归綈鏂瑰紡</li>
-                <li>Excel鏀寔瀵煎叆Boolean鍨嬫暟鎹�</li>
-                <li>浼樺寲澶村儚鏍峰紡锛岄紶鏍囩Щ鍏ユ偓鍋滈伄缃�</li>
-                <li>浠g爜鐢熸垚棰勮鎻愪緵婊氬姩鏈哄埗</li>
-                <li>浠g爜鐢熸垚鍒犻櫎澶氫綑鐨勬暟瀛梖loat绫诲瀷</li>
-                <li>淇杞崲瀛楃涓茬殑鐩爣瀛楃闆嗗睘鎬�</li>
-                <li>鍥炴樉鏁版嵁瀛楀吀闃叉绌哄�兼姤閿�</li>
-                <li>鏃ュ織璁板綍澧炲姞杩囨护澶氭枃浠跺満鏅�</li>
-                <li>淇敼缂撳瓨Set鏂规硶鍙兘瀵艰嚧宓屽鐨勯棶棰�</li>
-                <li>绉婚櫎鍓嶇涓�浜涘浣欑殑渚濊禆</li>
-                <li>闃叉瀹夊叏鎵弿YUI鍑虹幇鐨勯闄╂彁绀�</li>
-                <li>淇敼node-sass涓篸art-sass</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.1.18</li>
-                <li>鍗囩骇poi鍒版渶鏂扮増鏈�4.1.2</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.3.6</li>
-                <li>鍗囩骇bitwalker鍒版渶鏂扮増鏈�1.21</li>
-                <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.21.0</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.14.1</li>
-                <li>鍗囩骇vue鍒版渶鏂扮増鏈�2.6.12</li>
-                <li>鍗囩骇vuex鍒版渶鏂扮増鏈�3.6.0</li>
-                <li>鍗囩骇vue-cli鍒扮増鏈�4.5.9</li>
-                <li>鍗囩骇vue-router鍒版渶鏂扮増鏈�3.4.9</li>
-                <li>鍗囩骇vue-cli鍒版渶鏂扮増鏈�4.4.6</li>
-                <li>鍗囩骇vue-cropper鍒版渶鏂扮増鏈�0.5.5</li>
-                <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.6</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.8.1</li>
-                <li>鍗囩骇echarts鍒版渶鏂扮増鏈�4.9.0</li>
-                <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.4</li>
-                <li>鍗囩骇fuse.js鍒版渶鏂扮増鏈�6.4.3</li>
-                <li>鍗囩骇js-beautify鍒版渶鏂扮増鏈�1.13.0</li>
-                <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�2.2.1</li>
-                <li>鍗囩骇path-to-regexp鍒版渶鏂扮増鏈�6.2.0</li>
-                <li>鍗囩骇quill鍒版渶鏂扮増鏈�1.3.7</li>
-                <li>鍗囩骇screenfull鍒版渶鏂扮増鏈�5.0.2</li>
-                <li>鍗囩骇sortablejs鍒版渶鏂扮増鏈�1.10.2</li>
-                <li>鍗囩骇vuedraggable鍒版渶鏂扮増鏈�2.24.3</li>
-                <li>鍗囩骇chalk鍒版渶鏂扮増鏈�4.1.0</li>
-                <li>鍗囩骇eslint鍒版渶鏂扮増鏈�7.15.0</li>
-                <li>鍗囩骇eslint-plugin-vue鍒版渶鏂扮増鏈�7.2.0</li>
-                <li>鍗囩骇lint-staged鍒版渶鏂扮増鏈�10.5.3</li>
-                <li>鍗囩骇runjs鍒版渶鏂扮増鏈�4.4.2</li>
-                <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.0</li>
-                <li>鍗囩骇script-ext-html-webpack-plugin鍒版渶鏂扮増鏈�2.1.5</li>
-                <li>鍗囩骇svg-sprite-loader鍒版渶鏂扮増鏈�5.1.1</li>
-                <li>鍗囩骇vue-template-compiler鍒版渶鏂扮増鏈�2.6.12</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.1 - 2020-11-18">
-              <ol>
-                <li>闃绘浠绘剰鏂囦欢涓嬭浇婕忔礊</li>
-                <li>浠g爜鐢熸垚鏀寔涓婁紶鎺т欢</li>
-                <li>鏂板鍥剧墖涓婁紶缁勪欢</li>
-                <li>璋冩暣榛樿棣栭〉</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.2</li>
-                <li>mapperLocations閰嶇疆鏀寔鍒嗛殧绗�</li>
-                <li>鏉冮檺淇℃伅璋冩暣</li>
-                <li>璋冩暣sql榛樿鏃堕棿</li>
-                <li>瑙e喅浠g爜鐢熸垚娌℃湁bit绫诲瀷鐨勯棶棰�</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.0</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.0 - 2020-10-10">
-              <ol>
-                <li>鍗囩骇springboot鐗堟湰鍒�2.1.17 鎻愬崌瀹夊叏鎬�</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.2.5</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.1</li>
-                <li>鍗囩骇jjwt鍒扮増鏈�0.9.1</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.74</li>
-                <li>淇敼sass涓簄ode-sass锛岄伩鍏峞l-icon鍥炬爣涔辩爜</li>
-                <li>浠g爜鐢熸垚鏀寔鍚屾鏁版嵁搴�</li>
-                <li>浠g爜鐢熸垚鏀寔瀵屾枃鏈帶浠�</li>
-                <li>浠g爜鐢熸垚椤甸潰鏃朵笉蹇界暐remark灞炴��</li>
-                <li>浠g爜鐢熸垚娣诲姞select蹇呭~閫夐」</li>
-                <li>Excel瀵煎嚭绫诲瀷NUMERIC鏀寔绮惧害娴偣绫诲瀷</li>
-                <li>Excel瀵煎嚭targetAttr浼樺寲鑾峰彇鍊硷紝闃叉get鏂规硶涓嶈鑼�</li>
-                <li>Excel娉ㄨВ鏀寔鑷姩缁熻鏁版嵁鎬诲拰</li>
-                <li>Excel娉ㄨВ鏀寔璁剧疆BigDecimal绮惧害&鑸嶅叆瑙勫垯</li>
-                <li>鑿滃崟&鏁版嵁鏉冮檺鏂板锛堝睍寮�/鎶樺彔 鍏ㄩ��/鍏ㄤ笉閫� 鐖跺瓙鑱斿姩锛�</li>
-                <li>鍏佽鐢ㄦ埛鍒嗛厤鍒伴儴闂ㄧ埗鑺傜偣</li>
-                <li>鑿滃崟鏂板鏄惁缂撳瓨keep-alive</li>
-                <li>琛ㄦ牸鎿嶄綔鍒楅棿璺濊皟鏁�</li>
-                <li>闄愬埗绯荤粺鍐呯疆鍙傛暟涓嶅厑璁稿垹闄�</li>
-                <li>瀵屾枃鏈粍浠朵紭鍖栵紝鏀寔鑷畾涔夐珮搴�&鍥剧墖鍐茬獊闂</li>
-                <li>瀵屾枃鏈伐鍏锋爮鏍峰紡瀵归綈</li>
-                <li>瀵煎叆excel鏁村舰鍊兼牎楠屼紭鍖�</li>
-                <li>淇椤电鍏抽棴鎵�鏈夋椂鍥哄畾鏍囩璺敱涓嶅埛鏂伴棶棰�</li>
-                <li>琛ㄥ崟鏋勫缓甯冨眬鍨嬬粍浠舵柊澧炴寜閽�</li>
-                <li>宸︿晶鑿滃崟鏂囧瓧杩囬暱鏄剧ず鐪佺暐鍙�</li>
-                <li>淇鏍硅妭鐐逛负瀛愰儴闂ㄦ椂锛屾爲鐘剁粨鏋勬樉绀洪棶棰�</li>
-                <li>淇璋冪敤鐩爣瀛楃涓叉渶澶ч暱搴�</li>
-                <li>淇鑿滃崟鎻愮ず淇℃伅閿欒</li>
-                <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃潈闄愭爣璇�</li>
-                <li>淇鏁版嵁搴撳瓧绗︿覆绫诲瀷nvarchar</li>
-                <li>浼樺寲閫掑綊瀛愯妭鐐�</li>
-                <li>浼樺寲鏁版嵁鏉冮檺鍒ゆ柇</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.1.0 - 2020-08-13">
-              <ol>
-                <li>琛ㄦ牸宸ュ叿鏍忓彸渚ф坊鍔犲埛鏂�&鏄鹃殣鏌ヨ缁勪欢</li>
-                <li>鍚庣鏀寔CORS璺ㄥ煙璇锋眰</li>
-                <li>浠g爜鐢熸垚鏀寔閫夋嫨涓婄骇鑿滃崟</li>
-                <li>浠g爜鐢熸垚鏀寔鑷畾涔夎矾寰�</li>
-                <li>浠g爜鐢熸垚鏀寔澶嶉�夋</li>
-                <li>Excel瀵煎嚭瀵煎叆鏀寔dictType瀛楀吀绫诲瀷</li>
-                <li>Excel鏀寔鍒嗗壊瀛楃涓茬粍鍐呭</li>
-                <li>楠岃瘉鐮佺被鍨嬫敮鎸侊紙鏁扮粍璁$畻銆佸瓧绗﹂獙璇侊級</li>
-                <li>鍗囩骇vue-cli鐗堟湰鍒�4.4.4</li>
-                <li>淇敼 node-sass 涓� dart-sass</li>
-                <li>琛ㄥ崟绫诲瀷涓篒nteger/Long璁剧疆鏁村舰榛樿鍊�</li>
-                <li>浠g爜鐢熸垚鍣ㄩ粯璁apper璺緞涓庨粯璁apperScan璺緞涓嶄竴鑷�</li>
-                <li>浼樺寲闃查噸澶嶆彁浜ゆ嫤鎴櫒</li>
-                <li>浼樺寲涓婄骇鑿滃崟涓嶈兘閫夋嫨鑷繁</li>
-                <li>淇瑙掕壊鐨勬潈闄愬垎閰嶅悗锛屾湭瀹炴椂鐢熸晥闂</li>
-                <li>淇鍦ㄧ嚎鐢ㄦ埛鏃ュ織璁板綍绫诲瀷</li>
-                <li>淇瀵屾枃鏈┖鏍煎拰缂╄繘淇濆瓨鍚庝笉鐢熸晥闂</li>
-                <li>淇鍦ㄧ嚎鐢ㄦ埛鍒ゆ柇閫昏緫</li>
-                <li>鍞竴闄愬埗鏉′欢鍙繑鍥炲崟鏉℃暟鎹�</li>
-                <li>娣诲姞鑾峰彇褰撳墠鐨勭幆澧冮厤缃柟娉�</li>
-                <li>瓒呮椂鐧诲綍鍚庨〉闈㈣烦杞埌棣栭〉</li>
-                <li>鍏ㄥ眬寮傚父鐘舵�佹眽鍖栨嫤鎴鐞�</li>
-                <li>HTML杩囨护鍣ㄦ敼涓哄皢html杞箟</li>
-                <li>妫�鏌ュ瓧绗︽敮鎸佸皬鏁扮偣&闄嶇骇鏀规垚寮傚父鎻愰啋</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.0.0 - 2020-07-20">
-              <ol>
-                <li>鍗曞簲鐢ㄨ皟鏁翠负澶氭ā鍧楅」鐩�</li>
-                <li>鍗囩骇element-ui鐗堟湰鍒�2.13.2</li>
-                <li>鍒犻櫎babel锛屾彁楂樼紪璇戦�熷害銆�</li>
-                <li>鏂板鑿滃崟榛樿涓荤被鐩�</li>
-                <li>缂栫爜鏂囦欢鍚嶄慨鏀逛负uuid鏂瑰紡</li>
-                <li>瀹氭椂浠诲姟cron琛ㄨ揪寮忛獙璇�</li>
-                <li>瑙掕壊鏉冮檺淇敼鏃跺凡鏈夋潈闄愭湭鑷姩鍕鹃�夊紓甯镐慨澶�</li>
-                <li>闃叉鍒囨崲鏉冮檺鐢ㄦ埛鍚庣櫥褰曞嚭鐜�404</li>
-                <li>Excel鏀寔sort瀵煎嚭鎺掑簭</li>
-                <li>鍒涘缓鐢ㄦ埛涓嶅厑璁搁�夋嫨瓒呯骇绠$悊鍛樿鑹�</li>
-                <li>淇浠g爜鐢熸垚瀵煎叆琛ㄧ粨鏋勫嚭鐜板紓甯搁〉闈笉鎻愰啋闂</li>
-                <li>淇浠g爜鐢熸垚鐐瑰嚮澶氭琛ㄤ慨鏀规暟鎹笉鍙樺寲鐨勯棶棰�</li>
-                <li>淇澶村儚涓婁紶鎴愬姛浜屾鎵撳紑鏃犳硶鏀瑰彉瑁佸壀妗嗗ぇ灏忓拰浣嶇疆闂</li>
-                <li>淇甯冨眬涓簊mall鑰卪ini鐢ㄦ埛琛ㄥ崟鏄剧ず閿欎綅闂</li>
-                <li>淇鐑儴缃插鑷寸殑寮烘崲寮傚父闂</li>
-                <li>淇敼鐢ㄦ埛绠$悊澶嶉�夋瀹藉害锛岄槻姝㈤儴鍒嗘祻瑙堝櫒鍑虹幇鐪佺暐鍙�</li>
-                <li>IpUtils宸ュ叿锛屾竻闄ss鐗规畩瀛楃锛岄槻姝ff娉ㄥ叆鏀诲嚮</li>
-                <li>鐢熸垚domain 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal</li>
-                <li>瀹氭椂浠诲姟璋冩暣label-width锛岄槻姝㈤儴缃插嚭鐜伴敊浣�</li>
-                <li>璋冩暣琛ㄥご鍥哄畾鍒楅粯璁ゆ牱寮�</li>
-                <li>浠g爜鐢熸垚妯℃澘璋冩暣锛屽瓧娈典负String骞朵笖蹇呭~鍒欏姞绌轰覆鏉′欢</li>
-                <li>浠g爜鐢熸垚瀛楀吀Integer/Long浣跨敤parseInt</li>
-                <li>
-                  淇dict_sort涓嶅彲update涓�0鐨勯棶棰�&鏌ヨ杩斿洖澧炲姞dict_sort鍗囧簭鎺掑簭
-                </li>
-                <li>淇宀椾綅瀵煎嚭鏉冮檺娉ㄨВ</li>
-                <li>绂佹鍔犲瘑瀵嗘枃杩斿洖鍓嶇</li>
-                <li>淇浠g爜鐢熸垚椤甸潰涓殑鏌ヨ鏉′欢鍒涘缓鏃堕棿鏈敓鏁堢殑闂</li>
-                <li>淇棣栭〉鎼滅储鑿滃崟澶栭摼鏃犳硶鐐瑰嚮璺宠浆闂</li>
-                <li>淇鑿滃崟绠$悊閫夋嫨鍥炬爣锛宐ackspace鍒犻櫎鏃朵笉杩囨护鏁版嵁</li>
-                <li>鐢ㄦ埛绠$悊閮ㄩ棬鍒嗘敮鑺傜偣涓嶅彲妫�鏌�&鏄剧ず璁℃暟</li>
-                <li>鏁版嵁鑼冨洿杩囨护灞炴�ц皟鏁�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.3.0 - 2020-06-01">
-              <ol>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.70 淇楂樺嵄瀹夊叏婕忔礊</li>
-                <li>dev鍚姩榛樿鎵撳紑娴忚鍣�</li>
-                <li>vue-cli浣跨敤榛樿source-map</li>
-                <li>slidebar eslint鎶ラ敊浼樺寲</li>
-                <li>褰搕ags-view婊氬姩鍏抽棴鍙抽敭鑿滃崟</li>
-                <li>瀛楀吀绠$悊娣诲姞缂撳瓨璇诲彇</li>
-                <li>鍙傛暟绠$悊鏀寔缂撳瓨鎿嶄綔</li>
-                <li>鏀寔涓�绾ц彍鍗曪紙鍜屼富椤靛悓绾э級鍦╩ain鍖哄煙鏄剧ず</li>
-                <li>闄愬埗澶栭摼鍦板潃蹇呴』浠ttp(s)寮�澶�</li>
-                <li>tagview & sidebar 涓婚棰滆壊涓巈lement ui(鍏ㄥ眬)鍚屾</li>
-                <li>淇敼鏁版嵁婧愮被鍨嬩紭鍏堢骇锛屽厛鏍规嵁鏂规硶锛屽啀鏍规嵁绫�</li>
-                <li>鏀寔鏄惁闇�瑕佽缃畉oken灞炴�э紝鑷畾涔夎繑鍥炵爜娑堟伅銆�</li>
-                <li>swagger璇锋眰鍓嶇紑鍔犲叆閰嶇疆銆�</li>
-                <li>鐧诲綍鍦扮偣璁剧疆鍐呭杩囬暱鍒欓殣钘忔樉绀�</li>
-                <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃寜閽悗涓嶆彁绀烘秷鎭棶棰�</li>
-                <li>淇敼涓婄骇閮ㄩ棬锛堥�夋嫨椤规帓闄ゆ湰韬拰涓嬬骇锛�</li>
-                <li>閫氱敤http鍙戦�佹柟娉曞鍔犲弬鏁� contentType 缂栫爜绫诲瀷</li>
-                <li>鏇存崲IP鍦板潃鏌ヨ鎺ュ彛</li>
-                <li>淇椤电鍙橀噺undefined</li>
-                <li>娣诲姞鏍¢獙閮ㄩ棬鍖呭惈鏈仠鐢ㄧ殑瀛愰儴闂�</li>
-                <li>淇敼瀹氭椂浠诲姟璇︽儏涓嬫鎵ц鏃堕棿鏃ユ湡鏄剧ず閿欒</li>
-                <li>瑙掕壊绠$悊鏌ヨ璁剧疆榛樿鎺掑簭瀛楁</li>
-                <li>swagger娣诲姞enable鍙傛暟鎺у埗鏄惁鍚敤</li>
-                <li>鍙json绫诲瀷璇锋眰鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest</li>
-                <li>淇敼浠g爜鐢熸垚瀛楀吀瀛楁int绫诲瀷娌℃湁鑷姩閫変腑闂</li>
-                <li>vuex鐢ㄦ埛鍚嶅彇鍊间慨姝�</li>
-                <li>琛ㄦ牸鏍戞ā鏉垮幓鎺夊浣欑殑)</li>
-                <li>浠g爜鐢熸垚搴忓彿淇</li>
-                <li>鍏ㄥ睆鎯呭喌涓嬩笉璋冩暣涓婂杈硅窛</li>
-                <li>浠g爜鐢熸垚Date瀛楁娣诲姞榛樿鏍煎紡</li>
-                <li>鐢ㄦ埛绠$悊瑙掕壊閫夋嫨鏉冮檺鎺у埗</li>
-                <li>淇璺敱鎳掑姞杞芥姤閿欓棶棰�</li>
-                <li>妯℃澘sql.vm娣诲姞鑿滃崟鐘舵��</li>
-                <li>璁剧疆鐢ㄦ埛鍚嶇О涓嶈兘淇敼</li>
-                <li>dialog娣诲姞append-to-body灞炴�э紝闃叉ie閬僵</li>
-                <li>鑿滃崟鍖哄垎鐘舵�佸拰鏄剧ず闅愯棌鍔熻兘</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.68 淇瀹夊叏鍔犲浐</li>
-                <li>淇浠g爜鐢熸垚濡傛灉閫夋嫨瀛楀吀绫诲瀷缂哄け閫楀彿闂</li>
-                <li>鐧诲綍璇锋眰params鏇存崲涓篸ata锛岄槻姝㈡毚闇瞮rl</li>
-                <li>鏃ュ織杩斿洖鏃堕棿鏍煎紡澶勭悊</li>
-                <li>娣诲姞handle鎺у埗鍏佽鎷栧姩鐨勫厓绱�</li>
-                <li>甯冨眬璁剧疆鐐瑰嚮鎵╁ぇ鑼冨洿</li>
-                <li>浠g爜鐢熸垚鍒楀睘鎬ф帓搴忔煡璇�</li>
-                <li>浠g爜鐢熸垚鍒楁敮鎸佹嫋鍔ㄦ帓搴�</li>
-                <li>淇鏃堕棿鏍煎紡涓嶆敮鎸乮os闂</li>
-                <li>琛ㄥ崟鏋勫缓娣诲姞鐖剁骇class锛岄槻姝㈠啿绐�</li>
-                <li>瀹氭椂浠诲姟骞跺彂灞炴�т慨姝�</li>
-                <li>瑙掕壊绂佺敤&鑿滃崟闅愯棌涓嶆煡璇㈡潈闄�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.2.0 - 2020-03-18">
-              <ol>
-                <li>绯荤粺鐩戞帶鏂板瀹氭椂浠诲姟鍔熻兘</li>
-                <li>娣诲姞涓�涓墦鍖匴eb宸ョ▼bat</li>
-                <li>淇椤电榧犳爣婊氳疆鎸変笅鐨勬椂鍊欙紝鍙互鍏抽棴涓嶅彲鍏抽棴鐨則ag</li>
-                <li>淇鐐瑰嚮閫�鍑虹櫥褰曟湁鏃朵細鏃犳彁绀洪棶棰�</li>
-                <li>淇闃查噸澶嶆彁浜ゆ敞瑙f棤鏁堥棶棰�</li>
-                <li>淇閫氱煡鍏憡鎵归噺鍒犻櫎寮傚父闂</li>
-                <li>娣诲姞鑿滃崟鏃惰矾鐢卞湴鍧�蹇呭~闄愬埗</li>
-                <li>浠g爜鐢熸垚瀛楁鎻忚堪鍙紪杈�</li>
-                <li>淇鐢ㄦ埛淇敼涓汉淇℃伅瀵艰嚧缂撳瓨涓嶈繃鏈熼棶棰�</li>
-                <li>涓汉淇℃伅鍒涘缓鏃堕棿鑾峰彇姝g‘灞炴�у��</li>
-                <li>鎿嶄綔鏃ュ織璇︾粏鏄剧ず姝g‘绫诲瀷</li>
-                <li>瀵煎叆琛ㄥ崟鍑昏鏁版嵁鏃堕�変腑瀵瑰簲鐨勫閫夋</li>
-                <li>鎵归噺鏇挎崲琛ㄥ墠缂�閫昏緫璋冩暣</li>
-                <li>鍥哄畾閲嶅畾鍚戣矾寰勮〃杈惧紡</li>
-                <li>鍗囩骇element-ui鐗堟湰鍒�2.13.0</li>
-                <li>鎿嶄綔鏃ュ織鎺掑簭璋冩暣</li>
-                <li>淇charts鍒囨崲渚ц竟鏍忔垨鑰呯缉鏀剧獥鍙f樉绀篵ug</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.1.0 - 2020-02-24">
-              <ol>
-                <li>鏂板琛ㄥ崟鏋勫缓</li>
-                <li>浠g爜鐢熸垚鏀寔鏍戣〃缁撴瀯</li>
-                <li>鏂板鐢ㄦ埛瀵煎叆</li>
-                <li>淇鍔ㄦ�佸姞杞借矾鐢遍〉闈㈠埛鏂伴棶棰�</li>
-                <li>淇鍦板潃寮�鍏虫棤鏁堥棶棰�</li>
-                <li>姹夊寲閿欒鎻愮ず椤甸潰</li>
-                <li>浠g爜鐢熸垚宸茬煡闂淇敼</li>
-                <li>淇澶氭暟鎹簮涓嬮厤缃叧闂嚭鐜板紓甯稿鐞�</li>
-                <li>娣诲姞HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅</li>
-                <li>淇涓婁紶澶村儚鎺у埗鍙板嚭鐜板紓甯�</li>
-                <li>淇敼鐢ㄦ埛绠$悊鍒嗛〉涓嶆纭殑闂</li>
-                <li>淇楠岃瘉鐮佽褰曟彁绀洪敊璇�</li>
-                <li>淇request.js缂哄皯Message寮曠敤</li>
-                <li>淇琛ㄦ牸鏃堕棿涓虹┖鍑虹幇鐨勫紓甯�</li>
-                <li>娣诲姞Jackson鏃ユ湡鍙嶅簭鍒楀寲鏃跺尯閰嶇疆</li>
-                <li>璋冩暣鏍规嵁鐢ㄦ埛鏉冮檺鍔犺浇鑿滃崟鏁版嵁鏍戝舰缁撴瀯</li>
-                <li>璋冩暣鎴愬姛鐧诲綍涓嶆仮澶嶆寜閽紝闃叉澶氭鐐瑰嚮</li>
-                <li>淇敼鐢ㄦ埛涓汉璧勬枡鍚屾缂撳瓨淇℃伅</li>
-                <li>淇椤甸潰鍚屾椂鍑虹幇el-upload鍜孍ditor涓嶆樉绀哄鐞�</li>
-                <li>淇鍦ㄨ鑹茬鐞嗛〉淇敼鑿滃崟鏉冮檺鍋跺皵鏈�変腑闂</li>
-                <li>閰嶇疆鏂囦欢鏂板redis瀵嗙爜灞炴��</li>
-                <li>璁剧疆mybatis鍏ㄥ眬鐨勯厤缃枃浠�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.0.0 - 2019-12-02">
-              <ol>
-                <li>鏂板浠g爜鐢熸垚</li>
-                <li>鏂板@RepeatSubmit娉ㄨВ锛岄槻姝㈤噸澶嶆彁浜�</li>
-                <li>鏂板鑿滃崟涓荤洰褰曟坊鍔�/鍒犻櫎鎿嶄綔</li>
-                <li>鏃ュ織璁板綍杩囨护鐗规畩瀵硅薄锛岄槻姝㈣浆鎹㈠紓甯�</li>
-                <li>淇敼浠g爜鐢熸垚璺敱鑴氭湰閿欒</li>
-                <li>鐢ㄦ埛涓婁紶澶村儚瀹炴椂鍚屾缂撳瓨锛屾棤闇�閲嶆柊鐧诲綍</li>
-                <li>璋冩暣鍒囨崲椤电鍚庝笉閲嶆柊鍔犺浇鏁版嵁</li>
-                <li>娣诲姞jsencrypt瀹炵幇鍙傛暟鐨勫墠绔姞瀵�</li>
-                <li>绯荤粺閫�鍑哄垹闄ょ敤鎴风紦瀛樿褰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.1.0 - 2019-11-11">
-              <ol>
-                <li>鏂板鍦ㄧ嚎鐢ㄦ埛绠$悊</li>
-                <li>鏂板鎸夐挳缁勫姛鑳藉疄鐜帮紙鎵归噺鍒犻櫎銆佸鍑恒�佹竻绌猴級</li>
-                <li>鏂板鏌ヨ鏉′欢閲嶇疆鎸夐挳</li>
-                <li>鏂板Swagger鍏ㄥ眬Token閰嶇疆</li>
-                <li>鏂板鍚庣鍙傛暟鏍¢獙</li>
-                <li>淇瀛楀吀绠$悊椤甸潰鐨勬棩鏈熸煡璇㈠紓甯�</li>
-                <li>淇敼鏃堕棿鍑芥暟鍛藉悕闃叉鍐茬獊</li>
-                <li>鍘婚櫎鑿滃崟涓婄骇鏍¢獙锛岄粯璁や负椤剁骇</li>
-                <li>淇鐢ㄦ埛瀵嗙爜鏃犳硶淇敼闂</li>
-                <li>淇鑿滃崟绫诲瀷涓烘寜閽椂涓嶆樉绀烘潈闄愭爣璇�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.0.0 - 2019-10-08">
-              <ol>
-                <li>灏勬椽椤圭洰鍓嶅悗绔垎绂荤郴缁熸寮忓彂甯�</li>
-              </ol>
-            </el-collapse-item>
-          </el-collapse>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <div slot="header" class="clearfix">
-            <span>鎹愯禒鏀寔</span>
-          </div>
-          <div class="body">
-            <img
-              src="@/assets/images/pay.png"
-              alt="donate"
-              width="100%"
+    <div class="home">
+        <div class="overview">
+            <div class="overview-top">
+                <div class="title">椤圭洰鎬昏</div>
+                <div class="qurey">
+                    <el-form ref="queryFormRef" :model="queryParams">
+                        <div class="search_from">
+                            <el-form-item label="鏃ユ湡">
+                                <el-date-picker
+                                    style="width: 300px"
+                                    v-model="timeMerge"
+                                    clearable
+                                    end-placeholder="缁撴潫鏃堕棿"
+                                    format="YYYY-MM-DD"
+                                    placeholder="璇烽�夋嫨鏃ユ湡"
+                                    size="default"
+                                    start-placeholder="寮�濮嬫椂闂�"
+                                    type="daterange"
+                                    value-format="YYYY-MM-DD"
+                                    @change="dataPickerChange"
+                                />
+                            </el-form-item>
+                            <el-form-item label="琛屾斂鍖哄垝">
+                                <el-select
+                                    v-model="queryParams.area"
+                                    clearable
+                                    placeholder="璇烽�夋嫨鍖哄垝"
+                                    style="width: 180px"
+                                >
+                                    <el-option
+                                        v-for="item in sys_administrative_divisions"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    />
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item
+                                label="鎶曡祫閲戦"
+                                style="margin-right: 50px"
+                            >
+                                <div class="from_input">
+                                    <el-input
+                                        v-model="queryParams.start"
+                                        clearable
+                                        placeholder="璇疯緭鍏�"
+                                        style="width: 100px"
+                                        type="number"
+                                    />
+                                    鑷�
+                                    <el-input
+                                        v-model="queryParams.end"
+                                        clearable
+                                        placeholder="璇疯緭鍏�"
+                                        style="width: 100px"
+                                        type="number"
+                                    />
+                                </div>
+                            </el-form-item>
+                            <el-form-item style="margin-right: 20px">
+                                <el-button
+                                    icon="Search"
+                                    type="primary"
+                                    @click="handleQuery"
+                                    >鎼滅储</el-button
+                                >
+                                <el-button icon="Refresh" @click="resetQuery"
+                                    >閲嶇疆</el-button
+                                >
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                </div>
+            </div>
+            <!-- 缁熻鎯呭喌 -->
+            <ProjectOverview
+                :calculation="calculation"
+                :countExceptionProjectData="countExceptionProjectData"
             />
-            <span style="display: inline-block; height: 30px; line-height: 30px"
-              >浣犲彲浠ヨ浣滆�呭枬鏉挅鍟¤〃绀洪紦鍔�</span
-            >
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-  </div>
+        </div>
+        <!-- 浠e姙浜嬮」 -->
+        <div class="flex">
+            <div class="flex_card">
+                <el-card>
+                    <NoticeTable style="height: 360px" />
+                </el-card>
+            </div>
+            <!-- 娑堟伅閫氱煡 -->
+            <div class="flex_card">
+                <el-card>
+                    <TidingsTable style="height: 360px" />
+                </el-card>
+            </div>
+            <!-- 鍦板浘 -->
+        </div>
+        <div style="margin-top: 10px">
+            <el-card>
+                <div>
+                    <div class="search-form">
+                        <el-form :model="searchForm" inline>
+                            <el-form-item label=" ">
+                                <el-input
+                                    v-model="searchForm.name"
+                                    clearable
+                                    placeholder="璇疯緭鍏ラ」鐩悕绉版垨椤圭洰浠g爜"
+                                    style="width: 180px"
+                                />
+                            </el-form-item>
+                            <el-form-item style="margin-right: 0px">
+                                <el-button
+                                    icon="Search"
+                                    type="primary"
+                                    @click="searchList"
+                                    >鎼滅储</el-button
+                                >
+                                <el-button icon="Refresh" @click="mapQuery"
+                                    >閲嶇疆</el-button
+                                >
+                            </el-form-item>
+                        </el-form>
+                    </div>
+                    <div class="map_div">
+                        <Map
+                            id="DangerSourceId"
+                            ref="mapRef"
+                            :is-show-control="true"
+                            :list-type="true"
+                            :map-list="tableDatas"
+                            :map-type="true"
+                            class="w-full h-full border-r border-[#DBDEEA]"
+                            @label-click="showDetails"
+                            @mark-click="showDetails"
+                            @current-label-style-change="labelStyleChange"
+                        />
+                    </div>
+                </div>
+            </el-card>
+        </div>
+    </div>
 </template>
 
 <script>
+import SvgIcon from "@/components/SvgIcon/index.vue";
+import ProjectOverview from "./components/projectOverview.vue";
+import NoticeTable from "./components/noticeTable.vue";
+import TidingsTable from "./components/tidingsTable.vue";
+import Map from "./components/Map/index.vue";
+import { getCalculatioln, getAbnormalData } from '@/api/login';
 export default {
-  name: "Index",
-  data() {
-    return {
-      // 鐗堟湰鍙�
-      version: "3.8.8"
-    };
-  },
-  methods: {
-    goTarget(href) {
-      window.open(href, "_blank");
-    }
-  }
+    name: "Index",
+    data() {
+        return {
+            queryParams: {},
+            timeMerge: [],
+            sys_administrative_divisions: [],
+            countExceptionProjectData: {},
+            searchForm: {},
+            tableDatas: [
+                {
+                    name: "灏勬椽甯�",
+                    value: 105.37281,
+                    lat: 30.87145,
+                    lon: 105.37281,
+                    id: "222222222",
+                },
+                {
+                    name: "xxxx",
+                    value: 105.22332,
+                    lat: 31.52421,
+                    lon: 106.22332,
+                    id: "11112",
+                },
+            ],
+            calculation: [
+                { text: '鍌�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '寤�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '鐪�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '甯�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '鏂�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '绔�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '鍘�', mun: 0, statistics: '', statisticsMun: '0' },
+                { text: '鏅�', mun: 0, statistics: '', statisticsMun: '0' }
+            ]
+        };
+    },
+    components: {
+        SvgIcon,
+        ProjectOverview,
+        NoticeTable,
+        TidingsTable,
+        Map,
+    },
+    created() {
+        this.handleQuery()
+    },
+    methods: {
+        dataPickerChange(val) {
+            if (!val) {
+                this.queryParams.startTime = "";
+                this.queryParams.endTime = "";
+                return;
+            }
+
+            this.queryParams.startTime = this.timeMerge[0];
+            this.queryParams.endTime = this.timeMerge[1];
+        },
+        handleQuery() {
+            console.log(this.queryParams);
+            const obj = {
+                startDate: this.queryParams.startTime,
+                endDate: this.queryParams.endTime,
+                areaCode: this.queryParams.area,
+                minInvestment: this.queryParams.start,
+                maxInvestment: this.queryParams.end,
+            };
+
+            getCalculatioln(obj).then((res) => {
+
+                const arr = res.data.proPhaseCountVO?.concat(res.data.impTypeCountVO);
+                const newArr = arr.map((item) => ({
+                    text: item.text,
+                    mun: item.count,
+                    statistics: item.type,
+                    statisticsMun: item.amount,
+                }));
+                // 鍒涘缓涓�涓璞★紝浠ヤ究鏍规嵁 text 灞炴�у揩閫熸煡鎵� newArr 涓殑瀵硅薄
+                const newArrLookup = newArr.reduce((lookup, item) => {
+                    lookup[item.text] = item;
+                    return lookup;
+                }, {});
+
+                // 鏇存柊 calculation 鏁扮粍锛屼繚鎸佸叾鍘熷椤哄簭
+                this.calculation = this.calculation.map((item) => {
+                    const newItem = newArrLookup[item.text];
+                    return newItem ? newItem : item; // 濡傛灉 newItem 瀛樺湪锛屽垯杩斿洖 newItem锛屽惁鍒欒繑鍥炲師濮� item
+                });
+
+            });
+
+            this.abnormalData(obj);
+        },
+
+        // 鑾峰彇寮傚父鏁版嵁
+        async abnormalData(obj) {
+            const res = await getAbnormalData(obj);
+            this.countExceptionProjectData = res.data;
+        },
+
+        //鍦板浘璇︽儏
+        showDetails(row) {
+            console.log(row);
+        },
+
+        labelStyleChange(currentLabel) {
+            if (lastLabel) {
+                lastLabel.setBackgroundColor("#fff");
+                lastLabel.setFontColor("var(--el-color-primary)");
+            }
+            currentLabel.setBackgroundColor("var(--el-color-primary)");
+            currentLabel.setFontColor("#fff");
+            lastLabel = currentLabel;
+        },
+        resetQuery() {
+            this.queryParams = {
+                area: "",
+                start: "",
+                end: "",
+                startTime: "",
+                endTime: "",
+            };
+            this.timeMerge = [];
+            this.handleQuery();
+        },
+
+        // 鍦板浘鎼滅储
+        async searchList() {
+            // await search()
+            this.mapRef.moveTo(105.37281, 30.87145);
+        },
+        mapQuery() { },
+    },
 };
 </script>
 
 <style scoped lang="scss">
 .home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
-  }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
-  }
-  .col-item {
-    margin-bottom: 20px;
-  }
+    padding: 10px;
+    background-color: #f3f7fc;
+    min-height: calc(100vh - 85px);
+    overflow-x: auto;
 
-  ul {
-    padding: 0;
+    .overview {
+        padding: 10px 0 0 10px;
+        height: 280px;
+        min-width: 1600px;
+        background-color: #fff;
+        border-radius: 6px;
+
+        .overview-top {
+            display: flex;
+            justify-content: space-between;
+
+            .title {
+                font-size: 16px;
+            }
+
+            .qurey {
+                font-size: 12px;
+                font-weight: 100;
+            }
+        }
+    }
+
+    .search-form {
+        display: flex;
+        justify-content: flex-end;
+    }
+}
+// ::v-deep .el-form-item {
+//     display: inline-block !important;
+//     margin-right: 10px;
+// }
+::v-deep .el-form-item--medium .el-form-item__content {
+    display: inline-block !important;
+}
+::v-deep .el-form-item__label {
+    font-size: 12px;
+    font-weight: 400;
+}
+
+::v-deep .el-button {
+    font-size: 12px;
+}
+
+::v-deep.el-input__inner {
+    font-size: 12px;
+    height: 32px;
+}
+
+::v-deep.el-range-input {
+    font-size: 12px;
+}
+
+::v-deep.el-select__placeholder {
+    font-size: 12px;
+}
+::v-deep input[type='number']::-webkit-inner-spin-button,
+input[type='number']::-webkit-outer-spin-button {
+    -webkit-appearance: none;
     margin: 0;
-  }
-
-  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
-
-  ul {
-    list-style-type: none;
-  }
-
-  h4 {
-    margin-top: 0px;
-  }
-
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
-  }
-
-  p {
-    margin-top: 10px;
-
-    b {
-      font-weight: 700;
-    }
-  }
-
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
-    }
-  }
+}
+input[type='number'] {
+    -moz-appearance: textfield;
+}
+.search_from {
+    display: flex;
+    justify-self: justify-end;
+    gap: 10px;
+}
+.flex {
+    display: flex;
+    gap: 2%;
+}
+.flex_card {
+    width: 49%;
+    margin: 10px 0px;
+}
+.from_input {
+    display: flex;
+    gap: 10px;
+    font-size: 12px;
+}
+.map_div {
+    display: flex;
+    width: 100%;
+    height: 500px;
+    border: #dbdeea;
 }
 </style>
 
diff --git a/src/views/login.vue b/src/views/login.vue
index 88e6107..e1f97cb 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -1,386 +1,396 @@
 <template>
-  <div class="login">
-    <div class="nav">
-      <img alt="" src="../assets/images/bj.png" />
-      <div class="ml-[10px]">灏勬椽甯傞」鐩鐞嗙郴缁�</div>
-    </div>
-    <div class="conter">
-      <div class="left">
-        <div class="title">灏勬椽甯傞」鐩鐞嗙郴缁�</div>
-        <div>
-          杩愮敤绯荤粺鐨勮鐐广�佹柟娉曞拰鐞嗚锛屽椤圭洰娑夊強鐨勫叏閮ㄥ伐浣滆繘琛屾湁鏁堝湴绠$悊
+    <div class="login">
+        <div class="nav">
+            <img alt="" src="../assets/images/bj.png" />
+            <div class="ml-[10px]">灏勬椽甯傞」鐩鐞嗙郴缁�</div>
         </div>
-        <div class="img"></div>
-      </div>
-      <div class="right">
-        <div class="tab">
-          <div
-            :class="{ active: currentTab === 'corporation' }"
-            class="login-corporation"
-            @click="currentClick('corporation')"
-          >
-            娉曚汉鐧诲綍
-          </div>
-          <div
-            :class="{ active: currentTab === 'supervise' }"
-            class="login-supervise"
-            @click="superviseClick('supervise')"
-          >
-            鐩戠閮ㄩ棬鐧诲綍
-          </div>
-        </div>
-        <el-form
-          ref="loginRef"
-          :model="loginForm"
-          :rules="loginRules"
-          class="login-form"
-        >
-          <!-- <el-form-item v-if="tenantEnabled" prop="tenantId">
+        <div class="conter">
+            <div class="left">
+                <div class="title">灏勬椽甯傞」鐩鐞嗙郴缁�</div>
+                <div>
+                    杩愮敤绯荤粺鐨勮鐐广�佹柟娉曞拰鐞嗚锛屽椤圭洰娑夊強鐨勫叏閮ㄥ伐浣滆繘琛屾湁鏁堝湴绠$悊
+                </div>
+                <div class="img"></div>
+            </div>
+            <div class="right">
+                <div class="tab">
+                    <div
+                        :class="{ active: currentTab === 'corporation' }"
+                        class="login-corporation"
+                        @click="currentClick('corporation')"
+                    >
+                        娉曚汉鐧诲綍
+                    </div>
+                    <div
+                        :class="{ active: currentTab === 'supervise' }"
+                        class="login-supervise"
+                        @click="superviseClick('supervise')"
+                    >
+                        鐩戠閮ㄩ棬鐧诲綍
+                    </div>
+                </div>
+                <el-form
+                    ref="loginRef"
+                    :model="loginForm"
+                    :rules="loginRules"
+                    class="login-form"
+                >
+                    <!-- <el-form-item v-if="tenantEnabled" prop="tenantId">
             <el-select v-model="loginForm.tenantId" filterable placeholder="璇烽�夋嫨/杈撳叆鍏徃鍚嶇О" style="width: 100%">
               <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName"
                 :value="item.tenantId"></el-option>
               <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
 </el-select>
 </el-form-item> -->
-          <el-form-item prop="username">
-            <el-input
-              v-model="loginForm.username"
-              auto-complete="off"
-              maxlength="20"
-              placeholder="璇疯緭鍏ヨ处鍙�"
-              size="large"
-              type="text"
-            >
-              <template #prefix>
-                <svg-icon class="el-input__icon input-icon" icon-class="user" />
-              </template>
-            </el-input>
-          </el-form-item>
-          <el-form-item prop="password">
-            <el-input
-              v-model="loginForm.password"
-              auto-complete="off"
-              maxlength="20"
-              placeholder="璇疯緭鍏ュ瘑鐮�"
-              size="large"
-              type="password"
-              @keyup.enter="handleLogin"
-            >
-              <template #prefix>
-                <svg-icon
-                  class="el-input__icon input-icon"
-                  icon-class="password"
-                />
-              </template>
-            </el-input>
-          </el-form-item>
-          <el-form-item v-if="captchaEnabled" prop="code">
-            <el-input
-              v-model="loginForm.code"
-              auto-complete="off"
-              maxlength="20"
-              placeholder="楠岃瘉鐮�"
-              size="large"
-              style="width: 167px"
-              @keyup.enter="handleLogin"
-            >
-              <template #prefix>
-                <svg-icon
-                  class="el-input__icon input-icon"
-                  icon-class="validCode"
-                />
-              </template>
-            </el-input>
-            <div class="login-code">
-              <img :src="codeUrl" class="login-code-img" @click="getCode" />
+                    <el-form-item prop="username">
+                        <el-input
+                            v-model="loginForm.username"
+                            auto-complete="off"
+                            maxlength="20"
+                            placeholder="璇疯緭鍏ヨ处鍙�"
+                            size="large"
+                            type="text"
+                        >
+                            <template #prefix>
+                                <svg-icon
+                                    class="el-input__icon input-icon"
+                                    icon-class="user"
+                                />
+                            </template>
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item prop="password">
+                        <el-input
+                            v-model="loginForm.password"
+                            auto-complete="off"
+                            maxlength="20"
+                            placeholder="璇疯緭鍏ュ瘑鐮�"
+                            size="large"
+                            type="password"
+                            @keyup.enter="handleLogin"
+                        >
+                            <template #prefix>
+                                <svg-icon
+                                    class="el-input__icon input-icon"
+                                    icon-class="password"
+                                />
+                            </template>
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item v-if="captchaEnabled" prop="code">
+                        <el-input
+                            v-model="loginForm.code"
+                            auto-complete="off"
+                            maxlength="20"
+                            placeholder="楠岃瘉鐮�"
+                            size="large"
+                            style="width: 167px"
+                            @keyup.enter="handleLogin"
+                        >
+                            <template #prefix>
+                                <svg-icon
+                                    class="el-input__icon input-icon"
+                                    icon-class="validCode"
+                                />
+                            </template>
+                        </el-input>
+                        <div class="login-code">
+                            <img
+                                :src="codeUrl"
+                                class="login-code-img"
+                                @click="getCode"
+                            />
+                        </div>
+                    </el-form-item>
+                    <el-checkbox
+                        v-model="loginForm.rememberMe"
+                        style="margin: 0 0 25px 0; color: #2d5eff"
+                        >璁颁綇瀵嗙爜</el-checkbox
+                    >
+                    <div></div>
+                    <el-form-item style="width: 100%">
+                        <el-button
+                            :loading="loading"
+                            size="large"
+                            style="width: 100%"
+                            type="primary"
+                            @click.prevent="handleLogin"
+                        >
+                            <span v-if="!loading">鐧� 褰�</span>
+                            <span v-else>鐧� 褰� 涓�...</span>
+                        </el-button>
+                        <div v-if="register" style="float: right">
+                            <router-link :to="'/register'" class="link-type"
+                                >绔嬪嵆娉ㄥ唽</router-link
+                            >
+                        </div>
+                    </el-form-item>
+                </el-form>
+                <div class="other">
+                    <div class="other-title">
+                        <span style="color: #b3b8c1">鍏朵粬鐧诲綍鏂瑰紡:</span
+                        ><span style="color: #2d5eff; cursor: pointer">
+                            <svg-icon icon-class="phone" />鎵嬫満楠岃瘉鐮佺櫥褰�
+                        </span>
+                    </div>
+                    <div class="forget">蹇樿瀵嗙爜锛�</div>
+                </div>
             </div>
-          </el-form-item>
-          <el-checkbox
-            v-model="loginForm.rememberMe"
-            style="margin: 0 0 25px 0; color: #2d5eff"
-            >璁颁綇瀵嗙爜</el-checkbox
-          >
-          <div></div>
-          <el-form-item style="width: 100%">
-            <el-button
-              :loading="loading"
-              size="large"
-              style="width: 100%"
-              type="primary"
-              @click.prevent="handleLogin"
-            >
-              <span v-if="!loading">鐧� 褰�</span>
-              <span v-else>鐧� 褰� 涓�...</span>
-            </el-button>
-            <div v-if="register" style="float: right">
-              <router-link :to="'/register'" class="link-type"
-                >绔嬪嵆娉ㄥ唽</router-link
-              >
-            </div>
-          </el-form-item>
-        </el-form>
-        <div class="other">
-          <div class="other-title">
-            <span style="color: #b3b8c1">鍏朵粬鐧诲綍鏂瑰紡:</span
-            ><span style="color: #2d5eff; cursor: pointer">
-              <SvgIcon icon-class="phone" />鎵嬫満楠岃瘉鐮佺櫥褰�
-            </span>
-          </div>
-          <div class="forget">蹇樿瀵嗙爜锛�</div>
         </div>
-      </div>
     </div>
-  </div>
 </template>
 
 <script>
 import { getCodeImg } from "@/api/login";
 import Cookies from "js-cookie";
 import { encrypt, decrypt } from "@/utils/jsencrypt";
+import SvgIcon from '@/components/SvgIcon/index.vue';
 
 export default {
-  name: "Login",
-  data() {
-    return {
-      currentTab: "corporation",
-      codeUrl: "",
-      loginForm: {
-        username: "admin",
-        password: "admin123",
-        rememberMe: false,
-        code: "",
-        uuid: "",
-      },
-      loginRules: {
-        username: [
-          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
-        ],
-        password: [
-          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
-        ],
-        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
-      },
-      loading: false,
-      // 楠岃瘉鐮佸紑鍏�
-      captchaEnabled: true,
-      // 娉ㄥ唽寮�鍏�
-      register: false,
-      redirect: undefined,
-    };
-  },
-  watch: {
-    $route: {
-      handler: function (route) {
-        this.redirect = route.query && route.query.redirect;
-      },
-      immediate: true,
+    name: "Login",
+    data() {
+        return {
+            currentTab: "corporation",
+            codeUrl: "",
+            loginForm: {
+                username: "admin",
+                password: "admin123",
+                rememberMe: false,
+                code: "",
+                uuid: "",
+            },
+            loginRules: {
+                username: [
+                    { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
+                ],
+                password: [
+                    { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
+                ],
+                code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
+            },
+            loading: false,
+            // 楠岃瘉鐮佸紑鍏�
+            captchaEnabled: true,
+            // 娉ㄥ唽寮�鍏�
+            register: false,
+            redirect: undefined,
+        };
     },
-  },
-  created() {
-    this.getCode();
-    this.getCookie();
-  },
-  methods: {
-    getCode() {
-      getCodeImg().then((res) => {
-        this.captchaEnabled =
-          res.captchaEnabled === undefined ? true : res.captchaEnabled;
-        if (this.captchaEnabled) {
-          this.codeUrl = "data:image/gif;base64," + res.img;
-          this.loginForm.uuid = res.uuid;
-        }
-      });
+    comments: {
+        SvgIcon
     },
-    getCookie() {
-      const username = Cookies.get("username");
-      const password = Cookies.get("password");
-      const rememberMe = Cookies.get("rememberMe");
-      this.loginForm = {
-        username: username === undefined ? this.loginForm.username : username,
-        password:
-          password === undefined ? this.loginForm.password : decrypt(password),
-        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
-      };
+    watch: {
+        $route: {
+            handler: function (route) {
+                this.redirect = route.query && route.query.redirect;
+            },
+            immediate: true,
+        },
     },
-    // 娉曚汉鐧诲綍
-    currentClick(tab) {
-      this.currentTab = tab;
-      this.loginForm.role = "2";
-      console.log(this.loginForm);
+    created() {
+        this.getCode();
+        this.getCookie();
     },
-    // 鐩戠閮ㄩ棬鐧诲綍
-    superviseClick(tab) {
-      this.currentTab = tab;
-      this.loginForm.role = "1";
-      console.log(this.loginForm);
-    },
-    handleLogin() {
-      debugger
-      this.$refs.loginRef.validate((valid) => {
-        if (valid) {
-          this.loading = true;
-          if (this.loginForm.rememberMe) {
-            Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), {
-              expires: 30,
+    methods: {
+        getCode() {
+            getCodeImg().then((res) => {
+                this.captchaEnabled =
+                    res.captchaEnabled === undefined ? true : res.captchaEnabled;
+                if (this.captchaEnabled) {
+                    this.codeUrl = "data:image/gif;base64," + res.img;
+                    this.loginForm.uuid = res.uuid;
+                }
             });
-            Cookies.set("rememberMe", this.loginForm.rememberMe, {
-              expires: 30,
+        },
+        getCookie() {
+            const username = Cookies.get("username");
+            const password = Cookies.get("password");
+            const rememberMe = Cookies.get("rememberMe");
+            this.loginForm = {
+                username: username === undefined ? this.loginForm.username : username,
+                password:
+                    password === undefined ? this.loginForm.password : decrypt(password),
+                rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
+            };
+        },
+        // 娉曚汉鐧诲綍
+        currentClick(tab) {
+            this.currentTab = tab;
+            this.loginForm.role = "2";
+            console.log(this.loginForm);
+        },
+        // 鐩戠閮ㄩ棬鐧诲綍
+        superviseClick(tab) {
+            this.currentTab = tab;
+            this.loginForm.role = "1";
+            console.log(this.loginForm);
+        },
+        handleLogin() {
+            this.$refs.loginRef.validate((valid) => {
+                if (valid) {
+                    this.loading = true;
+                    if (this.loginForm.rememberMe) {
+                        Cookies.set("username", this.loginForm.username, { expires: 30 });
+                        Cookies.set("password", encrypt(this.loginForm.password), {
+                            expires: 30,
+                        });
+                        Cookies.set("rememberMe", this.loginForm.rememberMe, {
+                            expires: 30,
+                        });
+                    } else {
+                        Cookies.remove("username");
+                        Cookies.remove("password");
+                        Cookies.remove("rememberMe");
+                    }
+                    this.$store
+                        .dispatch("Login", this.loginForm)
+                        .then(() => {
+                            this.$router.push({ path: this.redirect || "/" }).catch(() => { });
+                        })
+                        .catch(() => {
+                            this.loading = false;
+                            if (this.captchaEnabled) {
+                                this.getCode();
+                            }
+                        });
+                }
             });
-          } else {
-            Cookies.remove("username");
-            Cookies.remove("password");
-            Cookies.remove("rememberMe");
-          }
-          this.$store
-            .dispatch("Login", this.loginForm)
-            .then(() => {
-              this.$router.push({ path: this.redirect || "/" }).catch(() => {});
-            })
-            .catch(() => {
-              this.loading = false;
-              if (this.captchaEnabled) {
-                this.getCode();
-              }
-            });
-        }
-      });
+        },
     },
-  },
 };
 </script>
 
 <style lang="scss" scoped>
 .login {
-  .nav {
-    display: flex;
-    align-items: center;
-    height: 40px;
-    margin-left: 24px;
-    background-color: #fff;
-    font-family: PangMenZhengDao;
-    font-size: 20px;
-    font-style: italic;
-    color: #1e2538;
-    line-height: 40px;
-  }
-
-  .conter {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    gap: 100px;
-    height: calc(100vh - 50px);
-    background-image: url("../assets/images/login-background.png");
-    background-size: cover;
-
-    .left {
-      width: 500px;
-      height: auto;
-
-      .title {
-        font-size: 34px;
-        color: #1f2639;
-        line-height: 16px;
-      }
-
-      .img {
-        background-image: url("../assets/images/login.png");
-        background-size: cover;
-        height: 295px;
-        width: 366px;
-        margin: auto;
-        margin-top: 20px;
-      }
+    .nav {
+        display: flex;
+        align-items: center;
+        height: 40px;
+        margin-left: 24px;
+        background-color: #fff;
+        font-family: PangMenZhengDao;
+        font-size: 20px;
+        font-style: italic;
+        color: #1e2538;
+        line-height: 40px;
     }
 
-    .right {
-      border-radius: 6px;
-      background: #ffffff;
-      width: 500px;
-      padding: 0px 25px 5px 25px;
-
-      .tab {
-        margin: 20px 0;
+    .conter {
         display: flex;
-        font-size: 24px;
-        line-height: 24px;
+        justify-content: center;
+        align-items: center;
         gap: 100px;
+        height: calc(100vh - 50px);
+        background-image: url('../assets/images/login-background.png');
+        background-size: cover;
 
-        .login-corporation {
-          cursor: pointer;
+        .left {
+            width: 500px;
+            height: auto;
+
+            .title {
+                font-size: 34px;
+                color: #1f2639;
+                line-height: 16px;
+            }
+
+            .img {
+                background-image: url('../assets/images/login.png');
+                background-size: cover;
+                height: 295px;
+                width: 366px;
+                margin: auto;
+                margin-top: 20px;
+            }
         }
 
-        .login-supervise {
-          cursor: pointer;
-        }
+        .right {
+            border-radius: 6px;
+            background: #ffffff;
+            width: 500px;
+            padding: 0px 25px 5px 25px;
 
-        .active {
-          color: #2d5eff;
-        }
-      }
+            .tab {
+                margin: 20px 0;
+                display: flex;
+                font-size: 24px;
+                line-height: 24px;
+                gap: 100px;
 
-      .other {
-        display: flex;
-        justify-content: space-between;
-        font-size: 14px;
-        margin-bottom: 10px;
+                .login-corporation {
+                    cursor: pointer;
+                }
 
-        .other-title {
-          display: flex;
-          gap: 10px;
-        }
+                .login-supervise {
+                    cursor: pointer;
+                }
 
-        .forget {
-          color: #2d5eff;
-          cursor: pointer;
+                .active {
+                    color: #2d5eff;
+                }
+            }
+
+            .other {
+                display: flex;
+                justify-content: space-between;
+                font-size: 14px;
+                margin-bottom: 10px;
+
+                .other-title {
+                    display: flex;
+                    gap: 10px;
+                }
+
+                .forget {
+                    color: #2d5eff;
+                    cursor: pointer;
+                }
+            }
         }
-      }
     }
-  }
 }
 
 .title {
-  margin: 0px auto 30px auto;
-  text-align: center;
-  color: #707070;
+    margin: 0px auto 30px auto;
+    text-align: center;
+    color: #707070;
 }
 
 .login-form {
-  .el-input {
-    height: 40px;
+    .el-input {
+        height: 40px;
 
-    input {
-      height: 40px;
+        input {
+            height: 40px;
+        }
     }
-  }
 
-  .input-icon {
-    height: 39px;
-    width: 14px;
-    margin-left: 0px;
-  }
+    .input-icon {
+        height: 39px;
+        width: 14px;
+        margin-left: 0px;
+    }
 }
 
 .login-tip {
-  font-size: 13px;
-  text-align: center;
-  color: #bfbfbf;
+    font-size: 13px;
+    text-align: center;
+    color: #bfbfbf;
 }
 
 .login-code {
-  width: 33%;
-  height: 40px;
-  float: right;
+    width: 33%;
+    height: 40px;
+    float: right;
 
-  img {
-    cursor: pointer;
-    vertical-align: middle;
-  }
+    img {
+        cursor: pointer;
+        vertical-align: middle;
+    }
 }
 
 .login-code-img {
-  height: 40px;
-  padding-left: 12px;
+    height: 40px;
+    padding-left: 12px;
 }
 </style>
diff --git a/src/views/process/api/deployService.js b/src/views/process/api/deployService.js
index 48f601c..c507d2b 100644
--- a/src/views/process/api/deployService.js
+++ b/src/views/process/api/deployService.js
@@ -4,12 +4,12 @@
 import commonUtil from "@/utils/common";
 
 // 鑾峰彇妯″瀷鏁版嵁
-export const getProcesslists = (data) => {
-    const fd = commonUtil.objectToFormData(data);
+export const getProcesslists = (params) => {
+    // const fd = commonUtil.objectToFormData(data);
     return request({
-      url: '/flow/manage/getprocesslists?pageNum=1&pageSize=10',
-      method: 'post',
-      data: fd
+      url: '/flow/manage/getprocesslists',
+      method: 'get',
+      params: params
     })
 }
 
@@ -60,4 +60,4 @@
     method: 'get',
     params
   });
-}
\ No newline at end of file
+}
diff --git a/src/views/process/api/model.js b/src/views/process/api/model.js
index 6519d1a..f488e40 100644
--- a/src/views/process/api/model.js
+++ b/src/views/process/api/model.js
@@ -4,11 +4,11 @@
 import commonUtil from "@/utils/common"
 
 // 鑾峰彇妯″瀷鏁版嵁
-export const getModelLists = (data) => {
+export const getModelLists = (parmas) => {
     return request({
       url: '/model/manage/modelLists',
-      method: 'post',
-      data: commonUtil.objectToFormData(data)
+      method: 'get',
+      params: parmas
     })
 }
 
@@ -38,4 +38,4 @@
     url: `/model/manage/remove/${id}`,
     method: 'post',
   });
-}
\ No newline at end of file
+}
diff --git a/src/views/process/deployManagement.vue b/src/views/process/deployManagement.vue
index cb20cb5..9121b5e 100644
--- a/src/views/process/deployManagement.vue
+++ b/src/views/process/deployManagement.vue
@@ -12,8 +12,8 @@
             <div>
                 <label>鐗堟湰</label>
                 <el-select v-model="searchParams.latest" size="small">
-                    <el-option label="鍙湅鏂扮増鏈�" value="true"></el-option>
-                    <el-option label="鍏ㄩ儴鐗堟湰" value="false"></el-option>
+                    <el-option label="鍙湅鏂扮増鏈�" :value="true"></el-option>
+                    <el-option label="鍏ㄩ儴鐗堟湰" :value="false"></el-option>
                 </el-select>
             </div>
             <div>
@@ -153,7 +153,7 @@
             searchParams: {
                 key: "",
                 name: "",
-                latest: "true",
+                latest: true,
                 orderByColumn: "processSort",
                 isAsc: "asc",
                 pageNum: 1,
@@ -199,7 +199,7 @@
         reset() {
             this.searchParams.key = "";
             this.searchParams.name = "";
-            this.searchParams.latest = "true";
+            this.searchParams.latest = true;
             this.getListAndRenderByParams(this.searchParams)
         },
         handleDefinition(index, row) {
diff --git a/src/views/process/modelManagement.vue b/src/views/process/modelManagement.vue
index 52ee3fe..c67b284 100644
--- a/src/views/process/modelManagement.vue
+++ b/src/views/process/modelManagement.vue
@@ -1,237 +1,245 @@
 <template>
-    <div class="c-model">
-        <div class="search-bar">
-            <div>
-                <label>妯″瀷鏍囪瘑</label>
-                <el-input v-model="searchParams.key" size="small"></el-input>
-            </div>
-            <div>
-                <label>妯″瀷鍚嶇О</label>
-                 <el-input v-model="searchParams.name" size="small"></el-input>
-            </div>
-            <div>
-                <el-button type="primary" @click="search" size="mini" icon="el-icon-search">鎼滅储</el-button>
-                <el-button type="default" @click="reset" size="mini" icon="el-icon-refresh">閲嶇疆</el-button>
-            </div>
-        </div>
-        <div class="c-model__content">
-            <table-template
-                :data="tableData"
-                :total="total"
-                @page-change="handlePageChange"
-            >
-                <template #toolbar>
-                    <el-button type="primary" @click="showAddDialog = true" size="mini" plain icon="el-icon-plus">鏂板缓妯″瀷</el-button>
-                </template>
-                <template #columns>
-                    <el-table-column
-                    prop="key"
-                    label="妯″瀷鏍囪瘑"
-                    width="180">
-                </el-table-column>
-                <el-table-column
-                    prop="name"
-                    label="妯″瀷鍚嶇О"
-                    width="180">
-                </el-table-column>
-                <el-table-column
-                    prop="category"
-                    label="鍒嗙被">
-                </el-table-column>
-                <el-table-column
-                    prop="version"
-                    label="鐗堟湰">
-                </el-table-column>
-                <el-table-column
-                    width="320"
-                    prop="lastUpdateTime"
-                    :formatter="handleDateTime"
-                    label="鍒涘缓鏃堕棿">
-                </el-table-column>
-                <el-table-column
-                    prop="address"
-                    width="320"
-                    label="鎿嶄綔">
-                    <template slot-scope="scope">
-                        <!--primary / success / warning / danger / info / text-->
-                        <el-button
-                        size="mini"
-                        type="text"
-                        @click="handleDesign(scope.$index, scope.row)">璁捐</el-button>
-                        <el-button
-                        v-if="!scope.row.deploymentId"
-                        size="mini"
-                        type="text"
-                        @click="handlePublish(scope.$index, scope.row)">鍙戝竷</el-button>
-                        <el-button
-                        size="mini"
-                        type="text"
-                        @click="handleExport(scope.$index, scope.row)">瀵煎嚭</el-button>
-                        <el-button
-                        size="mini"
-                        type="text"
-                        @click="handleDelete(scope.$index, scope.row)">鍒犻櫎</el-button>
-                    </template>
-                </el-table-column>
-                </template>
-            </table-template>
-        </div>
-        <el-dialog
-            title="鏂板缓妯″瀷"
-            :visible.sync="showAddDialog"
-        >
-            <el-form ref="form" :model="form" label-width="80px">
-                <el-form-item label="妯″瀷鏍囪瘑">
-                    <el-input v-model="form.key"></el-input>
-                </el-form-item>
-                <el-form-item label="妯″瀷鍚嶇О">
-                    <el-input v-model="form.name"></el-input>
-                </el-form-item>
-                <el-form-item label="鍒嗙被">
-                    <el-input v-model="form.category"></el-input>
-                </el-form-item>
-                <el-form-item label="鎻忚堪">
-                    <el-input type="textarea" v-model="form.description"></el-input>
-                </el-form-item>
-            </el-form>
-            <span slot="footer" class="dialog-footer">
+  <div class="c-model">
+    <div class="search-bar">
+      <div>
+        <label>妯″瀷鏍囪瘑</label>
+        <el-input v-model="searchParams.key" size="small"></el-input>
+      </div>
+      <div>
+        <label>妯″瀷鍚嶇О</label>
+        <el-input v-model="searchParams.name" size="small"></el-input>
+      </div>
+      <div>
+        <el-button type="primary" @click="search" size="mini" icon="el-icon-search">鎼滅储</el-button>
+        <el-button type="default" @click="reset" size="mini" icon="el-icon-refresh">閲嶇疆</el-button>
+      </div>
+    </div>
+    <div class="c-model__content">
+      <table-template
+        :data="tableData"
+        :total="total"
+        @page-change="handlePageChange"
+      >
+        <template #toolbar>
+          <el-button type="primary" @click="showAddDialog = true" size="mini" plain icon="el-icon-plus">鏂板缓妯″瀷</el-button>
+        </template>
+        <template #columns>
+          <el-table-column
+            prop="key"
+            label="妯″瀷鏍囪瘑"
+            width="180">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            label="妯″瀷鍚嶇О"
+            width="180">
+          </el-table-column>
+          <el-table-column
+            prop="category"
+            label="鍒嗙被">
+          </el-table-column>
+          <el-table-column
+            prop="version"
+            label="鐗堟湰">
+          </el-table-column>
+          <el-table-column
+            width="320"
+            prop="lastUpdateTime"
+            :formatter="handleDateTime"
+            label="鍒涘缓鏃堕棿">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            width="320"
+            label="鎿嶄綔">
+            <template slot-scope="scope">
+              <!--primary / success / warning / danger / info / text-->
+              <el-button
+                size="mini"
+                type="text"
+                @click="handleDesign(scope.$index, scope.row)">璁捐
+              </el-button>
+              <el-button
+                v-if="!scope.row.deploymentId"
+                size="mini"
+                type="text"
+                @click="handlePublish(scope.$index, scope.row)">鍙戝竷
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                @click="handleExport(scope.$index, scope.row)">瀵煎嚭
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.$index, scope.row)">鍒犻櫎
+              </el-button>
+            </template>
+          </el-table-column>
+        </template>
+      </table-template>
+    </div>
+    <el-dialog
+      title="鏂板缓妯″瀷"
+      :visible.sync="showAddDialog"
+    >
+      <el-form ref="form" :model="form" label-width="80px">
+        <el-form-item label="妯″瀷鏍囪瘑">
+          <el-input v-model="form.key"></el-input>
+        </el-form-item>
+        <el-form-item label="妯″瀷鍚嶇О">
+          <el-input v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒嗙被">
+          <el-input v-model="form.category"></el-input>
+        </el-form-item>
+        <el-form-item label="鎻忚堪">
+          <el-input type="textarea" v-model="form.description"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
                 <el-button @click="showAddDialog = false">鍙� 娑�</el-button>
                 <el-button type="primary" @click="handleAddModel">纭� 瀹�</el-button>
             </span>
-        </el-dialog>
-    </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
 import {getModelLists, addModel, publishModelById, deleteModelById} from "./api/model.js";
 import commonHelper from "@/utils/common.js"
 import TableTemplate from "@/components/TableTemplate";
+
 export default {
-    name: "ModelManagement",
-    components: {
-        TableTemplate
+  name: "ModelManagement",
+  components: {
+    TableTemplate
+  },
+  data() {
+    return {
+      responseData: {},
+      showAddDialog: false,
+      form: {
+        key: "",
+        name: "",
+        category: "",
+        description: "",
+      },
+      searchParams: {
+        name: "",
+        key: "",
+        pageSize: 10,
+        pageNum: 1,
+        orderByColumn: "modelSort",
+        isAsc: "asc",
+      },
+    };
+  },
+  computed: {
+    tableData() {
+      return this.responseData.rows || []
     },
-    data() {
-        return {
-            responseData: {},
-            showAddDialog: false,
-            form: {
-                key: "",
-                name: "",
-                category: "",
-                description: "",
-            },
-            searchParams: {
-                name: "",
-                key: "",
-                pageSize: 10,
-                pageNum: 1,
-                orderByColumn: "modelSort",
-                isAsc: "asc",
-            },
-        };
-    },
-    computed: {
-        tableData() {
-            return this.responseData.rows || []
-        },
-        total() {
-            return this.responseData.total || 0
-        }
-    },
-    created() {
-        this.getModelByParams(this.searchParams);
-    },
-    methods: {
-        getModelByParams(params) {
-            getModelLists(params).then(res => {
-                this.responseData = res;
-            });
-        },
-        handleAddModel() {
-            const formData = commonHelper.objectToFormData(this.form);
-            addModel(formData).then(res => {
-                console.log(res);
-                this.showAddDialog = false;
-                this.getModelByParams(this.searchParams)
-                this.$message.success("娣诲姞鎴愬姛!");
-                ["key", "name", "category", "description"].forEach(key => {
-                    this.form[key] = "";
-                });
-            });
-        },
-        handleDateTime(row) {
-            const {createTime} = row;
-            return commonHelper.normalizeDateTimeString(createTime);
-        },
-        handleDesign(index, row) {
-            // flowable鏀瑰彉璁捐鐨勮矾寰�
-            const path = "/designer/index.html#/editor/" + row.id;
-            // const path = "/editor?modelId=" + row.id;
-            commonHelper.openWindow(path);
-        },
-        handlePublish(index, row) {
-            const id = row.id;
-            publishModelById(id).then(res => {
-                this.$message.success("閮ㄧ讲鎴愬姛!");
-                this.getModelByParams(this.searchParams);
-            });
-        },
-        handleExport(index, row) {
-            const {key ,id} = row;
-            const a = document.createElement("a");
-            const url = process.env.VUE_APP_TAB_URL_PREFIX + "/model/manage/export/" + id;
-            a.href = url;
-            a.click();
-        },
-        handleDelete(index, row) {
-            this.$confirm('纭畾鍒犻櫎璇ユ潯妯″瀷淇℃伅鍚楋紵', {
-                confirmButtonText: '纭畾',
-                cancelButtonText: '鍙栨秷',
-                type: 'warning'
-            }).then(() => {
-                const id = row.id;
-                deleteModelById(id).then(res => {
-                    this.$message.success("鍒犻櫎鎴愬姛!");
-                    this.getModelByParams(this.searchParams);
-                 });
-            });
-           
-        },
-        search() {
-            this.getModelByParams(this.searchParams);
-        },
-        reset() {
-            this.searchParams.name = "";
-            this.searchParams.key = "";
-            this.getModelByParams(this.searchParams);
-        },
-        handlePageChange({pageNum, pageSize}) {
-            this.searchParams.pageNum = pageNum;
-            this.searchParams.pageSize = pageSize;
-            this.getModelByParams(this.searchParams);
-        },
+    total() {
+      return this.responseData.total || 0
     }
+  },
+  created() {
+    this.getModelByParams(this.searchParams);
+  },
+  methods: {
+    getModelByParams(params) {
+      getModelLists(params).then(res => {
+        this.responseData = res;
+      });
+    },
+    handleAddModel() {
+      const formData = commonHelper.objectToFormData(this.form);
+      addModel(formData).then(res => {
+        console.log(res);
+        this.showAddDialog = false;
+        this.getModelByParams(this.searchParams)
+        this.$message.success("娣诲姞鎴愬姛!");
+        ["key", "name", "category", "description"].forEach(key => {
+          this.form[key] = "";
+        });
+      });
+    },
+    handleDateTime(row) {
+      const {createTime} = row;
+      return commonHelper.normalizeDateTimeString(createTime);
+    },
+    handleDesign(index, row) {
+      // flowable鏀瑰彉璁捐鐨勮矾寰�
+      const path = process.env.VUE_APP_FLOWABLE_PREFIX + "/designer/index.html#/editor/" + row.id;
+      // const path = "/editor?modelId=" + row.id;
+      window.open(path, '')
+    },
+    handlePublish(index, row) {
+      const id = row.id;
+      publishModelById(id).then(res => {
+        this.$message.success("閮ㄧ讲鎴愬姛!");
+        this.getModelByParams(this.searchParams);
+      });
+    },
+    handleExport(index, row) {
+      const {key, id} = row;
+      const a = document.createElement("a");
+      const url = process.env.VUE_APP_FLOWABLE_PREFIX + "/model/manage/export/" + id;
+      a.href = url;
+      a.click();
+    },
+    handleDelete(index, row) {
+      this.$confirm('纭畾鍒犻櫎璇ユ潯妯″瀷淇℃伅鍚楋紵', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        const id = row.id;
+        deleteModelById(id).then(res => {
+          this.$message.success("鍒犻櫎鎴愬姛!");
+          this.getModelByParams(this.searchParams);
+        });
+      });
+
+    },
+    search() {
+      this.getModelByParams(this.searchParams);
+    },
+    reset() {
+      this.searchParams.name = "";
+      this.searchParams.key = "";
+      this.getModelByParams(this.searchParams);
+    },
+    handlePageChange({pageNum, pageSize}) {
+      this.searchParams.pageNum = pageNum;
+      this.searchParams.pageSize = pageSize;
+      this.getModelByParams(this.searchParams);
+    },
+  }
 };
 </script>
 
 <style>
 label {
-    font-size: 14px;
-    color: #606266;
-    margin-right: 8px;
+  font-size: 14px;
+  color: #606266;
+  margin-right: 8px;
 }
+
 .search-bar {
-    display: flex;
-    margin-top: 8px;
-    margin-left: 8px;
+  display: flex;
+  margin-top: 8px;
+  margin-left: 8px;
 }
+
 .el-input {
-    display: inline-block;
-    width: 300px;
-    margin-right: 10px;
+  display: inline-block;
+  width: 300px;
+  margin-right: 10px;
 }
+
 .el-textarea {
-    width: 300px;
+  width: 300px;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/projectEngineering/component/FileDialog.vue b/src/views/projectEngineering/component/FileDialog.vue
new file mode 100644
index 0000000..d06e5bd
--- /dev/null
+++ b/src/views/projectEngineering/component/FileDialog.vue
@@ -0,0 +1,176 @@
+
+<template>
+  <div>
+    <el-dialog
+      :visible.sync="fileDialogVisible"
+      ref="formDialogRef"
+      width="35%"
+      append-to-body
+      close-on-click-modal
+      @close="closeDialog"
+    >
+      <template slot="title">
+        <span style="padding-bottom: 18px">
+          {{ isImportOrExport ? '璇锋寜鐓ч渶姹傚鍑虹洰鏍囧唴瀹�' : '璇锋寜鐓фā鏉挎牱寮忎笂浼犻」鐩枃浠�' }}
+        </span>
+      </template>
+      <template slot="default">
+        <div v-if="!isImportOrExport" class="dialog-content">
+          <el-upload
+            ref="uploadRef"
+            class="upload-demo"
+            :action="uploadUrl"
+            :limit="1"
+            :accept="accept"
+            :headers=" uploadHeaders"
+            :disabled="uploadIsUploading"
+            :on-progress="handleFileUploadProgress"
+            :on-success="handleFileSuccess"
+            :auto-upload="false"
+            drag
+          >
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">璇蜂笂浼�<em>Zip</em>鏂囦欢锛屽ぇ灏忓湪<em>100M</em>浠ュ唴</div>
+          </el-upload>
+          <span>浠呭厑璁稿鍏ip鏍煎紡鏂囦欢銆�</span>
+          <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="handleDownloadFile">涓嬭浇妯℃澘</el-link>
+        </div>
+        <div v-else-if="isImportOrExport" class="dialog-content">
+          <el-button class="export-button" @click="handleDownloadTargetList">瀵煎嚭鐩爣鍒楄〃鍐呭</el-button>
+          <el-button class="export-button">瀵煎嚭鎵�鏈夊垪琛ㄥ唴瀹�</el-button>
+          <el-button class="export-button">瀵煎嚭鐩爣椤圭洰璇︽儏</el-button>
+          <el-button class="export-button">瀵煎嚭鎵�鏈夐」鐩鎯�</el-button>
+        </div>
+      </template>
+      <template slot="footer">
+        <div v-if="!isImportOrExport" class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="closeDialog">鍙� 娑�</el-button>
+        </div>
+        <div v-else-if="isImportOrExport"></div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { globalHeaders } from '@/utils/request';
+
+export default {
+  name: 'FileDialog',
+  props: {
+    isImportOrExport: {
+      type: Boolean,
+      default: false
+    },
+    fileDialogVisible: {
+      type: Boolean,
+      default: false
+    },
+    currentColumns: {
+      type: Array,
+      default: function () {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      uploadRef: null,
+      targetColumn: [],
+      accept: `.zip`,
+      uploadUrl: '/project/import',
+      uploadHeaders: globalHeaders(),
+      uploadIsUploading: false
+    };
+  },
+  methods: {
+    handleFileUploadProgress() {
+      this.uploadIsUploading = true;
+    },
+    handleFileSuccess(response, file) {
+      this.uploadIsUploading = false;
+      if (this.uploadRef) {
+        this.uploadRef.handleRemove(file);
+      }
+      if (response.code === 200) {
+        this.$emit('fileDialogCancel');
+        this.$message({
+          message: response.msg,
+          type: 'success'
+        });
+      } else {
+        this.$message.error(response.msg);
+      }
+    },
+    handleDownloadFile() {
+      const self = this;
+      // fetch(`${process.env.VITE_APP_BASE_API}/project/export/template`, {
+      //   method: 'GET',
+      //   headers: self.upload.headers
+      // })
+      //   .then(response => response.blob())
+      //   .then(blob => {
+      //     const url = window.URL.createObjectURL(blob);
+      //     const a = document.createElement('a');
+      //     a.style.display = 'none';
+      //     a.href = url;
+      //     a.download = `椤圭洰鏂囦欢妯℃澘_${new Date().getTime()}.zip`;
+      //     document.body.appendChild(a);
+      //     a.click();
+      //     window.URL.revokeObjectURL(url);
+      //   })
+      //   .catch(error => {
+      //     console.error('鏂囦欢涓嬭浇澶辫触:', error);
+      //   });
+    },
+    submitFileForm() {
+      if (this.uploadRef) {
+        this.uploadRef.submit();
+      }
+    },
+    closeDialog() {
+      this.$emit('fileDialogCancel');
+    },
+    handleDownloadTargetList() {
+      console.log('瀵煎嚭鐩爣鍒楄〃鍐呭', this.currentColumns);
+      this.targetColumn = this.currentColumns.filter(item => item.visible);
+    }
+  },
+  mounted() {
+    this.uploadRef = this.$refs.uploadRef;
+  },
+  created() {
+
+    this.isFileDialogVisible = this.fileDialogVisible;
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.dialog-content {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: column;
+  height: 300px;
+
+  .export-button {
+    margin-left: 0;
+    margin-bottom: 10px;
+  }
+}
+.dialog-footer {
+  display: flex;
+  justify-content: center;
+}
+.upload-demo {
+  width: 100%;
+}
+::v-deep  .el-upload{
+  width: 100%;
+}
+::v-deep .el-upload .el-upload-dragger{
+  width: 100%;
+}
+</style>
diff --git a/src/views/projectEngineering/projectLibrary/index.vue b/src/views/projectEngineering/projectLibrary/index.vue
new file mode 100644
index 0000000..9abbf0d
--- /dev/null
+++ b/src/views/projectEngineering/projectLibrary/index.vue
@@ -0,0 +1,493 @@
+<template>
+  <div class="app-container">
+    <el-form  :model="queryParams" ref="queryParamsRef" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <div class="slot">
+        <div class="left-section">
+          <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+            <el-input
+              style="width: 190px;margin-right: 20px"
+              size="small"
+              v-model="queryParams.projectName"
+              placeholder="璇疯緭鍏ラ」鐩悕绉�"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="椤圭洰浠g爜" prop="projectCode">
+            <el-input
+              style="width: 190px;margin-right: 20px"
+              size="small"
+              v-model="queryParams.projectCode"
+              placeholder="璇疯緭鍏ラ」鐩唬鐮�"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+          <el-form-item label="椤圭洰骞撮檺" prop="timeRange">
+            <el-date-picker
+              style="width: 270px"
+              size="small"
+              v-model="queryParams[timeRange]"
+              type="daterange"
+              range-separator="-"
+              value-format="yyyy-MM-dd"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              @change="handleQuery"
+              clearable
+            >
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button icon="el-icon-search" size="small" @click="handleQuery">鏌ヨ</el-button>
+            <el-button icon="el-icon-refresh" size="small" @click="resetQuery">閲嶇疆</el-button>
+          </el-form-item>
+          <el-popover :visible="popoverValue" :width="500" placement="bottom">
+            <template #reference>
+              <el-button style="margin-right: 16px; margin-top: 1px; color: #3369ff" @click="handlePopover" size="small">
+                鏇村绛涙煡鏉′欢
+                <span style="margin-left: 5px">
+                  <el-icon v-if="!popoverValue" class="el-icon-arrow-down"></el-icon>
+                  <el-icon v-else-if="popoverValue" class="el-icon-arrow-up"></el-icon>
+                </span>
+              </el-button>
+            </template>
+            <span>绛涢�夋潯浠�</span>
+            <el-form ref="moreQueryParamsRef"  label-width="68px" label-position="right" :model="moreQueryParams">
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="椤圭洰绫诲瀷">
+                    <el-select v-model="moreQueryParams.projectType" clearable placeholder="璇烽�夋嫨" class="select-option" size="small">
+                      <el-option v-for="items in sys_project_type" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="閲嶇偣鍒嗙被">
+                    <el-select v-model="moreQueryParams.importanceType" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_key_categories" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="椤圭洰鏍囩">
+                    <el-select v-model="moreQueryParams.tag" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_project_tags" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="椤圭洰鐘舵��">
+                    <el-select v-model="moreQueryParams.projectStatus" :disabled="isProjectCategory" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_project_status" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="椤圭洰鐮�">
+                    <el-select v-model="moreQueryParams.projectColorCode" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_project_code" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="鍏宠仈鐘舵��">
+                    <el-select v-model="moreQueryParams.assignmentStatus" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_association_status" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="璧勯噾绫诲瀷">
+                    <el-select v-model="moreQueryParams.investmentType" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_funding_type" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="椤圭洰闃舵">
+                    <el-select v-model="moreQueryParams.projectPhase" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_project_phases" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="鎶曡祫绫诲埆">
+                    <el-select v-model="moreQueryParams.investType" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_investment_type" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="琛屾斂鍖哄垝">
+                    <el-select v-model="moreQueryParams.area" clearable placeholder="璇烽�夋嫨" class="select-option">
+                      <el-option v-for="items in sys_administrative_divisions" :key="items.value" :label="items.label" :value="items.value" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row style="text-align: center">
+                <el-col :span="24">
+                  <el-form-item label-width="0">
+                    <el-button type="primary" @click="handleQueryFrom">纭� 璁�</el-button>
+                    <el-button @click="closePopover">鍙� 娑�</el-button>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </el-popover>
+        </div>
+        <div class="right-section">
+          <div>
+            <el-button  @click="handleExport" size="small" >
+              <svg-icon icon-class="exportIcon" style="margin-right: 8px"/>
+              瀵煎嚭鏁版嵁
+            </el-button>
+            <el-button :disabled="isReserve" @click="handleImport" size="small" >
+              <svg-icon icon-class="importIcon" style="margin-right: 8px"/>
+              瀵煎叆鏁版嵁
+            </el-button>
+          </div>
+          <div class="add-btn">
+            <el-tooltip content="鏂板" effect="dark" placement="top">
+              <el-button :disabled="isReserve" circle icon="el-icon-plus" @click="add()" size="small"/>
+            </el-tooltip>
+          </div>
+          <VisibilityToolbar
+            v-model:showSearch="showSearch"
+            :columns="columns"
+            @queryTable="handleQuery"
+          ></VisibilityToolbar>
+<!--            @update:columns="handleUpdateColumns"-->
+<!--            @update:sort="handleUpdateSort"-->
+<!--            @update:resetSort="handleResetSort"-->
+        </div>
+      </div>
+    </el-form>
+
+    <el-table
+      style="margin-top: 20px"
+      v-loading="loading"
+      :data="infoList"
+      @selection-change="handleSelectionChange"
+      height="60vh"
+      :show-overflow-tooltip = "true">
+      <el-table-column type="selection" width="55" align="center" />
+      <template v-for="item in columns">
+        <el-table-column
+          v-if="item.visible"
+          :prop="item.id"
+          :label="item.label"
+          v-bind="item"
+          :min-width="item.minWidth"
+        >
+          <template slot-scope="scope" v-if="item.slotName">
+            <slot :name="item.slotName" :scope="scope"></slot>
+          </template>
+        </el-table-column>
+      </template>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['code:info:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['code:info:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+
+      <template #projectStatus="{ scope }">
+        <el-text class="mx-1">{{ getProjectStatus(scope.row) }}</el-text>
+      </template>
+      <template #projectColorCode="{ scope }">
+        <el-text class="mx-1 has-dot">{{ '缁�' }}<span class="dot" style="margin-left: 5px"></span></el-text>
+      </template>
+      <template #projectType="{ scope }">
+        <el-text class="mx-1">{{ getProjectType(scope.row) }}</el-text>
+      </template>
+      <template #investType="{ scope }">
+        <el-text class="mx-1">{{ getInvesType(scope.row) }}</el-text>
+      </template>
+      <template #planStartTime="{ scope }">
+        {{ scope.row.planStartTime ? scope.row.planStartTime.split('-')[0] + '骞�' : '' }}
+      </template>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <FileDialog
+      :fileDialogVisible.sync="fileDialogVisible"
+      :isImportOrExport="isImportOrExport"
+      @fileDialogCancel="fileDialogCancel"
+      :currentColumns="columns"
+    />
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/projectInfo";
+import { current } from './list';
+import FileDialog from '../component/FileDialog';
+export default {
+  name: "projectInfo",
+  components: {
+    FileDialog
+  },
+  data() {
+    return {
+      isImportOrExport: false,
+      fileDialogVisible: false,
+      //鏄惁闇�瑕佹柊澧炴寜閽�(鍌ㄨ搫椤圭洰闇�瑕�)
+      isReserve: false,
+      //琛ㄥご
+      columns: [],
+      //鎺у埗鏇村绛涢�夋樉闅�
+      popoverValue: false,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 椤圭洰绠$悊鍩虹淇℃伅琛ㄦ牸鏁版嵁
+      infoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      timeRange:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectName: null,
+        projectCode: null,
+      },
+      moreQueryParams: {
+        projectType: '', // 椤圭洰绫诲瀷
+        importanceType: '', // 閲嶇偣鍒嗙被
+        projectStatus: '', // 椤圭洰鐘舵��
+        projectColorCode: '', // 椤圭洰鐮�
+        investmentType: '', // 璧勯噾绫诲瀷
+        projectPhase: '', // 椤圭洰闃舵
+        investType: '', // 鎶曡祫绫诲埆
+        area: '', // 琛屾斂鍖哄垝
+        assignmentStatus: '', //鍏宠仈鐘舵��
+        tag: '' //椤圭洰鏍囩
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        projectName: [
+          { required: true, message: "椤圭洰鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        projectStatus: [
+          { required: true, message: "椤圭洰鐘舵��  (0鏈紑宸ワ紝1宸插紑宸ワ紝2宸茬宸ワ紝3鏆傚仠)涓嶈兘涓虹┖", trigger: "change" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.columns = current.map((item, index) => {
+      item.index = index + 1;
+      item.key = index;
+      item.serialNumber = index + 1;
+      return item;
+    });
+      this.getList();
+  },
+  methods: {
+    // 鍏抽棴鏂囦欢澶勭悊寮规鐨勬柟娉�
+    fileDialogCancel() {
+      this.tableLoading = true;
+      this.fileDialogVisible = false;
+      // this.getList();
+      this.tableLoading = false;
+    },
+    handlePopover() {
+      this.popoverValue.value = !this.popoverValue.value;
+    },
+    /** 鏌ヨ椤圭洰绠$悊鍩虹淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      console.log("鏌ヨ")
+      // listInfo(this.queryParams).then(response => {
+      //   this.infoList = response.rows;
+      //   this.total = response.total;
+      // });
+        this.loading = false;
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        projectName: null,
+        projectCode: null,
+        content: null,
+        projectType: null,
+        projectStatus: null,
+        fundType: null,
+        investType: null,
+        projectPhase: null,
+        tag: null,
+        competentDepartment: null,
+        areaCode: null,
+        managementCentralization: null,
+        projectApprovalType: null,
+        investmentCatalogue: null,
+        importanceType: null,
+        year: null,
+        yearInvestAmount: null,
+        createProjectTime: null,
+        planStartTime: null,
+        planCompleteTime: null,
+        winUnit: null,
+        winAmount: null,
+        winTime: null,
+        projectAddress: null,
+        longitude: null,
+        latitude: null,
+        projectOwnerUnit: null,
+        projectContactPerson: null,
+        contact: null,
+        gmtCreateTime: null,
+        gmtUpdateTime: null,
+        updateBy: null,
+        createBy: null,
+        deleted: null
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞椤圭洰绠$悊鍩虹淇℃伅";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼椤圭洰绠$悊鍩虹淇℃伅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎椤圭洰绠$悊鍩虹淇℃伅缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      this.isImportOrExport = false;
+      this.fileDialogVisible = true;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('code/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+ .select-option {
+  width: 140px;
+}
+.slot {
+  display: flex;
+}
+
+.left-section {
+  flex-grow: 1;
+}
+
+.right-section {
+  display: flex;
+  margin-left: auto;
+  .add-btn {
+    margin: 0 10px;
+  }
+}
+
+</style>
diff --git a/src/views/projectEngineering/projectLibrary/list.js b/src/views/projectEngineering/projectLibrary/list.js
new file mode 100644
index 0000000..d187287
--- /dev/null
+++ b/src/views/projectEngineering/projectLibrary/list.js
@@ -0,0 +1,176 @@
+export const current = [
+  {id: 'projectName', label: '椤圭洰鍚嶇О', visible: true},
+  {id: 'projectOwnerUnit', label: '涓氫富鍗曚綅', visible: true},
+  {id: 'projectColorCode', label: '椤圭洰鐮�', slotName: 'projectColorCode', visible: true},
+  {id: 'projectCode', label: '椤圭洰浠g爜', visible: true},
+  {id: 'projectType', label: '椤圭洰绫诲瀷', slotName: 'projectType', visible: true},
+  {id: 'projectPhase', label: '椤圭洰闃舵', visible: true},
+  {id: 'totalInvestment', label: '鎬绘姇璧勯', visible: true},
+  {id: 'yearInvestAmount', label: '鏈勾璁″垝鎶曡祫', visible: true},
+  {id: 'planStartTime', label: '椤圭洰骞翠唤', slotName: 'planStartTime', visible: true},
+  {id: 'projectStatus', label: '椤圭洰鐘舵��', slotName: 'projectStatus', visible: true},
+  {id: 'investType', label: '鎶曡祫绫诲埆', slotName: 'investType', visible: true},
+  {id: 'content', label: '寤鸿鍐呭', visible: false},
+  {id: 'fundType', label: '璧勯噾绫诲瀷', visible: false},
+  {id: 'projectContactPerson', label: '椤圭洰鑱旂郴浜�', visible: false},
+  {id: 'contact', label: '鑱旂郴鏂瑰紡', visible: false},
+  {id: 'engineeringIdList', label: '鍏宠仈宸ョ▼', visible: false},
+  {id: 'competentDepartmentList', label: '涓荤閮ㄩ棬', visible: false},
+  {id: 'area', label: '琛屾斂鍖哄垝', visible: false},
+  {id: 'managementCentralizationList', label: '绠$悊褰掑彛', visible: false},
+  {id: 'projectApprovalType', label: '椤圭洰瀹℃壒绫诲瀷', visible: false},
+  {id: 'importanceType', label: '閲嶇偣鍒嗙被', visible: false},
+  {id: 'setTime', label: '绔嬮」鏃堕棿', visible: false},
+  {id: 'planCompleteTime', label: '璁″垝绔e伐鏃堕棿', visible: false},
+  {id: 'winUnit', label: '涓爣鍗曚綅', visible: false},
+  {id: 'winAmount', label: '涓爣閲戦', visible: false},
+  {id: 'winTime', label: '涓爣鏃堕棿', visible: false},
+  {id: 'year', label: '骞村害鎶曡祫璁″垝', visible: false},
+  {id: 'address', label: '椤圭洰鍦板潃', visible: false},
+  {id: 'projectBudget', label: '椤圭洰棰勭畻', visible: false},
+  {id: 'beCrossRegion', label: '寤鸿鍦扮偣鏄惁璺ㄥ煙', visible: false},
+  {id: 'constructionLocation', label: '椤圭洰寤鸿鍦扮偣', visible: false},
+  {id: 'detailedAddress', label: '寤鸿璇︾粏鍦板潃', visible: false},
+  {id: 'beCompensationProject', label: '鏄惁鏄ˉ鐮侀」鐩�', visible: false},
+  {id: 'compensationReason', label: '琛ョ爜鍘熷洜', visible: false},
+  {id: 'plannedStartDate', label: '璁″垝寮�宸ユ椂闂�', visible: false},
+  {id: 'expectedCompletionDate', label: '鎷熷缓鎴愭椂闂�', visible: false},
+  {id: 'nationalIndustryClassification', label: '鍥介檯琛屼笟鍒嗙被', visible: false},
+  {id: 'industryClassification', label: '鎵�灞炶涓氬垎绫�', visible: false},
+  {id: 'projectNature', label: '椤圭洰寤烘垚鎬ц川', visible: false},
+  {id: 'projectAttribute', label: '椤圭洰灞炴��', visible: false},
+  {id: 'useEarth', label: '鏄惁浣跨敤鍦熷湴', visible: false},
+  {id: 'contentScale', label: '涓昏寤鸿鍐呭鍙婅妯�', visible: false},
+  {id: 'code', label: '寤虹骞冲彴浠g爜', visible: false},
+  {id: 'projectUnit', label: '椤圭洰鍗曚綅', visible: false},
+  {id: 'projectUnitType', label: '椤圭洰鍗曚綅绫诲瀷', visible: false},
+  {id: 'registrationType', label: '鐧昏娉ㄥ唽绫诲瀷', visible: false},
+  {id: 'holdingSituation', label: '鎺ц偂鎯呭喌', visible: false},
+  {id: 'certificateType', label: '璇佺収绫诲瀷', visible: false},
+  {id: 'certificateNumber', label: '璇佷欢鍙风爜', visible: false},
+  {id: 'registeredAddress', label: '娉ㄥ唽鍦板潃', visible: false},
+  {id: 'registeredCapital', label: '娉ㄥ唽璧勯噾', visible: false},
+  {id: 'legal_representative', label: '娉曚汉浠h〃', visible: false},
+  {id: 'fixedPhone', label: '鍥哄畾鐢佃瘽', visible: false},
+  {id: 'legalPersonIdcard', label: '娉曚汉韬唤璇佸彿', visible: false},
+  {id: 'projectContactPerson', label: '椤圭洰鑱旂郴浜�', visible: false},
+  {id: 'phone', label: '绉诲姩鐢佃瘽', visible: false},
+  {id: 'contactIdcard', label: '鑱旂郴浜鸿韩浠借瘉鍙�', visible: false},
+  {id: 'wechat', label: '寰俊鍙�', visible: false},
+  {id: 'contactAddress', label: '鑱旂郴浜洪�氳鍦板潃', visible: false},
+  {id: 'postCode', label: '閭斂缂栫爜', visible: false},
+  {id: 'email', label: '鐢靛瓙閭', visible: false},
+  {id: 'totalInvestment', label: '椤圭洰鎬绘姇璧勯', visible: false},
+  {id: 'principal', label: '椤圭洰鏈噾', visible: false},
+  {id: 'governmentInvestmentTotal', label: '鏀垮簻鎶曡祫', visible: false},
+  {id: 'centralInvestmentTotal', label: '涓ぎ鎶曡祫', visible: false},
+  {id: 'centralBudgetInvestment', label: '涓ぎ棰勭畻鎶曡祫', visible: false},
+  {id: 'centralFiscalInvestment', label: '涓ぎ璐㈡斂', visible: false},
+  {id: 'centralSpecialBondInvestment', label: '涓ぎ涓撻」鍊哄埜绛归泦鐨勪笓椤瑰缓璁捐祫閲�', visible: false},
+  {id: 'centralSpecialFundInvestment', label: '涓ぎ涓撻」寤鸿鍩洪噾', visible: false},
+  {id: 'provincialInvestmentTotal', label: '鐪佺骇鎶曡祫', visible: false},
+  {id: 'provincialBudgetInvestment', label: '鐪侀绠楀唴鎶曡祫', visible: false},
+  {id: 'provincialFiscalInvestment', label: '鐪佽储鏀挎�у缓璁炬姇璧�', visible: false},
+  {id: 'provincialSpecialFundInvestment', label: '鐪佷笓椤瑰缓璁捐祫閲�', visible: false},
+  {id: 'cityInvestmentTotal', label: '甯�(宸�)鎶曡祫', visible: false},
+  {id: 'cityBudgetInvestment', label: '甯�(宸�)棰勭畻鍐呮姇璧�', visible: false},
+  {id: 'cityFiscalInvestment', label: '甯�(宸�)璐㈡斂鎬ф姇璧�', visible: false},
+  {id: 'citySpecialFundInvestment', label: '甯�(宸�)涓撻」璧勯噾', visible: false},
+  {id: 'countyInvestmentTotal', label: '鍘�(甯傘�佸尯)鎶曡祫', visible: false},
+  {id: 'countyBudgetInvestment', label: '鍖�(鍘�)棰勭畻鍐呮姇璧�', visible: false},
+  {id: 'countyFiscalInvestment', label: '鍖猴紙鍘匡級璐㈡斂鎬у缓璁捐祫閲�', visible: false},
+  {id: 'countySpecialFundInvestment', label: '鍖�(鍘�)涓撻」璧勯噾', visible: false},
+  {id: 'domesticLoanTotal', label: '鍥藉唴璐锋', visible: false},
+  {id: 'bankLoan', label: '閾惰璐锋', visible: false},
+  {id: 'foreignInvestmentTotal', label: '澶栧晢鎶曡祫', visible: false},
+  {id: 'enterpriseSelfRaisedTotal', label: '浼佷笟鑷', visible: false},
+  {id: 'otherInvestmentTotal', label: '鍏朵粬鎶曡祫', visible: false}
+];
+export const currentRest = [
+  { id: 'projectName', label: '椤圭洰鍚嶇О', visible: true },
+  { id: 'projectOwnerUnit', label: '涓氫富鍗曚綅', visible: true },
+  { id: 'projectColorCode', label: '椤圭洰鐮�', slotName: 'projectColorCode', visible: true },
+  { id: 'projectCode', label: '椤圭洰浠g爜', visible: true },
+  { id: 'projectType', label: '椤圭洰绫诲瀷', slotName: 'projectType', visible: true },
+  { id: 'projectPhase', label: '椤圭洰闃舵', visible: true },
+  { id: 'totalInvestment', label: '鎬绘姇璧勯', visible: true },
+  { id: 'yearInvestAmount', label: '鏈勾璁″垝鎶曡祫', visible: true },
+  { id: 'planStartTime', label: '椤圭洰骞翠唤', slotName: 'planStartTime', visible: true },
+  { id: 'projectStatus', label: '椤圭洰鐘舵��', slotName: 'projectStatus', visible: true },
+  { id: 'investType', label: '鎶曡祫绫诲埆', slotName: 'investType', visible: true },
+  { id: 'content', label: '寤鸿鍐呭', visible: false },
+  { id: 'fundType', label: '璧勯噾绫诲瀷', visible: false },
+  { id: 'projectContactPerson', label: '椤圭洰鑱旂郴浜�', visible: false },
+  { id: 'contact', label: '鑱旂郴鏂瑰紡', visible: false },
+  { id: 'engineeringIdList', label: '鍏宠仈宸ョ▼', visible: false },
+  { id: 'competentDepartmentList', label: '涓荤閮ㄩ棬', visible: false },
+  { id: 'area', label: '琛屾斂鍖哄垝', visible: false },
+  { id: 'managementCentralizationList', label: '绠$悊褰掑彛', visible: false },
+  { id: 'projectApprovalType', label: '椤圭洰瀹℃壒绫诲瀷', visible: false },
+  { id: 'importanceType', label: '閲嶇偣鍒嗙被', visible: false },
+  { id: 'setTime', label: '绔嬮」鏃堕棿', visible: false },
+  { id: 'planCompleteTime', label: '璁″垝绔e伐鏃堕棿', visible: false },
+  { id: 'winUnit', label: '涓爣鍗曚綅', visible: false },
+  { id: 'winAmount', label: '涓爣閲戦', visible: false },
+  { id: 'winTime', label: '涓爣鏃堕棿', visible: false },
+  { id: 'year', label: '骞村害鎶曡祫璁″垝', visible: false },
+  { id: 'address', label: '椤圭洰鍦板潃', visible: false },
+  { id: 'projectBudget', label: '椤圭洰棰勭畻', visible: false },
+  { id: 'beCrossRegion', label: '寤鸿鍦扮偣鏄惁璺ㄥ煙', visible: false },
+  { id: 'constructionLocation', label: '椤圭洰寤鸿鍦扮偣', visible: false },
+  { id: 'detailedAddress', label: '寤鸿璇︾粏鍦板潃', visible: false },
+  { id: 'beCompensationProject', label: '鏄惁鏄ˉ鐮侀」鐩�', visible: false },
+  { id: 'compensationReason', label: '琛ョ爜鍘熷洜', visible: false },
+  { id: 'plannedStartDate', label: '璁″垝寮�宸ユ椂闂�', visible: false },
+  { id: 'expectedCompletionDate', label: '鎷熷缓鎴愭椂闂�', visible: false },
+  { id: 'nationalIndustryClassification', label: '鍥介檯琛屼笟鍒嗙被', visible: false },
+  { id: 'industryClassification', label: '鎵�灞炶涓氬垎绫�', visible: false },
+  { id: 'projectNature', label: '椤圭洰寤烘垚鎬ц川', visible: false },
+  { id: 'projectAttribute', label: '椤圭洰灞炴��', visible: false },
+  { id: 'useEarth', label: '鏄惁浣跨敤鍦熷湴', visible: false },
+  { id: 'contentScale', label: '涓昏寤鸿鍐呭鍙婅妯�', visible: false },
+  { id: 'code', label: '寤虹骞冲彴浠g爜', visible: false },
+  { id: 'projectUnit', label: '椤圭洰鍗曚綅', visible: false },
+  { id: 'projectUnitType', label: '椤圭洰鍗曚綅绫诲瀷', visible: false },
+  { id: 'registrationType', label: '鐧昏娉ㄥ唽绫诲瀷', visible: false },
+  { id: 'holdingSituation', label: '鎺ц偂鎯呭喌', visible: false },
+  { id: 'certificateType', label: '璇佺収绫诲瀷', visible: false },
+  { id: 'certificateNumber', label: '璇佷欢鍙风爜', visible: false },
+  { id: 'registeredAddress', label: '娉ㄥ唽鍦板潃', visible: false },
+  { id: 'registeredCapital', label: '娉ㄥ唽璧勯噾', visible: false },
+  { id: 'legal_representative', label: '娉曚汉浠h〃', visible: false },
+  { id: 'fixedPhone', label: '鍥哄畾鐢佃瘽', visible: false },
+  { id: 'legalPersonIdcard', label: '娉曚汉韬唤璇佸彿', visible: false },
+  { id: 'projectContactPerson', label: '椤圭洰鑱旂郴浜�', visible: false },
+  { id: 'phone', label: '绉诲姩鐢佃瘽', visible: false },
+  { id: 'contactIdcard', label: '鑱旂郴浜鸿韩浠借瘉鍙�', visible: false },
+  { id: 'wechat', label: '寰俊鍙�', visible: false },
+  { id: 'contactAddress', label: '鑱旂郴浜洪�氳鍦板潃', visible: false },
+  { id: 'postCode', label: '閭斂缂栫爜', visible: false },
+  { id: 'email', label: '鐢靛瓙閭', visible: false },
+  { id: 'totalInvestment', label: '椤圭洰鎬绘姇璧勯', visible: false },
+  { id: 'principal', label: '椤圭洰鏈噾', visible: false },
+  { id: 'governmentInvestmentTotal', label: '鏀垮簻鎶曡祫', visible: false },
+  { id: 'centralInvestmentTotal', label: '涓ぎ鎶曡祫', visible: false },
+  { id: 'centralBudgetInvestment', label: '涓ぎ棰勭畻鎶曡祫', visible: false },
+  { id: 'centralFiscalInvestment', label: '涓ぎ璐㈡斂', visible: false },
+  { id: 'centralSpecialBondInvestment', label: '涓ぎ涓撻」鍊哄埜绛归泦鐨勪笓椤瑰缓璁捐祫閲�', visible: false },
+  { id: 'centralSpecialFundInvestment', label: '涓ぎ涓撻」寤鸿鍩洪噾', visible: false },
+  { id: 'provincialInvestmentTotal', label: '鐪佺骇鎶曡祫', visible: false },
+  { id: 'provincialBudgetInvestment', label: '鐪侀绠楀唴鎶曡祫', visible: false },
+  { id: 'provincialFiscalInvestment', label: '鐪佽储鏀挎�у缓璁炬姇璧�', visible: false },
+  { id: 'provincialSpecialFundInvestment', label: '鐪佷笓椤瑰缓璁捐祫閲�', visible: false },
+  { id: 'cityInvestmentTotal', label: '甯�(宸�)鎶曡祫', visible: false },
+  { id: 'cityBudgetInvestment', label: '甯�(宸�)棰勭畻鍐呮姇璧�', visible: false },
+  { id: 'cityFiscalInvestment', label: '甯�(宸�)璐㈡斂鎬ф姇璧�', visible: false },
+  { id: 'citySpecialFundInvestment', label: '甯�(宸�)涓撻」璧勯噾', visible: false },
+  { id: 'countyInvestmentTotal', label: '鍘�(甯傘�佸尯)鎶曡祫', visible: false },
+  { id: 'countyBudgetInvestment', label: '鍖�(鍘�)棰勭畻鍐呮姇璧�', visible: false },
+  { id: 'countyFiscalInvestment', label: '鍖猴紙鍘匡級璐㈡斂鎬у缓璁捐祫閲�', visible: false },
+  { id: 'countySpecialFundInvestment', label: '鍖�(鍘�)涓撻」璧勯噾', visible: false },
+  { id: 'domesticLoanTotal', label: '鍥藉唴璐锋', visible: false },
+  { id: 'bankLoan', label: '閾惰璐锋', visible: false },
+  { id: 'foreignInvestmentTotal', label: '澶栧晢鎶曡祫', visible: false },
+  { id: 'enterpriseSelfRaisedTotal', label: '浼佷笟鑷', visible: false },
+  { id: 'otherInvestmentTotal', label: '鍏朵粬鎶曡祫', visible: false }
+];

--
Gitblit v1.8.0