From 95ccc1acc6d8ede1c839493e7aecc9c97fd34c8c Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 24 九月 2021 15:55:39 +0800
Subject: [PATCH] 2021-09-24

---
 src/views/design/header/index.scss                                             |    2 
 src/views/login/loginform.jsx                                                  |   25 +
 src/components/header/index.jsx                                                |    2 
 src/tabviews/zshare/topSearch/index.jsx                                        |    4 
 src/tabviews/zshare/normalTable/index.jsx                                      |  270 ++++++++++++--------
 src/templates/formtabconfig/index.jsx                                          |    9 
 src/menu/components/form/normal-form/index.jsx                                 |    2 
 src/locales/zh-CN/model.js                                                     |    3 
 src/menu/components/table/normal-table/columns/editColumn/index.jsx            |    2 
 src/templates/modalconfig/index.jsx                                            |    2 
 src/templates/sharecomponent/columncomponent/colspanform/index.jsx             |    2 
 src/locales/en-US/model.js                                                     |    3 
 src/menu/components/table/normal-table/columns/index.scss                      |    3 
 src/mob/modalconfig/index.jsx                                                  |    2 
 src/tabviews/zshare/actionList/normalbutton/index.jsx                          |   83 +++++
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx           |   18 +
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx          |   26 +
 src/templates/zshare/formconfig.jsx                                            |   21 +
 src/menu/components/form/tab-form/index.jsx                                    |    2 
 src/pc/components/login/normal-login/loginform.jsx                             |   34 ++
 src/templates/sharecomponent/actioncomponent/actionform/index.jsx              |    6 
 src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx |   16 +
 src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx              |    7 
 src/tabviews/zshare/actionList/printbutton/index.jsx                           |    2 
 src/pc/components/login/normal-login/index.jsx                                 |    4 
 src/tabviews/zshare/mutilform/index.jsx                                        |    6 
 src/templates/sharecomponent/actioncomponent/index.jsx                         |    7 
 src/views/login/index.scss                                                     |   81 ++---
 src/menu/modalconfig/index.jsx                                                 |    2 
 src/menu/components/table/normal-table/columns/index.jsx                       |   15 +
 src/pc/components/login/normal-login/index.scss                                |   87 +++--
 src/templates/sharecomponent/columncomponent/columnform/index.jsx              |    4 
 src/views/login/index.jsx                                                      |    2 
 33 files changed, 494 insertions(+), 260 deletions(-)

diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 16d1e9d..ac930a4 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -398,7 +398,7 @@
           sessionStorage.setItem('isEditState', 'true')
 
           this.setSystemFuncs()
-
+          this.props.modifyMainMenu(null)
           this.props.history.replace('/design')
         } else {
           if (res.message.indexOf('瀵嗙爜閿欒') > -1) {
diff --git a/src/locales/en-US/model.js b/src/locales/en-US/model.js
index e42101d..6eb3569 100644
--- a/src/locales/en-US/model.js
+++ b/src/locales/en-US/model.js
@@ -210,7 +210,6 @@
   'model.status.forbidden': '绂佺敤',
   'model.status.open': '鍚敤',
   'header.form.readin': '鑷姩濉厖',
-  'header.form.readin.tooltip': '鏄惁灏嗚〃鏍奸�変腑鐨勬暟鎹嚜鍔ㄥ~鍏呭埌琛ㄥ崟锛堝瓧娈电浉鍚岋級',
   'header.form.afterExecSuccess': '鎴愬姛鍚�',
   'header.form.afterExecError': '澶辫触鍚�',
   'header.form.pagination': '鍒嗛〉',
@@ -244,5 +243,5 @@
   'model.tooltip.action.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃寜閽�嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬寜閽嫋鑷虫澶勬坊鍔狅紝濡傞�夋嫨鎸夐挳绫诲瀷涓鸿〃鍗曘�佹柊鏍囩椤电瓑鍚湁閰嶇疆椤甸潰鐨勬寜閽紝鍙湪宸︿晶宸ュ叿鏍�-鎸夐挳-鍙厤缃寜閽锛岀偣鍑绘寜閽畬鎴愮浉鍏抽厤缃�傛敞锛氬綋璁剧疆鎸夐挳鏄剧ず浣嶇疆涓鸿〃鏍兼椂锛屾樉绀哄垪浼氬鍔犳搷浣滃垪銆�',
   'model.tooltip.column.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃樉绀哄垪銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬樉绀哄垪鎷栬嚦姝ゅ娣诲姞锛涙垨鐐瑰嚮銆婃坊鍔犳樉绀哄垪銆嬫寜閽壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ�傛敞锛氭坊鍔犲悎骞跺垪鏃讹紝闇�璁剧疆鍙�夊垪銆�',
   'model.tooltip.tabs.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃爣绛鹃〉銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬爣绛鹃〉鎷栬嚦姝ゅ娣诲姞銆�',
-  'model.tooltip.func.innerface': '鍐呴儴鍑芥暟鍚嶇О闇�浠ableField绛夊瓧绗﹀紑濮�;',
+  'model.tooltip.func.innerface': '鍑芥暟鍚嶇О闇�浠ableField绛夊瓧绗﹀紑濮�;',
 }
\ No newline at end of file
diff --git a/src/locales/zh-CN/model.js b/src/locales/zh-CN/model.js
index 112722f..6e111a9 100644
--- a/src/locales/zh-CN/model.js
+++ b/src/locales/zh-CN/model.js
@@ -210,7 +210,6 @@
   'model.status.forbidden': '绂佺敤',
   'model.status.open': '鍚敤',
   'header.form.readin': '鑷姩濉厖',
-  'header.form.readin.tooltip': '鏄惁灏嗚〃鏍奸�変腑鐨勬暟鎹嚜鍔ㄥ~鍏呭埌琛ㄥ崟锛堝瓧娈电浉鍚岋級',
   'header.form.afterExecSuccess': '鎴愬姛鍚�',
   'header.form.afterExecError': '澶辫触鍚�',
   'header.form.pagination': '鍒嗛〉',
@@ -244,5 +243,5 @@
   'model.tooltip.action.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃寜閽�嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬寜閽嫋鑷虫澶勬坊鍔狅紝濡傞�夋嫨鎸夐挳绫诲瀷涓鸿〃鍗曘�佹柊鏍囩椤电瓑鍚湁閰嶇疆椤甸潰鐨勬寜閽紝鍙湪宸︿晶宸ュ叿鏍�-鎸夐挳-鍙厤缃寜閽锛岀偣鍑绘寜閽畬鎴愮浉鍏抽厤缃�傛敞锛氬綋璁剧疆鎸夐挳鏄剧ず浣嶇疆涓鸿〃鏍兼椂锛屾樉绀哄垪浼氬鍔犳搷浣滃垪銆�',
   'model.tooltip.column.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃樉绀哄垪銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬樉绀哄垪鎷栬嚦姝ゅ娣诲姞锛涙垨鐐瑰嚮銆婃坊鍔犳樉绀哄垪銆嬫寜閽壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ�傛敞锛氭坊鍔犲悎骞跺垪鏃讹紝闇�璁剧疆鍙�夊垪銆�',
   'model.tooltip.tabs.guide': '鍦ㄥ乏渚у伐鍏锋爮銆婃爣绛鹃〉銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬爣绛鹃〉鎷栬嚦姝ゅ娣诲姞銆�',
-  'model.tooltip.func.innerface': '鍐呴儴鍑芥暟鍚嶇О闇�浠ableField绛夊瓧绗﹀紑濮�;',
+  'model.tooltip.func.innerface': '鍑芥暟鍚嶇О闇�浠ableField绛夊瓧绗﹀紑濮�;',
 }
