From fbf25a99e0bc643be89b0f9dd0efed7867f1490e Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 27 七月 2022 18:08:02 +0800
Subject: [PATCH] 2022-07-27

---
 src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx         |    1 
 src/views/design/header/editfirstmenu/dragelement/index.scss                     |    6 
 src/views/design/sidemenu/editsecmenu/index.scss                                 |   81 -
 src/menu/sysinterface/settingform/simplescript/index.jsx                         |    2 
 src/views/design/header/index.jsx                                                |   48 
 src/views/design/sidemenu/menuform/index.scss                                    |   18 
 src/menu/components/table/edit-table/columns/tableIn/index.jsx                   |    4 
 src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx |    2 
 src/components/thawmenu/index.jsx                                                |    1 
 src/templates/comtableconfig/index.jsx                                           |    3 
 src/views/design/header/editfirstmenu/index.jsx                                  |   30 
 src/views/design/header/editfirstmenu/dragelement/index.jsx                      |    2 
 src/views/design/sidemenu/thdmenuform/index.jsx                                  |  170 +++
 src/locales/zh-CN/model.js                                                       |    2 
 src/views/design/sidemenu/editthdmenu/menuform/index.jsx                         |   34 
 src/views/design/sidemenu/menuelement/index.scss                                 |    2 
 src/api/index.js                                                                 |    7 
 src/locales/en-US/model.js                                                       |    2 
 src/views/design/sidemenu/index.jsx                                              |  377 ++++---
 src/views/design/sidemenu/editthdmenu/index.jsx                                  |  725 ++------------
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx             |    4 
 src/views/design/sidemenu/menuform/index.jsx                                     |   22 
 src/menu/datasource/verifycard/index.jsx                                         |    2 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx            |    2 
 src/views/design/sidemenu/thdmenuform/index.scss                                 |    0 
 src/views/design/sidemenu/thdmenuplus/preview/index.jsx                          |    0 
 src/views/design/index.scss                                                      |    8 
 src/views/design/sidemenu/menuelement/card.jsx                                   |   47 
 src/views/design/sidemenu/editsecmenu/index.jsx                                  |  385 +------
 src/locales/zh-CN/mob.js                                                         |    1 
 src/menu/components/carousel/data-card/options.jsx                               |    7 
 src/views/design/sidemenu/editthdmenu/index.scss                                 |  177 ---
 src/templates/zshare/verifycard/index.jsx                                        |   14 
 src/views/design/header/editfirstmenu/index.scss                                 |   79 -
 src/views/design/sidemenu/thdmenuplus/index.scss                                 |  137 ++
 src/views/design/sidemenu/thdmenuplus/preview/index.scss                         |    0 
 src/templates/zshare/customscript/index.jsx                                      |    2 
 src/utils/option.js                                                              |   18 
 src/views/design/sidemenu/thdmenuplus/index.jsx                                  |  309 ++++++
 src/locales/en-US/mob.js                                                         |    1 
 40 files changed, 1,183 insertions(+), 1,549 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 574fa7a..3fce8f4 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -140,12 +140,9 @@
    * @description 寰俊涓氬姟璇锋眰
    */
   wxNginxRequest (url, method, param) {
-    let _url = window.GLOB.location + ':8080/' + url
+    let _url = window.GLOB.location + '/' + url
     if (process.env.NODE_ENV === 'production') {
-      _url = document.location.origin + ':8080/' + url
-    }
-    if (/https/.test(_url)) {
-      _url = _url.replace(/:8080/g, ':8443')
+      _url = document.location.origin + '/' + url
     }
     
     if (param) {
diff --git a/src/components/thawmenu/index.jsx b/src/components/thawmenu/index.jsx
index 3513d13..843b8da 100644
--- a/src/components/thawmenu/index.jsx
+++ b/src/components/thawmenu/index.jsx
@@ -53,7 +53,6 @@
         })
       }
     })
-    this.setState({visible: true})
   }
 
   submit = () => {
diff --git a/src/locales/en-US/mob.js b/src/locales/en-US/mob.js
index f01e7e8..a284d0c 100644
--- a/src/locales/en-US/mob.js
+++ b/src/locales/en-US/mob.js
@@ -20,7 +20,6 @@
   'mob.component': '缁勪欢',
   'mob.status.open': '鍚敤',
   'mob.status.change': '鍒囨崲',
-  'mob.status.forbidden': '绂佺敤',
   'mob.basemsg': '鍩烘湰淇℃伅',
   'mob.query.delete': '纭畾鍒犻櫎鍚楋紵',
   'mob.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
diff --git a/src/locales/en-US/model.js b/src/locales/en-US/model.js
index fc3ed20..e8c73bb 100644
--- a/src/locales/en-US/model.js
+++ b/src/locales/en-US/model.js
@@ -41,7 +41,6 @@
   'model.menu.level1': 'Level 1 menu',
   'model.menu.level2': 'Level 2 menu',
   'model.menu.level3': 'Level 3 menu',
-  'model.menu.resetorder': 'Are you sure to adjust the menu sequence ?',
   'model.menu.basemsg': 'Please complete the basic information !',
   'header.menu.basedata': 'The basic information',
   'header.menu.table.add': 'Add tables',
@@ -150,7 +149,6 @@
   'model.form.color': 'Color',
   'model.query.delete': '纭畾鍒犻櫎鍚�?',
   'header.form.status.change': '鐘舵�佸垏鎹�',
-  'model.status.forbidden': '绂佺敤',
   'model.status.open': '鍚敤',
   'model.form.funcbutton': 'Function button',
   'model.form.execMode': 'Mode',
diff --git a/src/locales/zh-CN/mob.js b/src/locales/zh-CN/mob.js
index 414cea3..b7f44ec 100644
--- a/src/locales/zh-CN/mob.js
+++ b/src/locales/zh-CN/mob.js
@@ -20,7 +20,6 @@
   'mob.component': '缁勪欢',
   'mob.status.open': '鍚敤',
   'mob.status.change': '鍒囨崲',
-  'mob.status.forbidden': '绂佺敤',
   'mob.basemsg': '鍩烘湰淇℃伅',
   'mob.query.delete': '纭畾鍒犻櫎鍚楋紵',
   'mob.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
diff --git a/src/locales/zh-CN/model.js b/src/locales/zh-CN/model.js
index c7d9736..57af105 100644
--- a/src/locales/zh-CN/model.js
+++ b/src/locales/zh-CN/model.js
@@ -41,7 +41,6 @@
   'model.menu.level1': '涓�绾ц彍鍗�',
   'model.menu.level2': '浜岀骇鑿滃崟',
   'model.menu.level3': '涓夌骇鑿滃崟',
-  'model.menu.resetorder': '纭璋冩暣鑿滃崟椤哄簭鍚楋紵',
   'model.menu.basemsg': '璇峰畬鍠勮彍鍗曞熀鏈俊鎭紒',
   'header.menu.basedata': '鍩烘湰淇℃伅',
   'header.menu.table.add': '娣诲姞琛ㄥ悕',
@@ -150,7 +149,6 @@
   'model.form.color': '棰滆壊',
   'model.query.delete': '纭畾鍒犻櫎鍚�?',
   'header.form.status.change': '鐘舵�佸垏鎹�',
-  'model.status.forbidden': '绂佺敤',
   'model.status.open': '鍚敤',
   'model.form.funcbutton': '鍔熻兘鎸夐挳',
   'model.form.execMode': '鎵ц鏂瑰紡',
diff --git a/src/menu/components/carousel/data-card/options.jsx b/src/menu/components/carousel/data-card/options.jsx
index 36441fe..37104ad 100644
--- a/src/menu/components/carousel/data-card/options.jsx
+++ b/src/menu/components/carousel/data-card/options.jsx
@@ -59,7 +59,10 @@
       required: false,
       options: [
         {value: 'false', label: '鍚�'},
-        {value: 'true', label: '鏄�'},
+        {value: 'true', label: '鏄�'}
+      ],
+      controlFields: [
+        {field: 'speed', values: ['true']}
       ]
     },
     {
@@ -67,7 +70,7 @@
       field: 'speed',
       label: '鏃堕棿闂撮殧',
       initval: wrap.speed || 3,
-      tooltip: '浣跨敤鑷姩鍒囨崲鏃舵湁鏁堬紝榛樿涓�3绉�',
+      tooltip: '榛樿涓�3绉�',
       min: 1,
       max: 100,
       precision: 0,
diff --git a/src/menu/components/table/edit-table/columns/tableIn/index.jsx b/src/menu/components/table/edit-table/columns/tableIn/index.jsx
index 9e83517..61698fb 100644
--- a/src/menu/components/table/edit-table/columns/tableIn/index.jsx
+++ b/src/menu/components/table/edit-table/columns/tableIn/index.jsx
@@ -80,7 +80,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopTwoTone style={{marginLeft: '5px'}} twoToneColor="#ff4d4f" />
             </div>
           ) :
@@ -133,7 +133,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopTwoTone style={{marginLeft: '5px'}} twoToneColor="#ff4d4f" />
             </div>
           ) :
diff --git a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
index ba62d69..0c76b5f 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
@@ -154,7 +154,6 @@
       label: Formdict['model.sort'],
       initVal: card.IsSort || (card.isSub ? 'false' : 'true'),
       required: true,
-      // forbidden: card.isSub,
       options: [{
         value: 'true',
         text: Formdict['model.true']
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index 16a205d..ea96ce5 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -127,7 +127,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/menu/sysinterface/settingform/simplescript/index.jsx b/src/menu/sysinterface/settingform/simplescript/index.jsx
index 49a666f..42a4ba4 100644
--- a/src/menu/sysinterface/settingform/simplescript/index.jsx
+++ b/src/menu/sysinterface/settingform/simplescript/index.jsx
@@ -66,7 +66,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopTwoTone style={{marginLeft: '5px'}} twoToneColor="#ff4d4f" />
             </div>
           ) :
diff --git a/src/templates/comtableconfig/index.jsx b/src/templates/comtableconfig/index.jsx
index cfcc56e..19d51d2 100644
--- a/src/templates/comtableconfig/index.jsx
+++ b/src/templates/comtableconfig/index.jsx
@@ -79,9 +79,6 @@
 
     if (!_LongParam) {
       _config = fromJS(Source.baseConfig).toJS()
-      if (!menu.isSubtable) { // 涓嶆槸閫夋嫨涓诲瓙琛ㄦ椂锛岄殣钘忔爣绛鹃〉
-        _config.tabgroups = [{ uuid: 'tabs', sublist: [] }]
-      }
       _config.isAdd = true
     } else {
       _config = _LongParam
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index 9e5fcf7..50df4a3 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -155,7 +155,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -206,7 +206,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index e94f798..fa8b86d 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -155,7 +155,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
index d882c99..4dad8fb 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
@@ -70,7 +70,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/templates/zshare/customscript/index.jsx b/src/templates/zshare/customscript/index.jsx
index 0a63489..f68cca2 100644
--- a/src/templates/zshare/customscript/index.jsx
+++ b/src/templates/zshare/customscript/index.jsx
@@ -58,7 +58,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 1bfb556..0ae5a3a 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -108,7 +108,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -144,7 +144,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -218,7 +218,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -270,7 +270,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -339,7 +339,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -406,7 +406,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
@@ -507,7 +507,7 @@
         render: (text, record) => record.status === 'false' ?
           (
             <div style={{color: '#ff4d4f'}}>
-              {this.props.dict['model.status.forbidden']}
+              绂佺敤
               <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
diff --git a/src/utils/option.js b/src/utils/option.js
index 3a893d3..820030e 100644
--- a/src/utils/option.js
+++ b/src/utils/option.js
@@ -1,7 +1,7 @@
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import nortable from '@/assets/img/normaltable.jpg'
-import mainsubtable from '@/assets/img/mainsubtable.jpg'
+// import mainsubtable from '@/assets/img/mainsubtable.jpg'
 import treepage from '@/assets/img/treepage.jpg'
 import calendar from '@/assets/img/calendar.jpg'
 import customImg from '@/assets/img/custom.jpg'
@@ -55,14 +55,14 @@
     baseconfig: '',
     isSystem: true
   },
-  {
-    title: '涓诲瓙琛ㄨ〃鏍�',
-    type: 'CommonTable',
-    url: mainsubtable,
-    baseconfig: '',
-    isSystem: true,
-    isSubtable: true
-  },
+  // {
+  //   title: '涓诲瓙琛ㄨ〃鏍�',
+  //   type: 'CommonTable',
+  //   url: mainsubtable,
+  //   baseconfig: '',
+  //   isSystem: true,
+  //   isSubtable: true
+  // },
   {
     title: '鑷畾涔�',
     type: 'CustomPage',
diff --git a/src/views/design/header/editfirstmenu/dragelement/index.jsx b/src/views/design/header/editfirstmenu/dragelement/index.jsx
index bb32453..d707e8b 100644
--- a/src/views/design/header/editfirstmenu/dragelement/index.jsx
+++ b/src/views/design/header/editfirstmenu/dragelement/index.jsx
@@ -64,7 +64,7 @@
           findCard={findCard}
         />
       ))}
-      <Button type="primary" disabled={!change} onClick={confirm}>淇濆瓨</Button>
+      <Button type="primary" className="mk-save-menu" disabled={!change} onClick={confirm}>淇濆瓨</Button>
       <Button onClick={cancel}>鍏抽棴</Button>
     </div>
   )
diff --git a/src/views/design/header/editfirstmenu/dragelement/index.scss b/src/views/design/header/editfirstmenu/dragelement/index.scss
index 624f645..458e6ad 100644
--- a/src/views/design/header/editfirstmenu/dragelement/index.scss
+++ b/src/views/design/header/editfirstmenu/dragelement/index.scss
@@ -12,11 +12,7 @@
     padding: 0 10px;
     height: 26px;
   }
-  .ant-btn-primary[disabled] {
-    background-color: #f5f5f5 !important;
-    border-color: #d9d9d9 !important;
-    color: rgba(0, 0, 0, 0.35) !important;
-  }
+  
   .btn-group {
     display: inline-block;
   }
diff --git a/src/views/design/header/editfirstmenu/index.jsx b/src/views/design/header/editfirstmenu/index.jsx
index f167ddb..c565b22 100644
--- a/src/views/design/header/editfirstmenu/index.jsx
+++ b/src/views/design/header/editfirstmenu/index.jsx
@@ -10,7 +10,7 @@
 import MenuForm from './menuform'
 import Utils from '@/utils/utils.js'
 import Api from '@/api'
-import './index.scss'
+// import './index.scss'
 
 const { confirm } = Modal
 
