From b2298c8c996dd176c2bd7d424a1aa709cbb97965 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 05 二月 2021 15:34:21 +0800
Subject: [PATCH] 2021-02-05

---
 src/components/tabview/index.jsx                                  |    4 
 src/index.js                                                      |    1 
 src/tabviews/zshare/actionList/tabbutton/index.jsx                |   26 +-
 src/api/cacheutils.js                                             |   25 +++
 src/assets/css/viewstyle.scss                                     |    7 
 src/components/header/index.jsx                                   |   63 ++++---
 src/templates/sharecomponent/actioncomponent/actionform/index.jsx |    2 
 src/views/main/index.jsx                                          |   11 +
 src/router/index.js                                               |    3 
 src/views/menudesign/menuform/index.jsx                           |   20 ++
 src/components/breadview/index.jsx                                |  160 ++++++++++++++++++++
 src/api/index.js                                                  |   33 ++-
 src/components/breadview/index.scss                               |   73 +++++++++
 src/views/menudesign/index.jsx                                    |    2 
 src/components/Image/index.jsx                                    |    2 
 src/views/login/index.jsx                                         |    4 
 16 files changed, 384 insertions(+), 52 deletions(-)

diff --git a/src/api/cacheutils.js b/src/api/cacheutils.js
index 71983c5..2aa5642 100644
--- a/src/api/cacheutils.js
+++ b/src/api/cacheutils.js
@@ -306,6 +306,31 @@
   }
 
   /**
+   * @description 鍒犻櫎IndexedDB涓繚瀛樼殑閰嶇疆淇℃伅-鎵归噺
+   */
+  static delIndexDBConfig (keys) {
+    if (!window.GLOB.IndexDB || !keys) return
+
+    let objectStore = window.GLOB.IndexDB.transaction(['configs'], 'readwrite').objectStore('configs')
+
+    objectStore.openCursor().onsuccess = (event) => {
+      let cursor = event.target.result
+
+      if (cursor) {
+        if (cursor.value && keys.includes(cursor.value.menuid)) {
+          let request = objectStore.delete(cursor.key)
+
+          request.onerror = () => {
+            window.GLOB.IndexDB = null
+          }
+        }
+
+        cursor.continue()
+      }
+    }
+  }
+
+  /**
    * @description 鑾峰彇IndexedDB涓殑閰嶇疆淇℃伅
    */
   static getIndexDBMenuConfig (MenuID, userid) {
diff --git a/src/api/index.js b/src/api/index.js
index 2eec82e..aa7e885 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -274,14 +274,15 @@
                   clear = true
                 }
               })
+
+              if (clear) {
+                CacheUtils.clearWebSqlConfig()
+              } else {
+                let keys = res.menu_data.map(mid => `'${mid.menuid}'`).join(',')
+                CacheUtils.delWebSqlConfig(keys)
+              }
             }
-  
-            if (clear) {
-              CacheUtils.clearWebSqlConfig()
-            } else if (res.menu_data && res.menu_data.length > 0) {
-              let keys = res.menu_data.map(mid => `'${mid.menuid}'`).join(',')
-              CacheUtils.delWebSqlConfig(keys)
-            }
+            
             if (msg.version) {
               CacheUtils.updateWebSqlTime(curTime)
             } else {
@@ -303,21 +304,33 @@
             func: 's_get_app_version',
             modifydate: msg.createDate || curTime,
           }