\ No newline at end of file
diff --git a/src/menu/components/form/normal-form/index.jsx b/src/menu/components/form/normal-form/index.jsx
index 58f180c..4444f91 100644
--- a/src/menu/components/form/normal-form/index.jsx
+++ b/src/menu/components/form/normal-form/index.jsx
@@ -427,7 +427,7 @@
     }]
     let standardform = null
 
-    _inputfields = group.fields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = group.fields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && _item.field !== item.field)
     if (appType === 'mob') {
       _tabfields = group.fields.filter(item => _form.field !== item.field && item.hidden !== 'true' && ['text', 'number'].includes(item.type))
     } else {
diff --git a/src/menu/components/form/tab-form/index.jsx b/src/menu/components/form/tab-form/index.jsx
index ce0f66c..f1fc543 100644
--- a/src/menu/components/form/tab-form/index.jsx
+++ b/src/menu/components/form/tab-form/index.jsx
@@ -419,7 +419,7 @@
     }]
     let standardform = null
 
-    _inputfields = group.fields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = group.fields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && _item.field !== item.field)
     if (appType === 'mob') {
       _tabfields = group.fields.filter(item => _form.field !== item.field && item.hidden !== 'true' && ['text', 'number'].includes(item.type))
     } else {
diff --git a/src/menu/components/table/normal-table/columns/editColumn/index.jsx b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
index 3f7bee9..81aed8a 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
@@ -101,7 +101,7 @@
         }
         values.type = 'number'
         values.decimal = decimal
-      } else if (/nvarchar/ig.test(option.props.datatype)) {
+      } else {
         values.type = 'text'
       }
 
diff --git a/src/menu/components/table/normal-table/columns/index.jsx b/src/menu/components/table/normal-table/columns/index.jsx
index a7711e0..c347313 100644
--- a/src/menu/components/table/normal-table/columns/index.jsx
+++ b/src/menu/components/table/normal-table/columns/index.jsx
@@ -513,6 +513,20 @@
     })
   }
 
+  clear = () => {
+    const _this = this
+
+    confirm({
+      content: '纭畾娓呯┖鏄剧ず鍒楀悧锛�',
+      onOk() {
+        _this.setState({columns: []}, () => {
+          _this.props.updatecolumn({..._this.props.config, cols: []})
+        })
+      },
+      onCancel() {}
+    })
+  }
+
   componentDidMount () {
     MKEmitter.addListener('submitStyle', this.getStyle)
   }
@@ -555,6 +569,7 @@
           <Icon title="澶嶅埗鏄剧ず鍒�" type="copy" onClick={this.copycolumn} />
           <MarkColumn columns={fields} type="line" marks={lineMarks} onSubmit={this.updateLineMarks} />
           <Icon title="鍚屾瀛楁闆�" type="file-sync" onClick={this.syncfield} />
+          <Icon title="娓呯┖鏄剧ず鍒�" type="delete" onClick={this.clear}/>
         </div>
         <DndProvider>
           <Table
diff --git a/src/menu/components/table/normal-table/columns/index.scss b/src/menu/components/table/normal-table/columns/index.scss
index 5c733b7..f376b55 100644
--- a/src/menu/components/table/normal-table/columns/index.scss
+++ b/src/menu/components/table/normal-table/columns/index.scss
@@ -66,6 +66,9 @@
     >.anticon-copy {
       color: #26C281;
     }
+    >.anticon-delete {
+      color: #ff4d4f;
+    }
     >.anticon-file-sync {
       color: #1890ff;
     }
diff --git a/src/menu/modalconfig/index.jsx b/src/menu/modalconfig/index.jsx
index fc2a91e..fa87b7f 100644
--- a/src/menu/modalconfig/index.jsx
+++ b/src/menu/modalconfig/index.jsx
@@ -119,7 +119,7 @@
     }]
     let standardform = null
 
-    _inputfields = config.fields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = config.fields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && card.field !== item.field)
     _tabfields = config.fields.filter(item => card.field !== item.field && item.hidden !== 'true' && ['text', 'number', 'select', 'link'].includes(item.type))
     _tabfields.unshift({field: '', text: '鍘熻〃鍗�'})
 
diff --git a/src/mob/modalconfig/index.jsx b/src/mob/modalconfig/index.jsx
index 6876fc5..29c8e42 100644
--- a/src/mob/modalconfig/index.jsx
+++ b/src/mob/modalconfig/index.jsx
@@ -123,7 +123,7 @@
     }]
     let standardform = null
 
-    _inputfields = config.fields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = config.fields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && card.field !== item.field)
     _tabfields = config.fields.filter(item => card.field !== item.field && item.hidden !== 'true' && ['text', 'number', 'select', 'link'].includes(item.type))
     _tabfields.unshift({field: '', text: '鍘熻〃鍗�'})
 
diff --git a/src/pc/components/login/normal-login/index.jsx b/src/pc/components/login/normal-login/index.jsx
index 390a8cb..1ffb207 100644
--- a/src/pc/components/login/normal-login/index.jsx
+++ b/src/pc/components/login/normal-login/index.jsx
@@ -47,8 +47,8 @@
         wrap: { name: card.name, width: card.width || 24, loginWays: ['uname_pwd'], shortcut: 'remember' },
         style: { background: '#ffffff', width: '330px', borderRadius: '4px', marginLeft: '55vw'},
         loginWays: [
-          {type: 'uname_pwd', label: '璐﹀彿瀵嗙爜鐧诲綍', shortcut: 'remember'},
-          {type: 'sms_vcode', label: '鐭俊楠岃瘉鐮�'},
+          {type: 'uname_pwd', label: '璐﹀彿鐧诲綍', shortcut: 'remember'},
+          {type: 'sms_vcode', label: '鐭俊鐧诲綍'},
           {type: 'app_scan', label: '鎵爜鐧诲綍'},
         ]
       }
diff --git a/src/pc/components/login/normal-login/index.scss b/src/pc/components/login/normal-login/index.scss
index 2ee7fbb..5eb7460 100644
--- a/src/pc/components/login/normal-login/index.scss
+++ b/src/pc/components/login/normal-login/index.scss
@@ -43,58 +43,69 @@
       height: 40px;
       line-height: 1;
       font-size: 18px;
-      margin-bottom: 25px;
+      margin-bottom: 15px;
     }
     .ant-form-item:last-child {
       margin-bottom: 0;
     }
   }
