From 4a34ae32407330c6600d24b065c7de2ad9a51d6b Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期五, 26 一月 2024 10:49:04 +0800
Subject: [PATCH] 开发业务接口

---
 company/src/components/common/UploadImage.vue                                         |  155 +++
 company/src/plugins/download.js                                                       |    3 
 company/src/App.vue                                                                   |   10 
 company/src/components/common/UploadAvatarImage.vue                                   |   81 +
 company/src/components/common/PositionSelect.vue                                      |    2 
 company/src/assets/logo.png                                                           |    0 
 company/src/components/common/Light.vue                                               |   29 
 company/src/components/base/BaseTable.vue                                             |    8 
 company/src/components/common/Pagination.vue                                          |    2 
 company/src/assets/style/element-variables.scss                                       |    1 
 company/src/layouts/TableLayout.vue                                                   |    4 
 company/src/layouts/AppLayout.vue                                                     |  112 ++
 company/src/assets/images/zan.png                                                     |    0 
 company/src/components/common/Header.vue                                              |  193 ----
 company/src/components/base/BaseOpera.vue                                             |   16 
 company/src/router/index.js                                                           |    4 
 company/src/assets/images/login_img.jpg                                               |    0 
 company/src/store/index.js                                                            |   43 
 company/src/assets/images/top_ic_chilun@2x.png                                        |    0 
 company/src/components/common/GlobalQuestionWindow.vue                                |  137 +++
 company/src/assets/images/woman.png                                                   |    0 
 company/src/assets/images/login_bg.png                                                |    0 
 server/platform/src/main/resources/application.yml                                    |    2 
 company/src/plugins/messagebox.js                                                     |   31 
 company/src/assets/images/man.png                                                     |    0 
 company/src/components/common/tagsview.vue                                            |  261 ++++++
 company/src/components/common/DepartmentSelect.vue                                    |    3 
 company/src/assets/avatar/man.png                                                     |    0 
 server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java |    2 
 company/src/components/common/RichEditor.vue                                          |  158 +++
 company/src/assets/images/login_img.png                                               |    0 
 company/src/components/common/GlobalAlertWindow.vue                                   |  120 ++
 company/src/components/common/SearchFormCollapse.vue                                  |    2 
 company/src/components/common/ImportButton.vue                                        |   37 
 company/src/assets/style/lib.css                                                      |  117 ++
 company/src/components/common/Tree.vue                                                |  135 +++
 company/src/components/common/ShowRich.vue                                            |   42 
 company/src/assets/style/style.scss                                                   |   47 +
 company/src/assets/style/variables.scss                                               |    9 
 company/src/components/common/myImage.vue                                             |   84 +
 company/src/assets/avatar/woman.png                                                   |    0 
 company/src/assets/images/top_ic_bolang@2x.png                                        |    0 
 company/src/components/common/GlobalWindow.vue                                        |   33 
 company/src/components/common/Menu.vue                                                |   58 -
 company/src/components/common/TreeSelect.vue                                          |    2 
 company/src/components/common/CommonHeader.vue                                        |  220 +++++
 company/src/assets/style/alertstyle.scss                                              |   32 
 company/src/components/common/GlobalRigthWindow.vue                                   |  137 +++
 company/src/components/common/ImportWindow.vue                                        |  204 ++++
 49 files changed, 2,219 insertions(+), 317 deletions(-)

diff --git a/company/src/App.vue b/company/src/App.vue
index 2892abe..d22b2c9 100644
--- a/company/src/App.vue
+++ b/company/src/App.vue
@@ -3,10 +3,20 @@
 </template>
 
 <style lang="scss">
+@import "assets/style/lib.css";
 // 寮曞叆鍏ㄥ眬鏍峰紡
 @import "assets/style/style";
 // 寮曞叆绯荤粺鍐呯疆鍥炬爣
 @import "assets/icons/system/index";
 // 寮曞叆鑷畾涔夊浘鏍�
 @import "assets/icons/ext/index";
+.long-title-style {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -webkit-text-overflow: ellipsis;
+  overflow: hidden;
+}
+.el-tooltip__popper.is-dark {
+  max-width: 400px;
+}
 </style>
diff --git a/company/src/assets/avatar/man.png b/company/src/assets/avatar/man.png
new file mode 100644
index 0000000..a84beb9
--- /dev/null
+++ b/company/src/assets/avatar/man.png
Binary files differ
diff --git a/company/src/assets/avatar/woman.png b/company/src/assets/avatar/woman.png
new file mode 100644
index 0000000..eef8695
--- /dev/null
+++ b/company/src/assets/avatar/woman.png
Binary files differ
diff --git a/company/src/assets/images/login_bg.png b/company/src/assets/images/login_bg.png
new file mode 100644
index 0000000..edff503
--- /dev/null
+++ b/company/src/assets/images/login_bg.png
Binary files differ
diff --git a/company/src/assets/images/login_img.jpg b/company/src/assets/images/login_img.jpg
new file mode 100644
index 0000000..c7024a0
--- /dev/null
+++ b/company/src/assets/images/login_img.jpg
Binary files differ
diff --git a/company/src/assets/images/login_img.png b/company/src/assets/images/login_img.png
new file mode 100644
index 0000000..93ec0f9
--- /dev/null
+++ b/company/src/assets/images/login_img.png
Binary files differ
diff --git a/company/src/assets/images/man.png b/company/src/assets/images/man.png
index a84beb9..a6e3a8f 100644
--- a/company/src/assets/images/man.png
+++ b/company/src/assets/images/man.png
Binary files differ
diff --git a/company/src/assets/images/top_ic_bolang@2x.png b/company/src/assets/images/top_ic_bolang@2x.png
new file mode 100644
index 0000000..f3d281b
--- /dev/null
+++ b/company/src/assets/images/top_ic_bolang@2x.png
Binary files differ
diff --git a/company/src/assets/images/top_ic_chilun@2x.png b/company/src/assets/images/top_ic_chilun@2x.png
new file mode 100644
index 0000000..209e1c3
--- /dev/null
+++ b/company/src/assets/images/top_ic_chilun@2x.png
Binary files differ
diff --git a/company/src/assets/images/woman.png b/company/src/assets/images/woman.png
index eef8695..2aaafa6 100644
--- a/company/src/assets/images/woman.png
+++ b/company/src/assets/images/woman.png
Binary files differ
diff --git a/company/src/assets/images/zan.png b/company/src/assets/images/zan.png
new file mode 100644
index 0000000..6af5480
--- /dev/null
+++ b/company/src/assets/images/zan.png
Binary files differ
diff --git a/company/src/assets/logo.png b/company/src/assets/logo.png
index 5d8fd16..3c0b233 100644
--- a/company/src/assets/logo.png
+++ b/company/src/assets/logo.png
Binary files differ
diff --git a/company/src/assets/style/alertstyle.scss b/company/src/assets/style/alertstyle.scss
new file mode 100644
index 0000000..761f010
--- /dev/null
+++ b/company/src/assets/style/alertstyle.scss
@@ -0,0 +1,32 @@
+::v-deep .el-form-item {
+  display: flex;
+}
+::v-deep .el-form-item__content {
+  margin-left: 0 !important;
+  flex: 1;
+}
+
+.address-plus {
+  display: flex;
+  justify-content: space-between;
+  ::v-deep .el-select {
+    width: 31%;
+    .el-input__inner {
+      width: 100%;
+    }
+  }
+}
+.address {
+  display: flex;
+  justify-content: space-between;
+  ::v-deep .el-select {
+    width: 47%;
+    .el-input__inner {
+      width: 100%;
+    }
+  }
+}
+
+::v-deep input {
+  text-align: left !important;
+}
diff --git a/company/src/assets/style/element-variables.scss b/company/src/assets/style/element-variables.scss
index 9c8266b..efaf750 100644
--- a/company/src/assets/style/element-variables.scss
+++ b/company/src/assets/style/element-variables.scss
@@ -6,3 +6,4 @@
 $--font-path: '~element-ui/lib/theme-chalk/fonts';
 
 @import "~element-ui/packages/theme-chalk/src/index";