-  
+
           this.getSystemConfig(param).then(res => {
             if (!res.status) {
               reject()
               return
             }
+            let clear = false
             let version = res.app_version || '1.00'
             appVersion.newVersion = version
             appVersion.oldVersion = appVersion.oldVersion || version
   
             if (res.menu_data && res.menu_data.length > 0) {
-              CacheUtils.clearIndexDBConfig()
+              res.menu_data.forEach(mid => {
+                if (systemMenuKeys.indexOf(mid.menuid) > -1) {
+                  clear = true
+                }
+              })
+
+              if (clear) {
+                CacheUtils.clearIndexDBConfig()
+              } else if (res.menu_data && res.menu_data.length > 0) {
+                let keys = res.menu_data.map(mid => `'${mid.menuid}'`)
+                CacheUtils.delIndexDBConfig(keys)
+              }
             }
 
-            CacheUtils.updateIndexDBversion({version: version, createDate: curTime})
+            CacheUtils.updateIndexDBversion({version: appVersion.oldVersion, createDate: curTime})
   
             resolve(appVersion)
           })
diff --git a/src/assets/css/viewstyle.scss b/src/assets/css/viewstyle.scss
index a4167f4..c5dbf67 100644
--- a/src/assets/css/viewstyle.scss
+++ b/src/assets/css/viewstyle.scss
@@ -167,6 +167,13 @@
         color: $color5;
       }
     }