@@ -37,19 +37,20 @@
   editMenuModal = (Menu) => {
     // 鑿滃崟缂栬緫锛氫慨鏀�
     const menu = fromJS(Menu).toJS()
-    if (!is(fromJS(this.state.menulist), fromJS(this.props.menulist))) {
+    if (this.state.change) {
       notification.warning({
         top: 92,
         message: '鑿滃崟椤哄簭宸茶皟鏁达紝璇蜂繚瀛橈紒',
         duration: 5
       })
-    } else {
-      this.setState({
-        visible: true,
-        editMenu: menu.card,
-        loading: false
-      })
+      return
     }
+
+    this.setState({
+      visible: true,
+      editMenu: menu.card,
+      loading: false
+    })
   }
 
   editMemuSubmit = () => {
@@ -82,6 +83,15 @@
   }
 
   deleteMemu = (item) => {
+    if (this.state.change) {
+      notification.warning({
+        top: 92,
+        message: '鑿滃崟椤哄簭宸茶皟鏁达紝璇蜂繚瀛橈紒',
+        duration: 5
+      })
+      return
+    }
+    
     let _this = this
     confirm({
       title: `纭畾鍒犻櫎鑿滃崟銆�${item.MenuName}銆嬪悧锛焋,
@@ -173,7 +183,7 @@
     const { menulist, change } = this.state
 
     return (
-      <div className="header-edit-box">
+      <>
         <DndProvider backend={HTML5Backend}>
           <DragElement
             change={change}
@@ -199,7 +209,7 @@
             wrappedComponentRef={(inst) => this.editMenuFormRef = inst}
           />
         </Modal>
-      </div>
+      </>
     )
   }
 }
diff --git a/src/views/design/header/editfirstmenu/index.scss b/src/views/design/header/editfirstmenu/index.scss
index ac8a533..e69de29 100644
--- a/src/views/design/header/editfirstmenu/index.scss
+++ b/src/views/design/header/editfirstmenu/index.scss
@@ -1,79 +0,0 @@
-.header-edit-box {
-  .mask {
-    position: fixed;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    .tipcard {
-      position: absolute;
-      min-height: 100px;
-      font-size: 16px;
-      border-radius: 6px;
-      background-size: 100% 100%;
-      background-repeat: no-repeat;
-      padding: 15px;
-    }
-    .card1 {
-      left: 30%;
-      top: 20vh;
-      width: 230px;
-      min-height: 100px;
-      color: #000000;
-      font-style: oblique;
-    }
-    .card2 {
-      left: 60%;
-      top: 20vh;
-      width: 230px;
-      min-height: 100px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card3 {
-      left: 30%;
-      top: 50vh;
-      width: 230px;
-      min-height: 140px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card4 {
-      left: 60%;
-      top: 50vh;
-      width: 230px;
-      min-height: 140px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card5 {
-      right: 5%;
-      top: 20vh;
-      width: 130px;
-      min-height: 240px;
-      color: #000000;
-      padding: 40px 15px 10px;
-      p {
-        margin: 0 0 5px;
-      }
-      div {
-        text-align: center;
-        .new-view {
-          display: inline-block;
-          cursor: pointer;
-          color: #fff;
-          padding: 2px 10px;
-          border-radius: 4px;
-          background-color: #1890ff;
-          border-color: #1890ff;
-          text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-          -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-          box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/views/design/header/index.jsx b/src/views/design/header/index.jsx
index 7324d56..eabf65e 100644
--- a/src/views/design/header/index.jsx
+++ b/src/views/design/header/index.jsx
@@ -1,7 +1,6 @@
 import React, {Component} from 'react'
 import { withRouter } from 'react-router-dom'
 import {connect} from 'react-redux'
-import { is, fromJS } from 'immutable'
 import { Dropdown, Menu, Modal, notification, Switch, Button, Popover } from 'antd'
 import { MenuFoldOutlined, SettingOutlined, AppstoreOutlined, DownOutlined, HomeOutlined, ApiOutlined, PlusOutlined, SwapOutlined } from '@ant-design/icons'
 
@@ -53,10 +52,6 @@
 
   changeMenu (value) {
     // 涓昏彍鍗曞垏鎹�
-    if (this.props.editLevel) {
-      // 缂栬緫鐘舵�佷笅锛屼笉鍙垏鎹㈣彍鍗�
-      return
-    }
     if (value.PageParam.OpenType === 'menu') {
       this.props.modifyMainMenu(value)
     } else if (value.PageParam.OpenType === 'outpage') {
@@ -79,12 +74,21 @@
 
       this.setState({ menulist })
 
-      this.props.modifyMenuTree(menulist)
-      if (window.GLOB.systemType !== 'production') { // 闈炴寮忕郴缁熼�夋嫨绗竴椤�
-        this.props.modifyMainMenu(menulist[0] || null)
-      } else {
+      let mainMenu = menulist[0] || null
 
+      if (this.props.editLevel === 'level1') {
+        mainMenu = null
+      } else if (this.props.mainMenu && this.props.mainMenu.MenuID) {
+        let _menu = menulist.filter(item => item.MenuID === this.props.mainMenu.MenuID)[0]
+        mainMenu = _menu || mainMenu
+
+        if (!_menu && (this.props.editLevel === 'level2' || this.props.editLevel === 'level3')) {
+          this.props.resetEditLevel(false)
+        }
       }
+
+      this.props.modifyMenuTree(menulist)
+      this.props.modifyMainMenu(mainMenu)
     } else {
       notification.error({
         top: 92,
@@ -120,7 +124,8 @@
             MenuID: snd.MenuID,
             MenuName: snd.MenuName,
             PageParam: {Icon: 'folder'},
-            children: []
+            children: [],
+            level: 'second'
           }
 
           if (snd.PageParam) {
@@ -141,7 +146,8 @@
                 MenuNo: trd.MenuNo,
                 EasyCode: trd.EasyCode,
                 type: 'CommonTable',            // 榛樿鍊间负甯哥敤琛�
-                OpenType: 'newtab'              // 鎵撳紑鏂瑰紡
+                OpenType: 'newtab',             // 鎵撳紑鏂瑰紡
+                level: 'third'
               }
   
               if (trd.LinkUrl && iframes.includes(trd.LinkUrl.split('?')[0])) {
@@ -192,11 +198,13 @@
   enterEdit = () => {
     // 杩涘叆缂栬緫鐘舵��
     this.props.resetEditLevel('level1')
+    this.props.modifyMainMenu(null)
   }
   
   exitEdit = () => {
     // 閫�鍑虹紪杈戠姸鎬�
     this.props.resetEditLevel(false)
+    this.props.modifyMainMenu(this.state.menulist[0] || null)
   }
 
   
@@ -239,14 +247,6 @@
     this.loadmenu()
   }
 
-  UNSAFE_componentWillReceiveProps (nextProps) {
-    if (!is(fromJS(this.props.menuTree), fromJS(nextProps.menuTree)) && !is(fromJS(this.state.menulist), fromJS(nextProps.menuTree))) {
-      this.setState({
-        menulist: nextProps.menuTree
-      })
-    }
-  }
-
   componentDidMount () {
     if (window.GLOB.systemType !== 'production') {
       setTimeout(() => {
@@ -287,10 +287,6 @@
       this.reload()
     })
     MKEmitter.addListener('mkUpdateMenuList', this.reload)
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
   }
 
   /**
@@ -343,9 +339,9 @@
         {/* 杩涘叆缂栬緫鎸夐挳 */}
         {!editLevel && window.GLOB.systemType !== 'production' && menulist ? <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
-            <PlusOutlined onClick={() => this.setState({visible: true, loading: false})} className="mk-edit-menu"/>
-            <SwapOutlined onClick={this.enterEdit} className="mk-edit-menu"/>
-            <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId="0" Type="10" className="mk-edit-menu"/></div>
+            <PlusOutlined onClick={() => this.setState({visible: true, loading: false})}/>
+            <SwapOutlined onClick={this.enterEdit}/>
+            <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId="0" Type="10"/></div>
           </div>
         } trigger="hover">
           <SettingOutlined className="edit-check"/>
diff --git a/src/views/design/index.scss b/src/views/design/index.scss
index 9d05353..1c544d6 100644
--- a/src/views/design/index.scss
+++ b/src/views/design/index.scss
@@ -2,6 +2,10 @@
   display: flex;
   flex: auto;
   min-height: 100%;
+
+  .mk-save-menu[disabled] {
+    background: #ffffff!important;
+  }
 }
 .mk-design-view {
   #mk-tabview-wrap {
@@ -29,6 +33,10 @@
   .mk-swap {
     transform: rotate(90deg);
   }
+  .mk-swap.disabled {
+    cursor: not-allowed!important;
+    color: #959595;
+  }
 }
 .mk-menu-control.mk-popover-control-wrap {
   padding-bottom: 0px;
diff --git a/src/views/design/sidemenu/editsecmenu/index.jsx b/src/views/design/sidemenu/editsecmenu/index.jsx
index f76f779..c76db28 100644
--- a/src/views/design/sidemenu/editsecmenu/index.jsx
+++ b/src/views/design/sidemenu/editsecmenu/index.jsx
@@ -3,23 +3,15 @@
 import { is, fromJS } from 'immutable'
 import { DndProvider } from 'react-dnd'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { notification, Modal, Button, Spin } from 'antd'
-import { PlusOutlined } from '@ant-design/icons'
+import { notification, Modal, Button } from 'antd'
 import moment from 'moment'
-import TransferForm from '@/templates/zshare/basetransferform'
+
 import Utils from '@/utils/utils.js'
 import DragElement from '../menuelement'
 import MenuForm from '../menuform'
 import Api from '@/api'
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
+import MKEmitter from '@/utils/events.js'
 import './index.scss'
-
-import card1 from '@/assets/img/card-bg2.jpg'
-import card2 from '@/assets/img/card-bg5.jpg'
-import card3 from '@/assets/img/card-bg8.jpg'
-import card4 from '@/assets/img/card-bg7.jpg'
-import card5 from '@/assets/img/card-bg6.jpg'
 
 const { confirm } = Modal
 
@@ -28,42 +20,36 @@
     menulist: PropTypes.any,      // 浜岀骇鑿滃崟鍒楄〃
     menuTree: PropTypes.array,    // 涓�绾ц彍鍗曞垪琛�
     supMenu: PropTypes.object,    // 浜岀骇鑿滃崟鎵�瀵瑰簲鐨勪竴绾ц彍鍗�
-    reload: PropTypes.func,       // 鍒锋柊浜岀骇鑿滃崟鏁版嵁
     exitEdit: PropTypes.func      // 閫�鍑虹紪杈�
   }
 
   state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
     menulist: null,        // 鑿滃崟鍒楄〃
-    type: '',              // 缂栬緫绫诲瀷锛宎dd or edit
-    title: '',             // 妯℃�佹鏍囬
     visible: null,         // 妯℃�佹鏄惁鍙
     formlist: null,        // 琛ㄥ崟淇℃伅
     editMenu: null,        // 缂栬緫鑿滃崟
-    thawmenulist: null,    // 宸插喕缁撶殑浜岀骇鑿滃崟
-    thawMvisible: false,   // 瑙i櫎鍐荤粨妯℃�佹
-    confirmLoading: false, // 鎻愪氦涓�傘�傘��
-    targetKeys: []         // 瑙e喕鑿滃崟鍒楄〃 
+    loading: false,        // 鎻愪氦涓�傘�傘��
+    change: false
   }
 
   handlePreviewList = (List) => {
     this.setState({
-      menulist: List
+      menulist: List,
+      change: !is(fromJS(List), fromJS(this.props.menulist))
     })
   }
 
   handleMenu = (menu) => {
-    const { dict } = this.state
-
     // 鑿滃崟缂栬緫锛氫慨鏀广�佸垹闄わ紝濡傝彍鍗曢『搴忓凡鏀瑰彉锛屾彁绀轰繚瀛樿彍鍗曢『搴�
-    const _this = this
-    if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
+    if (this.state.change) {
       notification.warning({
         top: 92,
-        message: dict['model.menu.presave'],
+        message: '鑿滃崟椤哄簭宸茶皟鏁达紝璇蜂繚瀛橈紒',
         duration: 5
       })
-    } else if (menu.type === 'close') {
+      return
+    }
+    if (menu.type === 'close') {
       confirm({
         title: `纭畾鍒犻櫎鑿滃崟銆�${menu.card.MenuName}銆嬪悧锛焋,
         content: '',
@@ -74,7 +60,7 @@
           }
           return Api.getSystemConfig(param).then(res => {
             if (res.status) {
-              _this.props.reload()
+              MKEmitter.emit('mkUpdateMenuList')
             } else {
               notification.warning({
                 top: 92,
@@ -89,14 +75,12 @@
     } else if (menu.type === 'edit') {
       this.setState({
         visible: true,
-        title: dict['model.edit'] + dict['model.menu'],
-        type: 'edit',
         editMenu: menu.card,
         formlist: [
           { // 鐖剁骇鑿滃崟
             type: 'select',
             key: 'parentId',
-            label: dict['model.super'] + dict['model.menu'],
+            label: '涓婄骇鑿滃崟',
             initVal: this.props.supMenu.MenuID,
             required: true,
             options: this.props.menuTree
@@ -104,7 +88,7 @@
           { // 鑿滃崟鍚嶇О
             type: 'text',
             key: 'menuName',
-            label: dict['model.menu'] + dict['model.name'],
+            label: '鑿滃崟鍚嶇О',
             initVal: menu.card.MenuName,
             required: true,
             readonly: false
@@ -112,7 +96,7 @@
           { // 鑿滃崟鍥炬爣
             type: 'icon',
             key: 'icon',
-            label: dict['model.icon'],
+            label: '鍥炬爣',
             initVal: menu.card.PageParam.Icon || 'folder',
             required: true
           }
@@ -122,105 +106,39 @@
   }
 
   handleSubBtn = (type) => {
-    const { dict } = this.state
-
-    // 鎿嶄綔鎸夐挳
-    if (type === 'add') { // 娣诲姞鏂拌彍鍗�
-      this.setState({
-        visible: true,
-        title: dict['model.add'] + dict['model.menu'],
-        type: 'add',
-        formlist: [
-          { // 鐖剁骇鑿滃崟
-            type: 'select',
-            key: 'parentId',
-            label: dict['model.super'] + dict['model.menu'],
-            initVal: this.props.supMenu.MenuID,
-            required: true,
-            options: this.props.menuTree
-          },
-          { // 鑿滃崟鍚嶇О
-            type: 'text',
-            key: 'menuName',
-            label: dict['model.menu'] + dict['model.name'],
-            initVal: '',
-            required: true,
-            readonly: false
-          },
-          { // 鑿滃崟鍥炬爣
-            type: 'icon',
-            key: 'icon',
-            label: dict['model.icon'],
-            initVal: 'folder',
-            required: true
-          }
-        ]
-      })
-    } else if (type === 'thaw') { // 瑙e喕宸叉湁鑿滃崟
-      this.setState({
-        thawMvisible: true,
-        targetKeys: []
-      })
-      Api.getSystemConfig({
-        func: 'sPC_Get_FrozenMenu',
-        ParentID: this.props.supMenu.MenuID,
-        TYPE: 20
-      }).then(res => {
-        if (res.status) {
-          this.setState({
-            thawmenulist: res.data.map(menu => {
-              return {
-                key: menu.MenuID,
-                title: menu.MenuName
-              }
-            })
-          })
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    } else if (type === 'confirm') { // 纭畾鏃跺叆椤哄簭鏀瑰彉锛屽垯鎻愮ず淇濆瓨锛屽惁鍒欓��鍑虹紪杈�
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
-        let _this = this
-        let param  = {
-          func: 'sPC_Menu_SortUpt',
-          LText: this.state.menulist.map((item, index) => {
-            return 'select \'' + item.MenuID + '\' as Menuid,' + (index + 1) * 10 + ' as sort'
-          })
-        }
-
-        param.LText = param.LText.join(' union ') // sql鎷兼帴
-        param.LText = Utils.formatOptions(param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴�
-        param.secretkey = Utils.encrypt(param.LText, param.timestamp) // md5瀵嗛挜
-
-        confirm({
-          title: this.state.dict['model.menu.resetorder'],
-          content: '',
-          onOk() {
-            return Api.getSystemConfig(param).then(res => {
-              if (res.status) {
-                _this.props.reload()
-              } else {
-                notification.warning({
-                  top: 92,
-                  message: res.message,
-                  duration: 5
-                })
-              }
-            })
-          },
-          onCancel() {}
+    if (type === 'confirm') { // 淇濆瓨璋冩暣鍚庣殑椤哄簭
+      let param  = {
+        func: 'sPC_Menu_SortUpt',
+        LText: this.state.menulist.map((item, index) => {
+          return 'select \'' + item.MenuID + '\' as Menuid,' + (index + 1) * 10 + ' as sort'
         })
-      } else {
-        this.props.exitEdit()
       }
+
+      param.LText = param.LText.join(' union ') // sql鎷兼帴
+      param.LText = Utils.formatOptions(param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑
+      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴�
+      param.secretkey = Utils.encrypt(param.LText, param.timestamp) // md5瀵嗛挜
+
+      confirm({
+        title: '纭璋冩暣鑿滃崟椤哄簭鍚楋紵',
+        content: '',
+        onOk() {
+          return Api.getSystemConfig(param).then(res => {
+            if (res.status) {
+              MKEmitter.emit('mkUpdateMenuList')
+            } else {
+              notification.warning({
+                top: 92,
+                message: res.message,
+                duration: 5
+              })
+            }
+          })
+        },
+        onCancel() {}
+      })
     } else if (type === 'close') { // 閫�鍑虹紪杈�
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
+      if (this.state.change) {
         let _this = this
 
         confirm({
@@ -238,138 +156,45 @@
   }
 
   memuHandleSubmit = () => {
-    if (this.state.type === 'add') { // 鏂板缓鑿滃崟锛氭彁浜�
-      this.menuFormRef.handleConfirm().then(values => {
-        let param = {
-          ParentID: values.parentId,
-          MenuID: Utils.getuuid(),
-          MenuName: values.menuName,
-          PageParam: JSON.stringify({
-            Icon: values.icon
+    this.menuFormRef.handleConfirm().then(values => {
+      let param = {
+        func: 'sPC_SndMenu_Upt',
+        ParentID: values.parentId,
+        MenuID: this.state.editMenu.MenuID,
+        MenuName: values.menuName,
+        PageParam: JSON.stringify({
+          Icon: values.icon
+        })
+      }
+      this.setState({
+        loading: true
+      })
+      Api.getSystemConfig(param).then(res => {
+        if (res.status) {
+          this.setState({
+            loading: false,
+            visible: false
+          })
+          MKEmitter.emit('mkUpdateMenuList')
+        } else {
+          this.setState({
+            loading: false
+          })
+          notification.warning({
+            top: 92,
+            message: res.message,
+            duration: 5
           })
         }
-        param.func = 'sPC_SndMenu_Add'
-        param.Sort = (this.props.menulist.length + 1) * 10
-        this.setState({
-          confirmLoading: true
-        })
-        Api.getSystemConfig(param).then(res => {
-          if (res.status) {
-            this.setState({
-              confirmLoading: false,
-              visible: false
-            })
-            this.props.reload()
-          } else {
-            this.setState({
-              confirmLoading: false
-            })
-            notification.warning({
-              top: 92,
-              message: res.message,
-              duration: 5
-            })
-          }
-        })
-      }, () => {})
-    } else if (this.state.type === 'edit') { // 缂栬緫鑿滃崟锛氭彁浜�
-      this.menuFormRef.handleConfirm().then(values => {
-        let param = {
-          func: 'sPC_SndMenu_Upt',
-          ParentID: values.parentId,
-          MenuID: this.state.editMenu.MenuID,
-          MenuName: values.menuName,
-          PageParam: JSON.stringify({
-            Icon: values.icon
-          })
-        }
-        this.setState({
-          confirmLoading: true
-        })
-        Api.getSystemConfig(param).then(res => {
-          if (res.status) {
-            this.setState({
-              confirmLoading: false,
-              visible: false
-            })
-            this.props.reload()
-          } else {
-            this.setState({
-              confirmLoading: false
-            })
-            notification.warning({
-              top: 92,
-              message: res.message,
-              duration: 5
-            })
-          }
-        })
-      }, () => {})
-    }
+      })
+    }, () => {})
   }
 
   memuHandleCancel = () => { // 鍙栨秷鎿嶄綔锛屽叧闂ā鎬佹
     this.setState({
       visible: false,
-      type: '',
       formlist: null,
       editMenu: null
-    })
-  }
-
-  thawMemuSubmit = () => { // 瑙e喕鑿滃崟锛屾彁浜わ紝瀛樺湪澶氫釜鏃讹紝寰幆鎻愪氦
-    const { targetKeys } = this.state
-
-    if (targetKeys.length === 0) {
-      notification.warning({
-        top: 92,
-        message: this.state.dict['form.required.select'] + this.state.dict['model.menu'],
-        duration: 5
-      })
-    } else {
-      this.setState({
-        confirmLoading: true
-      })
-      let defers = targetKeys.map(item => {
-        return new Promise((resolve) => {
-          Api.getSystemConfig({
-            func: 'sPC_MainMenu_ReDel',
-            MenuID: item
-          }).then(res => {
-            if (res.status) {
-              resolve('')
-            } else {
-              resolve(res.message)
-            }
-          })
-        })
-      })
-      Promise.all(defers).then(res => {
-        let msg = res.filter(Boolean)[0]
-        if (msg) {
-          notification.error({
-            top: 92,
-            message: msg,
-            duration: 10
-          })
-        } else {
-          this.setState({
-            confirmLoading: false,
-            thawMvisible: false,
-            targetKeys: [],
-            thawmenulist: null
-          })
-          this.props.reload()
-        }
-      })
-    }
-  }
-
-  thawMemuCancel = () => { // 瑙e喕鑿滃崟鍙栨秷
-    this.setState({
-      thawMvisible: false,
-      targetKeys: [],
-      thawmenulist: null
     })
   }
 
@@ -382,80 +207,44 @@
   UNSAFE_componentWillReceiveProps (nextProps) {
     if (!is(fromJS(this.props.menulist), fromJS(nextProps.menulist))) {
       this.setState({
-        menulist: nextProps.menulist
+        menulist: nextProps.menulist,
+        change: false
       })
     }
   }
 
   render () {
-    const { dict } = this.state
+    const { change, loading } = this.state
 
     return (
-      <div className="second-edit-box">
-        <div className="mask">
-          <div className="tipcard card1" style={{backgroundImage: 'url(' + card1 + ')'}}>
-            鎷栧姩浜岀骇鑿滃崟鍙皟鏁撮『搴忥紝椤哄簭璋冩暣鍚庯紝璇风偣鍑荤‘瀹氭寜閽繚瀛樸��
-          </div>
-          <div className="tipcard card2" style={{backgroundImage: 'url(' + card2 + ')'}}>
-            鐐瑰嚮缂栬緫鍥炬爣鍙慨鏀硅彍鍗曞睘鎬э紝鐐瑰嚮鍒犻櫎鍥炬爣鍙垹闄よ彍鍗曘��
-          </div>
-          <div className="tipcard card3" style={{backgroundImage: 'url(' + card3 + ')'}}>
-            鐐瑰嚮瑙i櫎鍐荤粨鎸夐挳锛屽彲杩樺師宸插垹闄ょ殑浜岀骇鑿滃崟銆�
-          </div>
-          <div className="tipcard card4" style={{backgroundImage: 'url(' + card4 + ')'}}>
-            鐐瑰嚮娣诲姞鍥炬爣锛屽彲鏂板浜岀骇鑿滃崟銆�
-          </div>
-          <div className="tipcard card5" style={{backgroundImage: 'url(' + card5 + ')'}}>
-            <p>缂栬緫鐘舵�佷腑锛岃彍鍗曚箣澶栧尯鍩熶細閿佸畾锛屾煡鐪嬬郴缁熸暟鎹鐐瑰嚮銆�</p>
-            <div>
-              <span className="new-view" onClick={() => {window.open('#/main')}} >鏂伴〉闈�</span>
-            </div>
-          </div>
-        </div>
+      <>
         <DndProvider backend={HTML5Backend}>
-          {this.state.menulist && this.state.menulist.length > 0 ? <DragElement
+          <DragElement
             list={this.state.menulist}
             handlePreviewList={this.handlePreviewList}
             handleMenu={this.handleMenu}
-          /> : null}
+          />
         </DndProvider>
-        <div className="menu-add" onClick={() => {this.handleSubBtn('add')}}>
-          <PlusOutlined />
-        </div>
         <div className="menu-btn">
-          <Button type="primary" onClick={() => {this.handleSubBtn('thaw')}}>{dict['model.thaw'] + dict['model.menu']}</Button>
-          <Button type="primary" onClick={() => {this.handleSubBtn('confirm')}}>{dict['model.confirm']}</Button>
-          <Button onClick={() => {this.handleSubBtn('close')}}>{dict['model.close']}</Button>
+          <Button type="primary" className="mk-save-menu" disabled={!change} onClick={() => {this.handleSubBtn('confirm')}}>淇濆瓨</Button>
+          <Button onClick={() => {this.handleSubBtn('close')}}>鍏抽棴</Button>
         </div>
         <Modal
-          title={this.state.title}
+          title="淇敼鑿滃崟"
           visible={this.state.visible}
           onOk={this.memuHandleSubmit}
-          confirmLoading={this.state.confirmLoading}
+          confirmLoading={loading}
           onCancel={this.memuHandleCancel}
           destroyOnClose
         >
           {this.state.formlist ?
             <MenuForm
-              dict={dict}
               inputSubmit={this.memuHandleSubmit}
               formlist={this.state.formlist}
               wrappedComponentRef={(inst) => this.menuFormRef = inst}
             /> : null}
         </Modal>
-        <Modal
-          title={dict['model.thaw'] + dict['model.menu']}
-          width={600}
-          visible={this.state.thawMvisible}
-          onOk={this.thawMemuSubmit}
-          confirmLoading={this.state.confirmLoading}
-          onCancel={this.thawMemuCancel}
-          destroyOnClose
-        >
-          {!this.state.thawmenulist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />}
-          {this.state.thawmenulist && <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>}
-        </Modal>
-      </div>
+      </>
     )
   }
 }
diff --git a/src/views/design/sidemenu/editsecmenu/index.scss b/src/views/design/sidemenu/editsecmenu/index.scss
index 59277cb..e69de29 100644
--- a/src/views/design/sidemenu/editsecmenu/index.scss
+++ b/src/views/design/sidemenu/editsecmenu/index.scss
@@ -1,81 +0,0 @@
-.second-edit-box {
-  position: relative;
-  z-index: 10;
-  .mask {
-    position: fixed;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    .tipcard {
-      position: absolute;
-      min-height: 100px;
-      font-size: 16px;
-      border-radius: 6px;
-      background-size: 100% 100%;
-      background-repeat: no-repeat;
-      padding: 15px;  
-    }
-    .card1 {
-      left: 30%;
-      top: 20vh;
-      width: 230px;
-      min-height: 100px;
-      color: #000000;
-      font-style: oblique;
-    }
-    .card2 {
-      left: 60%;
-      top: 20vh;
-      width: 230px;
-      min-height: 100px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card3 {
-      left: 30%;
-      top: 50vh;
-      width: 230px;
-      min-height: 140px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card4 {
-      left: 60%;
-      top: 50vh;
-      width: 230px;
-      min-height: 140px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card5 {
-      right: 5%;
-      top: 20vh;
-      width: 130px;
-      min-height: 240px;
-      color: #000000;
-      padding: 40px 15px 10px;
-      p {
-        margin: 0 0 5px;
-      }
-      div {
-        text-align: center;
-        .new-view {
-          display: inline-block;
-          cursor: pointer;
-          color: #fff;
-          padding: 2px 10px;
-          border-radius: 4px;
-          background-color: #1890ff;
-          border-color: #1890ff;
-          text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-          -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-          box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/views/design/sidemenu/editthdmenu/index.jsx b/src/views/design/sidemenu/editthdmenu/index.jsx
index ae97e33..5a6d731 100644
--- a/src/views/design/sidemenu/editthdmenu/index.jsx
+++ b/src/views/design/sidemenu/editthdmenu/index.jsx
@@ -5,34 +5,21 @@
 import { DndProvider } from 'react-dnd'
 import { withRouter } from 'react-router-dom'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { notification, Modal, Button, Spin, Col, Card, Tabs, Row, Input } from 'antd'
-import { PlusOutlined } from '@ant-design/icons'
+import { notification, Modal, Button } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
-import { sysTemps } from '@/utils/option.js'
+import MKEmitter from '@/utils/events.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
-import mainsubtable from '@/assets/img/mainsubtable.jpg'
-import treepage from '@/assets/img/treepage.jpg'
-import calendar from '@/assets/img/calendar.jpg'
-import customImg from '@/assets/img/custom.jpg'
 import MkIcon from '@/components/mk-icon'
-import Preview from './preview'
-import MenuForm from './menuform'
-import TransferForm from '@/templates/zshare/basetransferform'
 import Utils from '@/utils/utils.js'
 import MenuUtils from '@/utils/utils-custom.js'
 import DragElement from '../menuelement'
 import asyncLoadComponent from '@/utils/asyncLoadComponent'
 import './index.scss'
 
-import card1 from '@/assets/img/card-bg2.jpg'
-import card2 from '@/assets/img/card-bg5.jpg'
-import card3 from '@/assets/img/card-bg8.jpg'
-import card4 from '@/assets/img/card-bg7.jpg'
-import card5 from '@/assets/img/card-bg6.jpg'
-
+const MenuForm = asyncLoadComponent(() => import('../thdmenuform'))
 const ComTableConfig = asyncLoadComponent(() => import('@/templates/comtableconfig'))
 const TreePageConfig = asyncLoadComponent(() => import('@/templates/treepageconfig'))
 const CalendarPageConfig = asyncLoadComponent(() => import('@/templates/calendarconfig'))
@@ -41,12 +28,9 @@
 const SubTable = asyncLoadComponent(() => import('@/templates/subtableconfig'))
 
 const { confirm } = Modal
-const { TabPane } = Tabs
-const { Search } = Input
 
 class EditMenu extends Component {
   static propTpyes = {
-    reload: PropTypes.func,      // 鑿滃崟淇敼鍚庡埛鏂�
     menulist: PropTypes.any,     // 涓夌骇鑿滃崟鍒楄〃
     exitEdit: PropTypes.func,    // 閫�鍑虹紪杈戠姸鎬�
     supMenu: PropTypes.object,   // 瀵瑰簲鐨勪笂绾ц彍鍗�
@@ -55,19 +39,10 @@
 
   state = {
     dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    thawmenulist: null,     // 宸插喕缁撶殑浜岀骇鑿滃崟
-    type: '',               // 鎿嶄綔绫诲瀷锛屾柊寤烘垨缂栬緫鑿滃崟
-    thawMvisible: false,    // 瑙i櫎鍐荤粨妯℃�佹
     confirmLoading: false,  // 鎻愪氦涓�傘�傘��
-    selectTemp: '',         // 閫夋嫨妯℃澘
-    usedTemplates: null,    // 宸蹭娇鐢ㄦā鏉垮垪琛�
-    tempSearchKey: '',      // 鑿滃崟鍚嶇О杩囨护鍊�
     loading: false,         // 缂栬緫鑿滃崟鎴栦娇鐢ㄥ凡浣跨敤妯℃澘鏃讹紝鑾峰彇閰嶇疆淇℃伅
-    preview: null,          // 鍥剧墖棰勮url
-    pretemplate: null,      // 棰勮妯℃澘
     btnParam: null,         // 缂栬緫鎸夐挳鐨勯厤缃俊鎭�
     menulist: null,         // 缂栬緫涓殑鑿滃崟
-    sysTemplates: sysTemps, // 绯荤粺妯℃澘
     tabview: '',            // 閫夋嫨妯℃澘绐楀彛锛坱emplate锛夈�佸熀纭�琛ㄦ牸閰嶇疆锛圕ommonTable锛夈�佽〃鍗曪紙Modal锛夈�佸瓙琛紙SubTable锛�
     editMenu: null,         // 缂栬緫鑿滃崟
     editAction: null,       // 缂栬緫鎸夐挳
@@ -79,8 +54,8 @@
     btnTab: null,           // 鎵撳紑鏂版爣绛炬垨褰撳墠椤甸潰鍒锋柊鐨勬寜閽�
     btnTabConfig: null,     // 鎵撳紑鏂版爣绛炬寜閽厤缃�
     handleMVisible: false,  // 娣诲姞鎴栦慨鏀硅彍鍗曟ā鎬佹锛堣鑹叉潈闄愬垎閰嶇瓑锛�
-    sysMenu: false,         // 娣诲姞鎴栫紪杈戣彍鍗曪紙瑙掕壊鏉冮檺鍒嗛厤绛夛級
-    targetKeys: []          // 瑙e喕鑿滃崟鍒楄〃 
+    sysMenu: null,          // 娣诲姞鎴栫紪杈戣彍鍗曪紙瑙掕壊鏉冮檺鍒嗛厤绛夛級
+    change: false
   }
 
   /**
@@ -97,7 +72,8 @@
    */
   handlePreviewList = (List) => {
     this.setState({
-      menulist: List
+      menulist: List,
+      change: !is(fromJS(List), fromJS(this.props.menulist))
     })
   }
 
@@ -108,15 +84,16 @@
    * 3銆佽彍鍗曠紪杈戯紝鏌ヨ鑿滃崟閰嶇疆淇℃伅锛屼俊鎭纭紝杩涘叆瀵瑰簲缂栬緫椤甸潰
    */
   handleMenu = (menu) => {
-    const _this = this
-
-    if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
+    if (this.state.change) {
       notification.warning({
         top: 92,
         message: this.state.dict['model.menu.presave'],
         duration: 5
       })
-    } else if (menu.type === 'close') {
+      return
+    }
+    
+    if (menu.type === 'close') {
       confirm({
         title: `纭畾鍒犻櫎鑿滃崟銆�${menu.card.MenuName}銆嬪悧锛焋,
         content: '',
@@ -127,7 +104,7 @@
           }
           return Api.getSystemConfig(param).then(res => {
             if (res.status) {
-              _this.props.reload()
+              MKEmitter.emit('mkUpdateMenuList')
             } else {
               notification.warning({
                 top: 92,
@@ -142,9 +119,9 @@
     } else if (menu.type === 'edit') {
       let _menu = fromJS(menu.card).toJS()
 
-      if (_menu.PageParam && (_menu.PageParam.Template === 'RolePermission' || _menu.PageParam.Template === 'NewPage')) { // 鍗曢〉闈慨鏀�
+      if (['RolePermission', 'NewPage'].includes(_menu.PageParam.Template)) { // 鍗曢〉闈慨鏀�
         _menu.Template = _menu.PageParam.Template
-        _menu.url = _menu.PageParam.url
+        _menu.url = _menu.PageParam.url || ''
 
         _menu.fstMenuId = _menu.FstId
         _menu.supMenuList = this.props.supMenuList
@@ -158,181 +135,103 @@
         return
       }
 
+      // let _param = ''
+      // if (card.type === 'CustomPage') {
+      //   _param = {
+      //     MenuType: 'custom',
+      //     MenuId: card.MenuID,
+      //     ParentId: card.ParentId,
+      //     MenuName: card.MenuName,
+      //     MenuNo: card.MenuNo
+      //   }
+      //   _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
+      // }
+      // window.open(`#/menudesign/${_param}`)}
 
-      let param = {
-        func: 'sPC_Get_LongParam',
-        MenuID: _menu.MenuID
-      }
+      // let param = {
+      //   func: 'sPC_Get_LongParam',
+      //   MenuID: _menu.MenuID
+      // }
 
-      this.setState({
-        loading: true
-      })
+      // this.setState({
+      //   loading: true
+      // })
 
-      Api.getSystemConfig(param).then(res => {
-        if (res.status) {
-          let _LongParam = ''
-          if (res.LongParam) {
-            try {
-              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
-            } catch (e) {
-              console.warn('Parse Failure')
-              _LongParam = ''
-            }
-          }
+      // Api.getSystemConfig(param).then(res => {
+      //   if (res.status) {
+      //     let _LongParam = ''
+      //     if (res.LongParam) {
+      //       try {
+      //         _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+      //       } catch (e) {
+      //         console.warn('Parse Failure')
+      //         _LongParam = ''
+      //       }
+      //     }
 
-          _menu.LongParam = _LongParam
-          _menu.fstMenuId = _menu.FstId
-          _menu.supMenuList = this.props.supMenuList
-          _menu.fstMenuList = this.props.menuTree
-          _menu.open_edition = res.open_edition || ''
+      //     _menu.LongParam = _LongParam
+      //     _menu.fstMenuId = _menu.FstId
+      //     _menu.supMenuList = this.props.supMenuList
+      //     _menu.fstMenuList = this.props.menuTree
+      //     _menu.open_edition = res.open_edition || ''
 
-          // 妫�娴嬫ā鏉挎槸鍚﹀瓨鍦�
-          let _Template = this.state.sysTemplates.filter(temp => temp.type === _menu.PageParam.Template)
-
-          // 妯℃澘涓嶅瓨鍦ㄦ椂閿欒鎻愮ず
-          if (_Template.length === 0) {
-            notification.warning({
-              top: 92,
-              message: '鑿滃崟妯℃澘涓㈠け锛岃閲嶆柊閫夋嫨妯℃澘锛�',
-              duration: 5
-            })
-
-            this.setState({
-              type: 'edit',
-              editMenu: _menu,
-              loading: false,
-              tabview: 'template'
-            }, () => {
-              document.getElementById('root').style.overflowY = 'hidden'
-            })
-          } else {
-            this.setState({
-              type: 'edit',
-              editMenu: _menu,
-              loading: false,
-              tabview: _menu.PageParam.Template
-            }, () => {
-              document.getElementById('root').style.overflowY = 'hidden'
-            })
-          }
-        } else {
-          this.setState({
-            loading: false
-          })
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
+          
+      //     this.setState({
+      //       editMenu: _menu,
+      //       loading: false,
+      //       tabview: _menu.PageParam.Template
+      //     }, () => {
+      //       document.getElementById('root').style.overflowY = 'hidden'
+      //     })
+      //   } else {
+      //     this.setState({
+      //       loading: false
+      //     })
+      //     notification.warning({
+      //       top: 92,
+      //       message: res.message,
+      //       duration: 5
+      //     })
+      //   }
+      // })
     }
   }
 
   handleSubBtn = (type) => {
     // 鎿嶄綔鎸夐挳锛氭坊鍔犮�佽В闄ゅ喕缁撱�佺‘璁ゅ強鍏抽棴
-    if (type === 'add') { // 鐐瑰嚮娣诲姞鏃讹紝灞曞紑妯℃澘
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
-        notification.warning({
-          top: 92,
-          message: this.state.dict['model.menu.presave'],
-          duration: 5
+    if (type === 'confirm') {
+      let param  = {
+        func: 'sPC_Menu_SortUpt',
+        LText: this.state.menulist.map((item, index) => {
+          return 'select \'' + item.MenuID + '\' as Menuid,' + (index + 1) * 10 + ' as sort'
         })
-        return
       }
 
-      this.setState({
-        tabview: 'template',
-        editMenu: {
-          MenuID: Utils.getuuid(),
-          MenuName: '',
-          MenuNo: '',
-          type: '',
-          PageParam: '',
-          LongParam: '',
-          isSubtable: '', // 鏄惁涓轰富瀛愯〃
-          ParentId: this.props.supMenu.MenuID,
-          supMenuList: this.props.supMenuList,
-          fstMenuId: this.props.mainMenu.MenuID,
-          fstMenuList: this.props.menuTree,
-          menuSort: (this.props.menulist.length + 1) * 10 // 鏂板缓鑿滃崟璁剧疆鎺掑簭
-        }
-      }, () => {
-        document.getElementById('root').style.overflowY = 'hidden'
-      })
-    } else if (type === 'thaw') {
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
-        notification.warning({
-          top: 92,
-          message: this.state.dict['model.menu.presave'],
-          duration: 5
-        })
-        return
-      }
-      this.setState({
-        thawMvisible: true,
-        targetKeys: []
-      })
-      Api.getSystemConfig({
-        func: 'sPC_Get_FrozenMenu',
-        ParentID: this.props.supMenu.MenuID,
-        TYPE: 30
-      }).then(res => {
-        if (res.status) {
-          this.setState({
-            thawmenulist: res.data.map(menu => {
-              return {
-                key: menu.MenuID,
-                title: menu.MenuName
-              }
-            })
-          })
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    } else if (type === 'confirm') {
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
-        let _this = this
-        let param  = {
-          func: 'sPC_Menu_SortUpt',
-          LText: this.state.menulist.map((item, index) => {
-            return 'select \'' + item.MenuID + '\' as Menuid,' + (index + 1) * 10 + ' as sort'
-          })
-        }
+      param.LText = param.LText.join(' union ') // sql鎷兼帴
+      param.LText = Utils.formatOptions(param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑
+      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴�
+      param.secretkey = Utils.encrypt(param.LText, param.timestamp) // md5瀵嗛挜
 
-        param.LText = param.LText.join(' union ') // sql鎷兼帴
-        param.LText = Utils.formatOptions(param.LText) // 鍏抽敭瀛楃鏇挎崲锛宐ase64鍔犲瘑
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 鏃堕棿鎴�
-        param.secretkey = Utils.encrypt(param.LText, param.timestamp) // md5瀵嗛挜
-
-        confirm({
-          title: this.state.dict['model.menu.resetorder'],
-          content: '',
-          onOk() {
-            return Api.getSystemConfig(param).then(res => {
-              if (res.status) {
-                _this.props.reload()
-              } else {
-                notification.warning({
-                  top: 92,
-                  message: res.message,
-                  duration: 5
-                })
-              }
-            })
-          },
-          onCancel() {}
-        })
-      } else {
-        this.props.exitEdit()
-      }
+      confirm({
+        title: '纭璋冩暣鑿滃崟椤哄簭鍚楋紵',
+        content: '',
+        onOk() {
+          return Api.getSystemConfig(param).then(res => {
+            if (res.status) {
+              MKEmitter.emit('mkUpdateMenuList')
+            } else {
+              notification.warning({
+                top: 92,
+                message: res.message,
+                duration: 5
+              })
+            }
+          })
+        },
+        onCancel() {}
+      })
     } else if (type === 'close') {
-      if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) {
+      if (this.state.change) {
         let _this = this
 
         confirm({
@@ -347,248 +246,6 @@
         this.props.exitEdit()
       }
     }
-  }
-
-  thawMemuSubmit = () => {
-    const { targetKeys } = this.state
-    // 涓夌骇鑿滃崟瑙i櫎鍐荤粨
-    if (targetKeys.length === 0) {
-      notification.warning({
-        top: 92,
-        message: this.state.dict['form.required.select'] + this.state.dict['model.menu'],
-        duration: 5
-      })
-    } else {
-      this.setState({
-        confirmLoading: true
-      })
-      let defers = targetKeys.map(item => {
-        return new Promise((resolve) => {
-          Api.getSystemConfig({
-            func: 'sPC_MainMenu_ReDel',
-            MenuID: item
-          }).then(res => {
-            if (res.status) {
-              resolve('')
-            } else {
-              resolve(res.message)
-            }
-          })
-        })
-      })
-      Promise.all(defers).then(res => {
-        let msg = res.filter(Boolean)[0]
-        if (msg) {
-          notification.error({
-            top: 92,
-            message: msg,
-            duration: 10
-          })
-        } else {
-          this.setState({
-            confirmLoading: false,
-            thawMvisible: false,
-            targetKeys: [],
-            thawmenulist: null
-          })
-          this.props.reload()
-        }
-      })
-    }
-  }
-
-  thawMemuCancel = () => {
-    // 瑙i櫎鍐荤粨-鍙栨秷
-    this.setState({
-      thawMvisible: false,
-      thawmenulist: null,
-      targetKeys: []
-    })
-  }
-
-  previewPicture = (template) => {
-    if (template.disabled) return
-    // 鍥剧墖棰勮
-    this.setState({
-      preview: template.url,
-      pretemplate: template
-    })
-  }
-
-  cancelPrePicture = () => {
-    // 鍏抽棴鍥剧墖棰勮
-    this.setState({
-      preview: null
-    })
-  }
-
-  /**
-   * @description 浣跨敤妯℃澘
-   * 1銆佷娇鐢ㄧ郴缁熸ā鏉挎椂锛屼娇鐢ㄧ郴缁熼厤缃�
-   * 2銆佷娇鐢ㄥ凡鏈夎彍鍗曟ā鏉挎椂锛岃幏鍙栬彍鍗曢厤缃俊鎭紝鏍囪涓簎ser锛堝鍒惰彍鍗曟寜閽級
-   */
-  useTemplate = (template, useType) => {
-    let editMenu = fromJS(this.state.editMenu).toJS()
-
-    editMenu.fstMenuId = this.props.mainMenu.MenuID
-    editMenu.fstMenuList = this.props.menuTree
-
-    if (useType === 'sys' && (template.type === 'RolePermission' || template.type === 'NewPage')) { // 鐙珛椤甸潰
-      let _menu = {
-        ...editMenu,
-        MenuID: Utils.getuuid(),
-        MenuName: template.title,
-        Template: template.type,
-        ParentId: this.props.supMenu.MenuID,
-        menuSort: (this.props.menulist.length + 1) * 10,
-        isSystem: true
-      }
-
-      this.setState({
-        handleMVisible: true,
-        sysMenu: _menu
-      })
-      return
-    } else if (template.type === 'CustomPage') {
-      let _menu = {
-        ...editMenu,
-        MenuID: Utils.getuuid(),
-        MenuName: template.title,
-        Template: template.type,
-        ParentId: this.props.supMenu.MenuID,
-        OriginMenuId: template.uuid || '',
-        menuSort: (this.props.menulist.length + 1) * 10,
-        isSystem: true
-      }
-
-      this.setState({
-        handleMVisible: true,
-        sysMenu: _menu
-      })
-      return
-    }
-
-    new Promise(resolve => {
-      if (useType === 'sys') {
-        resolve(true)
-      } else {
-        let param = {
-          func: 'sPC_Get_LongParam',
-          MenuID: template.uuid
-        }
-        this.setState({
-          loading: true
-        })
-
-        Api.getSystemConfig(param).then(result => {
-          if (!result.status) {
-            notification.warning({
-              top: 92,
-              message: result.message,
-              duration: 5
-            })
-            resolve(false)
-          } else {
-            let _config = ''
-            if (result.LongParam) {
-              try {
-                _config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
-                _config.type = 'user'
-              } catch (e) {
-                console.warn('Parse Failure')
-                _config = ''
-              }
-            }
-
-            if (_config) {
-              template.baseconfig = _config
-              resolve(true)
-            } else {
-              notification.warning({
-                top: 92,
-                message: '妯℃澘淇℃伅鑾峰彇澶辫触锛�',
-                duration: 5
-              })
-              resolve(false)
-            }
-          }
-        })
-      }
-    }).then(res => {
-      if (!res) { // 閿欒鏃讹紝閲嶇疆鐘舵��
-        this.setState({
-          loading: false
-        })
-        return
-      }
-
-      // 閫夋嫨妯℃澘锛氭坊鍔犺彍鍗曟椂(涓嶅瓨鍦╩enuId)
-      let _PageParam = {
-        OpenType: editMenu.PageParam ? editMenu.PageParam.OpenType : 'newtab',
-        Template: template.type
-      }
-
-      this.setState({
-        loading: false,
-        tabview: template.type,
-        editMenu: {
-          ...editMenu,
-          type: template.type,
-          PageParam: _PageParam,
-          LongParam: template.baseconfig,
-          isSubtable: template.isSubtable
-        }
-      })
-
-      document.getElementById('root').style.overflowY = 'hidden'
-    })
-  }
-
-  getUsedTemplate = () => {
-    let { sysTemplates } = this.state
-    let memberLevel = Utils.getMemberLevel()
-    const illust = { // 妯℃澘鍥剧墖锛岀敤浜庡凡浣跨敤妯℃澘
-      CommonTable: mainsubtable,
-      TreePage: treepage,
-      CalendarPage: calendar,
-      CustomPage: customImg
-    }
-
-    Api.getSystemConfig({func: 'sPC_Get_UserTemp', TypeCharTwo: 'menu'}).then(res => {
-      let _templates = []
-
-      res.UserTemp.forEach(temp => {
-        if (temp.Template === 'NewPage' || temp.Template === 'RolePermission') {
-          return
-        } else if (temp.Template === 'CustomPage' && memberLevel < 20) {
-          temp.disabled = true
-          temp.disTitle = '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'
-        }
-        
-        _templates.push({
-          uuid: temp.MenuID,
-          title: temp.MenuName,
-          type: temp.Template,
-          url: illust[temp.Template],
-          disabled: temp.disabled || false,
-          disTitle: temp.disTitle || ''
-        })
-      })
-
-      sysTemplates = sysTemplates.map(temp => {
-        if (temp.type === 'CustomPage' && memberLevel < 20) {
-          temp.disabled = true
-          temp.disTitle = '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'
-        }
-
-        return temp
-      })
-
-      this.setState({
-        usedTemplates: _templates,
-        sysTemplates: sysTemplates
-      })
-    })
   }
 
   exittabview = () => {
@@ -616,17 +273,6 @@
     const { sysMenu } = this.state
     let sysTemplates = fromJS(this.state.sysTemplates).toJS()
 
-    // 瑙掕壊鏉冮檺鍒嗛厤妯℃澘锛屽彧鍙互娣诲姞涓�娆�
-    // if (sysMenu.isSystem && (sysMenu.Template === 'RolePermission')) {
-    //   sysTemplates = sysTemplates.map(temp => {
-    //     if (temp.type === sysMenu.type) {
-    //       temp.hidden = true
-    //     }
-
-    //     return temp
-    //   })
-    // }
-
     this.menuFormRef.handleConfirm().then(res => {
       let PageParam = {
         Template: sysMenu.Template,
@@ -653,10 +299,6 @@
         LTexttb: ''
       }
 
-      if (sysMenu.menuSort) { // 鑿滃崟鏂板缓鏃惰缃帓搴�
-        param.Sort = sysMenu.menuSort
-      }
-
       param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
       param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
@@ -664,33 +306,29 @@
         confirmLoading: true
       })
 
-      if (sysMenu.Template === 'CustomPage' && sysMenu.OriginMenuId) {
-        this.copyMenu(param, sysMenu.OriginMenuId)
-      } else {
-        Api.getSystemConfig(param).then(response => {
-          if (response.status) {
-            this.setState({
-              sysTemplates: sysTemplates,
-              confirmLoading: false,
-              handleMVisible: false,
-              sysMenu: '',
-              tabview: ''
-            })
-  
-            this.props.reload()
-            document.getElementById('root').style.overflowY = 'unset'
-          } else {
-            this.setState({
-              confirmLoading: false
-            })
-            notification.warning({
-              top: 92,
-              message: response.message,
-              duration: 5
-            })
-          }
-        })
-      }
+      Api.getSystemConfig(param).then(response => {
+        if (response.status) {
+          this.setState({
+            sysTemplates: sysTemplates,
+            confirmLoading: false,
+            handleMVisible: false,
+            sysMenu: '',
+            tabview: ''
+          })
+
+          MKEmitter.emit('mkUpdateMenuList')
+          document.getElementById('root').style.overflowY = 'unset'
+        } else {
+          this.setState({
+            confirmLoading: false
+          })
+          notification.warning({
+            top: 92,
+            message: response.message,
+            duration: 5
+          })
+        }
+      })
     })
   }
 
@@ -731,7 +369,7 @@
               tabview: ''
             })
   
-            this.props.reload()
+            MKEmitter.emit('mkUpdateMenuList')
             document.getElementById('root').style.overflowY = 'unset'
           } else {
             this.setState({
@@ -758,8 +396,6 @@
   }
 
   UNSAFE_componentWillMount () {
-    this.getUsedTemplate()
-
     this.setState({
       menulist: this.props.menulist
     })
@@ -768,37 +404,17 @@
   UNSAFE_componentWillReceiveProps (nextProps) {
     if (!is(fromJS(this.props.menulist), fromJS(nextProps.menulist))) {
       this.setState({
-        menulist: nextProps.menulist
+        menulist: nextProps.menulist,
+        change: false
       })
     }
   }
 
   render () {
-    const { dict } = this.state
+    const { change } = this.state
+
     return (
       <div className="third-edit-box">
-        {!this.state.tabview ?
-          <div className="mask">
-            <div className="tipcard card1" style={{backgroundImage: 'url(' + card1 + ')'}}>
-              鎷栧姩涓夌骇鑿滃崟鍙皟鏁撮『搴忥紝椤哄簭璋冩暣鍚庯紝璇风偣鍑荤‘瀹氭寜閽繚瀛樸��
-            </div>
-            <div className="tipcard card2" style={{backgroundImage: 'url(' + card2 + ')'}}>
-              鐐瑰嚮缂栬緫鍥炬爣浼氭牴鎹彍鍗曟ā鏉匡紝杩涘叆鐩稿簲鐨勬ā鏉跨紪杈戦〉闈紝鐐瑰嚮鍒犻櫎鍥炬爣鍙垹闄よ彍鍗曘��
-            </div>
-            <div className="tipcard card3" style={{backgroundImage: 'url(' + card3 + ')'}}>
-              鐐瑰嚮瑙i櫎鍐荤粨鎸夐挳锛屽彲杩樺師宸插垹闄ょ殑涓夌骇鑿滃崟銆�
-            </div>
-            <div className="tipcard card4" style={{backgroundImage: 'url(' + card4 + ')'}}>
-              鐐瑰嚮娣诲姞鍥炬爣锛屼細鏄剧ず绯荤粺妯℃澘鍜屽凡浣跨敤妯℃澘锛岄�夋嫨宸蹭娇鐢ㄦā鏉挎椂锛屼細澶嶅埗宸叉坊鍔犺彍鍗曠殑閰嶇疆淇℃伅銆�
-            </div>
-            <div className="tipcard card5" style={{backgroundImage: 'url(' + card5 + ')'}}>
-              <p>缂栬緫鐘舵�佷腑锛岃彍鍗曚箣澶栧尯鍩熶細閿佸畾锛屾煡鐪嬬郴缁熸暟鎹鐐瑰嚮銆�</p>
-              <div>
-                <span className="new-view" onClick={() => {window.open('#/main')}} >鏂伴〉闈�</span>
-              </div>
-            </div>
-          </div> : null
-        }
         <div className="cus-submenu-title">
           <MkIcon type={this.props.supMenu.PageParam.Icon} />
           <span>{this.props.supMenu.MenuName}</span>
@@ -810,86 +426,29 @@
             handleMenu={this.handleMenu}
           />
         </DndProvider>
-        <div className="menu-add" onClick={() => {this.handleSubBtn('add')}}>
-          <PlusOutlined />
-        </div>
         <div className="menu-btn">
-          <Button type="primary" onClick={() => {this.handleSubBtn('thaw')}}>{dict['model.thaw'] + dict['model.menu']}</Button>
-          <Button type="primary" onClick={() => {this.handleSubBtn('confirm')}}>{dict['model.confirm']}</Button>
-          <Button onClick={() => {this.handleSubBtn('close')}}>{dict['model.close']}</Button>
+          <Button type="primary" className="mk-save-menu" disabled={!change} onClick={() => {this.handleSubBtn('confirm')}}>淇濆瓨</Button>
+          <Button onClick={() => {this.handleSubBtn('close')}}>鍏抽棴</Button>
         </div>
-        {this.state.tabview === 'template' ?
-          <div className="editboard">
-            <div className="workplace">
-              <Button className="top-btn mk-yellow" onClick={this.exittabview}>{dict['model.cancel']}</Button>
-              {this.state.tabview === 'template' && <Tabs defaultActiveKey="1">
-                <TabPane tab="绯荤粺妯℃澘" key="1">
-                  <Row>
-                    {this.state.sysTemplates.map((template, index) => {
-                      // if (template.hidden) return null
-
-                      return (
-                        <Col key={`${index}`} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={8}>
-                          <Card
-                            title={template.title}>
-                            <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
-                            <div className="card-operation">
-                              <Button type="primary" onClick={() => {this.useTemplate(template, 'sys')}}>浣跨敤妯℃澘</Button>
-                            </div>
-                          </Card>
-                        </Col>
-                      )
-                    })}
-                  </Row>
-                </TabPane>
-                <TabPane tab="宸蹭娇鐢ㄦā鏉�" key="2">
-                  <Row>
-                    <Col span={8}>
-                      <Search placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" defaultValue={this.state.tempSearchKey} onSearch={value => {this.setState({tempSearchKey: value})}} enterButton />
-                    </Col>
-                  </Row>
-                  <Row>
-                    {this.state.usedTemplates && this.state.usedTemplates.map((template, index) => {
-                      if (template.title.toLowerCase().indexOf(this.state.tempSearchKey.toLowerCase()) >= 0) {
-                        return (
-                          <Col key={template.type + index} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={6}>
-                            <Card
-                              title={template.title}>
-                              <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
-                              <div className="card-operation">
-                                <Button type="primary" onClick={() => {this.useTemplate(template, 'user')}}>浣跨敤妯℃澘</Button>
-                              </div>
-                            </Card>
-                          </Col>
-                        )
-                      } else {
-                        return ''
-                      }
-                    })}
-                  </Row>
-                </TabPane>
-              </Tabs>}
-            </div>
-          </div> : null
-        }
+        
         {this.state.tabview === 'TreePage' ?
           <TreePageConfig
             menu={this.state.editMenu}
-            reloadmenu={() => {this.props.reload()}}
+            reloadmenu={() => {MKEmitter.emit('mkUpdateMenuList')}}
             handleView={this.handleView}
           /> : null
         }
         {this.state.tabview === 'CalendarPage' ?
           <CalendarPageConfig
             menu={this.state.editMenu}
-            reloadmenu={() => {this.props.reload()}}
+            reloadmenu={() => {MKEmitter.emit('mkUpdateMenuList')}}
             handleView={this.handleView}
           /> : null
         }
         {this.state.tabview === 'CommonTable' ?
           <ComTableConfig
             menu={this.state.editMenu}
-            reloadmenu={() => {this.props.reload()}}
+            reloadmenu={() => {MKEmitter.emit('mkUpdateMenuList')}}
             handleView={this.handleView}
           /> : null
         }
@@ -927,38 +486,22 @@
             handleView={this.handleView}
           /> : null
         }
-        {/* 鍥剧墖棰勮 */}
-        <Preview cancel={this.cancelPrePicture} preview={this.state.preview} template={this.state.pretemplate} confirm={this.useTemplate}/>
-        {/* 瑙e喕鑿滃崟妯℃�佹 */}
-        <Modal
-          title={dict['model.thaw'] + dict['model.menu']}
-          width={600}
-          visible={this.state.thawMvisible}
-          onOk={this.thawMemuSubmit}
-          confirmLoading={this.state.confirmLoading}
-          onCancel={this.thawMemuCancel}
-          destroyOnClose
-        >
-          {!this.state.thawmenulist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />}
-          {this.state.thawmenulist && <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>}
-        </Modal>
         {/* 娣诲姞绯荤粺鑿滃崟 */}
         <Modal
-          title={this.state.sysMenu && this.state.sysMenu.isSystem ? dict['model.add'] + dict['model.menu'] : dict['model.update'] + dict['model.menu']}
+          title="淇敼鑿滃崟"
           visible={this.state.handleMVisible}
+          width={600}
           onOk={this.memuSubmit}
-          confirmLoading={this.state.confirmLoading}
+          confirmLoading={this.state.loading}
           onCancel={() => {this.setState({handleMVisible: false})}}
           destroyOnClose
         >
           <MenuForm
             menu={this.state.sysMenu}
-            dict={dict}
             inputSubmit={this.memuSubmit}
             wrappedComponentRef={(inst) => this.menuFormRef = inst}
           />
         </Modal>
-        {this.state.loading && <Spin className="loading-thdmenu" size="large" />}
       </div>
     )
   }
diff --git a/src/views/design/sidemenu/editthdmenu/index.scss b/src/views/design/sidemenu/editthdmenu/index.scss
index 83a9525..dcf0ae3 100644
--- a/src/views/design/sidemenu/editthdmenu/index.scss
+++ b/src/views/design/sidemenu/editthdmenu/index.scss
@@ -1,83 +1,6 @@
 .third-edit-box {
   position: relative;
   z-index: 10;
-  .mask {
-    position: fixed;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    .tipcard {
-      position: absolute;
-      min-height: 100px;
-      font-size: 16px;
-      border-radius: 6px;
-      background-size: 100% 100%;
-      background-repeat: no-repeat;
-      padding: 15px;  
-    }
-    .card1 {
-      left: 30%;
-      top: 20vh;
-      width: 250px;
-      min-height: 100px;
-      color: #000000;
-      font-style: oblique;
-    }
-    .card2 {
-      left: 60%;
-      top: 20vh;
-      width: 250px;
-      min-height: 100px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card3 {
-      left: 30%;
-      top: 50vh;
-      width: 250px;
-      min-height: 150px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card4 {
-      left: 60%;
-      top: 50vh;
-      width: 250px;
-      min-height: 150px;
-      color: #000000;
-      padding: 20px 30px;
-      font-style: oblique;
-    }
-    .card5 {
-      right: 5%;
-      top: 20vh;
-      width: 130px;
-      min-height: 240px;
-      color: #000000;
-      padding: 40px 15px 10px;
-      p {
-        margin: 0 0 5px;
-      }
-      div {
-        text-align: center;
-        .new-view {
-          display: inline-block;
-          cursor: pointer;
-          color: #fff;
-          padding: 2px 10px;
-          border-radius: 4px;
-          background-color: #1890ff;
-          border-color: #1890ff;
-          text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-          -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-          box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
-        }
-      }
-    }
-  }
   .cus-submenu-title {
     padding: 0px 24px;
     background: #364150;
@@ -92,105 +15,5 @@
     .anticon {
       margin-right: 10px;
     }
-  }
-  .editboard {
-    position: fixed;
-    z-index: 1070;
-    padding-top: 48px;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    background: rgba(0, 0, 0, 0.35);
-    .workplace {
-      position: relative;
-      width: calc(100vw - 235px);
-      height: 100%;
-      overflow-y: auto;
-      left: 235px;
-      background: #ffffff;
-
-      .top-btn {
-        position: absolute;
-        z-index: 1;
-        top: 12px;
-        right: 20px;
-        cursor: pointer;
-      }
-      .top-btn.submit {
-        right: 100px;
-      }
-      .ant-col {
-        padding: 10px;
-      }
-      .ant-col.disabled {
-        cursor: not-allowed;
-        .ant-card-head-title {
-          color: #959595;
-        }
-        .card-operation {
-          display: none;
-        }
-        img {
-          cursor: not-allowed;
-        }
-      }
-      .ant-card-head-title {
-        text-align: center;
-      }
-      .ant-card-body {
-        padding: 2px;
-        position: relative;
-        text-align: center;
-        overflow: hidden;
-        .card-operation {
-          position: absolute;
-          right: 0px;
-          top: 0;
-          height: 0px;
-          overflow: hidden;
-          transition: height 0.3s;
-          button {
-            height: 30px;
-            padding: 0 10px;
-            margin-top: 5px;
-            margin-right: 10px;
-            display: none;
-          }
-        }
-      }
-      .ant-card-body:hover {
-        .card-operation {
-          height: 40px;
-          button {
-            display: inline-block;
-          }
-        }
-      }
-      img {
-        max-width: 100%;
-        cursor: zoom-in;
-      }
-    }
-    .workplace::-webkit-scrollbar {
-      width: 7px;
-    }
-    .workplace::-webkit-scrollbar-thumb {
-      border-radius: 5px;
-      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
-      background: rgba(0, 0, 0, 0.13);
-    }
-    .workplace::-webkit-scrollbar-track {
-      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
-      border-radius: 3px;
-      border: 1px solid rgba(0, 0, 0, 0.07);
-      background: rgba(0, 0, 0, 0);
-    }
-  }
-  > .loading-thdmenu {
-    position: fixed;
-    left: calc(50vw - 22px);
-    top: calc(50vh - 70px);
-    z-index: 1100;
   }
 }
diff --git a/src/views/design/sidemenu/editthdmenu/menuform/index.jsx b/src/views/design/sidemenu/editthdmenu/menuform/index.jsx
index c86cde8..5e09244 100644
--- a/src/views/design/sidemenu/editthdmenu/menuform/index.jsx
+++ b/src/views/design/sidemenu/editthdmenu/menuform/index.jsx
@@ -8,18 +8,16 @@
 class MainSearch extends Component {
   static propTpyes = {
     menu: PropTypes.object,      // 鑿滃崟淇℃伅
-    dict: PropTypes.object,      // 瀛楀吀椤�
-    supMenuList: PropTypes.any,  // 琛ㄦ牸鏁版嵁
     inputSubmit: PropTypes.func  // 鍥炶溅鎻愪氦
   }
 
   state = {
-    menu: null
+    supMenuList: []
   }
 
   UNSAFE_componentWillMount () {
     this.setState({
-      menu: this.props.menu
+      supMenuList: this.props.menu.supMenuList
     })
   }
 
@@ -30,9 +28,15 @@
 
     if (submenu) {
       this.setState({
-        menu: {...menu, supMenuList: submenu.children}
+        supMenuList: submenu.children
       }, () => {
         this.props.form.setFieldsValue({ParentID: submenu.children[0] ? submenu.children[0].MenuID : ''})
+      })
+    } else {
+      this.setState({
+        supMenuList: []
+      }, () => {
+        this.props.form.setFieldsValue({ParentID: ''})
       })
     }
   }
@@ -74,14 +78,14 @@
     return (
       <Form {...formItemLayout} style={{paddingRight: '20px'}} onKeyDown={this.onEnterSubmit}>
         <Row gutter={24}>
-          <Col span={24}>
+          <Col span={22}>
             <Form.Item label={'涓�绾ц彍鍗�'}>
               {getFieldDecorator('fstMenuId', {
                 initialValue: menu.fstMenuId,
                 rules: [
                   {
                     required: true,
-                    message: this.props.dict['form.required.select'] + '涓婄骇鑿滃崟!'
+                    message: '璇烽�夋嫨涓婄骇鑿滃崟!'
                   }
                 ]
               })(
@@ -97,14 +101,14 @@
               )}
             </Form.Item>
           </Col>
-          <Col span={24}>
+          <Col span={22}>
             <Form.Item label={'浜岀骇鑿滃崟'}>
               {getFieldDecorator('ParentID', {
                 initialValue: menu.ParentId,
                 rules: [
                   {
                     required: true,
-                    message: this.props.dict['form.required.select'] + '涓婄骇鑿滃崟!'
+                    message: '璇烽�夋嫨涓婄骇鑿滃崟!'
                   }
                 ]
               })(
@@ -119,40 +123,40 @@
               )}
             </Form.Item>
           </Col>
-          <Col span={24}>
+          <Col span={22}>
             <Form.Item label={'鑿滃崟鍚嶇О'}>
               {getFieldDecorator('MenuName', {
                 initialValue: menu.MenuName || '',
                 rules: [
                   {
                     required: true,
-                    message: this.props.dict['form.required.input'] + '鑿滃崟鍚嶇О!'
+                    message: '璇疯緭鍏ヨ彍鍗曞悕绉�!'
                   }
                 ]
               })(<Input placeholder="" autoFocus autoComplete="off" />)}
             </Form.Item>
           </Col>
-          <Col span={24}>
+          <Col span={22}>
             <Form.Item label={'鑿滃崟鍙傛暟'}>
               {getFieldDecorator('MenuNo', {
                 initialValue: menu.MenuNo || '',
                 rules: [
                   {
                     required: true,
-                    message: this.props.dict['form.required.input'] + '鑿滃崟鍙傛暟!'
+                    message: '璇疯緭鍏ヨ彍鍗曞弬鏁�!'
                   }
                 ]
               })(<Input placeholder="" autoComplete="off" />)}
             </Form.Item>
           </Col>
-          {menu.Template === 'NewPage' ? <Col span={24}>
+          {menu.Template === 'NewPage' ? <Col span={22}>
             <Form.Item label={'閾炬帴鍦板潃'}>
               {getFieldDecorator('url', {
                 initialValue: menu.url || '',
                 rules: [
                   {
                     required: true,
-                    message: this.props.dict['form.required.input'] + '椤甸潰鍦板潃!'
+                    message: '璇疯緭鍏ラ〉闈㈠湴鍧�!'
                   },
                   {
                     max: 1024,
diff --git a/src/views/design/sidemenu/index.jsx b/src/views/design/sidemenu/index.jsx
index 9e0e8bb..e41d70d 100644
--- a/src/views/design/sidemenu/index.jsx
+++ b/src/views/design/sidemenu/index.jsx
@@ -1,12 +1,13 @@
 import React, {Component} from 'react'
 import { connect } from 'react-redux'
 import { is, fromJS } from 'immutable'
-import { Menu, notification, Popover, Modal, Spin } from 'antd'
-import { EditOutlined, SwapOutlined, PlusOutlined, UnlockOutlined, SettingOutlined } from '@ant-design/icons'
+import { Menu, Popover, Modal, notification } from 'antd'
+import { SwapOutlined, PlusOutlined, SettingOutlined } from '@ant-design/icons'
+import moment from 'moment'
 
 import asyncComponent from '@/utils/asyncComponent'
-import { resetEditLevel, modifyMenuTree, modifyMainMenu } from '@/store/action'
-import options from '@/store/options.js'
+import { resetEditLevel } from '@/store/action'
+import Utils from '@/utils/utils.js'
 import Api from '@/api'
 import MKEmitter from '@/utils/events.js'
 import MkIcon from '@/components/mk-icon'
@@ -14,22 +15,27 @@
 
 const EditSecMenu = asyncComponent(() => import('./editsecmenu'))
 const EditThdMenu = asyncComponent(() => import('./editthdmenu'))
-const TransferForm = asyncComponent(() => import('@/templates/zshare/basetransferform'))
+const ThawMenu = asyncComponent(() => import('@/components/thawmenu'))
+const AddThdMenu = asyncComponent(() => import('./thdmenuplus'))
+const ThdMenuForm = asyncComponent(() => import('./thdmenuform'))
+const MenuForm = asyncComponent(() => import('./menuform'))
 const { SubMenu } = Menu
 
 class Sidemenu extends Component {
   state = {
-    subMenulist: [],         // 浜岀骇鑿滃崟
     editMenu: null,          // 缂栬緫涓夌骇鑿滃崟鏃惰缃�
     rootSubmenuKeys: null,
     openKeys: null,
-    preview: null
+    preview: null,
+    loading: false,
+    thdVisible: false,
+    sysMenu: null,
+    formlist: []
   }
 
   async loadsubmenu (menu) {
     if (!menu || !menu.MenuID) { // 娌℃湁涓昏彍鍗曟椂锛屾竻绌轰笅绾ц彍鍗�
       this.setState({
-        subMenulist: [],
         rootSubmenuKeys: [],
         openKeys: [],
         editMenu: null
@@ -45,28 +51,14 @@
     }
 
     this.setState({
-      subMenulist: menu.children,
       rootSubmenuKeys: menu.children.map(item => item.MenuID),
       openKeys: openKey ? [openKey] : [],
       editMenu: this.props.editLevel === 'level3' ? menu.children.filter(_menu => _menu.MenuID === this.state.editMenu.MenuID)[0] : null
     })
   }
 
-  changemenu(e, menu) {
-    e.preventDefault()
-    if (this.props.editLevel !== 'HS') {
-      return
-    }
-
-    MKEmitter.emit('modifyTabs', menu, 'plus')
-  }
-
-  componentDidMount () {
-    window.addEventListener('storage', (e) => {
-      if (e.key !== 'menuUpdate') return
-
-      this.reload()
-    })
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
   }
 
   UNSAFE_componentWillReceiveProps (nextProps) {
@@ -74,10 +66,6 @@
       // 涓昏彍鍗曞垏鎹紝璇锋眰2銆�3绾ц彍鍗曟暟鎹�
       this.loadsubmenu(nextProps.mainMenu)
     }
-  }
-
-  shouldComponentUpdate(nextProps, nextState) {
-    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
   }
 
   onOpenChange = openKeys => {
@@ -94,6 +82,9 @@
   enterSubEdit = (e) => {
     // 缂栬緫浜岀骇鑿滃崟
     e.stopPropagation()
+
+    if (this.props.mainMenu.children.length === 0) return
+
     this.props.resetEditLevel('level2')
   }
 
@@ -102,110 +93,6 @@
     e.stopPropagation()
     this.props.resetEditLevel('level3')
     this.setState({editMenu: menu})
-  }
-
-  reload = () => {
-    const { mainMenu } = this.props
-    let _param = {func: 's_get_pc_menus', systemType: options.sysType, debug: 'Y'}
-    _param.pro_sys = window.GLOB.systemType === 'production' ? 'Y' : ''
-
-    Api.getSystemConfig(_param).then(result => {
-      // 鐧诲綍瓒呮椂
-      if (!result) return
-  
-      if (result.status) {
-        let res = this.getMenulist(result)
-        let _mainMenu = res.menulist.filter(item => item.MenuID === mainMenu.MenuID)[0]
-  
-        this.props.modifyMenuTree(res.menulist)
-        this.props.modifyMainMenu(_mainMenu || null)
-      } else {
-        notification.error({
-          top: 92,
-          message: result.message,
-          duration: 10
-        })
-      }
-      this.loadsubmenu(this.props.mainMenu)
-    })
-  }
-
-  getMenulist = (result) => {
-    let iframes = ['Main/Index', 'bda/rdt', 'Home/rdt']
-    let menulist = result.fst_menu.map(fst => {
-      let fstItem = {
-        MenuID: fst.MenuID,
-        MenuName: fst.MenuName,
-        PageParam: {OpenType: 'menu', linkUrl: ''},
-        children: []
-      }
-      if (fst.PageParam) {
-        try {
-          fstItem.PageParam = JSON.parse(fst.PageParam)
-        } catch (e) {
-          fstItem.PageParam = {OpenType: 'menu', linkUrl: ''}
-        }
-      }
-
-      if (fst.snd_menu) {
-        fstItem.children = fst.snd_menu.map(snd => {
-          let sndItem = {
-            ParentId: fst.MenuID,
-            MenuID: snd.MenuID,
-            MenuName: snd.MenuName,
-            PageParam: {Icon: 'folder'},
-            children: []
-          }
-
-          if (snd.PageParam) {
-            try {
-              sndItem.PageParam = JSON.parse(snd.PageParam)
-            } catch (e) {
-              sndItem.PageParam = {Icon: 'folder'}
-            }
-          }
-
-          if (snd.trd_menu) {
-            sndItem.children = snd.trd_menu.map(trd => {
-              let trdItem = {
-                FstId: fst.MenuID,
-                ParentId: snd.MenuID,
-                MenuID: trd.MenuID,
-                MenuName: trd.MenuName,
-                MenuNo: trd.MenuNo,
-                EasyCode: trd.EasyCode,
-                type: 'CommonTable',            // 榛樿鍊间负甯哥敤琛�
-                OpenType: 'newtab'              // 鎵撳紑鏂瑰紡
-              }
-  
-              if (trd.LinkUrl && iframes.includes(trd.LinkUrl.split('?')[0])) {
-                trdItem.type = 'iframe'
-                trdItem.LinkUrl = trd.LinkUrl.replace('&amp;', '&')
-                trdItem.forbidden = true
-              } else {
-                try {
-                  trdItem.PageParam = trd.PageParam ? JSON.parse(trd.PageParam) : {OpenType: 'newtab'}
-                } catch (e) {
-                  trdItem.PageParam = {OpenType: 'newtab'}
-                }
-
-                trdItem.type = trdItem.PageParam.Template || trdItem.type
-                trdItem.OpenType = trdItem.PageParam.OpenType || trdItem.OpenType
-
-                if (trdItem.type === 'CustomPage' && this.props.memberLevel < 20) { // 浼氬憳绛夌骇澶т簬绛変簬20鏃讹紝鏈夌紪杈戞潈闄�
-                  trdItem.forbidden = true
-                }
-              }
-              return trdItem
-            })
-          }
-          return sndItem
-        })
-      }
-      return fstItem
-    })
-
-    return { menulist }
   }
 
   exitEdit = () => {
@@ -226,23 +113,172 @@
       }
       _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
       window.open(`#/menudesign/${_param}`)
-    } else {
+    } else if (['RolePermission', 'NewPage'].includes(cell.type)) {
+      cell.Template = cell.PageParam.Template
+      cell.url = cell.PageParam.url || ''
 
+      cell.fstMenuId = cell.FstId
+      cell.supMenuList = this.props.mainMenu.children
+      cell.fstMenuList = this.props.menuTree
+
+      this.setState({
+        thdVisible: true,
+        loading: false,
+        sysMenu: cell
+      })
     }
+  }
+
+  addSecMenu = () => {
+    this.setState({
+      visible: true,
+      loading: false,
+      formlist: [
+        { // 鐖剁骇鑿滃崟
+          type: 'select',
+          key: 'parentId',
+          label: '涓婄骇鑿滃崟',
+          initVal: this.props.mainMenu.MenuID,
+          required: true,
+          options: this.props.menuTree
+        },
+        { // 鑿滃崟鍚嶇О
+          type: 'text',
+          key: 'menuName',
+          label: '鑿滃崟鍚嶇О',
+          initVal: '',
+          required: true,
+          readonly: false
+        },
+        { // 鑿滃崟鍥炬爣
+          type: 'icon',
+          key: 'icon',
+          label: '鍥炬爣',
+          initVal: 'folder',
+          required: true
+        }
+      ]
+    })
+  }
+
+  secSubmit = () => {
+    this.menuFormRef.handleConfirm().then(values => {
+      let param = {
+        ParentID: values.parentId,
+        MenuID: Utils.getuuid(),
+        MenuName: values.menuName,
+        PageParam: JSON.stringify({
+          Icon: values.icon
+        })
+      }
+      param.func = 'sPC_SndMenu_Add'
+      param.Sort = (this.props.mainMenu.children.length + 1) * 10
+
+      this.setState({
+        loading: true
+      })
+      Api.getSystemConfig(param).then(res => {
+        if (res.status) {
+          this.setState({
+            loading: false,
+            visible: false
+          })
+          MKEmitter.emit('mkUpdateMenuList')
+        } else {
+          this.setState({
+            loading: false
+          })
+          notification.warning({
+            top: 92,
+            message: res.message,
+            duration: 5
+          })
+        }
+      })
+    })
+  }
+
+  /**
+   * @description 涓夌骇鑿滃崟淇敼
+   */
+  thdSubmit = () => {
+    const { sysMenu } = this.state
+
+    this.menuThdFormRef.handleConfirm().then(res => {
+      let PageParam = {
+        Template: sysMenu.Template,
+        OpenType: 'newtab'
+      }
+
+      if (sysMenu.Template === 'NewPage') {
+        PageParam.OpenType = 'NewPage'
+        PageParam.url = res.url
+      }
+
+      let param = {
+        func: 'sPC_TrdMenu_AddUpt',
+        FstID: res.fstMenuId,
+        SndID: res.ParentID,
+        ParentID: res.ParentID,
+        MenuID: sysMenu.MenuID,
+        MenuNo: res.MenuNo,
+        Template: sysMenu.Template,
+        MenuName: res.MenuName,
+        PageParam: JSON.stringify(PageParam),
+        LongParam: '',
+        LText: '',
+        LTexttb: ''
+      }
+
+      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+      this.setState({
+        loading: true
+      })
+
+      Api.getSystemConfig(param).then(response => {
+        if (response.status) {
+          this.setState({
+            loading: false,
+            thdVisible: false,
+            sysMenu: null
+          })
+          MKEmitter.emit('mkUpdateMenuList')
+        } else {
+          this.setState({
+            loading: false
+          })
+          notification.warning({
+            top: 92,
+            message: response.message,
+            duration: 5
+          })
+        }
+      })
+    })
   }
 
   render () {
     const { mainMenu, editLevel } = this.props
-    const { visible } = this.state
-
-    let isnew = true
+    const { visible, loading, thdVisible } = this.state
 
     return (
       <aside className="mk-sys-side-menu ant-menu-dark mk-edit">
-        {!(editLevel === 'level2' || editLevel === 'level3') &&
+        {editLevel !== 'level2' && editLevel !== 'level3' && mainMenu ?
           <Menu openKeys={this.state.openKeys} onOpenChange={this.onOpenChange} mode="inline" theme="dark">
-          {!editLevel && mainMenu ? <li className="sup-menu"><EditOutlined onClick={this.enterSubEdit} className="edit-check"/></li> : null}
-          {this.state.subMenulist && this.state.subMenulist.map((item, index) => {
+          <li className="sup-menu">
+            <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+              <div className="mk-popover-control">
+                <PlusOutlined onClick={this.addSecMenu}/>
+                <SwapOutlined onClick={this.enterSubEdit} className={'mk-swap' + (mainMenu.children.length === 0 ? ' disabled' : '')}/>
+                <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId={mainMenu.MenuID} Type="20"/></div>
+              </div>
+            } trigger="hover" placement="top">
+              <SettingOutlined className="edit-check"/>
+            </Popover>
+          </li>
+          {mainMenu.children.map((item, index) => {
             return (
               <SubMenu
                 key={item.MenuID}
@@ -253,61 +289,72 @@
                   </span>
                 }
               >
-                {!editLevel ? <li className={'ant-menu-item ' + (item.children.length > 0 ? 'sub-menu' : '')}>
-                  {!isnew ? <EditOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="edit-check"/> :
+                <li className={'ant-menu-item ' + (item.children.length > 0 ? 'sub-menu' : '')}>
                   <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
                     <div className="mk-popover-control">
-                      <PlusOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-edit-menu"/>
-                      <SwapOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-edit-menu mk-swap"/>
-                      <UnlockOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-edit-menu"/>
+                      <div style={{display: 'inline-block', minWidth: '32px'}}><AddThdMenu mainMenu={mainMenu} supMenu={item} menuTree={this.props.menuTree}/></div>
+                      <SwapOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-swap"/>
+                      <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId={item.MenuID} Type="30"/></div>
                     </div>
                   } trigger="hover" placement="top">
                     <SettingOutlined className="edit-check"/>
-                  </Popover>}
-                </li> : null}
+                  </Popover>
+                </li>
                 {item.children.map(cell => {
                   return (
                     <Menu.Item key={cell.MenuID}>
-                      {editLevel !== 'HS' ?
-                        <span className="editable-menu-item" onDoubleClick={() => this.editmenu(cell)}>{cell.MenuName}</span> :
-                        <a href={cell.src} id={cell.MenuID} onClick={(e) => this.changemenu(e, cell)}>{cell.MenuName}</a>
-                      }
+                      <span className="editable-menu-item" onDoubleClick={(e) => {e.stopPropagation();this.editmenu(cell)}}>{cell.MenuName}</span>
                     </Menu.Item>
                   )
                 })}
               </SubMenu>
             )
           })}
-        </Menu>}
-        {editLevel === 'level2' ?
+        </Menu> : null}
+        {editLevel === 'level2' && mainMenu ?
           <EditSecMenu
-            menulist={this.state.subMenulist}
+            menulist={mainMenu.children}
             menuTree={this.props.menuTree}
             supMenu={this.props.mainMenu}
-            reload={this.reload}
             exitEdit={this.exitEdit}
           /> : null
         }
-        {editLevel === 'level3' && this.state.editMenu ?
+        {editLevel === 'level3' && mainMenu && this.state.editMenu ?
           <EditThdMenu
             menulist={this.state.editMenu.children}
-            supMenuList={this.state.subMenulist}
+            supMenuList={mainMenu.children}
             supMenu={this.state.editMenu}
-            reload={this.reload}
             exitEdit={this.exitEdit}
           /> : null
         }
         <Modal
-          title="瑙e喕鑿滃崟"
-          width={600}
+          title="娣诲姞鑿滃崟"
           visible={visible}
-          onOk={this.thawMemuSubmit}
-          confirmLoading={this.state.confirmLoading}
-          onCancel={this.thawMemuCancel}
+          onOk={this.secSubmit}
+          // confirmLoading={loading}
+          onCancel={() => this.setState({visible: false})}
           destroyOnClose
         >
-          {!this.state.thawmenulist ? <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" /> :
-          <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>}
+          <MenuForm
+            inputSubmit={this.secSubmit}
+            formlist={this.state.formlist}
+            wrappedComponentRef={(inst) => this.menuFormRef = inst}
+          />
+        </Modal>
+        <Modal
+          title="淇敼鑿滃崟"
+          visible={thdVisible}
+          width={600}
+          onOk={this.thdSubmit}
+          confirmLoading={loading}
+          onCancel={() => {this.setState({thdVisible: false})}}
+          destroyOnClose
+        >
+          <ThdMenuForm
+            menu={this.state.sysMenu}
+            inputSubmit={this.thdSubmit}
+            wrappedComponentRef={(inst) => this.menuThdFormRef = inst}
+          />
         </Modal>
       </aside>
     )
@@ -324,8 +371,6 @@
 
 const mapDispatchToProps = (dispatch) => {
   return {
-    modifyMenuTree: (menuTree) => dispatch(modifyMenuTree(menuTree)),
-    modifyMainMenu: (mainMenu) => dispatch(modifyMainMenu(mainMenu)),
     resetEditLevel: (level) => dispatch(resetEditLevel(level))
   }
 }
diff --git a/src/views/design/sidemenu/menuelement/card.jsx b/src/views/design/sidemenu/menuelement/card.jsx
index fd2aa26..b9133a4 100644
--- a/src/views/design/sidemenu/menuelement/card.jsx
+++ b/src/views/design/sidemenu/menuelement/card.jsx
@@ -33,30 +33,29 @@
     closeCard(id)
   }
 
-  let _param = ''
-  if (card.type === 'CustomPage') {
-    _param = {
-      MenuType: 'custom',
-      MenuId: card.MenuID,
-      ParentId: card.ParentId,
-      MenuName: card.MenuName,
-      MenuNo: card.MenuNo
-    }
-    _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
-  }
-
-  return (
-    <div className="side-card" style={{ opacity }}>
-      <div ref={node => drag(drop(node))}>
-        {card.PageParam && card.PageParam.Icon && <MkIcon type={card.PageParam.Icon} />}
-        {card.MenuName}
+  if (card.level === 'second') {
+    return (
+      <div className="side-card" style={{ opacity }}>
+        <div ref={node => drag(drop(node))}>
+          {card.PageParam && card.PageParam.Icon && <MkIcon type={card.PageParam.Icon} />}
+          {card.MenuName}
+        </div>
+        <EditOutlined className="edit" onClick={edit} />
+        <CloseOutlined className="close" onClick={close} />
       </div>
-      {/* 鑷畾涔夋ā鏉匡紝鍦ㄦ柊椤甸潰缂栬緫 */}
-      {!card.forbidden && card.type !== 'CustomPage' ? <EditOutlined className="edit" onClick={edit} /> : null}
-      {!card.forbidden && card.type === 'CustomPage' ? <EditOutlined className="edit" onClick={() => {window.open(`#/menudesign/${_param}`)}}/> : null}
-      {card.forbidden && card.type === 'CustomPage' ? <EditOutlined className="edit" style={{color: '#959595', cursor: 'not-allowed'}} title="浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��"/> : null}
-      <CloseOutlined className="close" onClick={close} />
-    </div>
-  )
+    )
+  } else {
+    return (
+      <div className="side-card" style={{ opacity }}>
+        <div ref={node => drag(drop(node))}>
+          {card.MenuName}
+        </div>
+        {/* 鑷畾涔夋ā鏉匡紝鍦ㄦ柊椤甸潰缂栬緫 */}
+        {!card.forbidden ? <EditOutlined className="edit" onClick={edit} /> : null}
+        {card.forbidden && card.type === 'CustomPage' ? <EditOutlined className="edit" style={{color: '#959595', cursor: 'not-allowed'}} title="浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��"/> : null}
+        <CloseOutlined className="close" onClick={close} />
+      </div>
+    )
+  }
 }
 export default Card
diff --git a/src/views/design/sidemenu/menuelement/index.scss b/src/views/design/sidemenu/menuelement/index.scss
index e685eec..2ec4117 100644
--- a/src/views/design/sidemenu/menuelement/index.scss
+++ b/src/views/design/sidemenu/menuelement/index.scss
@@ -15,7 +15,7 @@
 }
 .side-card {
   position: relative;
-  border: 1px dashed gray;
+  border: 1px dashed #535353;
   margin-top: 8px;
   height: 40px;
   width: 98%;
diff --git a/src/views/design/sidemenu/menuform/index.jsx b/src/views/design/sidemenu/menuform/index.jsx
index 8a1ae15..92bfbd2 100644
--- a/src/views/design/sidemenu/menuform/index.jsx
+++ b/src/views/design/sidemenu/menuform/index.jsx
@@ -7,9 +7,8 @@
 
 const MkEditIcon = asyncComponent(() => import('@/components/mkIcon'))
 
-class MainSearch extends Component {
+class MainForm extends Component {
   static propTpyes = {
-    dict: PropTypes.object,     // 瀛楀吀椤�
     formlist: PropTypes.array,
     inputSubmit: PropTypes.func
   }
@@ -48,10 +47,10 @@
                 rules: [
                   {
                     required: !!item.required,
-                    message: this.props.dict['form.required.input'] + item.label + '!'
+                    message: '璇疯緭鍏�' + item.label + '!'
                   }
                 ]
-              })(<Input placeholder="" autoFocus={item.key.toLowerCase() === 'menuname'} autoComplete="off" disabled={item.readonly} />)}
+              })(<Input placeholder="" autoFocus={item.key.toLowerCase() === 'menuname'} autoComplete="off" disabled={item.readonly} onPressEnter={() => this.props.inputSubmit()}/>)}
             </Form.Item>
           </Col>
         )
@@ -64,7 +63,7 @@
                 rules: [
                   {
                     required: !!item.required,
-                    message: this.props.dict['form.required.select'] + item.label + '!'
+                    message: '璇烽�夋嫨' + item.label + '!'
                   }
                 ]
               })(
@@ -93,7 +92,7 @@
                 rules: [
                   {
                     required: !!item.required,
-                    message: this.props.dict['form.required.select'] + item.label + '!'
+                    message: '璇烽�夋嫨' + item.label + '!'
                   }
                 ]
               })(
@@ -120,13 +119,6 @@
     })
   }
 
-  onEnterSubmit = (e) => {
-    // 琛ㄥ崟鍥炶溅鎻愪氦
-    if (e.key !== 'Enter') return
-    
-    this.props.inputSubmit && this.props.inputSubmit()
-  }
-
   render() {
     const formItemLayout = {
       labelCol: {
@@ -139,11 +131,11 @@
       }
     }
     return (
-      <Form {...formItemLayout} className="ant-advanced-search-form" id="form-box" onKeyDown={this.onEnterSubmit}>
+      <Form {...formItemLayout} id="form-box">
         <Row gutter={24}>{this.getFields()}</Row>
       </Form>
     )
   }
 }
 
-export default Form.create()(MainSearch)
\ No newline at end of file
+export default Form.create()(MainForm)
\ No newline at end of file
diff --git a/src/views/design/sidemenu/menuform/index.scss b/src/views/design/sidemenu/menuform/index.scss
index 9914d8e..8b13789 100644
--- a/src/views/design/sidemenu/menuform/index.scss
+++ b/src/views/design/sidemenu/menuform/index.scss
@@ -1,17 +1 @@
-.ant-advanced-search-form.main-search {
-  padding: 0px 24px 20px;
-  border-bottom: 1px solid #d9d9d9;
-  .ant-form-item {
-    display: flex;
-    margin-bottom: 10px;
-  }
-  .ant-form-item-control-wrapper {
-    flex: 1;
-  }
-  .ant-form-item-label {
-    width: 100px;
-  }
-}
-.ant-advanced-search-form {
-  position: relative;
-}
+
diff --git a/src/views/design/sidemenu/thdmenuform/index.jsx b/src/views/design/sidemenu/thdmenuform/index.jsx
new file mode 100644
index 0000000..1d68f35
--- /dev/null
+++ b/src/views/design/sidemenu/thdmenuform/index.jsx
@@ -0,0 +1,170 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { fromJS } from 'immutable'
+import { Form, Row, Col, Input, Select } from 'antd'
+// import './index.scss'
+
+const { TextArea } = Input
+
+class MainSearch extends Component {
+  static propTpyes = {
+    menu: PropTypes.object,      // 鑿滃崟淇℃伅
+    inputSubmit: PropTypes.func  // 鍥炶溅鎻愪氦
+  }
+
+  state = {
+    supMenuList: []
+  }
+
+  UNSAFE_componentWillMount () {
+    this.setState({
+      supMenuList: fromJS(this.props.menu.supMenuList).toJS()
+    })
+  }
+
+  changeMenu = (val) => {
+    const { menu } = this.props
+
+    let submenu = menu.fstMenuList.filter(item => item.MenuID === val)[0]
+
+    if (submenu) {
+      this.setState({
+        supMenuList: submenu.children
+      }, () => {
+        this.props.form.setFieldsValue({ParentID: submenu.children[0] ? submenu.children[0].MenuID : ''})
+      })
+    } else {
+      this.setState({
+        supMenuList: []
+      }, () => {
+        this.props.form.setFieldsValue({ParentID: ''})
+      })
+    }
+  }
+
+  handleConfirm = () => {
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    return new Promise((resolve, reject) => {
+      this.props.form.validateFieldsAndScroll((err, values) => {
+        if (!err) {
+          resolve(values)
+        } else {
+          reject(err)
+        }
+      })
+    })
+  }
+
+  render() {
+    const { menu } = this.props
+    const { getFieldDecorator } = this.props.form
+    const { supMenuList } = this.state
+    const formItemLayout = {
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 8 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      }
+    }
+
+    return (
+      <Form {...formItemLayout} style={{paddingRight: '20px'}}>
+        <Row gutter={24}>
+          <Col span={22}>
+            <Form.Item label={'涓�绾ц彍鍗�'}>
+              {getFieldDecorator('fstMenuId', {
+                initialValue: menu.fstMenuId,
+                rules: [
+                  {
+                    required: true,
+                    message: '璇烽�夋嫨涓婄骇鑿滃崟!'
+                  }
+                ]
+              })(
+                <Select
+                  showSearch
+                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
+                  onChange={this.changeMenu}
+                >
+                  {menu.fstMenuList.map(option =>
+                    <Select.Option key={option.MenuID} value={option.MenuID}>{option.text || option.MenuName}</Select.Option>
+                  )}
+                </Select>
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={22}>
+            <Form.Item label={'浜岀骇鑿滃崟'}>
+              {getFieldDecorator('ParentID', {
+                initialValue: menu.ParentId,
+                rules: [
+                  {
+                    required: true,
+                    message: '璇烽�夋嫨涓婄骇鑿滃崟!'
+                  }
+                ]
+              })(
+                <Select
+                  showSearch
+                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
+                >
+                  {supMenuList.map(option =>
+                    <Select.Option key={option.MenuID} value={option.MenuID}>{option.text || option.MenuName}</Select.Option>
+                  )}
+                </Select>
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={22}>
+            <Form.Item label={'鑿滃崟鍚嶇О'}>
+              {getFieldDecorator('MenuName', {
+                initialValue: menu.MenuName || '',
+                rules: [
+                  {
+                    required: true,
+                    message: '璇疯緭鍏ヨ彍鍗曞悕绉�!'
+                  }
+                ]
+              })(<Input placeholder="" autoFocus autoComplete="off" onPressEnter={() => this.props.inputSubmit()}/>)}
+            </Form.Item>
+          </Col>
+          <Col span={22}>
+            <Form.Item label={'鑿滃崟鍙傛暟'}>
+              {getFieldDecorator('MenuNo', {
+                initialValue: menu.MenuNo || '',
+                rules: [
+                  {
+                    required: true,
+                    message: '璇疯緭鍏ヨ彍鍗曞弬鏁�!'
+                  }
+                ]
+              })(<Input placeholder="" autoComplete="off" onPressEnter={() => this.props.inputSubmit()}/>)}
+            </Form.Item>
+          </Col>
+          {menu.Template === 'NewPage' ? <Col span={22}>
+            <Form.Item label={'閾炬帴鍦板潃'}>
+              {getFieldDecorator('url', {
+                initialValue: menu.url || '',
+                rules: [
+                  {
+                    required: true,
+                    message: '璇疯緭鍏ラ〉闈㈠湴鍧�!'
+                  },
+                  {
+                    max: 1024,
+                    message: '鍦板潃鏈�闀夸负1024涓瓧绗�!'
+                  }
+                ]
+              })(<TextArea rows={2} />)}
+            </Form.Item>
+          </Col> : null}
+        </Row>
+      </Form>
+    )
+  }
+}
+
+export default Form.create()(MainSearch)
\ No newline at end of file
diff --git a/src/views/design/sidemenu/thdmenuform/index.scss b/src/views/design/sidemenu/thdmenuform/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/design/sidemenu/thdmenuform/index.scss
diff --git a/src/views/design/sidemenu/thdmenuplus/index.jsx b/src/views/design/sidemenu/thdmenuplus/index.jsx
new file mode 100644
index 0000000..499fa29
--- /dev/null
+++ b/src/views/design/sidemenu/thdmenuplus/index.jsx
@@ -0,0 +1,309 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { Modal, notification, Col, Card, Tabs, Row, Input, Button } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import moment from 'moment'
+
+import Api from '@/api'
+import { sysTemps } from '@/utils/option.js'
+import MKEmitter from '@/utils/events.js'
+import Utils from '@/utils/utils.js'
+import Preview from './preview'
+import asyncComponent from '@/utils/asyncComponent'
+
+import mainsubtable from '@/assets/img/mainsubtable.jpg'
+import treepage from '@/assets/img/treepage.jpg'
+import calendar from '@/assets/img/calendar.jpg'
+import customImg from '@/assets/img/custom.jpg'
+
+import './index.scss'
+
+const MenuForm = asyncComponent(() => import('../thdmenuform'))
+const { TabPane } = Tabs
+const { Search } = Input
+
+class ThdMenuAdd extends Component {
+  static propTpyes = {
+    mainMenu: PropTypes.object,
+    supMenu: PropTypes.object,
+    menuTree: PropTypes.array,
+    Type: PropTypes.string
+  }
+
+  state = {
+    sysTemplates: [],
+    usedTemplates: [],
+    tempSearchKey: '',
+    addVisible: false,
+    preview: null,
+    visible: false,
+    sysMenu: null,
+    loading: false
+  }
+
+  UNSAFE_componentWillMount() {
+    this.getUsedTemplate()
+  }
+
+  getUsedTemplate = () => {
+    let { sysTemplates } = this.state
+    let memberLevel = Utils.getMemberLevel()
+    const illust = { // 妯℃澘鍥剧墖锛岀敤浜庡凡浣跨敤妯℃澘
+      CommonTable: mainsubtable,
+      TreePage: treepage,
+      CalendarPage: calendar,
+      CustomPage: customImg
+    }
+
+    Api.getSystemConfig({func: 'sPC_Get_UserTemp', TypeCharTwo: 'menu'}).then(res => {
+      let _templates = []
+
+      res.UserTemp.forEach(temp => {
+        if (!['CommonTable', 'TreePage', 'CalendarPage', 'CustomPage'].includes(temp.Template)) {
+          return
+        } else if (temp.Template === 'CustomPage' && memberLevel < 20) {
+          temp.disabled = true
+          temp.disTitle = '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'
+        }
+        
+        _templates.push({
+          uuid: temp.MenuID,
+          title: temp.MenuName,
+          type: temp.Template,
+          url: illust[temp.Template],
+          disabled: temp.disabled || false,
+          disTitle: temp.disTitle || ''
+        })
+      })
+
+      sysTemplates = sysTemps.map(temp => {
+        if (temp.type === 'CustomPage' && memberLevel < 20) {
+          temp.disabled = true
+          temp.disTitle = '浼氬憳绛夌骇涓嶅锛屾棤寮�鍙戞潈闄愩��'
+        }
+
+        return temp
+      })
+
+      this.setState({
+        usedTemplates: _templates,
+        sysTemplates: sysTemplates
+      })
+    })
+  }
+
+  trigger = () => {
+    this.setState({
+      visible: true
+    })
+    document.getElementById('root').style.overflowY = 'hidden'
+  }
+
+  previewPicture = (template) => {
+    if (template.disabled) return
+    // 鍥剧墖棰勮
+    this.setState({
+      preview: template.url,
+      pretemplate: template
+    })
+  }
+
+  cancelPrePicture = () => {
+    // 鍏抽棴鍥剧墖棰勮
+    this.setState({
+      preview: null
+    })
+  }
+  // this.setState({
+  //   tabview: 'template',
+  //   editMenu: {
+  //     MenuID: Utils.getuuid(),
+  //     MenuName: '',
+  //     MenuNo: '',
+  //     type: '',
+  //     PageParam: '',
+  //     LongParam: '',
+  //     isSubtable: '', // 鏄惁涓轰富瀛愯〃
+  //     ParentId: this.props.supMenu.MenuID,
+  //     supMenuList: this.props.supMenuList,
+  //     fstMenuId: this.props.mainMenu.MenuID,
+  //     fstMenuList: this.props.menuTree,
+  //     menuSort: (this.props.menulist.length + 1) * 10 // 鏂板缓鑿滃崟璁剧疆鎺掑簭
+  //   }
+  // }, () => {
+  //   document.getElementById('root').style.overflowY = 'hidden'
+  // })
+
+  useTemplate = (template) => {
+    const { mainMenu, supMenu, menuTree } = this.props
+
+    let sysMenu = {
+      MenuID: Utils.getuuid(),
+      MenuName: template.title,
+      Template: template.type,
+      fstMenuId: mainMenu.MenuID,
+      ParentId: supMenu.MenuID,
+      menuSort: (supMenu.children.length + 1) * 10,
+      copyId: template.uuid || '',
+      fstMenuList: menuTree,
+      supMenuList: mainMenu.children
+    }
+
+    this.setState({
+      visible: false
+    }, () => {
+      this.setState({
+        addVisible: true,
+        sysMenu: sysMenu
+      })
+      document.getElementById('root').style.overflowY = 'unset'
+    })
+  }
+
+  memuSubmit = () => {
+    const { sysMenu } = this.state
+
+    this.menuFormRef.handleConfirm().then(values => {
+      let PageParam = {
+        Template: sysMenu.Template,
+        OpenType: 'newtab'
+      }
+
+      if (sysMenu.Template === 'NewPage') {
+        PageParam.OpenType = 'NewPage'
+        PageParam.url = values.url
+      }
+
+      if (sysMenu.copyId) {
+        PageParam.copyMenuId = sysMenu.copyId
+      }
+
+      let param = {
+        func: 'sPC_TrdMenu_AddUpt',
+        FstID: values.fstMenuId,
+        SndID: values.ParentID,
+        ParentID: values.ParentID,
+        MenuID: sysMenu.MenuID,
+        MenuNo: values.MenuNo,
+        Template: sysMenu.Template,
+        MenuName: values.MenuName,
+        PageParam: JSON.stringify(PageParam),
+        LongParam: '',
+        LText: '',
+        LTexttb: '',
+        Sort: sysMenu.menuSort
+      }
+
+      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+      this.setState({
+        loading: true
+      })
+
+      Api.getSystemConfig(param).then(response => {
+        if (response.status) {
+          this.setState({
+            loading: false,
+            addVisible: false,
+            sysMenu: null
+          })
+
+          MKEmitter.emit('mkUpdateMenuList')
+        } else {
+          this.setState({
+            loading: false
+          })
+          notification.warning({
+            top: 92,
+            message: response.message,
+            duration: 5
+          })
+        }
+      })
+    })
+  }
+
+  render() {
+    const { visible, loading, tempSearchKey } = this.state
+
+    return (
+      <>
+        <PlusOutlined onClick={this.trigger}/>
+        <Modal
+          className="mk-template-modal"
+          visible={visible}
+          onOk={this.submit}
+          onCancel={() => this.setState({visible: false}, () => {document.getElementById('root').style.overflowY = 'unset'})}
+          destroyOnClose
+        >
+          <Tabs defaultActiveKey="1">
+            <TabPane tab="绯荤粺妯℃澘" key="1">
+              <Row>
+                {this.state.sysTemplates.map((template, index) => {
+                  return (
+                    <Col key={`${index}`} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={8}>
+                      <Card
+                        title={template.title}>
+                        <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
+                        <div className="card-operation">
+                          <Button type="primary" onClick={() => {this.useTemplate(template, 'sys')}}>浣跨敤妯℃澘</Button>
+                        </div>
+                      </Card>
+                    </Col>
+                  )
+                })}
+              </Row>
+            </TabPane>
+            <TabPane tab="宸蹭娇鐢ㄦā鏉�" key="2">
+              <Row>
+                <Col span={8}>
+                  <Search placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" defaultValue={''} onSearch={value => {this.setState({tempSearchKey: value})}} enterButton />
+                </Col>
+              </Row>
+              <Row>
+                {this.state.usedTemplates.map((template, index) => {
+                  if (!tempSearchKey || template.title.toLowerCase().indexOf(tempSearchKey.toLowerCase()) >= 0) {
+                    return (
+                      <Col key={template.type + index} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={6}>
+                        <Card
+                          title={template.title}>
+                          <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
+                          <div className="card-operation">
+                            <Button type="primary" onClick={() => {this.useTemplate(template, 'user')}}>浣跨敤妯℃澘</Button>
+                          </div>
+                        </Card>
+                      </Col>
+                    )
+                  } else {
+                    return null
+                  }
+                })}
+              </Row>
+            </TabPane>
+          </Tabs>
+          {/* 鍥剧墖棰勮 */}
+          <Preview cancel={this.cancelPrePicture} preview={this.state.preview} template={this.state.pretemplate} confirm={this.useTemplate}/>
+        </Modal>
+        {/* 娣诲姞绯荤粺鑿滃崟 */}
+        <Modal
+          title="娣诲姞鑿滃崟"
+          visible={this.state.addVisible}
+          width={600}
+          onOk={this.memuSubmit}
+          confirmLoading={loading}
+          onCancel={() => {this.setState({addVisible: false})}}
+          destroyOnClose
+        >
+          <MenuForm
+            menu={this.state.sysMenu}
+            inputSubmit={this.memuSubmit}
+            wrappedComponentRef={(inst) => this.menuFormRef = inst}
+          />
+        </Modal>
+      </>
+    )
+  }
+}
+
+export default ThdMenuAdd
\ No newline at end of file
diff --git a/src/views/design/sidemenu/thdmenuplus/index.scss b/src/views/design/sidemenu/thdmenuplus/index.scss
new file mode 100644
index 0000000..86c37fa
--- /dev/null
+++ b/src/views/design/sidemenu/thdmenuplus/index.scss
@@ -0,0 +1,137 @@
+.editboard {
+  position: fixed;
+  z-index: 1070;
+  padding-top: 48px;
+  top: 0px;
+  left: 0px;
+  right: 0px;
+  bottom: 0px;
+  background: rgba(0, 0, 0, 0.35);
+  .workplace {
+    position: relative;
+    width: calc(100vw - 235px);
+    height: 100%;
+    overflow-y: auto;
+    left: 235px;
+    background: #ffffff;
+
+    .top-btn {
+      position: absolute;
+      z-index: 1;
+      top: 12px;
+      right: 20px;
+      cursor: pointer;
+    }
+    .top-btn.submit {
+      right: 100px;
+    }
+    
+  }
+  .workplace::-webkit-scrollbar {
+    width: 7px;
+  }
+  .workplace::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+  }
+  .workplace::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
+}
+.mk-template-modal {
+  width: calc(100vw - 235px)!important;
+  left: 117px;
+  top: 48px;
+  padding-bottom: 0px;
+  .ant-modal-close {
+    .ant-modal-close-x {
+      height: 50px;
+      line-height: 50px;
+    }
+  }
+  .ant-modal-header {
+    display: none;
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+  .ant-modal-body {
+    padding: 0px;
+
+    .ant-tabs-tabpane {
+      height: calc(100vh - 110px);
+      overflow-y: auto;
+      padding: 0 15px 20px 15px;
+
+      .ant-col {
+        padding: 10px;
+      }
+      .ant-col.disabled {
+        cursor: not-allowed;
+        .ant-card-head-title {
+          color: #959595;
+        }
+        .card-operation {
+          display: none;
+        }
+        img {
+          cursor: not-allowed;
+        }
+      }
+      .ant-card-head-title {
+        text-align: center;
+      }
+      .ant-card-body {
+        padding: 2px;
+        position: relative;
+        text-align: center;
+        overflow: hidden;
+        .card-operation {
+          position: absolute;
+          right: 0px;
+          top: 0;
+          height: 0px;
+          overflow: hidden;
+          transition: height 0.3s;
+          button {
+            height: 30px;
+            padding: 0 10px;
+            margin-top: 5px;
+            margin-right: 10px;
+            display: none;
+          }
+        }
+      }
+      .ant-card-body:hover {
+        .card-operation {
+          height: 40px;
+          button {
+            display: inline-block;
+          }
+        }
+      }
+      img {
+        max-width: 100%;
+        cursor: zoom-in;
+      }
+    }
+    .ant-tabs-tabpane::-webkit-scrollbar {
+      width: 7px;
+    }
+    .ant-tabs-tabpane::-webkit-scrollbar-thumb {
+      border-radius: 5px;
+      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+      background: rgba(0, 0, 0, 0.13);
+    }
+    .ant-tabs-tabpane::-webkit-scrollbar-track {
+      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+      border-radius: 3px;
+      border: 1px solid rgba(0, 0, 0, 0.07);
+      background: rgba(0, 0, 0, 0);
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/views/design/sidemenu/editthdmenu/preview/index.jsx b/src/views/design/sidemenu/thdmenuplus/preview/index.jsx
similarity index 100%
rename from src/views/design/sidemenu/editthdmenu/preview/index.jsx
rename to src/views/design/sidemenu/thdmenuplus/preview/index.jsx
diff --git a/src/views/design/sidemenu/editthdmenu/preview/index.scss b/src/views/design/sidemenu/thdmenuplus/preview/index.scss
similarity index 100%
rename from src/views/design/sidemenu/editthdmenu/preview/index.scss
rename to src/views/design/sidemenu/thdmenuplus/preview/index.scss

--
Gitblit v1.8.0