+
diff --git a/company/src/assets/style/lib.css b/company/src/assets/style/lib.css
new file mode 100644
index 0000000..2fd7178
--- /dev/null
+++ b/company/src/assets/style/lib.css
@@ -0,0 +1,117 @@
+/*-----------------[鍒濆鍖朷--------------*/
+*{ font-family: PingFang SC;}
+/* 娓呯悊娴姩 */
+.cle:after {visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0;}
+.cle:after{zoom:1;}
+.clear{clear: both;}
+.tc{text-align:center;}
+.tl{text-align:left}
+.tr{text-align:right}
+.fl{float: left;}
+.fr{float: right;}
+
+.wp{ width: 94%; margin: 0 auto;}
+.w30{ width: 30%;}.w40{ width: 40%;}.w47{ width: 47%;}.w48{ width: 48%;}.w49{ width: 49%;}.w50{ width: 50%;}.w60{ width: 60%;}.w80{ width: 80%;}.w90{ width: 90%;}
+
+.bg_fa{ background-color: #fafafa;}.bg_f2{ background-color: #f2f2f2;}.bg_f1{ background-color: #f1f1f1;}.bg_f5{ background-color: #f5f5f5;}.bg_f6{ background-color: #f6f6f6;}.bg_f7{ background-color: #f7f7f7;}.bg_f8{ background-color: #f8f8f8;}.bg_e{ background-color: #eee;}.bg_d{ background-color: #ddd;}.bg_w{ background-color: #fff;}.bg_3{ background-color: #333;}.bcf{ color: #fff;}.bc3{ color: #333;}.bcc{ color: #ccc;}.bc9{ color: #999;}.bc6{ color: #666;}
+
+.rd4{border-radius: 4px;}.rd5{border-radius: 5px;}.rd6{border-radius: 6px;}.rd8{border-radius: 8px;}.rd10{border-radius: 10px;}.rd15{border-radius: 15px;}.rd20{border-radius: 20px;}.rd30{border-radius: 30px;}.rd40{border-radius: 40px;}.rd50{border-radius: 50px;}.rd60{border-radius: 60px;}.rd70{border-radius: 70px;}.rd80{border-radius: 80px;}.rd90{border-radius: 90px;}.rd100{border-radius: 100px;}.rd120{border-radius: 120px;}.rdhalf{  border-radius:50%}
+
+.ml5{ margin-left: 5px;}.ml10{ margin-left: 10px;}.ml15{ margin-left: 15px;}.ml20{ margin-left: 20px;}.ml25{ margin-left: 25px;}.ml30{ margin-left: 30px;}.ml40{ margin-left: 40px;}.ml50{ margin-left: 50px;}.ml60{ margin-left: 60px;}
+
+.mt5{ margin-top: 5px;}.mt10{ margin-top: 10px;}.mt15{ margin-top: 15px;}.mt20{ margin-top: 20px;}.mt25{ margin-top: 25px;}.mt30{ margin-top: 30px;}.mt35{ margin-top: 35px;}.mt40{ margin-top: 40px;}.mt45{ margin-top: 45px;}.mt50{ margin-top: 50px;}.mt60{ margin-top: 60px;}.mt70{ margin-top: 70px;}.mt80{ margin-top: 80px;}.mt90{ margin-top: 90px;}.mt100{ margin-top:100px;}.mt150{ margin-top:150px;}.mt200{ margin-top:200px;}.mt-20{ margin-top: -20px;}.mt-30{ margin-top: -30px;}.mt-40{ margin-top: -40px;}
+
+.mb5{ margin-bottom: 5px;}.mb10{ margin-bottom: 10px;}.mb15{ margin-bottom: 15px;}.mb20{ margin-bottom: 20px;}.mb25{ margin-bottom: 25px;}.mb30{ margin-bottom: 30px;}.mb40{ margin-bottom: 40px;}.mb50{ margin-bottom: 50px;}.mb60{ margin-bottom: 60px;}.mb80{ margin-bottom: 80px;}
+
+.mr5{ margin-right: 5px;}.mr10{ margin-right: 10px;}.mr15{ margin-right: 15px;}.mr20{ margin-right: 20px;}.mr25{ margin-right: 25px;}.mr30{ margin-right: 30px;}.mr40{ margin-right: 40px;}.mr60{ margin-right: 60px;}.mr80{ margin-right: 80px;}.mr100{ margin-right: 100px;}
+
+.pl10{ padding-left: 10px;}.pl20{ padding-left: 20px;}.pl25{ padding-left: 25px;}.pl30{ padding-left: 30px;}.pl40{ padding-left: 40px;}.pl50{ padding-left: 50px;}.pl60{ padding-left: 60px;}.pl80{ padding-left: 80px;}.pl100{ padding-left: 100px;}
+
+.pr10{ padding-right: 10px;}.pr20{ padding-right: 20px;}.pr25{ padding-right: 25px;}.pr30{ padding-right: 30px;}.pr40{ padding-right: 40px;}.pr50{ padding-right: 50px;}.pr60{ padding-right: 60px;}.pr80{ padding-right: 80px;}.pr100{ padding-right: 100px;}
+
+.pb10{ padding-bottom: 10px;}.pb20{ padding-bottom: 20px;}.pb25{ padding-bottom: 25px;}.pb30{ padding-bottom: 30px;}.pb40{ padding-bottom: 40px;}.pb50{ padding-bottom: 50px;}.pb100{ padding-bottom: 100px;}
+
+.pt10{ padding-top: 10px;}.pt20{ padding-top: 20px;}.pt25{ padding-top: 25px;}.pt30{ padding-top: 30px;}.pt40{ padding-top: 40px;}.pt50{ padding-top: 50px;}.pt100{ padding-top: 100px;}
+
+.plr{ padding-left: 30px; padding-right: 30px;}.plr20{ padding-left: 20px; padding-right: 20px;}.plr25{ padding-left: 25px; padding-right: 25px;}.plr30{ padding-left: 30px; padding-right: 30px;}.plr40{ padding-left: 40px; padding-right: 40px;}.plr50{ padding-left: 50px; padding-right: 50px;}.plr60{ padding-left: 60px; padding-right: 60px;}
+
+.ptb10{padding-bottom: 10px; padding-top: 10px;} .ptb15{padding-bottom: 15px; padding-top: 15px;} .ptb20{padding-bottom: 20px; padding-top: 20px;}.ptb25{padding-bottom: 25px; padding-top: 25px;}.ptb30{padding-bottom: 30px; padding-top: 30px;}.ptb35{padding-bottom: 35px; padding-top: 35px;}.ptb40{padding-bottom: 40px; padding-top: 40px;}.ptb50{padding-bottom: 50px; padding-top: 50px;}.ptb60{padding-bottom: 60px; padding-top: 60px;}.ptb80{padding-bottom: 80px; padding-top: 80px;}.ptb100{padding-bottom: 100px; padding-top: 100px;}.ptb150{padding-bottom: 150px; padding-top: 150px;}.ptb200{padding-bottom: 200px; padding-top: 200px;}
+
+.p5{ padding:5px}.p10{ padding:10px} .p20{ padding:20px}.p30{ padding:30px}.p2030{ padding:20px 30px}.p40{ padding:40px}.p3040{ padding:30px 40px}
+
+.f0{ font-size: 0px;}.f20{ font-size: 20px;}.f22{ font-size: 22px;}.f24{ font-size: 24px;}.f26{ font-size: 26px;}.f28{ font-size: 28px;}.f30{ font-size: 30px;}.f32{ font-size: 32px;}.f34{ font-size: 34px;}.f36{ font-size: 36px;} .f38{ font-size: 38px;}.f40{ font-size: 40px;} .f42{ font-size: 42px;}.f44{ font-size: 44px;}.f48{ font-size: 48px;}.f50{ font-size: 50px;}.f60{ font-size: 60px;}.f64{ font-size: 64px;}.f70{ font-size: 70px;}.f80{ font-size: 80px;}.f90{ font-size: 90px;}.f100{ font-size: 100px;}
+
+.img16{ width: 16px; height: 16px;}
+.img20{ width: 20px; height: 20px;}
+.img24{ width: 24px; height: 24px;}
+.img26{ width: 26px; height: 26px;}
+.img30{ width: 30px; height: 30px;}
+.img32{ width: 32px; height: 32px;}
+.img36{ width: 36px; height: 36px;}
+.img40{ width: 40px; height: 40px;}
+.img48{ width: 48px; height: 48px;}
+.img60{ width: 60px; height: 60px;}
+.img66{ width: 66px; height: 66px;}
+.img80{ width: 80px; height: 80px;}
+.img86{ width: 86px; height: 86px;}
+.img90{ width: 90px; height: 90px;}
+.img100{ width: 100px; height: 100px;}
+.img110{ width: 110px; height: 110px;}
+.img120{ width: 120px; height: 120px;}
+.img150{ width: 150px; height: 150px;}
+.img180{ width: 180px; height: 180px;}
+.img200{ width: 200px; height: 200px;}
+.imgfull{ width: 100%;}
+
+.rimb{ border-bottom: 1px solid #F1F1F1;}
+.rimt{ border-top: 1px solid #F1F1F1;}
+
+
+.bcover{  background-size: cover; background-position: center center; background-repeat:  no-repeat;}
+.bfull{ background-size: 100% 100%; background-position: center center; background-repeat:  no-repeat;}
+
+.b{ font-weight: bold;}
+.ibm{ display: inline-block; vertical-align: middle;}
+.bbox{ box-sizing: border-box;}
+.rauto{ margin-left:auto; margin-right:auto}
+.fixedBottom{position: fixed;		left: 0;		bottom: 0;		width: 100%;}
+.lh1-6{line-height: 1.6;}
+.lh1-6{line-height: 1.6;}
+.lh1-8{line-height: 1.8;}
+.lh2{line-height: 2;}
+
+.sbtn{ display: inline-block; padding: 0.7em 2em;  border: 1px solid transparent; box-sizing: border-box; text-align: center;}
+.mini{ font-size: 18px;}
+.med{ font-size: 26px;}
+.def{ font-size: 34px;}
+.sbtn_w100{ width: 100%; padding-left: 0; padding-right: 0;}
+.sbtn_green{ color: #fff; background:#65C35D; }
+.sbtn_green_rim{ color: #65C35D; border-color:#65C35D; }
+.sbtn_black{ color: #fff; background:#333; }
+.sbtn_gray{ color: #333; background:#F7F7F7; }
+.sbtn_black_rim{ color: #333; border-color:#eee; }
+.sbtn_gray_rim{ color: #999; border-color:#ccc; }
+/* flex */
+.flex{ display: flex; flex-wrap: wrap; justify-content: space-between;}
+.cXY{ display: flex;  align-items: center;justify-content: center;}
+.cY{ display: flex; align-items: center;}
+.cX{display: flex; justify-content: center}
+.rowW{ display: flex; flex-wrap: wrap;}
+.bX{ display: flex;   flex-direction: row; justify-content: space-between;} 
+.bY{ display: flex;   flex-direction:column; justify-content: space-between;} 
+.bcX{ display: flex; justify-content: space-between; align-items: center;}
+.fx1{ flex: 1; overflow: hidden; }
+
+.cAXY{ position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);}
+.shadowA{box-shadow: 0 0 5px 0 #ddd;}
+.shadowB{ position: relative;}
+.shadowB::after{ content: ""; display: block; width: 100%; height: 8px; box-shadow: 0 6px 12px rgba(0,0,0,.08); top: -8px; left: 0; position: absolute; }
+
+
+.orange{ color: #EA531B;}
+.green{ color: #65C35D;}
+.blue{ color: #3C77DA;}
+.red{ color: #f00;}
+/* /deep/ .uicon-close .u-icon--right{ position: absolute; right: 30px; top: 30px; z-index: 999;} */
+.popCloseBtn{ position: absolute; width:50px; height:50px; right: 20px; top: 20px;}
+.fixedHeader{ position: absolute; left: 0; top: 0;}
diff --git a/company/src/assets/style/style.scss b/company/src/assets/style/style.scss
index 114ca0e..cd08f82 100644
--- a/company/src/assets/style/style.scss
+++ b/company/src/assets/style/style.scss
@@ -5,13 +5,26 @@
   padding: 0;
   margin: 0;
   color: $font-color;
+  // overflow: hidden;
   font-family: 'Avenir', Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
+  scrollbar-width: none; /* firefox */
+  -ms-overflow-style: none; /* IE 10+ */
+  &::-webkit-scrollbar {
+    display: none; /* Chrome Safari */
+  }
   body {
     height: 100%;
     padding: 0;
     margin: 0;
+    overflow: scroll;
+    overflow: hidden;
+    scrollbar-width: none; /* firefox */
+    -ms-overflow-style: none; /* IE 10+ */
+    &::-webkit-scrollbar {
+      display: none; /* Chrome Safari */
+    }
   }
   h1,h2,h3,h4,h5,h6,ul {
     margin: 0;
@@ -23,10 +36,44 @@
   #app {
     height: 100%;
     min-width: $page-min-width;
+    // overflow: hidden;
   }
+}
+
+.bg {
+  z-index: 9990 !important;
+}
+.windows {
+  z-index: 9991 !important;
 }
 
 // 绌挎妗嗙殑鎸夐挳
 .el-transfer__buttons {
   padding: 0 16px !important;
 }
+
+.table-header {
+  background-color: #F5F6F8!important;
+  th {
+    background-color: #F5F6F8!important;
+    color: #3F4F69 !important;
+    font-size: 14px;
+  }
+}
+
+.doumee-element-table {
+  border-color: #DFE2E8;
+  tr, th, td {
+    border-color: #DFE2E8;
+  }
+}
+
+::v-deep .el-table__fixed {
+  height: 100% !important;
+}
+::v-deep .el-table__fixed-right {
+  height: 100% !important;
+}
+::v-deep .el-table__cell {
+  height: 100% !important;
+}
diff --git a/company/src/assets/style/variables.scss b/company/src/assets/style/variables.scss
index ff3f939..d982769 100644
--- a/company/src/assets/style/variables.scss
+++ b/company/src/assets/style/variables.scss
@@ -1,5 +1,12 @@
 // 涓昏壊璋�
-$primary-color: #2E68EC;
+$primary-color: #216EEE;
+$primary-title-start-color: #3582ff;
+$primary-title-color: #216EcE;
+$primary-color-sel: #0046c6;
+$primary-color-hover: #1562e2;
+$icon-background-color: #0d5ada;
+//鑿滃崟鎮诞鑹诧細
+$menu-hover-color: rgba(33, 110, 238, 0.10);
 // 澶撮儴楂樺害
 $header-height: 60px;
 // 鑿滃崟瀹藉害
diff --git a/company/src/components/base/BaseOpera.vue b/company/src/components/base/BaseOpera.vue
index 70681bd..5d64137 100644
--- a/company/src/components/base/BaseOpera.vue
+++ b/company/src/components/base/BaseOpera.vue
@@ -14,6 +14,16 @@
       }
     }
   },
+  // watch: {
+  //   visible() {
+  //     console.log(this.visible);
+  //   }
+  // },
+  watch: {
+    $route (to, from) {
+      this.close()
+    }
+  },
   methods: {
     // 閰嶇疆
     config (extParams = {}) {
@@ -49,6 +59,9 @@
         }
       })
     },
+    close () {
+      this.visible = false
+    },
     // 纭鏂板缓/淇敼
     confirm () {
       if (this.form.id == null || this.form.id === '') {
@@ -60,9 +73,12 @@
     // 纭鏂板缓
     __confirmCreate () {
       this.$refs.form.validate((valid) => {
+        // debugger
         if (!valid) {
           return
         }
+        // console.log(this.form);
+        // debugger
         // 璋冪敤鏂板缓鎺ュ彛
         this.isWorking = true
         this.api.create(this.form)
diff --git a/company/src/components/base/BaseTable.vue b/company/src/components/base/BaseTable.vue
index e738f2d..ccdafc0 100644
--- a/company/src/components/base/BaseTable.vue
+++ b/company/src/components/base/BaseTable.vue
@@ -135,9 +135,11 @@
     // 鍒犻櫎
     deleteById (row, childConfirm = true) {
       this.__checkApi()
-      let message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝悧?`
+      // let message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝悧?`
+      let message = `纭鍒犻櫎璇ヨ褰曞悧?`
       if (childConfirm && row.children != null && row.children.length > 0) {
-        message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝強鍏跺瓙${this.module}鍚�?`
+        // message = `纭鍒犻櫎${this.module}銆�${row[this.configData['field.main']]}銆戝強鍏跺瓙${this.module}鍚�?`
+        message = `纭鍒犻櫎璇ヨ褰曞強鍏跺瓙鏁版嵁鍚�?`
       }
       this.$dialog.deleteConfirm(message)
         .then(() => {
@@ -175,7 +177,7 @@
           }
         }
         if (containChildrenRows.length > 0) {
-          message = `鏈灏嗗垹闄�${this.module}銆�${containChildrenRows.join('銆�')}銆戝強鍏跺瓙${this.module}璁板綍锛岀‘璁ゅ垹闄ゅ悧锛焋
+          message = '鏈灏嗗垹闄よ鏁版嵁鍙婂叾瀛愭暟鎹紝纭鍒犻櫎鍚楋紵'
         }
       }
       this.$dialog.deleteConfirm(message)
diff --git a/company/src/components/common/CommonHeader.vue b/company/src/components/common/CommonHeader.vue
new file mode 100644
index 0000000..2e9798a
--- /dev/null
+++ b/company/src/components/common/CommonHeader.vue
@@ -0,0 +1,220 @@
+<template>
+  <div class="common-header">
+    <div class="header">
+      <div class="logo">
+        <div>浜戞槗淇濆鎴锋湇鍔$郴缁�</div>
+        <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
+      </div>
+      <div class="user">
+        <el-dropdown v-if="isLogined" trigger="click">
+          <span class="el-dropdown-link">
+            <!-- <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> -->
+            <img v-if="userInfo != null" style="width: 30px !important;" src="@/assets/avatar/man.png" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i>
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item @click.native="changePwd">淇敼瀵嗙爜</el-dropdown-item>
+            <el-dropdown-item @click.native="logout">閫�鍑虹櫥褰�</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </div>
+    </div>
+    <!-- 淇敼瀵嗙爜 -->
+    <GlobalAlertWindow
+      title="淇敼瀵嗙爜"
+      :visible.sync="visible.changePwd"
+      @confirm="confirmChangePwd"
+      @close="visible.changePwd = false"
+    >
+      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
+        <el-form-item label="鍘熷瀵嗙爜" prop="oldPwd" required>
+          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="璇疯緭鍏ュ師濮嬪瘑鐮�" maxlength="30" show-password></el-input>
+        </el-form-item>
+        <el-form-item label="鏂板瘑鐮�" prop="newPwd" required>
+          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="璇疯緭鍏ユ柊瀵嗙爜" maxlength="30" show-password></el-input>
+        </el-form-item>
+        <el-form-item label="纭鏂板瘑鐮�" prop="confirmPwd" required>
+          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜" maxlength="30" show-password></el-input>
+        </el-form-item>
+      </el-form>
+    </GlobalAlertWindow>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex'
+import GlobalAlertWindow from './GlobalAlertWindow'
+import { logout, updatePwd } from '@/api/system/common'
+export default {
+  name: 'CommonHeader',
+  components: { GlobalAlertWindow },
+  props: {
+    isLogined: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data () {
+    return {
+      visible: {
+        // 淇敼瀵嗙爜
+        changePwd: false
+      },
+      isWorking: {
+        // 淇敼瀵嗙爜
+        changePwd: false
+      },
+      username: 'bob', // 鐢ㄦ埛鍚�
+      // 淇敼瀵嗙爜寮规
+      changePwdData: {
+        form: {
+          oldPwd: '',
+          newPwd: '',
+          confirmPwd: ''
+        },
+        rules: {
+          oldPwd: [
+            { required: true, message: '璇疯緭鍏ュ師濮嬪瘑鐮�' }
+          ],
+          newPwd: [
+            { required: true, message: '璇疯緭鍏ユ柊瀵嗙爜' }
+          ],
+          confirmPwd: [
+            { required: true, message: '璇峰啀娆¤緭鍏ユ柊瀵嗙爜' }
+          ]
+        }
+      }
+    }
+  },
+  computed: {
+    ...mapState(['menuData', 'userInfo']),
+    title () {
+      return this.$route.meta.title
+    }
+  },
+  filters: {
+    // 灞曠ず鍚嶇О
+    displayName (userInfo) {
+      if (userInfo == null) {
+        return ''
+      }
+      if (userInfo.realname != null && userInfo.realname.trim().length > 0) {
+        return userInfo.realname
+      }
+      return userInfo.username
+    }
+  },
+  methods: {
+    ...mapMutations(['setUserInfo', 'switchCollapseMenu']),
+    // 淇敼瀵嗙爜
+    changePwd () {
+      this.visible.changePwd = true
+      this.$nextTick(() => {
+        this.$refs.changePwdDataForm.resetFields()
+      })
+    },
+    // 纭畾淇敼瀵嗙爜
+    confirmChangePwd () {
+      if (this.isWorking.changePwd) {
+        return
+      }
+      this.$refs.changePwdDataForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        // 楠岃瘉涓ゆ瀵嗙爜杈撳叆鏄惁涓�鑷�
+        if (this.changePwdData.form.newPwd !== this.changePwdData.form.confirmPwd) {
+          this.$tip.warning('涓ゆ瀵嗙爜杈撳叆涓嶄竴鑷�')
+          return
+        }
+        // 鎵ц淇敼
+        this.isWorking.changePwd = true
+        updatePwd({
+          oldPwd: this.changePwdData.form.oldPwd,
+          newPwd: this.changePwdData.form.newPwd
+        })
+          .then(() => {
+            this.$tip.apiSuccess('淇敼鎴愬姛')
+            this.visible.changePwd = false
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking.changePwd = false
+          })
+      })
+    },
+    // 閫�鍑虹櫥褰�
+    logout () {
+      logout()
+        .then(() => {
+          this.setUserInfo(null)
+          this.$router.push({ name: 'login' })
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+.common-header {
+  background-color: #1457C7;
+}
+.header {
+  overflow: hidden;
+  // background: #fff;
+  height: 100%;
+  display: flex;
+  justify-content: space-between;
+
+  .logo {
+    background: url('../../assets/images/top_ic_chilun@2x.png') no-repeat;
+    box-sizing: border-box;
+    min-width: 280px;
+    height: 70px;
+    padding: 17px 30px;
+    // flex-shrink: 0;
+    line-height: 36px;
+    font-size: 22px;
+    font-weight: 600;
+    color: #fff;
+    // display: inline;
+    .title-en {
+      font-size: 11px;
+      font-weight: 500;
+      color: rgb(202, 214, 238);
+    }
+  }
+  .user {
+    width: 712px;
+    box-sizing: border-box;
+    height: 70px;
+    padding-right: 25px;
+    background: url('../../assets/images/top_ic_bolang@2x.png') no-repeat;
+    flex-shrink: 0;
+    text-align: right;
+    .el-dropdown {
+      top: 10px;
+      color: #fff;
+    }
+    img {
+      width: 32px;
+      position: relative;
+      top: 10px;
+      margin-right: 10px;
+    }
+  }
+}
+// 涓嬫媺鑿滃崟妗�
+.el-dropdown-menu {
+  width: 140px;
+  .el-dropdown-menu__item:hover {
+    background: #E3EDFB;
+    color: $primary-color;
+  }
+}
+</style>
diff --git a/company/src/components/common/DepartmentSelect.vue b/company/src/components/common/DepartmentSelect.vue
index a90fd07..77d0b67 100644
--- a/company/src/components/common/DepartmentSelect.vue
+++ b/company/src/components/common/DepartmentSelect.vue
@@ -45,7 +45,7 @@
     }
   },
   watch: {
-    excludeId () {
+    value () {
       this.fetchData()
     }
   },
@@ -54,6 +54,7 @@
     fetchData () {
       fetchTree()
         .then(records => {
+          // debugger
           this.data = []
           this.__fillData(this.data, records)
         })
diff --git a/company/src/components/common/GlobalAlertWindow.vue b/company/src/components/common/GlobalAlertWindow.vue
new file mode 100644
index 0000000..53b0597
--- /dev/null
+++ b/company/src/components/common/GlobalAlertWindow.vue
@@ -0,0 +1,120 @@
+<template>
+  <el-dialog
+    class="global-window"
+    title="title"
+    :visible="visible"
+    :with-header="true"
+    :width="width"
+    :close-on-press-escape="false"
+    :wrapper-closable="false"
+    :append-to-body="true"
+    @close="close"
+  >
+    <div slot="title" class="window__header">
+      {{title}}
+    </div>
+    <div class="window__body">
+      <slot></slot>
+    </div>
+    <div v-if="withFooter" class="window__footer">
+      <slot name="footer">
+        <el-button @click="confirm" :loading="confirmWorking" type="primary">纭畾</el-button>
+        <el-button @click="close">鍙栨秷</el-button>
+      </slot>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'GlobalAlertWindow',
+  props: {
+    width: {
+      type: String,
+      default: '50%'
+    },
+    // 鏄惁鍖呭惈搴曢儴鎿嶄綔
+    withFooter: {
+      type: Boolean,
+      default: true
+    },
+    // 纭鎸夐挳loading鐘舵��
+    confirmWorking: {
+      type: Boolean,
+      default: false
+    },
+    // 鏍囬
+    title: {
+      type: String,
+      default: ''
+    },
+    // 鏄惁灞曠ず
+    visible: {
+      type: Boolean,
+      required: true
+    }
+  },
+  methods: {
+    confirm () {
+      // console.log(this.title);
+      // debugger
+      this.$emit('confirm')
+    },
+    close () {
+      // console.log(this.title);
+      // debugger
+      this.$emit('update:visible', false)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+// 杈撳叆妗嗛珮搴�
+$input-height: 32px;
+::v-deep .el-dialog__header {
+  background-color: #f7f7f7;
+  font-weight: 500;
+  color: #222;
+}
+::v-deep .el-dialog__body {
+  padding: 20px 20px 0;
+  box-sizing: border-box;
+}
+
+.global-window {
+  // top: 80px !important;
+  // left: 218px !important;
+  // 澶撮儴鏍囬
+  ::v-deep .el-dialog__header {
+    padding: 19px 24px;
+    height: 56px;
+    line-height: 18px;
+    box-sizing: border-box;
+    border-bottom: 1px solid #eee;
+    // text-align: center;
+    .el-dialog__headerbtn {
+      width: 18px;
+      height: 18px;
+      .el-dialog__close {
+        width: 18px;
+        height: 18px;
+        font-size: 19px;
+        line-height: 18px;
+      }
+    }
+  }
+  // 涓讳綋
+  .window__body {
+    min-height: 200px;
+  }
+  .window__footer {
+      user-select: none;
+      border-top: 1px solid #eee;
+      height: 60px;
+      line-height: 60px;
+      text-align: center;
+    }
+}
+</style>
diff --git a/company/src/components/common/GlobalQuestionWindow.vue b/company/src/components/common/GlobalQuestionWindow.vue
new file mode 100644
index 0000000..40b7797
--- /dev/null
+++ b/company/src/components/common/GlobalQuestionWindow.vue
@@ -0,0 +1,137 @@
+<template>
+  <el-dialog
+    class="global-window"
+    title="title"
+    :visible="visible"
+    :with-header="true"
+    :top="top"
+    :width="width"
+    :close-on-press-escape="false"
+    :wrapper-closable="false"
+    :append-to-body="true"
+    @close="close"
+  >
+    <div slot="title" style="min-height: 10px;" class="window__header">
+      {{title}}
+    </div>
+    <div class="window__body">
+      <slot></slot>
+    </div>
+    <div v-if="withFooter" class="window__footer">
+      <slot name="footer">
+        <el-button @click="confirm" :loading="confirmWorking" type="primary">纭畾</el-button>
+        <el-button @click="close">杩斿洖</el-button>
+      </slot>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'GlobalQuestionWindow',
+  props: {
+    width: {
+      type: String,
+      default: '40%'
+    },
+    top: {
+      type: String,
+      default: '15vh'
+    },
+    // 鏄惁鍖呭惈搴曢儴鎿嶄綔
+    withFooter: {
+      type: Boolean,
+      default: true
+    },
+    // 纭鎸夐挳loading鐘舵��
+    confirmWorking: {
+      type: Boolean,
+      default: false
+    },
+    // 鏍囬
+    title: {
+      type: String,
+      default: ''
+    },
+    // 鏄惁灞曠ず
+    visible: {
+      type: Boolean,
+      required: true
+    }
+  },
+  methods: {
+    confirm () {
+      // console.log(this.title);
+      // debugger
+      this.$emit('confirm')
+    },
+    close () {
+      // console.log(this.title);
+      // debugger
+      this.$emit('update:visible', false)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+// 杈撳叆妗嗛珮搴�
+$input-height: 32px;
+::v-deep .el-dialog__header {
+  background-color: #f7f7f7;
+  font-weight: 500;
+  color: #222;
+}
+::v-deep .el-dialog__body {
+  padding: 30px 20px 0;
+  box-sizing: border-box;
+}
+
+.global-window {
+  // top: 80px !important;
+  // left: 218px !important;
+  // 澶撮儴鏍囬
+  ::v-deep .el-drawer__header {
+    padding: 0 10px 0 0;
+    line-height: 40px;
+    border-bottom: 1px solid #eee;
+    text-align: center;
+    width: 100%;
+  }
+  // 涓讳綋
+  ::v-deep .el-dialog__body {
+    display: flex;
+    flex-direction: column;
+    position: absolute;
+    top: 40px;
+    bottom: 0;
+    width: 100%;
+    height: calc(90vh - 52px);
+    overflow: hidden;
+    background-color: #f7f7f7;
+    // 鍐呭
+    .window__body {
+      width: 100%;
+      height: 100%;
+      overflow-y: auto;
+      // 鏍囩
+      .el-form-item__label {
+        float: none;
+      }
+      // 鍏冪礌瀹藉害涓�100%
+      .el-form-item__content > *{
+        width: 100%;
+      }
+    }
+    // 灏鹃儴
+    .window__footer {
+      user-select: none;
+      border-top: 1px solid #eee;
+      height: 60px;
+      line-height: 60px;
+      text-align: center;
+    }
+  }
+}
+</style>
diff --git a/company/src/components/common/GlobalRigthWindow.vue b/company/src/components/common/GlobalRigthWindow.vue
new file mode 100644
index 0000000..1e01639
--- /dev/null
+++ b/company/src/components/common/GlobalRigthWindow.vue
@@ -0,0 +1,137 @@
+<template>
+  <el-drawer
+    class="global-window"
+    title="title"
+    :visible="visible"
+    :with-header="true"
+    :size="width"
+    :close-on-press-escape="false"
+    :wrapper-closable="false"
+    :append-to-body="true"
+    :modal="false"
+    @close="close"
+  >
+    <div slot="title" class="window__header">
+      <span class="header__btn-back" @click="close"><i class="el-icon-arrow-left"></i></span>{{title}}
+      <!-- {{title}} -->
+    </div>
+    <div class="window__body">
+      <slot></slot>
+    </div>
+    <div v-if="withFooter" class="window__footer">
+      <slot name="footer">
+        <el-button @click="confirm" :loading="confirmWorking" type="primary">纭畾</el-button>
+        <el-button @click="close">杩斿洖</el-button>
+      </slot>
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+export default {
+  name: 'GlobalWindow',
+  props: {
+    width: {
+      type: String,
+      default: '100%'
+    },
+    // 鏄惁鍖呭惈搴曢儴鎿嶄綔
+    withFooter: {
+      type: Boolean,
+      default: true
+    },
+    // 纭鎸夐挳loading鐘舵��
+    confirmWorking: {
+      type: Boolean,
+      default: false
+    },
+    // 鏍囬
+    title: {
+      type: String,
+      default: ''
+    },
+    // 鏄惁灞曠ず
+    visible: {
+      type: Boolean,
+      required: true
+    }
+  },
+  methods: {
+    confirm () {
+      this.$emit('confirm')
+    },
+    close () {
+      this.$emit('update:visible', false)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+// 杈撳叆妗嗛珮搴�
+$input-height: 32px;
+.global-window {
+  top: 80px !important;
+  left: 218px !important;
+  // 澶撮儴鏍囬
+  ::v-deep .el-drawer__header {
+    padding: 0 10px 0 0;
+    line-height: 40px;
+    border-bottom: 1px solid #eee;
+    // text-align: center;
+    font-weight: 500;
+    color: #222;
+    // 杩斿洖鎸夐挳
+    .header__btn-back {
+      display: inline-block;
+      width: 30px;
+      background: $primary-color;
+      color: #fff;
+      text-align: center;
+      margin-right: 12px;
+      border-right: 1px solid #eee;
+    }
+    .el-drawer__close-btn:focus {
+      outline: none;
+    }
+  }
+  // 涓讳綋
+  ::v-deep .el-drawer__body {
+    display: flex;
+    flex-direction: column;
+    position: absolute;
+    top: 40px;
+    bottom: 0;
+    width: 100%;
+    overflow: hidden;
+    // background-color: #f7f7f7;
+    // 鍐呭
+    .window__body {
+      // width: 1100px;
+      // margin: 0 auto;
+      // background-color: #fff;
+      width: 100%;
+      height: 100%;
+      overflow-y: auto;
+      padding: 0;
+      // 鏍囩
+      .el-form-item__label {
+        float: none;
+      }
+      // 鍏冪礌瀹藉害涓�100%
+      .el-form-item__content > *{
+        width: 100%;
+      }
+    }
+    // 灏鹃儴
+    .window__footer {
+      user-select: none;
+      border-top: 1px solid #eee;
+      height: 60px;
+      line-height: 60px;
+      text-align: center;
+    }
+  }
+}
+</style>
diff --git a/company/src/components/common/GlobalWindow.vue b/company/src/components/common/GlobalWindow.vue
index f68056c..7967500 100644
--- a/company/src/components/common/GlobalWindow.vue
+++ b/company/src/components/common/GlobalWindow.vue
@@ -8,18 +8,20 @@
     :close-on-press-escape="false"
     :wrapper-closable="false"
     :append-to-body="true"
+    :modal="false"
     @close="close"
   >
     <div slot="title" class="window__header">
       <span class="header__btn-back" @click="close"><i class="el-icon-arrow-left"></i></span>{{title}}
+      <!-- {{title}} -->
     </div>
     <div class="window__body">
       <slot></slot>
     </div>
     <div v-if="withFooter" class="window__footer">
       <slot name="footer">
-        <el-button @click="confirm" :loading="confirmWorking" type="primary">{{submitText}}</el-button>
-        <el-button @click="close">鍙栨秷</el-button>
+        <el-button @click="confirm" :loading="confirmWorking" type="primary">纭畾</el-button>
+        <el-button @click="close">杩斿洖</el-button>
       </slot>
     </div>
   </el-drawer>
@@ -31,7 +33,7 @@
   props: {
     width: {
       type: String,
-      default: '36%'
+      default: '100%'
     },
     // 鏄惁鍖呭惈搴曢儴鎿嶄綔
     withFooter: {
@@ -52,11 +54,6 @@
     visible: {
       type: Boolean,
       required: true
-    },
-    // 纭鎸夐挳鏂囧瓧
-    submitText: {
-      type: String,
-      default: '纭畾'
     }
   },
   methods: {
@@ -75,11 +72,16 @@
 // 杈撳叆妗嗛珮搴�
 $input-height: 32px;
 .global-window {
+  top: 80px !important;
+  left: 218px !important;
   // 澶撮儴鏍囬
-  /deep/ .el-drawer__header {
+  ::v-deep .el-drawer__header {
     padding: 0 10px 0 0;
     line-height: 40px;
     border-bottom: 1px solid #eee;
+    // text-align: center;
+    font-weight: 500;
+    color: #222;
     // 杩斿洖鎸夐挳
     .header__btn-back {
       display: inline-block;
@@ -95,7 +97,7 @@
     }
   }
   // 涓讳綋
-  /deep/ .el-drawer__body {
+  ::v-deep .el-drawer__body {
     display: flex;
     flex-direction: column;
     position: absolute;
@@ -103,15 +105,20 @@
     bottom: 0;
     width: 100%;
     overflow: hidden;
+    // background-color: #f7f7f7;
     // 鍐呭
     .window__body {
+      // width: 1100px;
+      // margin: 0 auto;
+      // background-color: #fff;
+      width: 100%;
       height: 100%;
       overflow-y: auto;
       padding: 12px 16px;
       // 鏍囩
-      .el-form-item__label {
-        float: none;
-      }
+      // .el-form-item__label {
+      //   float: none;
+      // }
       // 鍏冪礌瀹藉害涓�100%
       .el-form-item__content > *{
         width: 100%;
diff --git a/company/src/components/common/Header.vue b/company/src/components/common/Header.vue
index 31c6e4e..1800c40 100644
--- a/company/src/components/common/Header.vue
+++ b/company/src/components/common/Header.vue
@@ -1,156 +1,30 @@
 <template>
   <div class="main-header">
     <div class="header">
-<!--      <h2>-->
-<!--        <i class="el-icon-s-unfold" v-if="menuData.collapse" @click="switchCollapseMenu(null)"></i>-->
-<!--        <i class="el-icon-s-fold" v-else @click="switchCollapseMenu(null)"></i>-->
-<!--        {{title}}-->
-<!--      </h2>-->
-      <div class="user">
-<!--        <span style="font-size: 13px">{{ userInfo.company.name }}</span>-->
-        <el-dropdown trigger="click">
-          <span class="el-dropdown-link">
-            <img v-if="userInfo != null" :src="userInfo.avatar == null ? '@/assets/images/avatar/man.png' : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i>
-          </span>
-          <el-dropdown-menu slot="dropdown">
-            <el-dropdown-item @click.native="changePwd">淇敼瀵嗙爜</el-dropdown-item>
-            <el-dropdown-item @click.native="logout">閫�鍑虹櫥褰�</el-dropdown-item>
-          </el-dropdown-menu>
-        </el-dropdown>
-      </div>
+      <h2>
+        <i class="el-icon-s-unfold" v-if="menuData.collapse" @click="switchCollapseMenu(null)"></i>
+        <i class="el-icon-s-fold" v-else @click="switchCollapseMenu(null)"></i>
+        {{title}}
+      </h2>
+      <tagsview class="tags"></tagsview>
     </div>
-    <!-- 淇敼瀵嗙爜 -->
-    <GlobalWindow
-      title="淇敼瀵嗙爜"
-      :visible.sync="visible.changePwd"
-      @confirm="confirmChangePwd"
-      @close="visible.changePwd = false"
-    >
-      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
-        <el-form-item label="鍘熷瀵嗙爜" prop="oldPwd" required>
-          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="璇疯緭鍏ュ師濮嬪瘑鐮�" maxlength="30" show-password></el-input>
-        </el-form-item>
-        <el-form-item label="鏂板瘑鐮�" prop="newPwd" required>
-          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="璇疯緭鍏ユ柊瀵嗙爜" maxlength="30" show-password></el-input>
-        </el-form-item>
-        <el-form-item label="纭鏂板瘑鐮�" prop="confirmPwd" required>
-          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜" maxlength="30" show-password></el-input>
-        </el-form-item>
-      </el-form>
-    </GlobalWindow>
   </div>
 </template>
 
 <script>
 import { mapState, mapMutations } from 'vuex'
-import GlobalWindow from './GlobalWindow'
-import { logout, updatePwd } from '@/api/system/common'
+import tagsview from "./tagsview.vue"
 export default {
   name: 'Header',
-  components: { GlobalWindow },
-  data () {
-    return {
-      visible: {
-        // 淇敼瀵嗙爜
-        changePwd: false
-      },
-      isWorking: {
-        // 淇敼瀵嗙爜
-        changePwd: false
-      },
-      username: 'bob', // 鐢ㄦ埛鍚�
-      // 淇敼瀵嗙爜寮规
-      changePwdData: {
-        form: {
-          oldPwd: '',
-          newPwd: '',
-          confirmPwd: ''
-        },
-        rules: {
-          oldPwd: [
-            { required: true, message: '璇疯緭鍏ュ師濮嬪瘑鐮�' }
-          ],
-          newPwd: [
-            { required: true, message: '璇疯緭鍏ユ柊瀵嗙爜' }
-          ],
-          confirmPwd: [
-            { required: true, message: '璇峰啀娆¤緭鍏ユ柊瀵嗙爜' }
-          ]
-        }
-      }
-    }
-  },
+  components: { tagsview },
   computed: {
-    ...mapState(['menuData', 'userInfo']),
+    ...mapState(['menuData']),
     title () {
       return this.$route.meta.title
     }
   },
-  filters: {
-    // 灞曠ず鍚嶇О
-    displayName (userInfo) {
-      if (userInfo == null) {
-        return ''
-      }
-      // if (userInfo.realname != null && userInfo.realname.trim().length > 0) {
-      //   return userInfo.realname
-      // }
-      return userInfo.username
-    }
-  },
   methods: {
-    ...mapMutations(['setUserInfo', 'switchCollapseMenu']),
-    // 淇敼瀵嗙爜
-    changePwd () {
-      this.visible.changePwd = true
-      this.$nextTick(() => {
-        this.$refs.changePwdDataForm.resetFields()
-      })
-    },
-    // 纭畾淇敼瀵嗙爜
-    confirmChangePwd () {
-      if (this.isWorking.changePwd) {
-        return
-      }
-      this.$refs.changePwdDataForm.validate((valid) => {
-        if (!valid) {
-          return
-        }
-        // 楠岃瘉涓ゆ瀵嗙爜杈撳叆鏄惁涓�鑷�
-        if (this.changePwdData.form.newPwd !== this.changePwdData.form.confirmPwd) {
-          this.$tip.warning('涓ゆ瀵嗙爜杈撳叆涓嶄竴鑷�')
-          return
-        }
-        // 鎵ц淇敼
-        this.isWorking.changePwd = true
-        updatePwd({
-          oldPwd: this.changePwdData.form.oldPwd,
-          newPwd: this.changePwdData.form.newPwd
-        })
-          .then(() => {
-            this.$tip.apiSuccess('淇敼鎴愬姛')
-            this.visible.changePwd = false
-          })
-          .catch(e => {
-            this.$tip.apiFailed(e)
-          })
-          .finally(() => {
-            this.isWorking.changePwd = false
-          })
-      })
-    },
-    // 閫�鍑虹櫥褰�
-    logout () {
-      logout()
-        .then(() => {
-          this.setUserInfo(null)
-          location.reload()
-          // this.$router.push({ name: 'login' })
-        })
-        .catch(e => {
-          this.$tip.apiFailed(e)
-        })
-    }
+    ...mapMutations(['switchCollapseMenu']),
   }
 }
 </script>
@@ -163,54 +37,23 @@
   background: #fff;
   height: 100%;
   display: flex;
+  overflow: hidden;
   h2 {
-    width: 50%;
     flex-shrink: 0;
-    line-height: $header-height;
+    line-height: 48px;
+    width: 200px;
     font-size: 19px;
-    font-weight: 600;
     color: #606263;
+    font-weight: normal;
     display: inline;
     & > i {
       font-size: 20px;
       margin-right: 12px;
     }
   }
-  .user {
-    width: 50%;
-    flex-shrink: 0;
-    text-align: right;
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
-    text {
-      font-size: 18px !important;
-      color: #222222;
-    }
-    .el-dropdown-link {
-      height: 100%;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-    }
-    .el-dropdown {
-      top: 2px;
-      height: 100%;
-    }
-    img {
-      width: 32px;
-      position: relative;
-      // top: 10px;
-      margin-right: 10px;
-    }
-  }
 }
-// 涓嬫媺鑿滃崟妗�
-.el-dropdown-menu {
-  width: 140px;
-  .el-dropdown-menu__item:hover {
-    background: #E3EDFB;
-    color: $primary-color;
-  }
-}
+// .tags {
+//     padding-bottom: 16px;
+//   }
+
 </style>
diff --git a/company/src/components/common/ImportButton.vue b/company/src/components/common/ImportButton.vue
new file mode 100644
index 0000000..04510be
--- /dev/null
+++ b/company/src/components/common/ImportButton.vue
@@ -0,0 +1,37 @@
+<template>
+  <div class="import-button">
+    <el-button type="primary" @click="$refs.importWindow.open(text)">{{text}}</el-button>
+    <ImportWindow :action="action" :template-path="templatePath" :template-name="templateName" ref="importWindow" @download="$emit('download')" @success="handleSuccess"/>
+  </div>
+</template>
+
+<script>
+import ImportWindow from './ImportWindow'
+export default {
+  name: 'ImportButton',
+  components: { ImportWindow },
+  props: {
+    // 鎸夐挳鏂囨
+    text: {
+      default: '瀵煎叆'
+    },
+    // 妯$増鍦板潃
+    templatePath: {
+      required: true
+    },
+    // 涓嬭浇鍚庣殑妯$増鏂囦欢鍚嶇О
+    templateName: {
+      required: true
+    },
+    // 瀵煎叆鎺ュ彛鍦板潃
+    action: {
+      required: true
+    }
+  },
+  methods: {
+    handleSuccess () {
+      this.$emit('success')
+    }
+  }
+}
+</script>
diff --git a/company/src/components/common/ImportWindow.vue b/company/src/components/common/ImportWindow.vue
new file mode 100644
index 0000000..8e05ddb
--- /dev/null
+++ b/company/src/components/common/ImportWindow.vue
@@ -0,0 +1,204 @@
+<template>
+  <el-dialog
+    width="500px"
+    :title="title"
+    :visible.sync="visible"
+    append-to-body
+    custom-class="eva-dialog import-window"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+  >
+    <el-form>
+      <el-form-item>
+        <el-upload
+          drag
+          :show-file-list="false"
+          action="none"
+          accept=".xlsx, .xls"
+          :before-upload="handleBeforeUpload"
+        >
+          <template v-if="form.file == null">
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          </template>
+          <template v-else>
+            <i class="el-icon-files"></i>
+            <div class="el-upload__text">{{form.file.name}}<em></em></div>
+          </template>
+        </el-upload>
+      </el-form-item>
+    </el-form>
+    
+    <div slot="footer" class="import-window__footer">
+      <!-- <div class="sync-exists">
+        <el-checkbox v-model="form.sync"/><span>鍚屾宸插瓨鍦ㄧ殑鏁版嵁</span>
+      </div> -->
+      <div class="opera">
+        <a href=""></a>
+        <el-button type="text" icon="el-icon-download" @click="downloadTemplate">涓嬭浇妯$増</el-button>
+        <el-button @click="cancel">{{cancelText}}</el-button>
+        <el-button type="primary" @click="confirm" :loading="isWorking">{{confirmText}}</el-button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import request from '@/utils/request'
+export default {
+  name: 'ImportWindow',
+  props: {
+    // 瀵煎叆鎺ュ彛鍦板潃
+    action: {
+      required: true
+    },
+    // 纭鎸夐挳鏂囨
+    confirmText: {
+      type: String,
+      default: '瀵煎叆'
+    },
+    
+    // 鍙栨秷鎸夐挳鏂囨
+    cancelText: {
+      type: String,
+      default: '鍙栨秷'
+    },
+    // 妯$増鍦板潃
+    templatePath: {
+      required: true
+    },
+    // 涓嬭浇鍚庣殑妯$増鏂囦欢鍚嶇О
+    templateName: {
+      required: true
+    }
+  },
+  data () {
+    return {
+      visible: false,
+      isWorking: false,
+      title: '瀵煎叆鏁版嵁',
+      form: {
+        sync: false,
+        file: false,
+        categoryId: ''
+      }
+    }
+  },
+  methods: {
+    /**
+     * 鎵撳紑绐楀彛
+     *
+     * @param title 绐楀彛鏍囬
+     */
+    open (title) {
+      this.visible = true
+      this.title = title
+      this.form.sync = false
+      this.form.file = null
+    },
+    /**
+     * 纭畾瀵煎叆
+     */
+    confirm () {
+      if (this.form.file == null) {
+        this.$tip.warning('璇烽�夋嫨鏂囦欢')
+        return
+      }
+      this.isWorking = true
+      const param = new FormData()
+      param.set('file', this.form.file)
+      request.post(this.action, param, {
+        headers: {
+          'Content-Type': 'multipart/form-data;charset=UTF-8'
+        }
+      })
+        .then(() => {
+          this.$tip.success('瀵煎叆鎴愬姛')
+          this.visible = false
+          this.$emit('success')
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.isWorking = false
+        })
+    },
+    /**
+     * 鍙栨秷
+     */
+    cancel () {
+      this.visible = false
+    },
+    /**
+     * 涓嬭浇妯$増
+     */
+    downloadTemplate () {
+      const link = document.createElement('a')
+      link.setAttribute('download', this.templateName) //涓嬭浇鐨勬枃浠跺悕
+      console.log(`${window.location.origin}${process.env.VUE_APP_CONTEXT_PATH}${this.templatePath}`);
+      link.href = `${window.location.origin}${process.env.VUE_APP_CONTEXT_PATH}${this.templatePath}`  //鏂囦欢url
+      link.click()
+      // this.$emit('download')
+    },
+    /**
+     * 鏂囦欢涓婁紶鍓嶅瓨鍌ㄤ笂浼犵殑鏂囦欢
+     *
+     * @param file 闇�瀵煎叆鐨勬枃浠�
+     */
+    handleBeforeUpload (file) {
+      this.form.file = file
+      return false
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@import "../../assets/style/variables";
+.import-window {
+  .el-upload {
+    width: 100%;
+    .el-upload-dragger {
+      width: 100%;
+      .el-icon-upload, .el-icon-files {
+        font-size: 67px;
+        color: #C0C4CC;
+        margin: 40px 0 16px;
+        line-height: 50px;
+      }
+    }
+  }
+  .import-window__footer {
+    display: flex;
+    .sync-exists {
+      width: 200px;
+      flex-shrink: 0;
+      text-align: left;
+      font-size: 13px;
+      display: flex;
+      align-items: center;
+      .el-checkbox {
+        margin-right: 10px;
+      }
+      & > * {
+        vertical-align: middle;
+      }
+    }
+    .opera {
+      flex-grow: 1;
+      a {
+        font-size: 12px;
+        margin-right: 10px;
+        text-decoration: none;
+        .el-icon-download {
+          font-size: 15px;
+          position: relative;
+          top: 2px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/company/src/components/common/Light.vue b/company/src/components/common/Light.vue
index 3e18a29..433a66a 100644
--- a/company/src/components/common/Light.vue
+++ b/company/src/components/common/Light.vue
@@ -28,13 +28,16 @@
 $cycle-size01: 16px;
 $cycle-size02: 6px;
 $normal-color: #00CC99;
+$shadow-color: #00CCa9;
 $warn-color: #FFCC33;
+$warn-shadow-color: #FFCbe3;
 $danger-color: #FF3300;
+$dange-shadowr-color: #FF3310;
 @mixin light-status ($cycle-bg) {
   em {
     background: $cycle-bg;
     i {
-      background: $cycle-bg - 30;
+      background: mix($cycle-bg,  #000030, 0.5);
     }
   }
 }
@@ -79,44 +82,44 @@
 }
 @keyframes shine-normal {
   0% {
-    box-shadow: 0 0 5px $normal-color + 10;
+    box-shadow: 0 0 5px $shadow-color;
   }
   25% {
-    box-shadow: 0 0 10px $normal-color + 10;
+    box-shadow: 0 0 10px $shadow-color;
   }
   50% {
-    box-shadow: 0 0 15px $normal-color + 10;
+    box-shadow: 0 0 15px $shadow-color;
   }
   100% {
-    box-shadow: 0 0 20px $normal-color + 10;
+    box-shadow: 0 0 20px $shadow-color;
   }
 }
 @keyframes shine-warn {
   0% {
-    box-shadow: 0 0 5px $warn-color - 50;
+    box-shadow: 0 0 5px $warn-shadow-color;
   }
   25% {
-    box-shadow: 0 0 10px $warn-color - 50;
+    box-shadow: 0 0 10px $warn-shadow-color;
   }
   50% {
-    box-shadow: 0 0 15px $warn-color - 50;
+    box-shadow: 0 0 15px $warn-shadow-color;
   }
   100% {
-    box-shadow: 0 0 20px $warn-color - 50;
+    box-shadow: 0 0 20px $warn-shadow-color;
   }
 }
 @keyframes shine-danger {
   0% {
-    box-shadow: 0 0 5px $danger-color + 10;
+    box-shadow: 0 0 5px $dange-shadowr-color;
   }
   25% {
-    box-shadow: 0 0 10px $danger-color + 10;
+    box-shadow: 0 0 10px $dange-shadowr-color;
   }
   50% {
-    box-shadow: 0 0 15px $danger-color + 10;
+    box-shadow: 0 0 15px $dange-shadowr-color;
   }
   100% {
-    box-shadow: 0 0 20px $danger-color + 10;
+    box-shadow: 0 0 20px $dange-shadowr-color;
   }
 }
 </style>
diff --git a/company/src/components/common/Menu.vue b/company/src/components/common/Menu.vue
index 98280b5..b928666 100644
--- a/company/src/components/common/Menu.vue
+++ b/company/src/components/common/Menu.vue
@@ -1,19 +1,15 @@
 <template>
   <div class="menu" :class="{collapse: menuData.collapse}">
-    <div class="logo">
-      <div><img src="@/assets/logo.png"></div>
-      <h1 :class="{ hidden: menuData.collapse }">浜戞槗淇�</h1>
-    </div>
     <scrollbar>
-<!--      :default-openeds="defaultOpeneds"-->
       <el-menu
         ref="menu"
-        :unique-opened="true"
         :default-active="activeIndex"
         text-color="#fff"
         active-text-color="#fff"
         :collapse="menuData.collapse"
+        :default-openeds="defaultOpeneds"
         :collapse-transition="false"
+        unique-opened
         @select="handleSelect"
       >
         <MenuItems v-for="menu in menuData.list" :key="menu.index" :menu="menu" :is-root-menu="true"/>
@@ -40,12 +36,17 @@
       const menuConfig = this.__getMenuConfig(path, 'url', this.menuData.list)
       if (menuConfig == null) {
         return null
+      } else {
+        this.$store.commit("pushtags", menuConfig)
       }
+      // console.log(menuConfig.index);
       return menuConfig.index
     },
     // 榛樿灞曞紑鐨勮彍鍗昳ndex
     defaultOpeneds () {
-      return this.menuData.list.map(menu => menu.index)
+      // return this.menuData.list.map(menu => menu.index)
+      
+      return [this.menuData.list[0].index]
     }
   },
   methods: {
@@ -65,7 +66,9 @@
       if (menuConfig.url == null || menuConfig.url.trim().length === 0) {
         return
       }
+      
       this.$router.push(menuConfig.url)
+      this.$store.commit("pushtags", menuConfig)
     },
     // 鑾峰彇鑿滃崟閰嶇疆
     __getMenuConfig (value, key, menus) {
@@ -92,37 +95,6 @@
   height: 100%;
   display: flex;
   flex-direction: column;
-  // LOGO
-  .logo {
-    height: 60px;
-    flex-shrink: 0;
-    line-height: 60px;
-    overflow: hidden;
-    display: flex;
-    background: $primary-color - 20;
-    padding: 0 16px;
-    & > div {
-      width: 32px;
-      flex-shrink: 0;
-      margin-right: 12px;
-      img {
-        width: 100%;
-        flex-shrink: 0;
-        vertical-align: middle;
-        position: relative;
-        top: -2px;
-      }
-    }
-    h1 {
-      font-size: 16px;
-      font-weight: 500;
-      transition: opacity ease .3s;
-      overflow: hidden;
-      &.hidden {
-        opacity: 0;
-      }
-    }
-  }
 }
 </style>
 <style lang="scss">
@@ -136,11 +108,11 @@
     background: $primary-color;
     // 閫変腑鐘舵��
     &.is-active {
-      background: $primary-color - 40 !important;
+      background: $primary-color-sel !important;
     }
     // 鎮诞
     &:hover {
-      background-color: $primary-color - 12;
+      background-color: $primary-color-hover;
     }
     &:focus {
       background: $primary-color;
@@ -153,13 +125,13 @@
     }
     &.is-active {
       .el-submenu__title{
-        background-color: $primary-color - 20;
+        background-color: $icon-background-color;
       }
       .el-menu .el-menu-item{
-        background-color: $primary-color - 20;
+        background-color: $icon-background-color;
         // 鎮诞
         &:hover {
-          background-color: $primary-color - 30;
+          background-color: $icon-background-color;
         }
       }
     }
diff --git a/company/src/components/common/Pagination.vue b/company/src/components/common/Pagination.vue
index 975a875..86ea4d2 100644
--- a/company/src/components/common/Pagination.vue
+++ b/company/src/components/common/Pagination.vue
@@ -2,7 +2,7 @@
   <div class="table-pagination">
     <el-pagination
       :current-page="pagination.pageIndex"
-      :page-sizes="[10, 20, 30, 40]"
+      :page-sizes="pagination.pageSizes||[10, 20, 30, 40]"
       :page-size="pagination.pageSize"
       layout="total, sizes, prev, pager, next, jumper"
       :total="pagination.total"
diff --git a/company/src/components/common/PositionSelect.vue b/company/src/components/common/PositionSelect.vue
index dd8c279..7ff6b2b 100644
--- a/company/src/components/common/PositionSelect.vue
+++ b/company/src/components/common/PositionSelect.vue
@@ -93,7 +93,7 @@
 }
 .vue-treeselect {
   line-height: 30px;
-  /deep/ .vue-treeselect__control {
+  ::deep .vue-treeselect__control {
     height: 32px;
     .vue-treeselect__single-value {
       line-height: 30px;
diff --git a/company/src/components/common/RichEditor.vue b/company/src/components/common/RichEditor.vue
new file mode 100644
index 0000000..4ac38b2
--- /dev/null
+++ b/company/src/components/common/RichEditor.vue
@@ -0,0 +1,158 @@
+<template>
+  <div style="border: 1px solid #ccc;">
+    <Toolbar
+      style="border-bottom: 1px solid #ccc"
+      :editor="editor"
+      :defaultConfig="toolbarConfig"
+      :mode="mode"
+    />
+    <Editor
+      style="height: 300px; overflow-y: hidden;"
+      :value="content.content"
+      :mode="mode"
+      :defaultConfig="editorConfig"
+      @onCreated="onCreated"
+      @onChange="onChange"
+      @input="html=$event"
+    />
+  </div>
+</template>
+
+<script>
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+export default {
+  name: 'RichEditor',
+  components: { Editor, Toolbar },
+  props: {
+    content: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      editor: null,
+      html: '<p><br></p>',
+      toolbarConfig: {
+        toolbarKeys: [
+          "headerSelect",
+          "blockquote",
+          "|",
+          "bold",
+          "underline",
+          "italic",
+          {
+              "key": "group-more-style",
+              "title": "鏇村",
+              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M204.8 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M505.6 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M806.4 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path></svg>",
+              "menuKeys": [
+                  "through",
+                  "code",
+                  "sup",
+                  "sub",
+                  "clearStyle"
+              ]
+          },
+          "color",
+          "bgColor",
+          "|",
+          "fontSize",
+          "fontFamily",
+          "lineHeight",
+          "|",
+          "bulletedList",
+          "numberedList",
+          "todo",
+          {
+              "key": "group-justify",
+              "title": "瀵归綈",
+              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>",
+              "menuKeys": [
+                  "justifyLeft",
+                  "justifyRight",
+                  "justifyCenter",
+                  "justifyJustify"
+              ]
+          },
+          {
+              "key": "group-indent",
+              "title": "缂╄繘",
+              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>",
+              "menuKeys": [
+                  "indent",
+                  "delIndent"
+              ]
+          },
+          // "|",
+          "emotion",
+          "insertLink",
+          {
+              "key": "group-image",
+              "title": "鍥剧墖",
+              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>",
+              "menuKeys": [
+                  "insertImage",
+                  "uploadImage"
+              ]
+          },
+          "insertTable",
+          "codeBlock",
+          "divider",
+          "|",
+          "undo",
+          "redo",
+          "|",
+          "fullScreen"
+        ]
+      },
+      editorConfig: {
+        placeholder: '璇疯緭鍏ュ唴瀹�...',
+        MENU_CONF: {
+          uploadImage: {
+            // server: '/api/upload',
+            name: 'file',
+            server: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
+            meta: {
+              folder: 'shop'
+            },
+            onBeforeUpload(file) {    // JS 璇硶
+              // file 閫変腑鐨勬枃浠讹紝鏍煎紡濡� { key: file }
+              // debugger
+              return file
+            },
+            onSuccess(file, res) {
+                console.log(`${file.name} 涓婁紶鎴愬姛`, res)
+            },
+            onError(file, err, res) {
+              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res)
+            },
+          },
+
+        }
+      },
+      mode: 'default', // or 'simple'
+    }
+  },
+  beforeDestroy() {
+    const editor = this.editor
+    if (editor == null) return
+    editor.destroy() // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒
+  },
+  methods: {
+    onCreated (editor) {
+      this.editor = Object.seal(editor)
+    },
+    onChange (editor) {
+      console.log(this.html);
+      // debugger
+      if (!this.html||this.content.content==this.html) {
+        return
+      }
+      this.$emit('edit', this.html)
+    },
+  },
+
+}
+</script>
+
+<style src="@wangeditor/editor/dist/css/style.css"></style>
diff --git a/company/src/components/common/SearchFormCollapse.vue b/company/src/components/common/SearchFormCollapse.vue
index 0c1dcbf..5e602b8 100644
--- a/company/src/components/common/SearchFormCollapse.vue
+++ b/company/src/components/common/SearchFormCollapse.vue
@@ -31,7 +31,7 @@
     height: 50px;
     overflow: hidden;
     padding-right: 250px;
-    /deep/ section {
+    ::v-deep section {
       position: absolute;
       top: 0;
       right: 100px;
diff --git a/company/src/components/common/ShowRich.vue b/company/src/components/common/ShowRich.vue
new file mode 100644
index 0000000..7a7c9d9
--- /dev/null
+++ b/company/src/components/common/ShowRich.vue
@@ -0,0 +1,42 @@
+<template>
+  <GlobalAlertWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <Editor v-if="form.content" v-model="form.content" :defaultConfig="{ readOnly : true }" />
+    <div slot="footer"></div>
+  </GlobalAlertWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+import { Editor } from '@wangeditor/editor-for-vue'
+export default {
+  name: 'ShowRich',
+  extends: BaseOpera,
+  components: { GlobalAlertWindow, Editor },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        content: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/areas',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+   
+  },
+}
+</script>
diff --git a/company/src/components/common/Tree.vue b/company/src/components/common/Tree.vue
new file mode 100644
index 0000000..432a1a6
--- /dev/null
+++ b/company/src/components/common/Tree.vue
@@ -0,0 +1,135 @@
+<template>
+    <div class="tree">
+        <div v-for="(item, index) of list" :key="index" @click.stop="clickIten(item)">
+            <div class="tree_item">
+                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item[defaultProps.status] }" v-show="item[defaultProps.status] && item[defaultProps.children]"></i>
+                <i class="el-icon-caret-right color" v-show="item[defaultProps.children] && !item[defaultProps.status]"></i>
+                <div class="tree_item_label long-title-style" :title="item[defaultProps.name]" :class="{ 'activeColor': item[defaultProps.status] && !item[defaultProps.children] }">{{ item[defaultProps.name] }}</div>
+            </div>
+            <div class="tree_childern" v-show="item[defaultProps.status]">
+                <tree
+                  :list="item[defaultProps.children]"
+                  :defaultProps="defaultProps"
+                  @callback="callback"
+                />
+                 <!-- @callback="callback" -->
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// import Bus from '@/utils/eventBus'
+export default {
+  name: 'tree',
+  props: {
+    list: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    defaultProps: {
+      type: Object,
+      require: false,
+      default: () => {
+        return {
+          name: 'name',
+          status: 'status',
+          children: 'children',
+          id: 'id'
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      tempItem: {
+        id: null,
+        name: null
+      }
+    }
+  },
+  methods: {
+    // 鐐瑰嚮褰撳墠椤�
+    clickIten (item) {
+      item[this.defaultProps.status] = !item[this.defaultProps.status]
+      this.list.forEach(subItem => {
+        if ((subItem[this.defaultProps.id] !== item[this.defaultProps.id] && subItem[this.defaultProps.status]) || (this.list.length === 1 && subItem[this.defaultProps.status] === false)) {
+          subItem[this.defaultProps.status] = false
+          if (subItem[this.defaultProps.children]) {
+            this.recursion(subItem[this.defaultProps.children])
+          }
+        }
+      })
+      if (this.tempItem['id'] === item[this.defaultProps.id]) {
+        this.tempItem = {
+          id: null,
+          name: null
+        }
+      } else {
+        this.tempItem.id = item[this.defaultProps.id]
+        this.tempItem.name = item[this.defaultProps.name]
+      }
+    
+      this.$emit('callback', this.tempItem, item)
+    },
+    // 閫掑綊鏂规硶
+    recursion (children) {
+      children.forEach(item => {
+        item[this.defaultProps.status] = false
+        if (item[this.defaultProps.children]) {
+          this.recursion(item[this.defaultProps.children])
+        }
+      })
+    },
+    callback (data, item) {
+      if (this.tempItem.id === data.id) {
+        this.tempItem = {}
+      } else {
+        this.tempItem.id = data.id
+        this.tempItem.name = data.name
+      }
+      this.$emit('callback', this.tempItem, item)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tree {
+    /*width: 100%;*/
+    /*height: auto;*/
+    /*border-radius: 5px;*/
+    /*overflow: hidden;*/
+    /*border: 1px solid #eeeeee;*/
+    /*box-sizing: border-box;*/
+    .tree_childern {
+        margin-left: 20px;
+    }
+    .activeItem {
+        background: #F4F7FC;
+    }
+    .tree_item {
+        display: flex;
+        align-items: center;
+        height: 48px;
+        cursor: pointer;
+        padding-left: 10px;
+        .tree_item_label {
+            font-size: 14px;
+            font-weight: 400;
+            color: #333333;
+            white-space: nowrap;
+        }
+        i {
+            margin-right: 5px;
+        }
+        .color {
+            color: #999999 !important;
+        }
+        .activeColor {
+            color: #305ED5 !important;
+        }
+    }
+}
+</style>
diff --git a/company/src/components/common/TreeSelect.vue b/company/src/components/common/TreeSelect.vue
index fc2efdf..d9cf2e6 100644
--- a/company/src/components/common/TreeSelect.vue
+++ b/company/src/components/common/TreeSelect.vue
@@ -57,7 +57,7 @@
   }
   .vue-treeselect {
     line-height: 30px;
-    /deep/ .vue-treeselect__control {
+    ::v-deep .vue-treeselect__control {
       height: 32px;
       .vue-treeselect__single-value {
         line-height: 30px;
diff --git a/company/src/components/common/UploadAvatarImage.vue b/company/src/components/common/UploadAvatarImage.vue
index ac31f3c..e0d737e 100644
--- a/company/src/components/common/UploadAvatarImage.vue
+++ b/company/src/components/common/UploadAvatarImage.vue
@@ -1,18 +1,18 @@
 <template>
   <div>
     <el-upload
-      :style="customStyle"
+      class="avatar-uploader"
+      accept=".png,.jpg"
       :action="uploadImgUrl"
       :data="uploadData"
       :show-file-list="false"
       :on-success="handleAvatarSuccess"
       :on-error="uploadError"
       :before-upload="beforeAvatarUpload">
-      <img v-if="file.imgurlfull" :src="file.imgurlfull" :style="customStyle" class="avatar">
-      <div v-else :style="customStyle">
-        <i class="el-icon-plus avatar-uploader-icon"></i>
-        <div class="tips-style">{{ tipsLabel }}</div>
-      </div>
+      <template v-if="file.imgurlfull">
+        <img :src="file.imgurlfull" class="avatar">
+      </template>
+      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
     </el-upload>
   </div>
 
@@ -25,16 +25,16 @@
       type: Object,
       default: () => {}
     },
-    uploadData: Object,
-    tipsLabel: '',
-    customStyle: {
-      type: String,
-      default: 'width: 90px; height: 90px;'
-    }
+    uploadData: Object
   },
   data() {
     return {
-      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
+      // uploadData: {
+      //   folder: 'upload',
+      //   type: 'image'
+      // },
+      imgurlfull: ''
     }
   },
 
@@ -42,36 +42,41 @@
     // 涓婁紶鍥剧墖
     handleAvatarSuccess(res, file) {
       if (res.code == 200) {
-        let { data } = res
-        this.file.imgurl = data.imgaddr;
-        this.file.imgurlfull = data.url;
-        this.$message.success('涓婁紶鎴愬姛')
-        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
+        this.file.imgurl = res.data.imgaddr;
+        this.file.imgurlfull = res.data.url;
+        this.$tip.apiSuccess('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { imgurl: res.data.imgaddr, imgurlfull: res.data.url })
       } else {
-        this.$message.error('涓婁紶澶辫触')
+        this.$tip.apiFailed('涓婁紶澶辫触')
       }
       this.$emit('uploadEnd')
     },
     uploadError() {
-      this.$message.error('涓婁紶澶辫触')
+      this.$tip.apiFailed('涓婁紶澶辫触')
       this.$emit('endUpload')
     },
     // // 鎷︽埅
     beforeAvatarUpload(file) {
       this.$emit('uploadBegin')
-      return true;
-    },
-  },
+      return true
+    }
+  }
 }
 </script>
 
 <style lang="scss" scoped>
 $image-width: 100px;
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
 ::v-deep .el-upload {
   border: 1px dashed #d9d9d9;
   border-radius: 6px;
   cursor: pointer;
   position: relative;
+  width: $image-width;
+  height: $image-width;
   overflow: hidden;
 }
 .avatar-uploader .el-upload:hover {
@@ -80,18 +85,34 @@
 .avatar-uploader-icon {
   font-size: 28px;
   color: #8c939d;
-  line-height: 90px;
+  width: $image-width;
+  height: $image-width;
+  line-height: $image-width;
   text-align: center;
 }
 .avatar {
+  width: $image-width;
+  height: $image-width;
   display: block;
 }
-.tips-style {
-  height: 13px;
-  font-size: 13px;
-  font-weight: 400;
-  color: #999999;
-  line-height: 13px;
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
 }
 </style>
 
diff --git a/company/src/components/common/UploadImage.vue b/company/src/components/common/UploadImage.vue
new file mode 100644
index 0000000..67ccb8a
--- /dev/null
+++ b/company/src/components/common/UploadImage.vue
@@ -0,0 +1,155 @@
+<template>
+  <div>
+    <el-upload
+      :action="uploadImgUrl"
+      :data="uploadData"
+      list-type="picture-card"
+      :file-list="fileList"
+      accept=".jpg,.png"
+      :before-upload="beforeUpload"
+      :on-success="uploadSuccess"
+      :on-error="fail"
+    >
+      <i class="el-icon-plus icon"></i>
+      <div slot="file" slot-scope="{file}">
+        <img
+          class="el-upload-list__item-thumbnail"
+          :src="file.url" alt=""
+          style="width: 100px;height: 100px;"
+        >
+        <span class="el-upload-list__item-actions">
+          <span
+            class="el-upload-list__item-preview"
+            @click="handlePictureCardPreview(file)"
+          >
+            <i class="el-icon-zoom-in"></i>
+          </span>
+          <span
+            class="el-upload-list__item-delete"
+            @click="handleRemove(file)"
+          >
+            <i class="el-icon-delete"></i>
+          </span>
+        </span>
+      </div>
+    </el-upload>
+    <el-image-viewer 
+      v-if="showViewer" 
+      :on-close="closeViewer"
+      :initialIndex="tempIndex"
+      :url-list="srcList"
+      :z-index="3000"
+    />
+  </div>
+  
+</template>
+
+<script>
+import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+export default {
+  components: {
+    ElImageViewer
+  },
+  props: {
+    fileList: {
+      type: Array,
+      default: () => []
+    },
+    uploadData: Object,
+  },
+  data() {
+    return {
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
+      
+      realList: [],
+      srcList: [],
+      tempIndex: 0,
+      showViewer: false,
+    }
+  },
+  watch: {
+    fileList: {
+      handler(val) {
+        console.log(val);
+        if (val.length==0) {
+          this.realList = []
+          this.srcList = []
+        }
+      }
+      
+    }
+  },
+  methods: {
+    beforeUpload(file) {
+      
+      this.$emit('beginUpload')
+      return true
+    },
+     // 涓婁紶鍥剧墖鎴愬姛
+     uploadSuccess (res, file, fileList) {     
+      // console.log('this.fileList', this.fileList);
+      // console.log('fileList', fileList);
+      this.$emit('endUpload')
+      this.realList = fileList
+      this.srcList.push(res.data.url)
+      // console.log('file', file);
+      if (res.code === 200) {
+        this.fileList.push(
+          {
+            fileurl: res.data.imgaddr,
+            name: res.data.originname,
+            url: res.data.url
+          }
+        )
+      } else {
+        this.$message.error(res.msg || '涓婁紶澶辫触')
+      }
+    },
+    fail (err, file, fileList) {
+      this.$emit('endUpload')
+      this.$message.error('涓婁紶澶辫触')
+    },
+    handlePictureCardPreview(file) {
+      // this.tempIndex = this.srcList.findIndex(item => item == file.response.data.url )
+      // console.log(file);
+      this.tempIndex = this.fileList.findIndex(item => item.url == file.url )
+      // console.log( this.tempIndex);
+      this.srcList = this.fileList.map(item => item.url)
+      this.showViewer = true
+    },
+    closeViewer() {
+      this.showViewer = false
+    },
+    handleRemove(file) {
+      console.log(this.fileList);
+      let tempIndex = this.realList.findIndex(item => item.url === file.url)
+      // debugger
+      this.realList.splice(tempIndex, 1)
+      this.fileList.splice(tempIndex, 1)
+      this.srcList.splice(tempIndex, 1)
+      
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
+
diff --git a/company/src/components/common/myImage.vue b/company/src/components/common/myImage.vue
new file mode 100644
index 0000000..a159f20
--- /dev/null
+++ b/company/src/components/common/myImage.vue
@@ -0,0 +1,84 @@
+<template>
+  <div>
+    {{ src }}
+    <img
+      class="el-upload-list__item-thumbnail"
+      :src="src" alt=""
+      :style="`width: ${width}px;height: ${height}px;`"
+      @click="handlePictureCardPreview()"
+    >
+    <el-image-viewer 
+      v-if="showViewer" 
+      :on-close="closeViewer"
+      :initialIndex="tempIndex"
+      :url-list="previewSrcList"
+      :z-index="3000"
+    />
+  </div>
+  
+</template>
+
+<script>
+import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+export default {
+  components: {
+    ElImageViewer
+  },
+  props: {
+    src: {
+      type: String,
+      default: ''
+    },
+    width: {
+      type: Number,
+      default: 100
+    },
+    height: {
+      type: Number,
+      default: 100
+    },
+    previewSrcList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      tempIndex: 0,
+      showViewer: false,
+    }
+  },
+
+  methods: {
+    handlePictureCardPreview() {
+      console.log(this.src);
+      this.tempIndex = this.srcList.findIndex(item => item == this.src )
+      this.showViewer = true
+    },
+    closeViewer() {
+      this.showViewer = false
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
+
diff --git a/company/src/components/common/tagsview.vue b/company/src/components/common/tagsview.vue
new file mode 100644
index 0000000..c5afffa
--- /dev/null
+++ b/company/src/components/common/tagsview.vue
@@ -0,0 +1,261 @@
+<template>
+  <div class="tags-view-style" style="display:flex; overflow-x: scroll;">
+    <i class="el-icon-arrow-left btn" v-if="leftStatus" :class="leftStatus?'nor-btn':'ban-btn'" @click="scrollToStart()"></i>
+    <div id="tags-box" ref="tags">
+      <div
+        v-for="(item, index) in tags"
+        :key="index"
+        :id="'tags-box-' + index"
+        @contextmenu.prevent="openMenu(item,$event)"
+        :class="isActive(item.url,index)?'active':''"
+        class="tagsview"
+        @click="tagsmenu(item, index)"
+      >
+        {{ item.label }}
+        <!-- 杩欎釜鍦版柟涓�瀹氳click鍔犱釜stop闃绘锛屼笉鐒朵細鍥犱负浜嬩欢鍐掓场涓�鐩磋Е鍙戠埗鍏冪礌鐨勭偣鍑讳簨浠讹紝鏃犳硶璺宠浆鍙︿竴涓矾鐢� -->
+        <span v-if="tags.length > 1" class="el-icon-close tagsicon" @click.stop="handleClose(item,index)"></span>
+        <!-- <ul v-show="visible" class="contextmenu" :style="{left:left+'px',top:top+'px'}">
+          <li @click.stop="rightClose()">鍏抽棴</li>
+          <li @click.stop="cleartags($route.path)">鍏抽棴鍏朵粬</li>
+        </ul> -->
+      </div>
+    </div>
+    <i class="el-icon-arrow-right btn" v-if="rightStatus"  :class="rightStatus?'nor-btn':'ban-btn'" @click="scrollToEnd()"></i>
+  </div>
+</template>
+
+<script>
+//杩欎釜灏辨槸瀵煎叆vuex鐨勬暟鎹紝閰嶅悎涓嬮潰...map鐢�
+import { mapState, mapMutations } from "vuex";
+export default {
+  data() {
+    return {
+      //鍙抽敭鑿滃崟闅愯棌瀵瑰簲甯冨皵鍊�
+      visible: false,
+      //鍙抽敭鑿滃崟瀵瑰簲浣嶇疆
+      top: 0,
+      left: 0,
+      leftStatus: false,
+      rightStatus: false,
+    }
+  },
+  computed: {
+    //寮曞叆vuex涓璼tate涓殑tags鏁版嵁锛屼竴鏍穞his璋冪敤灏辫
+    ...mapState(["tags"]),
+  },
+  watch:{
+    //鐩戝惉鍙抽敭鑿滃崟鐨勫�兼槸鍚︿负true锛屽鏋滄槸灏卞垱寤哄叏灞�鐩戝惉鐐瑰嚮浜嬩欢锛岃Е鍙慶loseMenu浜嬩欢闅愯棌鑿滃崟锛屽鏋滄槸false灏卞垹闄ょ洃鍚�
+    visible(value) {
+      if (value) {
+        document.body.addEventListener('click', this.closeMenu)
+      } else {
+        document.body.removeEventListener('click', this.closeMenu)
+      }
+    },
+    $route(to,from){
+      this.tags.forEach((item, index) => {
+        if (item.url === to.path) {
+          let tagsDiv = document.getElementById('tags-box')
+          if (index) {
+            tagsDiv.scrollTo(index * 110, 0)
+          } else {
+            tagsDiv.scrollTo(0, 0)
+          }
+        }
+      })
+    }
+
+  },
+  mounted() {
+    this.$refs.tags.addEventListener('scroll', e => {
+      
+      if (this.$refs.tags.scrollLeft > 0) {
+        this.leftStatus = true
+      } else {
+        this.leftStatus = false
+      }
+      if (this.$refs.tags.scrollLeft + this.$refs.tags.clientWidth < this.$refs.tags.scrollWidth) {
+       this.rightStatus = true
+      } else {
+        this.rightStatus = false
+      }
+
+    }, false)
+  },
+  methods: {
+    //寮曞叆vuex涓璵utation鏂规硶锛屽彲浠ョ洿鎺his.xxx璋冪敤浠�
+    ...mapMutations(["closeTab", "cleartagsview"]),
+    //鐐瑰嚮鍙夊弶鍒犻櫎鐨勪簨浠�
+    rightClose() {
+      this.visible = false
+      if (this.tags.length == 1) {
+        return
+      }
+      let index = this.tags.indexOf(this.selectedTag)
+      this.handleClose(this.selectedTag, index)
+    },
+    handleClose(item, index) {
+      if (this.tags.length == 1) {
+        return
+      }
+      //鍏堟妸闀垮害淇濆瓨涓嬫潵鍚庨潰鐢ㄦ潵姣旇緝鍋氬垽鏂潯浠�
+      let length = this.tags.length - 1;
+      //vuex璋冩柟娉�,涓婇潰...map寮曞叆鐨剉uex鏂规硶锛屼笉浼氳繖绉嶆柟娉曠殑鐪媣ue瀹樼綉鏂囨。
+      this.closeTab(item);
+      // 濡傛灉鍏抽棴鐨勬爣绛句笉鏄綋鍓嶈矾鐢辩殑璇濓紝灏变笉璺宠浆
+      if (item.url !== this.$route.path) {
+        return;
+      }
+      // 鍒ゆ柇锛氬鏋渋ndex鍜宭ength鏄竴鏍风殑锛岄偅灏变唬琛ㄩ兘鏄竴鏍风殑闀垮害锛屽氨鏄渶鍚庝竴浣嶏紝閭e氨寰�宸﹁烦杞竴涓�
+      if (index === length) {
+        //鍐嶅垽鏂細濡傛灉length=0锛屼篃灏辨槸璇翠綘鍒犲畬浜嗘墍鏈夋爣绛�
+        if (length === 0) {
+          //閭d箞鍐嶅垽鏂細濡傛灉褰撳墠璺敱涓嶇瓑浜巌ndex锛屼篃灏辨槸鎴戦椤电殑璺敱
+          if (this.$route.path !== "/index") {
+            //閭d箞灏辫烦杞椤点�傝繖涓�姝ョ殑鎰忔�濇槸锛氬鏋滃垹闄ょ殑鏈�鍚庝竴涓爣绛句笉鏄椤靛氨缁熶竴璺宠浆棣栭〉锛屽鏋滀綘鍒犻櫎鐨勬渶鍚庝竴涓爣绛炬槸棣栭〉鏍囩锛屽凡缁忓湪杩欎釜棣栭〉璺敱涓婁簡锛屼綘杩樿烦涓粈涔堝憿銆傝繖涓嶉噸澶嶆搷浣滀簡鍚椼��
+            this.$router.push({ path: "/index" });
+          }
+        } else {
+          //閭d箞锛屽鏋滀笂闈㈢殑鏉′欢閮戒笉鎴愮珛锛屾病鏈塴ength=0.涔熷氨鏄浣犺繕鏈夊ソ鍑犱釜鏍囩锛屽苟涓斾綘鍒犻櫎鐨勬槸鏈�鍚庝竴浣嶆爣绛撅紝閭d箞灏卞線宸﹁竟鎸竴浣嶈烦杞矾鐢�
+          this.$router.push({ path: this.tags[index - 1].url });
+        }
+      } else {
+        // 濡傛灉浣犵偣鍑讳笉鏄渶鍚庝竴浣嶆爣绛撅紝鐐圭殑鍓嶉潰鐨勶紝閭e氨寰�鍙宠竟璺宠浆
+        this.$router.push({ path: this.tags[index].url });
+      }
+    },
+    //鐐瑰嚮璺宠浆璺敱
+    tagsmenu(item, index) {
+      console.log('tagsmenu');
+      //鍒ゆ柇锛氬綋鍓嶈矾鐢变笉绛変簬褰撳墠閫変腑椤圭殑url锛屼篃灏变唬琛ㄤ綘鐐瑰嚮鐨勪笉鏄幇鍦ㄩ�変腑鐨勬爣绛撅紝鏄彟涓�涓爣绛惧氨璺宠浆杩囧幓锛屽鏋滀綘鐐瑰嚮鐨勬槸鐜板湪宸茬粡閫変腑鐨勬爣绛惧氨涓嶇敤璺宠浆浜嗭紝鍥犱负浣犲凡缁忓湪杩欎釜璺敱浜嗚繕璺充粈涔堝憿銆�
+      if (this.$route.path !== item.url) {
+        //鐢╬ath鐨勮烦杞柟娉曟妸褰撳墠椤圭殑url褰撲綔鍦板潃璺宠浆銆�
+        this.$router.push({ path: item.url });
+        let tagsDiv = document.getElementById('tags-box')
+        if (index) {
+          tagsDiv.scrollTo(index * 110, 0)
+        }
+      }
+    },
+    //閫氳繃鍒ゆ柇璺敱涓�鑷磋繑鍥炲竷灏斿�兼坊鍔燾lass锛屾坊鍔犻珮浜晥鏋�
+    isActive(route, index) {
+      let res = route === this.$route.path
+      return res
+    },
+    scrollToStart() {
+
+      let tagsDiv = document.getElementById('tags-box')
+      tagsDiv.scrollTo(0, 0)
+    }, 
+    scrollToEnd() {
+      let tagsDiv = document.getElementById('tags-box')
+      tagsDiv.scrollTo(tagsDiv.scrollWidth, 0)
+    },
+    //鍙抽敭浜嬩欢锛屾樉绀哄彸閿彍鍗曪紝骞跺浐瀹氬ソ浣嶇疆銆�
+    openMenu(tag, e) {
+      this.visible = true
+      this.selectedTag = tag
+      const offsetLeft = this.$el.getBoundingClientRect().left
+      console.log(tag, e);
+      this.left = e.clientX - offsetLeft + 60  //鍙抽敭鑿滃崟璺濈宸﹁竟鐨勮窛绂�
+      this.top = e.clientY +20  //鍙抽敭鑿滃崟璺濈涓婇潰鐨勮窛绂�           杩欎袱涓彲浠ユ洿鏀癸紝鐪嬬湅鑷繁鐨勫彸閿彍鍗曞湪浠�涔堜綅缃紝鑷繁璋�
+    },
+    //闅愯棌鍙抽敭鑿滃崟
+    closeMenu() {
+      this.visible = false
+    },
+    //鍙抽敭鑿滃崟鍏抽棴鎵�鏈夐�夐」锛岃Е鍙憊uex涓殑鏂规硶锛屾妸褰撳墠璺敱褰撳弬鏁颁紶杩囧幓鐢ㄤ簬鍒ゆ柇
+    cleartags(val){
+      this.visible = false
+      this.cleartagsview(val)
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btn {
+  font-size: 20px;
+  line-height: 48px;
+  height: 48px;
+}
+.nor-btn {
+  color: #666;
+  cursor: pointer;
+  &:hover {
+    color: #2E68EC;
+  }
+}
+
+.ban-btn {
+  color: #999;
+  cursor:not-allowed
+}
+
+#tags-box {
+  overflow-x: hidden;
+  white-space: nowrap;
+  flex: 1;
+  // width: 240px;
+  scrollbar-width: none; /* firefox */
+  -ms-overflow-style: none; /* IE 10+ */
+  &::-webkit-scrollbar {
+      display: none; /* Chrome Safari */
+    }
+}
+#tags-box::-webkit-scrollbar {
+    display: none; /* Chrome Safari */
+}
+//鏍囩瀵艰埅鏍峰紡
+.tagsview {
+  cursor: pointer;
+  // margin-left: 4px;
+  height: 48px;
+  line-height: 48px;
+  padding: 0 8px 0 24px;
+  // border: 1px solid #d8dce5;
+  // border-radius: 5px;
+  color: #000;
+  font-size: 14px;
+  display: inline-block;
+
+}
+//鍙夊彿榧犳爣缁忚繃鏍峰紡
+.tagsicon:hover{
+  color: #f56c6c;
+}
+//鏍囩楂樹寒
+.active{
+  color: #2E68EC;
+  border-bottom: 2px solid #2E68EC;
+}
+//鍙抽敭鑿滃崟鏍峰紡
+.contextmenu {
+  margin: 0;
+  background: #fff;
+  z-index: 100;
+  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;
+    }
+  }
+}
+.tags-view-style {
+  scrollbar-width: none; /* firefox */
+  -ms-overflow-style: none; /* IE 10+ */
+  &::-webkit-scrollbar {
+    display: none; /* Chrome Safari */
+  }
+}
+</style>
diff --git a/company/src/layouts/AppLayout.vue b/company/src/layouts/AppLayout.vue
index 476998f..c0aa936 100644
--- a/company/src/layouts/AppLayout.vue
+++ b/company/src/layouts/AppLayout.vue
@@ -1,31 +1,49 @@
 <template>
-  <el-container class="app-layout">
-    <el-aside :class="{collapse:menuData.collapse}">
-      <Menu/>
-    </el-aside>
-    <el-main>
-      <header>
-        <AppHeader/>
-      </header>
-      <main>
-        <transition name="fade">
-          <router-view></router-view>
-        </transition>
-      </main>
-    </el-main>
-  </el-container>
+  <div>
+    <CommonHeader />
+    <div style="height:10px; background: #fff"></div>
+    <el-container class="app-layout">
+      <el-aside :class="{collapse:menuData.collapse}">
+        <Menu/>
+      </el-aside>
+      <el-main>
+        <header>
+          <AppHeader/>
+        </header>
+        <div style="height:10px;"></div>
+        <main>
+          <transition name="fade">
+            <keep-alive>
+              <router-view></router-view>
+            </keep-alive>
+          </transition>
+        </main>
+      </el-main>
+    </el-container>
+
+  </div>
 </template>
 
 <script>
 import { mapState } from 'vuex'
 import Header from '@/components/common/Header'
+import CommonHeader from '@/components/common/CommonHeader'
 import Menu from '@/components/common/Menu'
 export default {
   name: 'DefaultLayout',
-  components: { AppHeader: Header, Menu },
+  components: { AppHeader: Header, Menu, CommonHeader },
+  data() {
+    return {
+      isFinishData: false
+    }
+  },
   computed: {
-    ...mapState(['menuData'])
-  }
+    ...mapState(['menuData', 'userInfo'])
+  },
+
+  methods: {
+
+  },
 }
 </script>
 
@@ -34,17 +52,27 @@
 .el-container {
   background: #F7F8F9;
   height: 100%;
+
   display: flex;
-  overflow: hidden;
+  // overflow: hidden;
+  overflow: scroll;
   // 宸﹁竟鑿滃崟
   .el-aside {
     width: $menu-width !important;
     flex-shrink: 0;
-    height: 100%;
-    overflow-y: auto;
+    // height: 100%;
+    // height: 900px;
+    height: calc(100vh - 80px);
+    overflow-y: scroll;
+    overflow-x: hidden;
     background: $primary-color;
     color: #fff;
     transition: width ease .3s;
+    scrollbar-width: none; /* firefox */
+    -ms-overflow-style: none; /* IE 10+ */
+    &::-webkit-scrollbar {
+      display: none; /* Chrome Safari */
+    }
     &.collapse {
       width: 64px !important;
     }
@@ -52,14 +80,21 @@
   // 鍙宠竟鍐呭
   .el-main {
     width: 100%;
-    height: 100%;
+    // height: 100%;
+    height: calc(100vh - 90px);
     padding: 0;
     position: relative;
     display: flex;
     flex-direction: column;
-    overflow: hidden;
+    overflow-y: scroll;
+    overflow-x: hidden;
+    scrollbar-width: none; /* firefox */
+    -ms-overflow-style: none; /* IE 10+ */
+    &::-webkit-scrollbar {
+      display: none; /* Chrome Safari */
+    }
     & > header {
-      height: $header-height;
+      height: 48px;
       flex-shrink: 0;
     }
     & > main {
@@ -81,4 +116,33 @@
   transition: all .5s;
   position: absolute;
 }
+.comfirm {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  background-color: rgba(0, 0, 0, 0.3);
+  z-index: 1000;
+  .container {
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+    background-color: #fff;
+    width: 500px;
+    height: 120px;
+    padding: 30px;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    .complete {
+      display: flex;
+      flex-direction: row-reverse;
+    }
+  }
+}
 </style>
diff --git a/company/src/layouts/TableLayout.vue b/company/src/layouts/TableLayout.vue
index d64e0ae..2a12773 100644
--- a/company/src/layouts/TableLayout.vue
+++ b/company/src/layouts/TableLayout.vue
@@ -1,11 +1,11 @@
 <template>
   <div class="table-layout">
     <!-- 澶撮儴 -->
-    <div v-if="withBreadcrumb" class="table-header">
+<!--    <div v-if="withBreadcrumb" class="table-header">
       <el-breadcrumb separator="/">
         <el-breadcrumb-item v-for="path in paths" :key="path">{{path}}</el-breadcrumb-item>
       </el-breadcrumb>
-    </div>
+    </div>-->
     <Profile :roles="roles" :permissions="permissions">
       <!-- 鎼滅储琛ㄥ崟閮ㄥ垎 -->
       <div class="table-search-form">
diff --git a/company/src/plugins/download.js b/company/src/plugins/download.js
index 39ba4c5..f4c5876 100644
--- a/company/src/plugins/download.js
+++ b/company/src/plugins/download.js
@@ -2,12 +2,11 @@
 import message from './message'
 
 export default function (response, decode = true, mime = 'application/octet-stream') {
-  // debugger
   // 褰撲笅杞芥帴鍙f病鏈夋垚鍔熻繑鍥炴祦骞朵笖鎺ュ彛杩斿洖鐨勬槸JSON鏃堕渶瑕佸鍝嶅簲娴佽繘琛岃В鏋愬苟鎻愮ず閿欒銆傦紙澶勭悊涓嬭浇鎺ュ彛鍑虹幇鏈煡寮傚父鐨勬儏鍐碉級
   if (response.headers['content-type'] === 'application/json') {
     const blob = new Blob([response.data])
     const fileReader = new FileReader()
-    fileReader.readAsText(blob, 'UTF-8')
+    fileReader.readAsText(blob, 'utf-8')
     fileReader.onload = function () {
       message.apiFailed(JSON.parse(fileReader.result))
     }
diff --git a/company/src/plugins/messagebox.js b/company/src/plugins/messagebox.js
index 5d3d2ec..be2c47b 100644
--- a/company/src/plugins/messagebox.js
+++ b/company/src/plugins/messagebox.js
@@ -10,6 +10,13 @@
       type: 'warning'
     })
   },
+  resetConfirm (message) {
+    return MessageBox.confirm(message, '閲嶇疆鎻愰啋', {
+      confirmButtonText: '纭閲嶇疆',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    })
+  },
   // 绂佺敤浜屾纭
   disableConfirm (message) {
     return MessageBox.confirm(message, '绂佺敤鎻愰啋', {
@@ -25,5 +32,29 @@
       cancelButtonText: '鍙栨秷',
       type: 'warning'
     })
+  },
+  // 瀹屽杽鎻愰啋
+  messageApprove (message) {
+    return MessageBox.confirm(message, '瀹℃牳鎻愰啋', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    })
+  },
+    // 闂嵎纭疄鎻愰啋
+  messageWaring (message, title, confirmText='纭畾', cancelText='鍙栨秷') {
+    return MessageBox.confirm(message, title, {
+      confirmButtonText: confirmText,
+      cancelButtonText: cancelText,
+      type: 'warning'
+    })
+  },
+  // 纭鏄惁鏈嶅姟璇ヤ紒涓�
+  cancelOrder (message) {
+    return MessageBox.confirm(message, '鍙栨秷鎻愮ず', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    })
   }
 }
diff --git a/company/src/router/index.js b/company/src/router/index.js
index 56a7f96..cf320c3 100644
--- a/company/src/router/index.js
+++ b/company/src/router/index.js
@@ -3,6 +3,7 @@
 import AppLayout from '@/layouts/AppLayout'
 import { getUserInfo } from '@/api/system/common'
 const Login = () => import('@/views/login')
+
 const ErrorNoPermissions = () => import('@/views/no-permissions')
 const Error404 = () => import('@/views/not-found')
 
@@ -18,6 +19,7 @@
       path: '/login',
       component: Login
     },
+
     // 鏃犳潈闄�
     {
       name: 'no-permissions',
@@ -52,7 +54,6 @@
   }
   // 楠岃瘉鐢ㄦ埛鏄惁鐧诲綍
   const userInfo = router.app.$options.store.state.userInfo
-  // console.log(userInfo)
   if (userInfo != null) {
     // 濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄦ潈闄�
     if (userInfo.permissions.length === 0) {
@@ -67,7 +68,6 @@
     next()
     return
   }
-  // debugger
   getUserInfo()
     .then(userInfo => {
       // 濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄦ潈闄�
diff --git a/company/src/store/index.js b/company/src/store/index.js
index 3be2adb..d2f4f72 100644
--- a/company/src/store/index.js
+++ b/company/src/store/index.js
@@ -13,7 +13,11 @@
     list: [],
     // 鏄惁鏀惰捣
     collapse: false
-  }
+  },
+  //tags鏁扮粍
+  tags:[],
+  //tagsview鏍囩鏄剧ず闅愯棌
+  isCollapse:false
 }
 
 const mutations = {
@@ -28,8 +32,12 @@
   },
   // 璁剧疆宸茬櫥褰曠殑鐢ㄦ埛淇℃伅
   setUserInfo: (state, data) => {
-    state.userInfo = data
+    state.userInfo = {
+      ...state.userInfo,
+      ...data
+    }
   },
+
   // 璁剧疆棣栭〉璺敱淇℃伅
   setHomePage (state, homePage) {
     state.homePage = homePage
@@ -37,6 +45,37 @@
   // 閲嶇疆鑿滃崟
   resetMenus: (state) => {
     state.menuData.list = []
+  },
+  //  tags
+  pushtags(state,val){
+    //濡傛灉绛変簬-1璇存槑tabs涓嶅瓨鍦ㄩ偅涔堟彃鍏ワ紝鍚﹀垯浠�涔堥兘涓嶅仛
+    //findindex鎵捐鏍囷紝寰幆鍒ゆ柇涓�涓嬶紝濡傛灉绛変簬閭d箞灏变唬琛ㄦ湁鐩稿悓鐨勶紝灏变笉蹇呮坊鍔狅紝濡傛灉鎵句笉鍒伴偅灏辨槸-1.灏辨坊鍔�
+    let result = state.tags.findIndex(item => item.label === val.label)
+    if (result === -1) {
+      state.tags.push({...val, keepAlive: false})
+    } else {
+      state.tags[result]= {...val, keepAlive: true}
+    }
+    // result === -1 ? state.tags.push(val) : (state.tags[result]==val)
+  },
+  //鍏抽棴鏍囩
+  closeTab(state, val) {
+    //鍚屼笂锛屾壘瑙掓爣锛岀劧鍚庣敤瑙掓爣鐨勪綅缃搴斿垹闄や竴浣嶃�俿plice锛氳繖鏄暟缁勭殑鍒犻櫎鏂规硶
+    let result = state.tags.findIndex(item => item.label === val.label)
+    state.tags.splice(result, 1)
+  },
+  //鍏抽棴鎵�鏈塼agsview鏍囩
+  cleartagsview(state,val){
+    //娓呯┖鏁扮粍
+    state.tags=[]
+    //璺宠浆鍒伴椤�,val鎺ュ彈浼犺繃鏉ョ殑褰撳墠璺敱
+    if(val !== "/index"){
+      router.push({path:"/index"})
+    }
+  },
+  //鏀瑰彉tagsview鏄剧ず闅愯棌
+  changeisshow(state){
+    state.isCollapse=!state.isCollapse
   }
 }
 const actions = {}
diff --git a/server/platform/src/main/resources/application.yml b/server/platform/src/main/resources/application.yml
index b77ea70..40a1f40 100644
--- a/server/platform/src/main/resources/application.yml
+++ b/server/platform/src/main/resources/application.yml
@@ -55,7 +55,7 @@
 # dao灞傜殑鏃ュ織璁剧疆涓篸ebug锛屾柟渚挎煡鐪媠ql
 logging:
   level:
-    doumeemes.dao: debug
+    com.doumee.dao: debug
 
 knife4j:
   enable: true
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
index 9f13882..6becd77 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -462,7 +462,7 @@
 
     @Override
     public Company findById(Integer id) {
-        Company model = findById(id);
+        Company model = companyMapper.selectById(id);
         if(model == null ||Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
             throw  new BusinessException(ResponseStatus.DATA_EMPTY);
         }

--
Gitblit v1.9.3