-  .login-way-wrap {
-    height: 50px;
-    line-height: 50px;
-    margin-bottom: 10px;
+  .login-way-title {
+    font-size: 18px;
+    line-height: 45px;
     display: flex;
-    border-radius: inherit;
-    .login-way {
-      flex: 1;
-      width: 50%;
-      font-size: 17px;
-      text-align: center;
-      white-space: nowrap;
-      text-overflow: ellipsis;
-      overflow: hidden;
-      padding: 0 16px;
-      transition: all 0.3s;
-      border: 1px solid transparent;
-      border-top: 0!important;
+    padding-top: 10px;
+    padding-left: 15px;
+    padding-right: 15px;
+    padding-bottom: 10px;
+  }
+  .login-way-title::before, .login-way-title::after {
+    display: inline-block;
+    content: ' ';
+    height: 0.5px;
+    flex: 1;
+    background-color: rgba(0, 0, 0, 0.15);
+    position: relative;
+    top: 22px;
+  }
+  .login-way-title::before {
+    margin: 0 10px 0 0;
+  }
+  .login-way-title::after {
+    margin: 0 0 0 10px;
+  }
+  .scan-icon {
+    position: absolute;
+    right: 0px;
+    top: 0px;
+    font-size: 46px;
+    color: #000000;
+    line-height: 1;
+    transform: rotate(-45deg);
+    transform-origin: 0 0;
+    overflow: hidden;
+    padding-bottom: 10px;
+    cursor: pointer;
+    i {
+      transform-origin: 0 0;
+      transform: rotate(45deg);
     }
-    .login-way.active, .login-way:hover {
+  }
+  .login-ways {
+    padding: 0 20px 25px;
+    span {
       color: #1890ff;
-    }
-    .login-way:not(.active) {
       cursor: pointer;
-      background: #fafafa;
-      border: 1px solid #e8e8e8;
     }
-    .login-way:first-child {
-      border-left: 0;
-      border-top-left-radius: inherit;
-    }
-    .login-way:last-child {
-      border-right: 0;
-      border-top-right-radius: inherit;
+    span + span {
+      margin-left: 15px;
     }
   }
-  .login-way-wrap.simple {
-    .login-way {
-      font-size: 18px;
-      text-align: left;
-      padding: 0 15px;
-      line-height: 60px;
-    }
+  .login-ways.center {
+    text-align: center;
   }
+
   .form-scan-wrap {
-    padding: 30px;
+    padding: 10px 30px 0;
     text-align: center;
     font-size: 12px;
     line-height: 35px;
diff --git a/src/pc/components/login/normal-login/loginform.jsx b/src/pc/components/login/normal-login/loginform.jsx
index 19ede79..536b883 100644
--- a/src/pc/components/login/normal-login/loginform.jsx
+++ b/src/pc/components/login/normal-login/loginform.jsx
@@ -20,14 +20,23 @@
   state = {
     activeWay: null,
     loginWays: [],
+    scanWay: null
   }
 
   UNSAFE_componentWillMount () {
     const { loginWays, wrap } = this.props
 
     let _loginWays = []
+    let scanWay = null
     loginWays.forEach(item => {
       if (!wrap.loginWays || wrap.loginWays.includes(item.type)) {
+        if (item.type === 'sms_vcode') {
+          item.label = '鐭俊鐧诲綍'
+        } else if (item.type === 'uname_pwd') {
+          item.label = '璐﹀彿鐧诲綍'
+        } else if (item.type === 'app_scan') {
+          scanWay = item
+        }
         _loginWays.push(item)
       }
     })
@@ -35,6 +44,7 @@
     this.setState({
       loginWays: _loginWays,
       activeWay: _loginWays[0],
+      scanWay
     })
   }
 
@@ -43,8 +53,16 @@
 
     if (!is(fromJS(wrap), fromJS(nextProps.wrap))) {
       let _loginWays = []
+      let scanWay = null
       nextProps.loginWays.forEach(item => {
         if (!nextProps.wrap.loginWays || nextProps.wrap.loginWays.includes(item.type)) {
+          if (item.type === 'sms_vcode') {
+            item.label = '鐭俊鐧诲綍'
+          } else if (item.type === 'uname_pwd') {
+            item.label = '璐﹀彿鐧诲綍'
+          } else if (item.type === 'app_scan') {
+            scanWay = item
+          }
           _loginWays.push(item)
         }
       })
@@ -52,6 +70,7 @@
       this.setState({
         loginWays: _loginWays,
         activeWay: _loginWays[0],
+        scanWay
       })
     }
   }
@@ -81,15 +100,12 @@
   }
 
   render() {
-    const { activeWay, loginWays } = this.state
+    const { activeWay, loginWays, scanWay } = this.state
 
     return (
       <Form className="login-edit-form">
-        <div className={'login-way-wrap ' + (loginWays.length === 1 ? 'simple' : '')}>
-          {loginWays.map(item => (
-            <div className={'login-way' + (activeWay.type === item.type ? ' active' : '')} onClick={() => this.onChangeTab(item)} key={item.type}>{item.label}</div>
-          ))}
-        </div>
+        <div className="login-way-title">{activeWay.label}</div>
+        {scanWay && activeWay.type !== 'app_scan' ? <div className="scan-icon" onClick={() => this.onChangeTab(scanWay)}><Icon type="qrcode" /></div> : null}
         {activeWay.type === 'uname_pwd' ? <div className={'form-item-wrap ' + (activeWay.shortcut === 'none' ? 'no-short' : '')}>
           <Form.Item>
             <Input
@@ -143,6 +159,12 @@
           </div>
           璇蜂娇鐢ㄥ鎴风鎵竴鎵櫥褰�
         </div> : null}
+        <div className={'login-ways ' + (activeWay.type === 'app_scan' ? 'center' : '')}>
+          {loginWays.map(item => {
+            if (item.type === 'app_scan' || activeWay.type === item.type) return null
+            return (<span key={item.type} onClick={() => this.onChangeTab(item)}>{item.label}</span>)
+          })}
+        </div>
       </Form>
     )
   }
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 5c5818a..9b690c8 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -314,6 +314,9 @@
           param.$callbacksql = callbacksql
         } else {
           param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+          if (btn.output) {
+            param.key_back_type = 'Y'
+          }
         }
 
         if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -356,7 +359,7 @@
             param.$callbacksql = callbacksql
           } else {
             param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
-            if (btn.OpenType === 'formSubmit' && btn.output) {
+            if (btn.output) {
               param.key_back_type = 'Y'
             }
           }
@@ -391,6 +394,9 @@
             param.$callbacksql = callbacksql
           } else {
             param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            if (btn.output) {
+              param.key_back_type = 'Y'
+            }
           }
           
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -457,6 +463,9 @@
             param.$callbacksql = callbacksql
           } else {
             param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            if (btn.output) {
+              param.key_back_type = 'Y'
+            }
           }
           
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -490,6 +499,9 @@
               param.$callbacksql = callbacksql
             } else {
               param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              if (btn.output) {
+                param.key_back_type = 'Y'
+              }
             }
             
             if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -513,6 +525,9 @@
               param.$callbacksql = callbacksql
             } else {
               param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              if (btn.output) {
+                param.key_back_type = 'Y'
+              }
             }
             
             if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -668,14 +683,39 @@
       }
 
       if (params.length <= 20) {
-        let deffers = params.map(param => {
+        let deffers = params.map((param, i) => {
           return new Promise(resolve => {
-            Api.genericInterface(param).then(res => {
-              resolve(res)
-            }, () => {
-              this.updateStatus('over')
-              _resolve()
-            })
+            setTimeout(() => {
+              let _param = null
+              if (btn.preFunc) {
+                _param = fromJS(param).toJS()
+                param.func = btn.preFunc
+              }
+              Api.genericInterface(param).then(res => {
+                if (btn.preFunc && res.status && res.ErrCode !== '-1') {
+                  _param = {..._param, ...res}
+
+                  delete _param.status
+                  delete _param.ErrCode
+                  delete _param.ErrMesg
+                  delete _param.message
+
+                  Api.genericInterface(_param).then(result => {
+                    if (!result.status) {
+                      notification.warning({
+                        top: 92,
+                        message: result.message,
+                        duration: 5
+                      })
+                    }
+                  })
+                }
+                resolve(res)
+              }, () => {
+                this.updateStatus('over')
+                _resolve()
+              })
+            }, 20 * i)
           })
         })
         Promise.all(deffers).then(result => {
@@ -1111,8 +1151,33 @@
       loadingNumber: params.length || ''
     })
 
+    let _param = null
+
+    if (btn.preFunc) {
+      _param = fromJS(param).toJS()
+      param.func = btn.preFunc
+    }
+
     Api.genericInterface(param).then(res => {
       if (res.status) {
+        if (btn.preFunc && res.ErrCode !== '-1') {
+          _param = {..._param, ...res}
+  
+          delete _param.status
+          delete _param.ErrCode
+          delete _param.ErrMesg
+          delete _param.message
+  
+          Api.genericInterface(_param).then(result => {
+            if (!result.status) {
+              notification.warning({
+                top: 92,
+                message: result.message,
+                duration: 5
+              })
+            }
+          })
+        }
         if (params.length === 0) {
           this.execSuccess(res)
           _resolve()
@@ -1713,7 +1778,7 @@
       result.push({
         key: item.field,
         readonly: item.readonly === 'true',
-        readin: _readin,
+        readin: item.readin !== 'false' && item.readin !== 'top',
         fieldlen: _fieldlen,
         writein: item.writein !== 'false',
         type: _type,
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
index 4931b51..2520eac 100644
--- a/src/tabviews/zshare/actionList/printbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -1434,7 +1434,7 @@
       result.push({
         key: item.field,
         readonly: item.readonly === 'true',
-        readin: _readin,
+        readin: item.readin !== 'false' && item.readin !== 'top',
         fieldlen: _fieldlen,
         type: item.type,
         value: _initval
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 6d5929a..2525408 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -76,13 +76,15 @@
       if (!item.field || !['text', 'number', 'switch', 'select', 'link', 'linkMain', 'funcvar', 'date', 'datemonth', 'datetime', 'radio', 'checkbox', 'checkcard', 'fileupload', 'textarea', 'multiselect', 'brafteditor', 'color'].includes(item.type)) return false
 
       // 鏁版嵁鑷姩濉厖
-      item.readin = item.readin !== 'false'
+      let readin = item.readin !== 'false'
+      item.readin = item.readin !== 'false' && item.readin !== 'top'
       item.readonly = check || item.readonly === 'true'
       item.writein = item.writein !== 'false'
       item.hidden = item.hidden === 'true'
       item.fieldlength = item.fieldlength || 50
 
       if (item.type === 'funcvar') {
+        readin = false
         item.readin = false
         item.hidden = true
       } else if (item.type === 'number') {
@@ -111,7 +113,7 @@
 
       let newval = '$empty'
 
-      if (item.readin && data && data.hasOwnProperty(item.field)) {
+      if (readin && data && data.hasOwnProperty(item.field)) {
         newval = data[item.field]
       }
       if (item.type === 'linkMain') {
diff --git a/src/tabviews/zshare/normalTable/index.jsx b/src/tabviews/zshare/normalTable/index.jsx
index 38c2501..7aa11e6 100644
--- a/src/tabviews/zshare/normalTable/index.jsx
+++ b/src/tabviews/zshare/normalTable/index.jsx
@@ -17,6 +17,16 @@
 const TabButton = asyncComponent(() => import('@/tabviews/zshare/actionList/tabbutton'))
 const NewPageButton = asyncComponent(() => import('@/tabviews/zshare/actionList/newpagebutton'))
 
+class BodyRow extends React.Component {
+  shouldComponentUpdate (nextProps) {
+    return this.props.className !== nextProps.className
+  }
+
+  render() {
+    return <tr {...this.props}/>
+  }
+}
+
 class NormalTable extends Component {
   static propTpyes = {
     tableId: PropTypes.string,       // 鍒楄〃Id
@@ -49,7 +59,7 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { menuType, memberLevel, pageSize } = this.props
+    const { menuType, memberLevel, pageSize, setting } = this.props
     let columns = fromJS(this.props.columns).toJS()
     let lineMarks = []
     let _columns = []
@@ -57,122 +67,159 @@
     let _format = false    // 鏄惁铏氬寲澶勭悊
     let rowspans = []
 
-    if (window.GLOB.dataFormat && menuType !== 'HS' && memberLevel) {
-      _format = true
-
-      if (memberLevel >= 30) {
-        radio = 20
-      } else if (memberLevel >= 20) {
-        radio = 10
-      }
-    }
-
-    columns.forEach((item, index) => {
-      if (item.hidden === true || item.Hide === 'true') return
-      let cell = null
-
-      if (item.type === 'colspan') {
-        cell = {title: item.label, children: []}
-
-        item.subcols.forEach(col => {
-          if (col.rowspan === 'true') {
-            rowspans.push(col.field)
-          }
-          if (_format && !Math.floor(Math.random() * radio)) {
-            col.blur = true
-          }
-
-          if (col.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
-            col.marks = col.marks.filter(mark => {
-              if (mark.signType === 'line') {
-                lineMarks.push(mark)
-              }
-              return mark.signType !== 'line' && mark.signType !== 'card'
+    if (setting.tableMode === 'fast') {
+      rowspans = null
+      columns.forEach(item => {
+        if (item.hidden === true || item.Hide === 'true') return
+        let cell = null
+  
+        if (item.type === 'colspan' || item.type === 'old_colspan') {
+          cell = {title: item.label, children: []}
+  
+          item.subcols.forEach(col => {
+            cell.children.push({
+              align: col.Align,
+              title: col.label,
+              dataIndex: col.field || col.uuid,
+              key: col.uuid,
+              width: col.Width || 120
             })
-    
-            if (col.marks.length === 0) {
-              col.marks = ''
-            }
-          }
-
-          cell.children.push({
-            align: col.Align,
-            title: col.label,
-            dataIndex: col.field || col.uuid,
-            key: col.uuid,
-            width: col.Width || 120,
-            render: (text, record) => {
-              return this.getContent(col, record)
-            }
           })
-        })
-      } else if (item.type === 'old_colspan') {
-        item.subcols.forEach(col => {
-          if (col.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
-            col.marks = col.marks.filter(mark => {
-              if (mark.signType === 'line') {
-                lineMarks.push(mark)
+        } else {
+          if (item.type === 'index') {
+            item.field = '$Index'
+            item.type = 'text'
+          }
+  
+          cell = {
+            align: item.Align,
+            dataIndex: item.field || item.uuid,
+            title: item.label,
+            sorter: item.field && item.IsSort === 'true',
+            width: item.Width || 120
+          }
+        }
+        
+        _columns.push(cell)
+      })
+    } else {
+      if (window.GLOB.dataFormat && menuType !== 'HS' && memberLevel) {
+        _format = true
+  
+        if (memberLevel >= 30) {
+          radio = 20
+        } else if (memberLevel >= 20) {
+          radio = 10
+        }
+      }
+  
+      columns.forEach((item, index) => {
+        if (item.hidden === true || item.Hide === 'true') return
+        let cell = null
+  
+        if (item.type === 'colspan') {
+          cell = {title: item.label, children: []}
+  
+          item.subcols.forEach(col => {
+            if (col.rowspan === 'true') {
+              rowspans.push(col.field)
+            }
+            if (_format && !Math.floor(Math.random() * radio)) {
+              col.blur = true
+            }
+  
+            if (col.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
+              col.marks = col.marks.filter(mark => {
+                if (mark.signType === 'line') {
+                  lineMarks.push(mark)
+                }
+                return mark.signType !== 'line' && mark.signType !== 'card'
+              })
+      
+              if (col.marks.length === 0) {
+                col.marks = ''
               }
-              return mark.signType !== 'line' && mark.signType !== 'card'
+            }
+  
+            cell.children.push({
+              align: col.Align,
+              title: col.label,
+              dataIndex: col.field || col.uuid,
+              key: col.uuid,
+              width: col.Width || 120,
+              render: (text, record) => {
+                return this.getContent(col, record)
+              }
             })
-    
-            if (col.marks.length === 0) {
-              col.marks = ''
+          })
+        } else if (item.type === 'old_colspan') {
+          item.subcols.forEach(col => {
+            if (col.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
+              col.marks = col.marks.filter(mark => {
+                if (mark.signType === 'line') {
+                  lineMarks.push(mark)
+                }
+                return mark.signType !== 'line' && mark.signType !== 'card'
+              })
+      
+              if (col.marks.length === 0) {
+                col.marks = ''
+              }
             }
-          }
-        })
-
-        cell = {
-          align: item.Align,
-          dataIndex: item.field || item.uuid,
-          title: item.label,
-          sorter: item.field && item.IsSort === 'true',
-          width: item.Width || 120,
-          render: (text, record) => {
-            return this.getContent(item, record)
-          }
-        }
-      } else {
-        if (item.rowspan === 'true') {
-          rowspans.push(item.field)
-        }
-        if (item.type === 'index') {
-          item.field = '$Index'
-          item.type = 'text'
-        } else if (_format && !Math.floor(Math.random() * radio)) {
-          item.blur = true
-        }
-
-        if (item.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
-          item.marks = item.marks.filter(mark => {
-            if (mark.signType === 'line') {
-              lineMarks.push(mark)
-            }
-            return mark.signType !== 'line' && mark.signType !== 'card'
           })
   
-          if (item.marks.length === 0) {
-            item.marks = ''
+          cell = {
+            align: item.Align,
+            dataIndex: item.field || item.uuid,
+            title: item.label,
+            sorter: item.field && item.IsSort === 'true',
+            width: item.Width || 120,
+            render: (text, record) => {
+              return this.getContent(item, record)
+            }
+          }
+        } else {
+          if (item.rowspan === 'true') {
+            rowspans.push(item.field)
+          }
+          if (item.type === 'index') {
+            item.field = '$Index'
+            item.type = 'text'
+          } else if (_format && !Math.floor(Math.random() * radio)) {
+            item.blur = true
+          }
+  
+          if (item.marks) { // 杩囨护琛屽拰鍗$墖鏍囪
+            item.marks = item.marks.filter(mark => {
+              if (mark.signType === 'line') {
+                lineMarks.push(mark)
+              }
+              return mark.signType !== 'line' && mark.signType !== 'card'
+            })
+    
+            if (item.marks.length === 0) {
+              item.marks = ''
+            }
+          }
+  
+          cell = {
+            align: item.Align,
+            dataIndex: item.field || item.uuid,
+            title: item.label,
+            sorter: item.field && item.IsSort === 'true',
+            width: item.Width || 120,
+            render: (text, record) => {
+              return this.getContent(item, record)
+            }
           }
         }
-
-        cell = {
-          align: item.Align,
-          dataIndex: item.field || item.uuid,
-          title: item.label,
-          sorter: item.field && item.IsSort === 'true',
-          width: item.Width || 120,
-          render: (text, record) => {
-            return this.getContent(item, record)
-          }
-        }
+        
+        _columns.push(cell)
+      })
+  
+      if (rowspans.length === 0) {
+        rowspans = null
       }
-      
-      _columns.push(cell)
-    })
-
-    if (rowspans.length === 0) {
-      rowspans = null
     }
     
     this.setState({
@@ -1056,6 +1103,14 @@
     const { setting, pickup, statFValue } = this.props
     const { selectedRowKeys, lineMarks, activeIndex } = this.state
 
+    let components = {
+      body: {}
+    }
+
+    if (setting.tableMode === 'fast') {
+      components.body.row = BodyRow
+    }
+
     // 璁剧疆琛ㄦ牸閫夋嫨灞炴�э細鍗曢�夈�佸閫夈�佷笉鍙��
     let rowSelection = null
     if (setting.tableType) {
@@ -1136,6 +1191,7 @@
           />
         </Affix>}
         <Table
+          components={components}
           size={setting.size || 'middle'}
           style={style}
           bordered={setting.bordered !== 'false'}
diff --git a/src/tabviews/zshare/topSearch/index.jsx b/src/tabviews/zshare/topSearch/index.jsx
index 90209bf..defee38 100644
--- a/src/tabviews/zshare/topSearch/index.jsx
+++ b/src/tabviews/zshare/topSearch/index.jsx
@@ -433,6 +433,7 @@
     const { getFieldDecorator } = this.props.form
     const { dict, showButton, showAdvanced, float, visible } = this.state
     const fields = []
+    let lastRadio = 6
 
     this.state.searchlist.forEach((item, index) => {
       if (item.hidden || item.advanced) return
@@ -446,6 +447,7 @@
 
       let content = null
       let field = item.field
+      lastRadio = item.ratio || 6
 
       if (item.type === 'text') {
         if (item.inputType === 'search') {
@@ -480,7 +482,7 @@
 
     if (showButton) {
       let action = (
-        <Col span={6} style={{ whiteSpace: 'nowrap' }} className="search-button" key="actions">
+        <Col span={lastRadio < 6 ? 6 : lastRadio} style={{ whiteSpace: 'nowrap' }} className="search-button" key="actions">
           <Form.Item label={' '} colon={false} style={{ minHeight: '40px' }}>
             <Button type="primary" onClick={this.handleSubmit}>
               {dict['main.search']}
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index e2aacac..8b38bc5 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/src/templates/formtabconfig/index.jsx
@@ -440,7 +440,7 @@
       _formfields = [..._formfields, ...group.sublist]
     })
 
-    _inputfields = _formfields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = _formfields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && card.field !== item.field)
     _tabfields = _formfields.filter(item => card.field !== item.field && item.hidden !== 'true' && ['text', 'number', 'select', 'link'].includes(item.type))
     _tabfields.unshift({field: '', text: '鍘熻〃鍗�'})
     
@@ -505,15 +505,10 @@
       usefulFields = []
     }
 
-    let ableField = usefulFields.join(', ')
-    let functip = <div>
-      <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p>
-    </div>
-
     this.setState({
       modaltype: 'actionEdit',
       card: card,
-      formlist: getActionForm(card, functip, this.state.config, usefulFields)
+      formlist: getActionForm(card, this.state.config, usefulFields)
     })
   }
 
diff --git a/src/templates/modalconfig/index.jsx b/src/templates/modalconfig/index.jsx
index ba2dcdc..8e0e44a 100644
--- a/src/templates/modalconfig/index.jsx
+++ b/src/templates/modalconfig/index.jsx
@@ -200,7 +200,7 @@
     }]
     let standardform = null
 
-    _inputfields = config.fields.filter(item => item.type === 'text' || item.type === 'number' || item.type === 'textarea' || item.type === 'color')
+    _inputfields = config.fields.filter(item => ['text', 'number', 'textarea', 'color'].includes(item.type) && card.field !== item.field)
     _tabfields = config.fields.filter(item => card.field !== item.field && item.hidden !== 'true' && ['text', 'number', 'select', 'link'].includes(item.type))
     _tabfields.unshift({field: '', text: '鍘熻〃鍗�'})
 
diff --git a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
index b544ead..96d9c47 100644
--- a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
@@ -222,7 +222,7 @@
       } else if (_intertype === 'outer') {
         _options.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
       } else if (_intertype === 'inner') {
-        _options.push('innerFunc')
+        _options.push('innerFunc', 'preFunc')
       } else {
         _options.push('sql', 'sqlType')
       }
@@ -527,7 +527,7 @@
 
       if (item.type === 'text') { // 鏂囨湰鎼滅储
         let _rules = []
-        if (item.key === 'innerFunc') {
+        if (item.key === 'innerFunc' || item.key === 'preFunc') {
           let str = '^(' + item.fields.join('|') + ')'
           let _patten = new RegExp(str + formRule.func.innerPattern + '$', 'g')
           _rules = [{
@@ -589,7 +589,7 @@
                     message: this.props.dict['form.required.input'] + item.label + '!'
                   }
                 ]
-              })(<InputNumber min={0} max={10000} precision={0} />)}
+              })(<InputNumber min={0} max={10000} precision={0} onPressEnter={this.handleSubmit}/>)}
             </Form.Item>
           </Col>
         )
diff --git a/src/templates/sharecomponent/actioncomponent/index.jsx b/src/templates/sharecomponent/actioncomponent/index.jsx
index 2bd7db5..2a76df0 100644
--- a/src/templates/sharecomponent/actioncomponent/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/index.jsx
@@ -151,11 +151,6 @@
       usefulFields = []
     }
 
-    let ableField = usefulFields.join(', ')
-    let functip = <div>
-      <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p>
-    </div>
-
     let menulist = []
 
     if (menu.fstMenuList) {
@@ -183,7 +178,7 @@
     this.setState({
       visible: true,
       card: card,
-      formlist: getActionForm(card, functip, this.props.config, usefulFields, this.props.type, menulist, this.state.printTemps)
+      formlist: getActionForm(card, this.props.config, usefulFields, this.props.type, menulist, this.state.printTemps)
     })
   }
 
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index d5b0024..3701e1d 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -429,6 +429,22 @@
   changeColumns = (columns) => {
     const { verify } = this.state
 
+    if (columns[0] && (columns[0].type === 'image' || columns[0].type === 'text')) {
+      columns = columns.map(col => {
+        let _cell = {
+          uuid: Utils.getuuid(),
+          Column: col.Column,
+          Text: col.Text,
+          type: 'Nvarchar(50)',
+          limit: '50',
+          import: 'true',
+          required: 'true'
+        }
+
+        return _cell
+      })
+    }
+
     columns = columns.map(col => {
       if (/^Nvarchar/ig.test(col.type)) {
         col.limit = col.type.match(/\d+/) ? col.type.match(/\d+/)[0] : '20000'
@@ -835,7 +851,7 @@
               娓呯┖Excel鍒�
             </Button>
             <Col style={{fontSize: '12px', color: '#757575', paddingLeft: '10px'}} span={24}>娉細鏁板�肩被鍨嬶紙int 鎴� decimal锛夛紝鍐呭涓哄繀濉紱鏈�澶у�煎拰鏈�灏忓�煎湪绫诲瀷涓烘暟鍊兼椂鏈夋晥銆�</Col>
-            <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelincolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
+            <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelcolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
           </TabPane>
           {card.intertype === 'system' ? <TabPane tab={
             <span>
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index b5fadc0..72cc3a2 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -49,7 +49,8 @@
         min: 5,
         max: 200,
         editable: true,
-        width: '20%'
+        width: '20%',
+        render: (text) => text || 20
       },
       {
         title: '绫诲瀷',
@@ -425,6 +426,27 @@
     })
   }
 
+  changeColumns = (columns) => {
+    const { verify } = this.state
+
+    if (columns[0] && (columns[0].type !== 'image' && columns[0].type !== 'text')) {
+      columns = columns.map(col => {
+        let _cell = {
+          uuid: Utils.getuuid(),
+          Column: col.Column,
+          Text: col.Text,
+          Width: 20,
+          abs: 'false',
+          type: 'text',
+        }
+
+        return _cell
+      })
+    }
+
+    this.setState({verify: {...verify, columns}})
+  }
+
   render() {
     const { card } = this.props
     const { verify, excelColumns, defaultscript } = this.state
@@ -457,7 +479,7 @@
               娓呯┖Excel鍒�
             </Button>
             <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index銆�</div>
-            <EditTable actions={['edit', 'move', 'copy', 'del']} type="exceloutcolumn" data={verify.columns} columns={excelColumns} onChange={(columns) => this.setState({verify: {...verify, columns}})}/>
+            <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelcolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
           </TabPane>
           {card.intertype === 'system' ? <TabPane tab={
             <span>
diff --git a/src/templates/sharecomponent/columncomponent/colspanform/index.jsx b/src/templates/sharecomponent/columncomponent/colspanform/index.jsx
index 029ee98..2729c01 100644
--- a/src/templates/sharecomponent/columncomponent/colspanform/index.jsx
+++ b/src/templates/sharecomponent/columncomponent/colspanform/index.jsx
@@ -138,7 +138,7 @@
                     message: this.props.dict['form.required.input'] + this.props.dict['model.form.columnWidth'] + '!'
                   }
                 ]
-              })(<InputNumber min={1} max={1000} precision={0} />)}
+              })(<InputNumber min={1} max={1000} precision={0} onPressEnter={this.handleSubmit} />)}
             </Form.Item>
           </Col>
           <Col span={12}>
diff --git a/src/templates/sharecomponent/columncomponent/columnform/index.jsx b/src/templates/sharecomponent/columncomponent/columnform/index.jsx
index eaf0a25..5efbdd6 100644
--- a/src/templates/sharecomponent/columncomponent/columnform/index.jsx
+++ b/src/templates/sharecomponent/columncomponent/columnform/index.jsx
@@ -215,8 +215,8 @@
                     message: this.props.dict['form.required.input'] + item.label + '!'
                   }
                 ]
-              })(item.unlimit ? <InputNumber /> :
-                  <InputNumber min={item.min} max={item.max} precision={item.decimal} />)}
+              })(item.unlimit ? <InputNumber onPressEnter={this.handleSubmit}/> :
+                  <InputNumber min={item.min} max={item.max} precision={item.decimal} onPressEnter={this.handleSubmit}/>)}
             </Form.Item>
           </Col>
         )
diff --git a/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx b/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
index 0a4383f..374c44e 100644
--- a/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
@@ -123,6 +123,11 @@
     }
   })
 
+  let radio = 6
+  if (cards.length > 0) {
+    radio = cards[cards.length - 1].ratio || 6
+  }
+
   return (
     <div ref={drop} className="ant-row">
       {cards.map(card => (
@@ -139,7 +144,7 @@
           />
         </Col>
       ))}
-      {cards.length > 0 ? <Col key="action" className="action" span={6}>
+      {cards.length > 0 ? <Col key="action" className="action" span={radio < 6 ? 6 : radio}>
         <div className="ant-row ant-form-item" style={{whiteSpace: 'nowrap', lineHeight: '40px', height: '55px', marginBottom: 0}}>
           <div className="ant-col ant-form-item-label ant-col-xs-24 ant-col-sm-8">
           </div>
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
index d7000ac..2e620cb 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
@@ -641,6 +641,22 @@
             </Col>
             <Col span={12}>
               <Form.Item label={
+                <Tooltip placement="topLeft" title="浣跨敤鎬ラ�熸ā寮忔椂锛岃〃鏍间腑鐨勬爣璁般�佸弻鍑讳簨浠躲�佹牸寮忓寲銆佽鍚堝苟銆佸墠缂�銆佸悗缂�銆佸瓧娈甸�忚绛夋晥鏋滃皢鏃犳晥锛屼笖鏁版嵁閮戒細浠ユ枃鏈牸寮忔樉绀恒��">
+                  <Icon type="question-circle" />
+                  妯″紡
+                </Tooltip>
+              }>
+                {getFieldDecorator('tableMode', {
+                  initialValue: setting.tableMode || 'compatible'
+                })(
+                <Radio.Group>
+                  <Radio value="compatible">鍏煎</Radio>
+                  <Radio value="fast">鎬ラ��</Radio>
+                </Radio.Group>)}
+              </Form.Item>
+            </Col>
+            <Col span={12}>
+              <Form.Item label={
                 <Tooltip placement="topLeft" title="楂樼骇鎼滅储寮圭獥鐨勫搴︼紝娉細褰撳搴﹀�煎皬浜�100鏃惰〃绀哄崰绐楀彛鐨勭櫨鍒嗘瘮锛屽ぇ浜�100鏃惰〃绀哄搴︾殑缁濆鍊笺��">
                   <Icon type="question-circle" />
                   楂樼骇鎼滅储
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 63ba08f..6613e61 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -788,12 +788,11 @@
 /**
  * @description 鑾峰彇鎸夐挳琛ㄥ崟閰嶇疆淇℃伅
  * @param {*} card           缂栬緫鎸夐挳
- * @param {*} functip        鐢熸垚瀛樺偍杩囩▼鎻愮ず
  * @param {*} config         椤甸潰閰嶇疆
  * @param {*} usefulFields   瀛樺偍杩囩▼鍙敤鐨勫紑濮嬪瓧娈�
  * @param {*} type           鎸夐挳绫诲瀷锛岀敤浜庡尯鍒嗗彲閫夌殑鎵撳紑鏂瑰紡
  */
-export function getActionForm (card, functip, config, usefulFields, type, menulist = [], printTemps = []) {
+export function getActionForm (card, config, usefulFields, type, menulist = [], printTemps = []) {
   let columns = (config.columns || []).filter(col => col.field)
 
   let opentypes = [
@@ -954,7 +953,7 @@
       key: 'innerFunc',
       label: Formdict['header.form.innerFunc'],
       initVal: card.innerFunc || '',
-      tooltip: functip,
+      tooltip: `鍑芥暟鍚嶇О闇�浠�${usefulFields.join(', ')}绛夊瓧绗﹀紑濮嬨�俙,
       fields: usefulFields,
       tooltipClass: 'middle',
       required: card.intertype === 'inner',
@@ -1386,6 +1385,17 @@
         value: 'bottom',
         text: '涓嬩晶'
       }]
+    },
+    {
+      type: 'text',
+      key: 'preFunc',
+      label: '鍓嶇疆鍑芥暟',
+      initVal: card.preFunc || '',
+      tooltip: `鍑芥暟鍚嶇О闇�浠�${usefulFields.join(', ')}绛夊瓧绗﹀紑濮嬶紱鍓嶇疆鍑芥暟鎵ц瀹屾垚鍚庯紝缁撴灉浼氫紶鍏ュ唴閮ㄥ嚱鏁颁腑锛屾鏃跺唴閮ㄥ嚱鏁颁細寮傛鎵ц銆俙,
+      fields: usefulFields,
+      tooltipClass: 'middle',
+      required: false,
+      readonly: false
     },
   ]
 }
@@ -2744,7 +2754,7 @@
       type: 'radio',
       key: 'readin',
       label: Formdict['header.form.readin'],
-      tooltip: Formdict['header.form.readin.tooltip'],
+      tooltip: '鏄惁灏嗚〃鏍奸�変腑鐨勬暟鎹嚜鍔ㄥ~鍏呭埌琛ㄥ崟锛堝瓧娈电浉鍚岋級',
       initVal: card.readin || 'true',
       options: [{
         value: 'true',
@@ -2752,6 +2762,9 @@
       }, {
         value: 'false',
         text: Formdict['model.false']
+      }, {
+        value: 'top',
+        text: '棣栬'
       }]
     },
     {
diff --git a/src/views/design/header/index.scss b/src/views/design/header/index.scss
index e9fe096..2e1c35a 100644
--- a/src/views/design/header/index.scss
+++ b/src/views/design/header/index.scss
@@ -29,9 +29,7 @@
     line-height: 48px;
     padding-left: 10px;
     margin: 0 10px;
-    transition: padding-left 0.15s;
     i {
-      cursor: pointer;
       position: relative;
       top: 3px;
       font-size: 20px;
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 315618c..ef337c1 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -453,14 +453,12 @@
                 login_types.push(item.way_no)
 
                 login_ways.push({
-                  label: item.way_name,
                   type: item.way_no,
                   smsId: item.sms_id
                 }) 
               })
             } else {
               login_ways.push({
-                label: '璐﹀彿瀵嗙爜鐧诲綍',
                 type: 'uname_pwd',
                 smsId: ''
               })
diff --git a/src/views/login/index.scss b/src/views/login/index.scss
index 80c6e97..68ff047 100644
--- a/src/views/login/index.scss
+++ b/src/views/login/index.scss
@@ -35,6 +35,7 @@
     border-bottom: 2px solid #1890ff;
 
     .login-form {
+      position: relative;
       float: right;
       margin-top: 5%;
       margin-right: 20%;
@@ -49,15 +50,46 @@
         font-size: 18px;
         line-height: 45px;
         display: flex;
+        padding-top: 10px;
       }
       .login-way-title::before, .login-way-title::after {
         display: inline-block;
         content: ' ';
         height: 0.5px;
         flex: 1;
-        background-color: red;
+        background-color: rgba(0, 0, 0, 0.15);
         position: relative;
         top: 22px;
+      }
+      .scan-icon {
+        position: absolute;
+        right: 0px;
+        top: 0px;
+        font-size: 46px;
+        color: #000000;
+        line-height: 1;
+        transform: rotate(-45deg);
+        transform-origin: 0 0;
+        overflow: hidden;
+        padding-bottom: 10px;
+        cursor: pointer;
+        i {
+          transform-origin: 0 0;
+          transform: rotate(45deg);
+        }
+      }
+      .login-ways {
+        padding: 0 1.6vw 1.5vw;
+        span {
+          color: #1890ff;
+          cursor: pointer;
+        }
+        span + span {
+          margin-left: 15px;
+        }
+      }
+      .login-ways.center {
+        text-align: center;
       }
       .login-way-title::before {
         margin: 0 10px 0 1.6vw;
@@ -65,49 +97,9 @@
       .login-way-title::after {
         margin: 0 1.6vw 0 10px;
       }
-      .login-way-wrap {
-        height: 50px;
-        line-height: 50px;
-        margin-bottom: 10px;
-        display: flex;
-        .login-way {
-          flex: 1;
-          width: 50%;
-          font-size: 17px;
-          text-align: center;
-          white-space: nowrap;
-          text-overflow: ellipsis;
-          overflow: hidden;
-          padding: 0 16px;
-          transition: all 0.3s;
-          border: 1px solid transparent;
-          border-top: 0!important;
-        }
-        .login-way.active, .login-way:hover {
-          color: #1890ff;
-        }
-        .login-way:not(.active) {
-          cursor: pointer;
-          background: #fafafa;
-          border: 1px solid #e8e8e8;
-        }
-        .login-way:first-child {
-          border-left: 0;
-        }
-        .login-way:last-child {
-          border-right: 0;
-        }
-      }
-      .login-way-wrap.simple {
-        .login-way {
-          font-size: 18px;
-          text-align: left!important;
-          padding-left: 1.6vw!important;
-          line-height: 60px!important;
-        }
-      }
       .form-item-wrap {
-        padding: 0.6vw 1.6vw 1.6vw;
+        // padding: 0.6vw 1.6vw 1.6vw;
+        padding: 0.6vw 1.6vw 0vw;
       }
 
       h4 {
@@ -142,16 +134,17 @@
         font-size: 14px;
         margin-bottom: 10px;
         height: 25px;
+        float: right;
         .ant-form-item-control {
           line-height: 25px;
         }
         .register {
           color: #1890ff;
+          margin-right: 10px;
         }
         .forgot {
           font-size: 14px;
           color: #1890ff;
-          float: right;
         }
       }
       .minline {
diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx
index 43cfa46..8e56f32 100644
--- a/src/views/login/loginform.jsx
+++ b/src/views/login/loginform.jsx
@@ -40,6 +40,7 @@
     loginWays: [],
     smsId: '',
     verdisabled: false,
+    hasScan: false,
     timeout: false
   }
 
@@ -56,15 +57,19 @@
     }
 
     let smsId = ''
+    let hasScan = false
     let _loginWays = []
     loginWays.forEach(item => {
       if (item.type === 'sms_vcode') {
+        item.label = '鐭俊鐧诲綍'
         smsId = item.smsId
         _loginWays.push(item)
       } else if (item.type === 'uname_pwd') {
+        item.label = '璐﹀彿鐧诲綍'
         _loginWays.push(item)
       } else if (item.type === 'app_scan') {
         _loginWays.push(item)
+        hasScan = true
       }
     })
 
@@ -76,7 +81,8 @@
       activeKey,
       scanId: activeKey === 'app_scan' ? Utils.getuuid() : '',
       timeout: false,
-      remember
+      remember,
+      hasScan
     })
 
     if (activeKey === 'app_scan') {
@@ -356,16 +362,13 @@
 
   render() {
     const { getFieldDecorator } = this.props.form
-    const { activeKey, verdisabled, delay, loginWays, remember, scanId, timeout } = this.state
+    const { activeKey, verdisabled, delay, loginWays, remember, scanId, timeout, hasScan } = this.state
+    const wayLabels = {app_scan: '鎵爜鐧诲綍', uname_pwd: '璐﹀彿鐧诲綍', sms_vcode: '鐭俊鐧诲綍'}
 
     return (
       <Form className="login-form" id="login-form" onSubmit={this.handleSubmit}>
-        <div className={'login-way-wrap ' + (loginWays.length === 1 ? 'simple' : '')}>
-          {loginWays.map(item => (
-            <div className={'login-way' + (activeKey === item.type ? ' active' : '')} onClick={() => this.onChangeTab(item.type)} key={item.type}>{item.label}</div>
-          ))}
-        </div>
-        {/* <div className="login-way-title">鐢ㄦ埛鐧诲綍</div> */}
+        <div className="login-way-title">{wayLabels[activeKey]}</div>
+        {hasScan && activeKey !== 'app_scan' ? <div className="scan-icon" onClick={() => this.onChangeTab('app_scan')}><Icon type="qrcode" /></div> : null}
         {activeKey === 'uname_pwd' ? <div className="form-item-wrap">
           <Form.Item>
             {getFieldDecorator('username', {
@@ -489,6 +492,12 @@
             璇蜂娇鐢ㄥ鎴风鎵竴鎵櫥褰�
           </div>
         </div> : null}
+        <div className={'login-ways ' + (activeKey === 'app_scan' ? 'center' : '')}>
+          {loginWays.map(item => {
+            if (item.type === 'app_scan' || activeKey === item.type) return null
+            return (<span key={item.type} onClick={() => this.onChangeTab(item.type)}>{item.label}</span>)
+          })}
+        </div>
       </Form>
     )
   }

--
Gitblit v1.8.0