+    >.mk-breadview-wrap {
+      >.ant-breadcrumb {
+        .anticon-redo:hover, .anticon-home:hover {
+          color: $color5;
+        }
+      }
+    }
   }
   .custom-data-card-box, .custom-prop-card-box {
     .data-zoom.radio .card-row-list > .ant-col:not(.active):not(.selected):hover > .card-item-box, .data-zoom.checkbox .card-row-list > .ant-col:not(.active):not(.selected):hover > .card-item-box {
diff --git a/src/components/Image/index.jsx b/src/components/Image/index.jsx
index 01bd23e..30631d4 100644
--- a/src/components/Image/index.jsx
+++ b/src/components/Image/index.jsx
@@ -6,6 +6,8 @@
     let Img = new Image()
     Img.src = this.props.url
     
+    if (!this.ImageWrapDom) return
+    
     if (Img.complete) {
       this.setSize(Img.width, Img.height)
     } else {
diff --git a/src/components/breadview/index.jsx b/src/components/breadview/index.jsx
new file mode 100644
index 0000000..914621d
--- /dev/null
+++ b/src/components/breadview/index.jsx
@@ -0,0 +1,160 @@
+import React, {Component} from 'react'
+import {connect} from 'react-redux'
+import { is, fromJS } from 'immutable'
+import { BackTop, Breadcrumb, Icon} from 'antd'
+import moment from 'moment'
+import 'moment/locale/zh-cn'
+
+import asyncComponent from '@/utils/asyncLoadComponent'
+import NotFount from '@/components/404'
+import mzhCN from '@/locales/zh-CN/main.js'
+import menUS from '@/locales/en-US/main.js'
+import MKEmitter from '@/utils/events.js'
+
+import './index.scss'
+
+const Home = asyncComponent(() => import('@/tabviews/home'))
+const CustomPage = asyncComponent(() => import('@/tabviews/custom'))
+const CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
+const CalendarPage = asyncComponent(() => import('@/tabviews/calendar'))
+const TreePage = asyncComponent(() => import('@/tabviews/treepage'))
+const Iframe = asyncComponent(() => import('@/tabviews/iframe'))
+const RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
+const FormTab = asyncComponent(() => import('@/tabviews/formtab'))
+
+let service = ''
+
+if (process.env.NODE_ENV === 'production') {
+  service = document.location.origin + '/' + window.GLOB.service + 'zh-CN/'
+} else {
+  service = window.GLOB.location + '/' + window.GLOB.service + 'zh-CN/'
+}
+
+class BreadView extends Component {
+  state = {
+    tabview: null, // 鏍囩
+    dict: localStorage.getItem('lang') !== 'en-US' ? mzhCN : menUS,
+  }
+
+  refreshTabview = () => {
+    const { tabview } = this.state
+    window.GLOB.CacheMap = new Map()
+
+    MKEmitter.emit('reloadMenuView', tabview.MenuID)
+  }
+
+  selectcomponent = (view) => {
+    // 鏍规嵁tab椤典腑鑿滃崟淇℃伅锛岄�夋嫨鎵�闇�鐨勭粍浠�
+    if (view.type === 'Home') {
+      return (<Home MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'CommonTable' || view.type === 'ManageTable') {
+      return (<CommonTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'CustomPage') {
+      return (<CustomPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'TreePage') {
+      return (<TreePage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'CalendarPage') {
+      return (<CalendarPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'RolePermission') {
+      return (<RoleManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'FormTab') {
+      return (<FormTab MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'iframe') {
+      return (<Iframe key={view.MenuID} MenuID={view.MenuID} MenuNo={view.MenuNo} title={view.MenuName} MenuName={view.MenuName} url={service + view.LinkUrl}/>)
+    } else {
+      return (<NotFount key={view.MenuID} />)
+    }
+  }
+
+  UNSAFE_componentWillMount () {
+    if (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') {
+      moment.locale('zh-cn')
+    } else {
+      moment.locale('en')
+    }
+
+    let home = {
+      MenuID: 'home_page_id',
+      MenuName: this.state.dict['main.homepage'],
+      selected: true,
+      type: 'Home'
+    }
+    this.setState({tabview: home})
+  }
+
+  gotoHome = () => {
+    let home = {
+      MenuID: 'home_page_id',
+      MenuName: this.state.dict['main.homepage'],
+      selected: true,
+      type: 'Home'
+    }
+    this.setState({tabview: home})
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    if (nextProps.tabviews && !is(fromJS(this.state.tabviews), fromJS(nextProps.tabviews))) {
+      // 淇濆瓨淇敼鏍囩闆�
+      this.setState({
+        tabview: nextProps.tabviews[nextProps.tabviews.length - 1]
+      })
+
+      let node = document.getElementById('root').parentNode.parentNode
+      if (node) {
+        node.scrollTop = 0
+      }
+    }
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+  }
+
+  render () {
+    const { tabview } = this.state
+
+    return (
+      <section id="mk-breadview-wrap" className="mk-breadview-wrap">
+        {tabview ? <Breadcrumb separator="">
+          <Breadcrumb.Item>
+            <Icon type="home" onClick={this.gotoHome} />
+          </Breadcrumb.Item>
+          {tabview.ParentNames && tabview.ParentNames[0] ?
+            <Breadcrumb.Item>{tabview.ParentNames[0]}</Breadcrumb.Item> : null}
+          {tabview.ParentNames && tabview.ParentNames[0] ?
+              <Breadcrumb.Separator children={<Icon type="right" />} /> : null}
+          {tabview.ParentNames && tabview.ParentNames[1] ?
+            <Breadcrumb.Item>{tabview.ParentNames[1]}</Breadcrumb.Item> : null}
+          {tabview.ParentNames && tabview.ParentNames[1] ?
+              <Breadcrumb.Separator children={<Icon type="right" />} /> : null}
+          <Breadcrumb.Item><Icon type="redo" onClick={this.refreshTabview}/>{tabview.MenuName}</Breadcrumb.Item>
+        </Breadcrumb> : null}
+        {tabview ? this.selectcomponent(tabview) : null}
+        <BackTop>
+          <div className="ant-back-top">
+            <div className="ant-back-top-content">
+              <div className="ant-back-top-icon"></div>
+            </div>
+          </div>
+        </BackTop>
+      </section>
+    )
+  }
+}
+
+const mapStateToProps = (state) => {
+  return {
+    tabviews: state.tabviews
+  }
+}
+
+const mapDispatchToProps = () => {
+  return {}
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(BreadView)
\ No newline at end of file
diff --git a/src/components/breadview/index.scss b/src/components/breadview/index.scss
new file mode 100644
index 0000000..10194f5
--- /dev/null
+++ b/src/components/breadview/index.scss
@@ -0,0 +1,73 @@
+.mk-breadview-wrap {
+  min-height: 100%;
+  padding-top: 48px;
+  width: 100%;
+  box-sizing: content-box;
+  >.ant-breadcrumb {
+    padding: 10px;
+    .anticon-home {
+      cursor: pointer;
+      margin-right: 10px;
+    }
+    .anticon-redo {
+      cursor: pointer;
+      margin-right: 5px;
+    }
+    .ant-breadcrumb-link + .ant-breadcrumb-separator {
+      display: none;
+    }
+  }
+  >.commontable, >.calendar-page {
+    padding-left: 15px;
+    padding-right: 15px;
+  }
+  >.commontable, >.calendar-page {
+    > .top-search {
+      padding-left: 0;
+      padding-right: 0;
+      margin: 0 24px;
+    }
+  }
+  iframe {
+    width: 100%;
+    height: calc(100vh - 115px);
+    overflow-y: scroll;
+    border: 0;
+    margin-top: 16px;
+  }
+  .main-copy {
+    position: fixed;
+    z-index: 20;
+    bottom: 65px;
+    right: 30px;
+    width: 40px;
+    height: 40px;
+    i {
+      font-size: 18px;
+    }
+  }
+  .main-copy.ifr-copy {
+    bottom: 65px;
+    right: 40px;
+    width: 30px;
+    height: 32px;
+    border: 2px solid #687991;
+    opacity: 0.6;
+    i {
+      font-size: 14px;
+      color: #687991;
+    }
+  }
+  .main-copy.ifr-copy:hover {
+    opacity: 1;
+  }
+  .ant-back-top {
+    bottom: 20px;
+    right: 30px;
+  }
+}
+
+.ant-message {
+  top: 50px;
+  z-index: 1080;
+}
\ No newline at end of file
diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 073bf55..d0953d4 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -48,7 +48,8 @@
     thdMenuList: [],
     oriVersion: '',
     newVersion: '',
-    debug: sessionStorage.getItem('debug') === 'true'
+    debug: sessionStorage.getItem('debug') === 'true',
+    navBar: window.GLOB.navBar
   }
 
   handleCollapse = () => {
@@ -126,10 +127,10 @@
 
   changeMenu (value) {
     // 涓昏彍鍗曞垏鎹�
-    if (value.PageParam.OpenType === 'menu') {
+    if (value.OpenType === 'outpage' && value.linkUrl) {
+      window.open(value.linkUrl)
+    } else if (value.OpenType === 'menu') {
       this.props.modifyMainMenu(value)
-    } else if (value.PageParam.OpenType === 'outpage') {
-      window.open(value.PageParam.linkUrl)
     }
   }
 
@@ -227,14 +228,19 @@
         let tabs = fromJS(this.props.tabviews).toJS()
         let menu = fromJS(response[1]).toJS()
 
-        tabs = tabs.map(tab => {
-          tab.selected = false
-          return tab
-        })
+        if (this.state.navBar === 'topmenu') {
+          menu.selected = true
+          this.props.modifyTabview([menu])
+        } else {
+          tabs = tabs.map(tab => {
+            tab.selected = false
+            return tab
+          })
 
-        menu.selected = true
-        tabs.push(menu)
-        this.props.modifyTabview(tabs)
+          menu.selected = true
+          tabs.push(menu)
+          this.props.modifyTabview(tabs)
+        }
       }
     })
   }
@@ -247,14 +253,18 @@
       let fstItem = {
         MenuID: fst.MenuID,
         MenuName: fst.MenuName,
-        PageParam: {OpenType: 'menu', linkUrl: ''},
+        OpenType: 'menu',
         children: []
       }
       if (fst.PageParam) {
         try {
           fstItem.PageParam = JSON.parse(fst.PageParam)
         } catch (e) {
-          fstItem.PageParam = {OpenType: 'menu', linkUrl: ''}
+          fstItem.PageParam = null
+        }
+        if (fstItem.PageParam && fstItem.PageParam.OpenType === 'outpage' && fstItem.PageParam.linkUrl) {
+          fstItem.OpenType = 'outpage'
+          fstItem.linkUrl = fstItem.PageParam.linkUrl
         }
       }
 
@@ -287,6 +297,7 @@
             debug: sessionStorage.getItem('debug'),
             role_id: sessionStorage.getItem('role_id'),
             mainlogo: window.GLOB.mainlogo,
+            navBar: window.GLOB.navBar || '',
             mstyle: window.GLOB.style
           }
 
@@ -297,6 +308,7 @@
                 ParentId: snd.MenuID,
                 MenuID: trd.MenuID,
                 MenuName: trd.MenuName,
+                ParentNames: [fst.MenuName, snd.MenuName],
                 MenuNo: trd.MenuNo,
                 EasyCode: trd.EasyCode,
                 type: 'CommonTable',            // 榛樿鍊间负甯哥敤琛�
@@ -541,15 +553,18 @@
 
   changeVerMenu(menu, type) {
     if (type === 'first') {
-      if (menu.PageParam.OpenType === 'menu') {
+      if (menu.OpenType === 'outpage' && menu.linkUrl) {
+        window.open(menu.linkUrl)
+      } else if (menu.OpenType === 'menu') {
 
-      } else if (menu.PageParam.OpenType === 'outpage') {
-        window.open(menu.PageParam.linkUrl)
       }
     } else {
-      if (menu.OpenType === 'newpage' || menu.OpenType === 'NewPage') {
+      if (menu.OpenType === 'newpage' || menu.OpenType === 'NewPage') { // NewPage涓烘墦寮�澶栭儴椤甸潰鍦板潃锛宯ewpage涓烘墦寮�绯荤粺鑿滃崟
         window.open(menu.src)
       } else if (menu.OpenType === 'blank') {
+        menu.selected = true
+        this.props.modifyTabview([menu])
+      } else if (this.state.navBar === 'topmenu') {
         menu.selected = true
         this.props.modifyTabview([menu])
       } else {
@@ -578,7 +593,7 @@
 
   render () {
     const { mainMenu, collapse } = this.props
-    const { thdMenuList, searchkey, oriVersion, newVersion, debug, menulist } = this.state
+    const { thdMenuList, searchkey, oriVersion, newVersion, debug, menulist, navBar } = this.state
 
     const menu = (
       <Menu className="header-dropdown">
@@ -602,12 +617,12 @@
 
     return (
       <header className="header-container ant-menu-dark" id="main-header-container">
-        <div className={'header-logo ' + (collapse ? 'collapse' : '')}><img src={this.state.logourl} alt=""/></div>
-        <div className={'header-collapse ' + (collapse ? 'collapse' : '')}>
-          {menulist && menulist.length ? <Icon type={collapse ? 'menu-unfold' : 'menu-fold'} onClick={this.handleCollapse}/> : null}
+        <div className={'header-logo ' + (collapse && navBar !== 'topmenu' ? 'collapse' : '')}><img src={this.state.logourl} alt=""/></div>
+        <div className={'header-collapse ' + (collapse && navBar !== 'topmenu' ? 'collapse' : '')}>
+          {navBar !== 'topmenu' ? <Icon type={collapse ? 'menu-unfold' : 'menu-fold'} onClick={this.handleCollapse}/> : null}
         </div>
         {/* 姝e父鑿滃崟 */}
-        {menulist ?
+        {navBar !== 'topmenu' && menulist ?
           <ul className="header-menu">{
             menulist.map(item => {
               return (
@@ -619,7 +634,7 @@
           </ul> : null
         }
         {/* 姝e父鑿滃崟 */}
-        {/* {menulist ?
+        {navBar === 'topmenu' && menulist ?
           <ul className="header-menu vertical-menu">{
             menulist.map(item => {
               if (item.children && item.children.length > 0) {
@@ -661,7 +676,7 @@
               }
             })}
           </ul> : null
-        } */}
+        }
         {/* 澶村儚銆佺敤鎴峰悕 */}
         <Dropdown className="header-setting" overlay={menu}>
           <div>
diff --git a/src/components/tabview/index.jsx b/src/components/tabview/index.jsx
index 7f5d069..7c4e5a5 100644
--- a/src/components/tabview/index.jsx
+++ b/src/components/tabview/index.jsx
@@ -35,7 +35,7 @@
   service = window.GLOB.location + '/' + window.GLOB.service + 'zh-CN/'
 }
 
-class Header extends Component {
+class TabViews extends Component {
   static propTpyes = {
     collapse: PropTypes.bool,
     tabviews: PropTypes.array // 鏍囩椤垫暟缁�
@@ -269,4 +269,4 @@
   }
 }
 
-export default connect(mapStateToProps, mapDispatchToProps)(Header)
\ No newline at end of file
+export default connect(mapStateToProps, mapDispatchToProps)(TabViews)
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index e03e548..c7e8665 100644
--- a/src/index.js
+++ b/src/index.js
@@ -154,6 +154,7 @@
         GLOB.webSite = _systemMsg.webSite
         GLOB.style = _systemMsg.style
         GLOB.showline = _systemMsg.showline || ''
+        GLOB.navBar = _systemMsg.navBar || 'sidemenu'
 
         if (GLOB.favicon) {
           let link = document.querySelector("link[rel*='icon']") || document.createElement('link')
diff --git a/src/router/index.js b/src/router/index.js
index bf66ba2..65fd766 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -58,6 +58,9 @@
           if (_param.mainlogo) {
             window.GLOB.mainlogo = _param.mainlogo
           }
+          if (_param.navBar) {
+            window.GLOB.navBar = _param.navBar
+          }
           if (_param.mstyle && styles[_param.mstyle]) {
             document.body.className = styles[_param.mstyle]
           }
diff --git a/src/tabviews/zshare/actionList/tabbutton/index.jsx b/src/tabviews/zshare/actionList/tabbutton/index.jsx
index 9223ef1..8d242e9 100644
--- a/src/tabviews/zshare/actionList/tabbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/tabbutton/index.jsx
@@ -134,18 +134,22 @@
       return tab.MenuID !== newtab.MenuID
     })
 
-    if (tabviews.length !== tabs.length) {
-      this.props.modifyTabview(fromJS(tabs).toJS())
-    }
-
-    this.setState({}, () => {
-      if (MenuID) {
-        tabs.splice(index + 1, 0, newtab)
-      } else {
-        tabs.push(newtab)
+    if (window.GLOB.navBar === 'topmenu') {
+      this.props.modifyTabview([newtab])
+    } else {
+      if (tabviews.length !== tabs.length) {
+        this.props.modifyTabview(fromJS(tabs).toJS())
       }
-      this.props.modifyTabview(tabs)
-    })
+  
+      this.setState({}, () => {
+        if (MenuID) {
+          tabs.splice(index + 1, 0, newtab)
+        } else {
+          tabs.push(newtab)
+        }
+        this.props.modifyTabview(tabs)
+      })
+    }
 
     MKEmitter.emit('openNewTab')
     if (window.GLOB.systemType === 'production') {
diff --git a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
index a77dfb6..fa38cae 100644
--- a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
@@ -665,7 +665,7 @@
                   }
                 ]
               })(
-                <Cascader options={item.options || []} placeholder="" />
+                <Cascader allowClear options={item.options || []} placeholder="" />
               )}
             </Form.Item>
           </Col>
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 1c2ad1c..2745e4c 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -291,7 +291,8 @@
               doclogo: res.doclogo || '',
               style: res.CSS || '',
               showline: res.split_line_show || 'true',
-              webSite: res.WebSite || ''
+              webSite: res.WebSite || '',
+              navBar: res.NavBar !== 'topmenu' ? 'sidemenu' : 'topmenu'
             }
 
             sessionStorage.setItem('home_background', res.index_background_color)
@@ -344,6 +345,7 @@
 
             window.GLOB.mainlogo = systemMsg.mainlogo
             window.GLOB.style = systemMsg.style
+            window.GLOB.navBar = systemMsg.navBar
         
             if (window.GLOB.style && styles[window.GLOB.style]) {
               document.body.className = styles[window.GLOB.style] + ' ' + (res.split_line_show === 'false' ? 'hidden-split-line' : '')
diff --git a/src/views/main/index.jsx b/src/views/main/index.jsx
index 93ec841..c739759 100644
--- a/src/views/main/index.jsx
+++ b/src/views/main/index.jsx
@@ -11,16 +11,23 @@
 import './index.scss'
 
 const Tabview = asyncComponent(() => import('@/components/tabview'))
+const Breadview = asyncComponent(() => import('@/components/breadview'))
 const _locale = localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
 
 class Main extends Component {
+  state = {
+    navBar: window.GLOB.navBar
+  }
+
   render () {
+    const { navBar } = this.state
     return (
       <div className="mk-main-view">
         <ConfigProvider locale={_locale}>
           <Header key="header"/>
-          <Sidemenu key="sidemenu"/>
-          <Tabview key="tabview"/>
+          {navBar !== 'topmenu' ? <Sidemenu key="sidemenu"/> : null}
+          {navBar !== 'topmenu' ? <Tabview key="tabview"/> : null}
+          {navBar === 'topmenu' ? <Breadview key="breadview"/> : null}
           <QueryLog />
         </ConfigProvider>
       </div>
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index c79828e..6dbf7e2 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -508,7 +508,7 @@
         EasyCode: _config.easyCode || '',
         Template: 'CustomPage',
         MenuName: _config.MenuName || '',
-        PageParam: JSON.stringify({Template: 'CustomPage', OpenType: 'newtab'}),
+        PageParam: JSON.stringify({Template: 'CustomPage', OpenType: _config.OpenType || 'newtab'}),
         LongParam: window.btoa(window.encodeURIComponent(JSON.stringify(_config))),
         LText: '',
         LTexttb: ''
diff --git a/src/views/menudesign/menuform/index.jsx b/src/views/menudesign/menuform/index.jsx
index b9a5833..926ed80 100644
--- a/src/views/menudesign/menuform/index.jsx
+++ b/src/views/menudesign/menuform/index.jsx
@@ -143,6 +143,8 @@
       this.props.updateConfig({...config, cacheUseful: value})
     } else if (key === 'timeUnit') {
       this.props.updateConfig({...config, timeUnit: value})
+    } else if (key === 'OpenType') {
+      this.props.updateConfig({...config, OpenType: value})
     }
   }
 
@@ -255,6 +257,24 @@
             </Form.Item>
           </Col>
           <Col span={24}>
+            <Form.Item label="鎵撳紑鏂瑰紡">
+              {getFieldDecorator('OpenType', {
+                initialValue: config.OpenType || 'newtab',
+                rules: [
+                  {
+                    required: true,
+                    message: dict['form.required.select'] + dict['model.openway'] + '!'
+                  }
+                ]
+              })(
+                <Select onChange={(value) => {this.selectChange('OpenType', value)}}>
+                  <Select.Option value="newtab">鏍囩椤�</Select.Option>
+                  <Select.Option value="newpage">鏂伴〉闈�</Select.Option>
+                </Select>
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={24}>
             <Form.Item label={
               <Tooltip placement="topLeft" title="瀵逛簬涓嶇粡甯告�у彉鍔ㄧ殑淇℃伅锛岀紦瀛樻暟鎹湁鍔╀簬鎻愰珮鏌ヨ鏁堢巼銆�">
                 <Icon type="question-circle" />

--
Gitblit v1.8.0