king
2024-06-21 2bccb9ec7bdefe23292a22bc153463cfa1479a49
2024-06-21
45个文件已修改
2019 ■■■■ 已修改文件
src/api/index.js 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/index.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/setupProxy.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/basetable/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/data-card/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/double-data-card/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/table-card/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/share/normalTable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/table/edit-table/normalTable/index.jsx 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/popview/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/changeuserbutton/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/excelInbutton/index.jsx 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/exceloutbutton/index.jsx 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funcbutton/index.jsx 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funczip/index.jsx 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/newpagebutton/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/normalbutton/index.jsx 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/popupbutton/index.jsx 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/printbutton/index.jsx 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/tabbutton/index.jsx 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/mutilform/index.jsx 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/topSearch/index.jsx 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/searchcomponent/searchform/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils-custom.js 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appcheck/index.jsx 217 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appmanage/index.jsx 425 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basedesign/index.jsx 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/imdesign/index.jsx 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/interface/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/main/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menudesign/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mkiframe/index.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mobdesign/index.jsx 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pcdesign/index.jsx 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/rolemanage/index.jsx 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/systemfunc/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/systemproc/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tabledesign/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js
@@ -98,13 +98,16 @@
  }
  /**
   * @description 微信业务请求
   * @description 微信业务请求 原接口 'wxpay/getaccesstoken'
   */
  wxAccessToken (domain = '') {
    let _url = window.GLOB.baseurl + 'wxpay/getaccesstoken'
    let _url = domain || window.GLOB.baseurl
    if (domain) {
      _url = domain + 'wxpay/getaccesstoken'
    if (/qingqiumarket.cn|cloud.mk9h.cn/.test(_url)) {
      _url = _url.replace('http://qingqiumarket.cn', 'http://qingqiumarket.cn:8080')
      _url = _url.replace('http://cloud.mk9h.cn', 'http://cloud.mk9h.cn:8080')
      _url = _url.replace('https://qingqiumarket.cn', 'https://qingqiumarket.cn:8443')
      _url = _url.replace('https://cloud.mk9h.cn', 'https://cloud.mk9h.cn:8443')
    }
    return new Promise(resolve => {
@@ -113,8 +116,10 @@
      } else {
        window.GLOB.accessToken = {domain}
        axios({
          url: _url,
          method: 'get'
          url: _url + 'wechat/jsapi/getaccesstoken',
          method: 'post',
          headers: { 'Content-Type': 'application/json' },
          data: JSON.stringify({appId: 'wx4d8a34c8d4494872'})
        }).then(res => {
          if (res.oa_access_token) {
            window.GLOB.accessToken.accessTime = parseInt(new Date().getTime() / 1000)
@@ -129,6 +134,7 @@
  /**
   * @description 微信业务请求
   * 39上 qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn
   */
  wxNginxRequest (url, method, param) {
    let _url = url
@@ -138,16 +144,11 @@
      if (process.env.NODE_ENV === 'production') {
        _url = document.location.origin + '/' + url
      }
      if (/^http:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
        _url = window.GLOB.location + ':8080/' + url
        if (process.env.NODE_ENV === 'production') {
          _url = document.location.origin + ':8080/' + url
        }
      } else if (/^https:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
        _url = window.GLOB.location + ':8443/' + url
        if (process.env.NODE_ENV === 'production') {
          _url = document.location.origin + ':8443/' + url
        }
      if (/qingqiumarket.cn|cloud.mk9h.cn/.test(_url)) {
        _url = _url.replace('http://qingqiumarket.cn', 'http://qingqiumarket.cn:8080')
        _url = _url.replace('http://cloud.mk9h.cn', 'http://cloud.mk9h.cn:8080')
        _url = _url.replace('https://qingqiumarket.cn', 'https://qingqiumarket.cn:8443')
        _url = _url.replace('https://cloud.mk9h.cn', 'https://cloud.mk9h.cn:8443')
      }
    }
    
@@ -1029,16 +1030,11 @@
    if (process.env.NODE_ENV === 'production') {
      _url = document.location.origin + '/file/oss/upload'
    }
    if (/^http:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
      _url = window.GLOB.location + ':8080/file/oss/upload'
      if (process.env.NODE_ENV === 'production') {
        _url = document.location.origin + ':8080/file/oss/upload'
      }
    } else if (/^https:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
      _url = window.GLOB.location + ':8443/file/oss/upload'
      if (process.env.NODE_ENV === 'production') {
        _url = document.location.origin + ':8443/file/oss/upload'
      }
    if (/qingqiumarket.cn|cloud.mk9h.cn/.test(_url)) {
      _url = _url.replace('http://qingqiumarket.cn', 'http://qingqiumarket.cn:8080')
      _url = _url.replace('http://cloud.mk9h.cn', 'http://cloud.mk9h.cn:8080')
      _url = _url.replace('https://qingqiumarket.cn', 'https://qingqiumarket.cn:8443')
      _url = _url.replace('https://cloud.mk9h.cn', 'https://cloud.mk9h.cn:8443')
    }
    
    return axios({
src/index.js
@@ -1,5 +1,8 @@
import React from 'react'
import ReactDOM from 'react-dom'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/es/locale/zh_CN'
import Route from './router'
import md5 from 'md5'
import * as serviceWorker from './serviceWorker'
@@ -17,13 +20,6 @@
    }
    return uuid.join('')
  })())
}
const render = Component => {
  ReactDOM.render(
    <Component/>,
    document.getElementById('root')
  )
}
fetch('../options.json')
@@ -369,7 +365,20 @@
    window.GLOB.SyncData = new Map()     // 存储同步查询数据
    window.GLOB.mkThdMenus = new Map()   // 三级菜单
    render(Route)
    if (lang === 'zh-CN' || !/#\/(login|main|billprint|docprint|tab|iframe|view|ssologin)/.test(window.location.href)) { // 开发使用中文
      ReactDOM.render(
        <ConfigProvider locale={zhCN}>
          <Route/>
        </ConfigProvider>,
        document.getElementById('root')
      )
    } else {
      ReactDOM.render(
        <Route/>,
        document.getElementById('root')
      )
    }
  })
serviceWorker.unregister()
src/setupProxy.js
@@ -36,6 +36,12 @@
    changeOrigin: true
  }))
  app.use(proxy('/wechat', {
    target: `${options.host}/${options.service}`,
    secure: false,
    changeOrigin: true
  }))
//   app.use(proxy('/trans', {
//     target: `${host}/${service}`,
//     secure: false,
src/tabviews/basetable/index.jsx
@@ -504,12 +504,6 @@
    if (cell.OpenType === 'excelOut') { // 导出
      cell.$menuName = item.$menuname
      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
        cell.errorType = 'error1'
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom' && item.setting.interType !== 'system') {
        cell.errorType = 'error2'
      }
    }
    if (cell.verify) {
src/tabviews/commontable/index.jsx
@@ -305,12 +305,6 @@
        if (item.OpenType === 'excelOut') { // 导出
          item.$menuName = MenuName
          if (!item.verify || !item.verify.columns || item.verify.columns.length === 0) {
            item.errorType = 'error1'
          } else if (item.intertype === 'system' && item.verify.dataType !== 'custom' && config.setting.interType !== 'system') {
            item.errorType = 'error2'
          }
        }
        if (item.verify && item.verify.invalid === 'true') {
src/tabviews/custom/components/card/data-card/index.jsx
@@ -616,7 +616,7 @@
      MKEmitter.emit('resetSelectLine', config.uuid, last ? last.$$uuid : '', last)
      MKEmitter.emit('syncBalconyData', config.uuid, items, data.length > 0 && data.length === keys.length)
      if (items.length === 0) {
        message.warning('未获取到数据!')
        message.warning(window.GLOB.dict['no_data'] || '未获取到数据!')
      }
    } else {
      this.setState({
@@ -1222,7 +1222,7 @@
            selectedData={selectedData}
          /> : null
        }
        {config.wrap.pickup === 'true' && this.state.data.length > 0 ? <div className="pickup-wrap"><Switch title="收起" checkedChildren="开" unCheckedChildren="关" checked={pickup} onChange={this.pickupChange} /></div> : null}
        {config.wrap.pickup === 'true' && this.state.data.length > 0 ? <div className="pickup-wrap"><Switch title="收起" checkedChildren={window.GLOB.dict['open'] || '开'} unCheckedChildren={window.GLOB.dict['shut'] || '关'} checked={pickup} onChange={this.pickupChange} /></div> : null}
        <div className={`data-zoom ${config.wrap.wrapClass}`}>
          {switchable ? <div className={'prev-page ' + (pageIndex === 1 ? 'disabled' : '')} onClick={this.prevPage}><div><div><img src={preImg} alt=""/></div></div></div> : null}
          <Row className={'card-row-list ' + config.wrap.layout} style={{maxHeight: config.wrap.zHeight}}>
@@ -1271,8 +1271,8 @@
          {switchable ? <div className={'prev-page ' + (total <= _total ? 'disabled' : '')} onClick={this.nextPage}><div><div><img src={nextImg} alt=""/></div></div></div> : null}
        </div>
        {config.$empty && data.length === 0 ? <Empty description={false}/> : null}
        {config.wrap.pagestyle === 'page' ? <Pagination size="small" total={total} showTotal={(t, range) => total > 0 ? `${range[0]}-${range[1]} 共 ${total} 条` : `共 ${total} 条`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null}
        {config.wrap.pagestyle === 'more' && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>查看更多<DownOutlined/></div> : null}
        {config.wrap.pagestyle === 'page' ? <Pagination size="small" total={total} showTotal={(t, range) => total > 0 ? `${range[0]}-${range[1]} ${window.GLOB.dict['of'] || '共'} ${total} ${window.GLOB.dict['items'] || '条'}` : `${total} ${window.GLOB.dict['items'] || '条'}`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null}
        {config.wrap.pagestyle === 'more' && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>{window.GLOB.dict['view_more'] || '查看更多'}<DownOutlined/></div> : null}
      </div>
    )
  }
src/tabviews/custom/components/card/double-data-card/index.jsx
@@ -1159,7 +1159,7 @@
            selectedData={selectedData}
          /> : null
        }
        {config.wrap.pickup === 'true' && this.state.data.length > 0 ? <div className="pickup-wrap"><Switch title="收起" checkedChildren="开" unCheckedChildren="关" checked={pickup} onChange={this.pickupChange} /></div> : null}
        {config.wrap.pickup === 'true' && this.state.data.length > 0 ? <div className="pickup-wrap"><Switch title="收起" checkedChildren={window.GLOB.dict['open'] || '开'} unCheckedChildren={window.GLOB.dict['shut'] || '关'} checked={pickup} onChange={this.pickupChange} /></div> : null}
        <div className={config.wrap.zoomStyle ? 'data-zoom-box' : ''} style={config.wrap.zoomStyle}>
          <div className={`data-zoom ${config.wrap.wrapClass}`}>
            <Row className="card-row-list">
@@ -1239,8 +1239,8 @@
          </div>
          {config.$empty && data.length === 0 ? <Empty description={false}/> : null}
        </div>
        {config.wrap.pagestyle === 'page' ? <Pagination size="small" total={total} showTotal={(t, range) => total > 0 ? `${range[0]}-${range[1]} 共 ${total} 条` : `共 ${total} 条`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null}
        {config.wrap.pagestyle === 'more' && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>查看更多<DownOutlined/></div> : null}
        {config.wrap.pagestyle === 'page' ? <Pagination size="small" total={total} showTotal={(t, range) => total > 0 ? `${range[0]}-${range[1]} ${window.GLOB.dict['of'] || '共'} ${total} ${window.GLOB.dict['items'] || '条'}` : `${total} ${window.GLOB.dict['items'] || '条'}`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null}
        {config.wrap.pagestyle === 'more' && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>{window.GLOB.dict['view_more'] || '查看更多'}<DownOutlined/></div> : null}
      </div>
    )
  }
src/tabviews/custom/components/card/table-card/index.jsx
@@ -612,7 +612,7 @@
          {data && data.length === 0 ? <Empty description={false}/> : null}
        </Row>
        {config.wrap.pagestyle === 'page' ? <Pagination size="small" current={pageIndex} total={total} onChange={this.changePageIndex} /> : null}
        {config.wrap.pagestyle === 'more' && data && data.length > 0 ? <div className={'mk-more' + (config.setting.pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>查看更多<DownOutlined/></div> : null}
        {config.wrap.pagestyle === 'more' && data && data.length > 0 ? <div className={'mk-more' + (config.setting.pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>{window.GLOB.dict['view_more'] || '查看更多'}<DownOutlined/></div> : null}
      </div>
    )
  }
src/tabviews/custom/components/share/normalTable/index.jsx
@@ -873,7 +873,7 @@
      MKEmitter.emit('resetSelectLine', MenuID, '', '')
      MKEmitter.emit('syncBalconyData', MenuID, data, data.length > 0)
      if (data.length === 0) {
        message.warning('未获取到数据!')
        message.warning(window.GLOB.dict['no_data'] || '未获取到数据!')
      }
    } else {
      this.setState({
@@ -1163,7 +1163,7 @@
        pageSizeOptions: pageOptions,
        showSizeChanger: true,
        total: this.props.total || 0,
        showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
        showTotal: (total, range) => `${range[0]}-${range[1]} ${window.GLOB.dict['of'] || '共'} ${total} ${window.GLOB.dict['items'] || '条'}`
      }
    }
@@ -1208,7 +1208,7 @@
    return (
      <div className={`normal-custom-table ${setting.tableHeader || ''} ${setting.parity === 'true' ? 'mk-parity' : ''} ${height ? 'fixed-table-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} style={style}>
        {(setting.tableType === 'radio' || setting.tableType === 'checkbox') && data && data.length > 0 ?
          <Switch title="收起" className="main-pickup" checkedChildren="开" unCheckedChildren="关" checked={pickup} onChange={this.pickupChange} /> : null
          <Switch title="收起" className="main-pickup" checkedChildren={window.GLOB.dict['open'] || '开'} unCheckedChildren={window.GLOB.dict['shut'] || '关'} checked={pickup} onChange={this.pickupChange} /> : null
        }
        <Table
          components={components}
src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
@@ -1383,7 +1383,8 @@
    allColumns: null,
    checkForms: [],
    allForms: [],
    reseting: false
    reseting: false,
    dict: window.GLOB.dict
  }
  timer = null
@@ -1625,7 +1626,7 @@
  }
  checkLine = () => {
    const { edData, forms, checkForms } = this.state
    const { edData, forms, checkForms, dict } = this.state
    let data = edData.filter(item => item.$$uuid === this.blurId)[0]
@@ -1668,7 +1669,7 @@
      if (col.type === 'text') {
        let val = record[col.field] !== undefined ? (record[col.field] + '') : ''
        if (col.required === 'true' && !val) {
          err = `${col.label}不可为空`
          err = `${col.label}${dict['not_empty'] || '不可为空'}`
        } else if (col.datatype === 'datetime' && !val) {
          val = '1949-10-01'
        }
@@ -1677,27 +1678,27 @@
        let val = record[col.field]
        if (col.required === 'true' && !val) {
          err = `${col.label}不可为${col.noValue === 'hide' ? '空' : '0'}`
          err = `${col.label}${col.noValue === 'hide' ? (dict['not_empty'] || '不可为空') : dict['not_zero'] || '不可为0'}`
        } else if (col.noValue === 'hide' && !val) {
          if (col.clearField && checkForms.includes(col.clearField) && !record[col.clearField]) {
            err = `请填写 ${col.label} 或 ${col.clearName}`
            err = `${dict['input_tip'] || '请填写 '}${col.label} ${dict['or'] || '或'} ${col.clearName}`
          }
          val = 0
        } else if (!val && val !== 0) {
          err = `${col.label}不可为空`
          err = `${col.label}${dict['not_empty'] || '不可为空'}`
        } else {
          val = +val
          if (isNaN(val)) {
            err = `${col.label}数据格式错误`
            err = `${col.label} ${dict['data_format'] || '数据格式错误'}`
            return
          }
  
          val = +val.toFixed(col.decimal || 0)
          
          if (typeof(col.max) === 'number' && val > col.max) {
            err = `${col.label}不可大于${col.max}`
            err = `${col.label}${dict['max_limit'] || ' 不可大于 '}${col.max}`
          } else if (typeof(col.min) === 'number' && val < col.min) {
            err = `${col.label}不可小于${col.min}`
            err = `${col.label}${dict['less_limit'] || ' 不可小于 '}${col.min}`
          }
        }
@@ -2230,7 +2231,7 @@
  checkData = () => {
    const { setting } = this.props
    const { edData, forms, checkForms, selectedRowKeys } = this.state
    const { edData, forms, checkForms, selectedRowKeys, dict } = this.state
    let data = fromJS(edData).toJS()
@@ -2244,7 +2245,7 @@
      if (data.length === 0) {
        notification.warning({
          top: 92,
          message: '请选择需要提交的数据!',
          message: dict['select_row'] || '请选择需要提交的数据!',
          duration: 5
        })
        return null
@@ -2254,7 +2255,7 @@
    if (data.length === 0) {
      notification.warning({
        top: 92,
        message: '数据未修改,不可提交!',
        message: dict['un_modified'] || '数据未修改,不可提交!',
        duration: 5
      })
      return null
@@ -2288,7 +2289,7 @@
        if (col.type === 'text') {
          let val = item[col.field] !== undefined ? (item[col.field] + '') : ''
          if (col.required === 'true' && !val) {
            line.push(`${col.label}不可为空`)
            line.push(`${col.label}${dict['not_empty'] || '不可为空'}`)
          } else if (col.datatype === 'datetime' && !val) {
            val = '1949-10-01'
          }
@@ -2296,31 +2297,31 @@
        } else if (col.type === 'number') {
          let val = item[col.field]
          if (col.required === 'true' && !val) {
            err = `${col.label}不可为${col.noValue === 'hide' ? '空' : '0'}`
            err = `${col.label}${col.noValue === 'hide' ? (dict['not_empty'] || '不可为空') : dict['not_zero'] || '不可为0'}`
          } else if (col.noValue === 'hide' && !val) {
            if (col.clearField && checkForms.includes(col.clearField) && !item[col.clearField]) {
              let msg = `请填写 ${col.label} 或 ${col.clearName}`
              let msg = `${dict['input_tip'] || '请填写 '}${col.label} ${dict['or'] || '或'} ${col.clearName}`
              if (!line.includes(msg)) {
                line.push(msg)
              }
            }
            val = 0
          } else if (!val && val !== 0) {
            line.push(`${col.label}不可为空`)
            line.push(`${col.label}${dict['not_empty'] || '不可为空'}`)
            return
          } else {
            val = +val
            if (isNaN(val)) {
              line.push(`${col.label}数据格式错误`)
              line.push(`${col.label} ${dict['data_format'] || '数据格式错误'}`)
              return
            }
  
            val = +val.toFixed(col.decimal || 0)
            
            if (typeof(col.max) === 'number' && val > col.max) {
              line.push(`${col.label}不可大于${col.max}`)
              line.push(`${col.label}${dict['max_limit'] || ' 不可大于 '}${col.max}`)
            } else if (typeof(col.min) === 'number' && val < col.min) {
              line.push(`${col.label}不可小于${col.min}`)
              line.push(`${col.label}${dict['less_limit'] || ' 不可小于 '}${col.min}`)
            }
          }
@@ -2329,7 +2330,7 @@
      })
      if (line.length > 0) {
        err += `第${Index}行:` + line.join(',') + ';'
        err += (dict['line'] ? `${dict['line']} ${Index}:` : `第${Index}行:`) + line.join(',') + ';'
      }
      if (!item.$deleted) {
        Index++
@@ -2353,14 +2354,14 @@
  submit = (record) => {
    const { submit, BID, setting } = this.props
    const { forms } = this.state
    const { forms, dict } = this.state
    this.setState({visible: false, midData: null})
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
@@ -2438,17 +2439,18 @@
  execSuccess = (res, record) => {
    const { submit } = this.props
    const { edData } = this.state
    const { edData, dict } = this.state
    if (res && res.ErrCode === 'S') { // 执行成功
      notification.success({
        top: 92,
        message: res.message || '执行成功',
        message: res.message || dict['exc_success'] || '执行成功',
        duration: submit.stime ? submit.stime : 2
      })
    } else if (res && res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.message || '执行成功'
        title: res.message || dict['exc_success'] || '执行成功',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res && res.ErrCode === '-1') { // 完成后不提示
@@ -2494,26 +2496,28 @@
  execError = (res, record) => {
    const { submit } = this.props
    const { dict } = this.state
    if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: submit.ntime ? submit.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: submit.ftime ? submit.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    
    this.setState({
@@ -2627,7 +2631,7 @@
  render() {
    const { setting, lineMarks, submit } = this.props
    const { edData, columns, loading, pageOptions, selectedRowKeys, visible, midData, reseting } = this.state
    const { edData, columns, loading, pageOptions, selectedRowKeys, visible, midData, reseting, dict } = this.state
    if (reseting) return null
@@ -2658,7 +2662,7 @@
        pageSizeOptions: pageOptions,
        showSizeChanger: true,
        total: this.props.total || 0,
        showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
        showTotal: (total, range) => `${range[0]}-${range[1]} ${dict['of'] || '共'} ${total} ${dict['items'] || '条'}`
      }
    }
@@ -2683,7 +2687,7 @@
    return (
      <>
        {setting.hasSubmit && edData.length > 0 ? <div className="edit-custom-table-btn-wrap" style={submit.wrapStyle}>
          <Button style={submit.style} onClick={() => setTimeout(() => {this.submit()}, 10)} loading={loading} className="submit-table" type="link">提交</Button>
          <Button style={submit.style} onClick={() => setTimeout(() => {this.submit()}, 10)} loading={loading} className="submit-table" type="link">{dict['submit'] || '提交'}</Button>
        </div> : null}
        <div className={`edit-custom-table ${setting.tableHeader || ''} ${setting.parity === 'true' ? 'mk-parity' : ''} ${height ? 'fixed-table-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || ''} mk-edit-${setting.editType || 'simple'}`} style={style}>
          <Table
@@ -2707,7 +2711,7 @@
            onChange={this.changeTable}
            pagination={_pagination}
          />
          {setting.hasSubmit && _data.length > 10 ? <Button style={submit.style} onClick={() => setTimeout(() => {this.submit()}, 10)} loading={loading} className="submit-footer-table" type="link">提交</Button> : null}
          {setting.hasSubmit && _data.length > 10 ? <Button style={submit.style} onClick={() => setTimeout(() => {this.submit()}, 10)} loading={loading} className="submit-footer-table" type="link">{dict['submit'] || '提交'}</Button> : null}
        </div>
        <Modal
          className="mk-user-confirm"
@@ -2716,13 +2720,13 @@
          maskClosable={false}
          closable={false}
          footer={[
            <Button key="cancel" onClick={() => { this.setState({ visible: false, midData: null }) }}>取消</Button>,
            <Button key="refresh" className="table-refresh" onClick={() => { midData && this.updateMutil(midData) }}>刷新表格</Button>,
            <Button key="confirm" type="primary" onClick={() => setTimeout(() => {this.submit()}, 10)}>提交数据</Button>
            <Button key="cancel" onClick={() => { this.setState({ visible: false, midData: null }) }}>{dict['cancel'] || '取消'}</Button>,
            <Button key="refresh" className="table-refresh" onClick={() => { midData && this.updateMutil(midData) }}>{dict['refresh'] || '刷新表格'}</Button>,
            <Button key="confirm" type="primary" onClick={() => setTimeout(() => {this.submit()}, 10)}>{dict['submit'] || '提交数据'}</Button>
          ]}
          destroyOnClose
        >
          <div><QuestionCircleOutlined />表格中有数据尚未提交</div>
          <div><QuestionCircleOutlined />{dict['data_not_sub'] || '表格中有数据尚未提交'}</div>
        </Modal>
      </>
    )
src/tabviews/custom/index.jsx
@@ -956,16 +956,6 @@
    if (cell.OpenType === 'excelOut') { // 导出
      cell.$menuName = item.$menuname
      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
        cell.errorType = 'error1'
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom') {
        if (item.setting.interType !== 'system') {
          cell.errorType = 'error2'
        } else if (item.type === 'balcony' || item.subtype === 'propcard') {
          cell.errorType = 'error2'
        }
      }
    } else if (cell.OpenType === 'pop' && item.$cache && item.$time && cell.modal) {
      cell.modal.$cache = item.$cache
      cell.modal.$time = item.$time
src/tabviews/custom/popview/index.jsx
@@ -667,16 +667,6 @@
    if (cell.OpenType === 'excelOut') { // 导出
      cell.$menuName = item.$menuname
      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
        cell.errorType = 'error1'
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom') {
        if (item.setting.interType !== 'system') {
          cell.errorType = 'error2'
        } else if (item.type === 'balcony' || item.subtype === 'propcard') {
          cell.errorType = 'error2'
        }
      }
    }
    if (cell.verify) {
src/tabviews/subtable/index.jsx
@@ -230,12 +230,6 @@
        if (item.OpenType === 'excelOut') { // 导出
          item.$menuName = Tab.label
          if (!item.verify || !item.verify.columns || item.verify.columns.length === 0) {
            item.errorType = 'error1'
          } else if (item.intertype === 'system' && item.verify.dataType !== 'custom' && config.setting.interType !== 'system') {
            item.errorType = 'error2'
          }
        }
        if (item.verify && item.verify.invalid === 'true') {
src/tabviews/subtabtable/index.jsx
@@ -203,12 +203,6 @@
        if (item.OpenType === 'excelOut') { // 导出
          item.$menuName = Tab.label
          if (!item.verify || !item.verify.columns || item.verify.columns.length === 0) {
            item.errorType = 'error1'
          } else if (item.intertype === 'system' && item.verify.dataType !== 'custom' && config.setting.interType !== 'system') {
            item.errorType = 'error2'
          }
        }
        if (item.verify && item.verify.invalid === 'true') {
src/tabviews/zshare/actionList/changeuserbutton/index.jsx
@@ -125,7 +125,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: window.GLOB.dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -162,7 +162,9 @@
    param[setting.primaryKey] = primaryId
    confirm({
      title: '确定要执行吗?',
      title: window.GLOB.dict['exec_sure'] || '确定要执行吗?',
      okText: window.GLOB.dict['ok'] || '确定',
      cancelText: window.GLOB.dict['cancel'] || '取消',
      onOk() {
        return new Promise(resolve => {
          Api.genericInterface(param).then(res => {
src/tabviews/zshare/actionList/excelInbutton/index.jsx
@@ -29,6 +29,7 @@
    disabled: false,
    hidden: false,
    primaryId: '',
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -108,7 +109,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { setting, BID, btn, selectedData, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -119,20 +120,14 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        duration: 5
      })
    } else if (!btn.verify || !btn.verify.sheet || !btn.verify.columns || btn.verify.columns.length === 0) {
      notification.warning({
        top: 92,
        message: 'excel导入验证信息未设置!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
    } else {
@@ -164,16 +159,18 @@
   */
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { dict } = this.state
    if (res.ErrCode === 'S' || !res.ErrCode) { // 执行成功
      notification.success({
        top: 92,
        message: res.message || '执行成功!',
        message: res.message || dict['exc_success'] || '执行成功!',
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.message || '执行成功!'
        title: res.message || dict['exc_success'] || '执行成功!',
        okText: dict['got_it'] || '知道了',
      })
    } else if (res.ErrCode === '-1') { // 完成后不提示
@@ -226,6 +223,7 @@
   */
  execError = (res = {}) => {
    const { btn } = this.props
    const { dict } = this.state
    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
      res.ErrCode = 'E'
@@ -233,23 +231,24 @@
    if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    
    this.setState({
@@ -380,8 +379,10 @@
          } else if (res.ErrCode === 'C') {
            const _this = this
            confirm({
              title: '请确认',
              title: window.GLOB.dict['exec_sure'] || '请确认',
              content: res.message,
              okText: window.GLOB.dict['ok'] || '确定',
              cancelText: window.GLOB.dict['cancel'] || '取消',
              onOk() {
                return new Promise(resolve => {
                  Api.genericInterface(unCheckParam).then(result => {
src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -23,9 +23,10 @@
  }
  state = {
    loading: false, // 导出中
    loading: false,
    hidden: false,
    disabled: false
    disabled: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -92,7 +93,7 @@
   */
  actionTrigger = (triggerId, _, type, lid) => {
    const { setting, BID, btn, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -101,19 +102,7 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        duration: 5
      })
    } else if (btn.errorType === 'error1') {
      notification.warning({
        top: 92,
        message: '请设置导出列!',
        duration: 5
      })
    } else if (btn.errorType === 'error2') {
      notification.warning({
        top: 92,
        message: '按钮需自定义导出数据源!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
    } else {
@@ -145,7 +134,7 @@
      if (!valid) {
        notification.warning({
          top: 92,
          message: '搜索条件不可为空!',
          message: window.GLOB.dict['miss_search'] || '搜索条件不可为空!',
          duration: 5
        })
        return
@@ -345,7 +334,7 @@
        Api.genericInterface(res).then(result => {
          if (result.status) {
            if (!result.data) {
              this.execError({ErrCode: 'N', message: '未获取到数据信息!'})
              this.execError({ErrCode: 'N', message: window.GLOB.dict['no_data'] || '未获取到数据信息!'})
            } else if (result.data.length >= pageSize) {
              data = data.concat(result.data)
              pageIndex++
@@ -427,7 +416,7 @@
    Api.genericInterface(param).then(result => {
      if (result.status) {
        if (!result.data) {
          this.execError({ErrCode: 'N', message: '未获取到数据信息!'})
          this.execError({ErrCode: 'N', message: window.GLOB.dict['no_data'] || '未获取到数据信息!'})
        } else if (result.data.length >= pageSize) {
          data = data.concat(result.data)
          pageIndex++
@@ -450,6 +439,7 @@
   */
  exportExcel = (data = [], ErrCode, msg, search) => {
    const { btn } = this.props
    const { dict } = this.state
    
    let imgCol = false
    let merge = false
@@ -523,7 +513,7 @@
      if (errors.length) {
        notification.error({
          top: 92,
          message: '数据中缺少字段:' + errors.join('、'),
          message: (dict['miss_field'] || '数据中缺少字段') + ':' + errors.join('、'),
          duration: 5
        })
@@ -540,7 +530,7 @@
        // eslint-disable-next-line
        let func = new Function('XLSX', 'data', 'columns', 'searches', 'callback', btn.verify.excel_func)
        func(XLSX, data, columns, search, (res) => {
          res = res || {ErrCode: ErrCode || 'S', message: msg || '导出成功!'}
          res = res || {ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'}
          this.execSuccess(res)
        })
      } else if (imgCol) {
@@ -621,7 +611,7 @@
        this.table2excel(column, table)
        this.execSuccess({ErrCode: ErrCode || 'S', message: msg || '导出成功!'})
        this.execSuccess({ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'})
      } else {
        let table = []
        let _header = []
@@ -781,7 +771,7 @@
  
        XLSX.writeFile(wb, `${btn.verify.excelName || btn.$menuName || ''}${moment().format('YYYYMMDDHHmmss')}.xlsx`)
  
        this.execSuccess({ErrCode: ErrCode || 'S', message: msg || '导出成功!'})
        this.execSuccess({ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'})
      }
    } catch (e) {
      console.warn(e)
@@ -985,7 +975,8 @@
      })
    } else if (res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.message
        title: res.message,
        okText: window.GLOB.dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === '-1') { // 完成后不提示
@@ -1038,6 +1029,7 @@
   */
  execError = (res = {}) => {
    const { btn } = this.props
    const { dict } = this.state
    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
      res.ErrCode = 'E'
@@ -1045,23 +1037,24 @@
    if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    
    this.setState({
src/tabviews/zshare/actionList/funcbutton/index.jsx
@@ -23,6 +23,7 @@
    loading: false,
    disabled: false,
    hidden: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -102,7 +103,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { btn, BID, selectedData, LID } = this.props
    const { loading } = this.state
    const { loading, dict } = this.state
    if (loading) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -112,14 +113,14 @@
    let error = ''
    if (btn.funcType === 'shareLink' && window.GLOB.systemType === 'production' && !btn.shareProUrl) {
      error = '尚未设置正式系统链接地址!'
      error = dict['no_prod_link'] || '尚未设置正式系统链接地址!'
    } else if (btn.funcType === 'refund') {
      if (data.length === 0) {
        error = '请选择行!'
        error = dict['select_row'] || '请选择行!'
      } else if (data.length !== 1) {
        error = '请选择单行数据!'
        error = dict['select_single_row'] || '请选择单行数据!'
      } else if (!data[0].$$uuid) {
        error = '未获取到订单编号!'
        error = dict['no_ordercode'] || '未获取到订单编号!'
      }
    }
@@ -160,7 +161,9 @@
      const that = this
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          that.execRefund(orderId)
        },
@@ -172,7 +175,7 @@
  execRefund = (orderId) => {
    Api.setRefund(orderId).then(res => {
      if (!res.status) {
        this.execError({ErrCode: 'E', message: '执行失败!', ...res})
        this.execError({ErrCode: 'E', message: window.GLOB.dict['exc_fail'] || '执行失败!', ...res})
      } else {
        this.execSuccess({ErrCode: 'S', ...res})
      }
@@ -243,22 +246,24 @@
        title: btn.shareTip
      })
    } else {
      message.success('已复制到剪切板。')
      message.success(window.GLOB.dict['copied'] || '已复制到剪切板。')
    }
  }
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { dict } = this.state
    if (res.ErrCode === 'S' || !res.ErrCode) { // 执行成功
      notification.success({
        top: 92,
        message: res.message || '执行成功!',
        message: res.message || dict['exc_success'] || '执行成功!',
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.message || '执行成功!'
        title: res.message || dict['exc_success'] || '执行成功!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === '-1') { // 完成后不提示
@@ -275,6 +280,7 @@
  execError = (res) => {
    const { btn } = this.props
    const { dict } = this.state
    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
      res.ErrCode = 'E'
@@ -282,23 +288,24 @@
    if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    
    this.setState({
src/tabviews/zshare/actionList/funczip/index.jsx
@@ -22,6 +22,7 @@
    loading: false,
    disabled: false,
    hidden: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -101,7 +102,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { BID, btn, selectedData, setting, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -112,21 +113,21 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return
    } else if (btn.Ot !== 'notRequired' && data.length === 0) {
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -351,43 +352,47 @@
   */
  execError = (res) => {
    const { btn } = this.props
    const { dict } = this.state
    this.setState({
      loading: false
    })
    if (res.ErrCode === '01') {
      message.error('未获取到下载文件。')
      message.error(dict['exc_fail'] || '未获取到下载文件。')
      return
    } else if (res.ErrCode === '02') {
      Modal.error({
        title: '部分文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
        title: dict['exc_fail'] || '部分文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
        okText: dict['got_it'] || '知道了'
      })
      return
    } else if (res.ErrCode === '03') {
      Modal.error({
        title: '文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
        title: dict['exc_fail'] || '文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
        okText: dict['got_it'] || '知道了'
      })
      return
    } else if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    if (btn.execError !== 'never') {
src/tabviews/zshare/actionList/index.jsx
@@ -231,7 +231,7 @@
          <div className="button-list toolbar-button">
            {this.getButtonList(actions)}
            {mores ? <Dropdown overlay={<div className="mk-button-dropdown-wrap">{this.getButtonList(mores)}</div>} trigger={['hover']}>
              <div className="mk-button-more">更多<DownOutlined/></div>
              <div className="mk-button-more">{window.GLOB.dict['more'] || '更多'}<DownOutlined/></div>
            </Dropdown> : null}
          </div>
        </Affix>
@@ -241,7 +241,7 @@
        <div className="button-list toolbar-button">
          {this.getButtonList(actions)}
          {mores ? <Dropdown overlay={<div className="mk-button-dropdown-wrap">{this.getButtonList(mores)}</div>} trigger={['hover']}>
            <div className="mk-button-more">更多<DownOutlined/></div>
            <div className="mk-button-more">{window.GLOB.dict['more'] || '更多'}<DownOutlined/></div>
          </Dropdown> : null}
        </div>
      )
src/tabviews/zshare/actionList/newpagebutton/index.jsx
@@ -114,7 +114,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: window.GLOB.dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
@@ -122,14 +122,14 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: window.GLOB.dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
    } else if (btn.pageTemplate === 'custom' && window.GLOB.systemType === 'production' && !btn.proUrl) {
      notification.warning({
        top: 92,
        message: '尚未设置正式系统链接地址!',
        message: window.GLOB.dict['no_prod_link'] || '尚未设置正式系统链接地址!',
        duration: 5
      })
      return
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -44,7 +44,8 @@
    hidden: false,
    autoMatic: false,
    check: false,
    count: 0
    count: 0,
    dict: window.GLOB.dict
  }
  moduleParams = null
@@ -206,7 +207,7 @@
   */
  actionTrigger = (triggerId, record, type, lid, callback) => {
    const { btn, selectedData, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (type === 'preButton') {
      if (btn.uuid !== triggerId) return
@@ -242,7 +243,9 @@
    } else if (btn.OpenType === 'prompt') {
      this.setState({loading: true})
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(data, resolve)
@@ -319,7 +322,7 @@
  preTrigger = (callback) => {
    const { btn, selectedData } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) {
      callback()
@@ -352,7 +355,9 @@
    } else if (btn.OpenType === 'prompt') {
      this.setState({loading: true})
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(data, resolve)
@@ -402,11 +407,12 @@
  checkBtnData = (data) => {
    const { BID, btn, setting } = this.props
    const { dict } = this.state
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return false
@@ -414,7 +420,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return false
@@ -422,42 +428,17 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return false
    } else if (btn.intertype === 'system') {
      if (data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
        notification.warning({
          top: 92,
          message: '使用创建凭证函数,需要选择行!',
          duration: 5
        })
        return false
      }
    } else if (btn.intertype === 'custom' || btn.intertype === 'outer') {
      if (btn.callbackType === 'script' && (!btn.verify || !btn.verify.cbScripts || !btn.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
        notification.warning({
          top: 92,
          message: '使用自定义脚本回调时,回调脚本不可为空!',
          duration: 5
        })
        return false
      } else if (btn.procMode === 'system' && data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
        notification.warning({
          top: 92,
          message: '使用创建凭证函数,需要选择行!',
          duration: 5
        })
        return false
      } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
        notification.warning({
          top: 92,
          message: '尚未设置正式系统接口地址!',
          duration: 5
        })
        return false
      }
    } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
      notification.warning({
        top: 92,
        message: dict['no_prod_link'] || '尚未设置正式系统接口地址!',
        duration: 5
      })
      return false
    }
    return true
@@ -1081,7 +1062,7 @@
    if (times > 50) {
      notification.warning({
        top: 92,
        message: '前置按钮加载失败!',
        message: window.GLOB.dict['pre_btn_failed'] || '前置按钮加载失败!',
        duration: 5
      })
      this.setState({loading: false})
@@ -1119,7 +1100,7 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: window.GLOB.dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      _resolve()
@@ -1846,8 +1827,10 @@
        }
        const _this = this
        confirm({
          title: '请确认',
          title: window.GLOB.dict['exec_sure'] || '请确认',
          content: msg,
          okText: window.GLOB.dict['ok'] || '确定',
          cancelText: window.GLOB.dict['cancel'] || '取消',
          onOk() {
            return new Promise(resolve => {
              Api.genericInterface(unCheckParam).then(result => {
@@ -2244,7 +2227,7 @@
   */
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { autoMatic } = this.state
    const { autoMatic, dict } = this.state
    if (btn.resetForms) {
      let data = {}
@@ -2326,18 +2309,19 @@
      if (btn.formType !== 'counter' || res.message) {
        notification.success({
          top: 92,
          message: res.message || '执行成功!',
          message: res.message || dict['exc_success'] || '执行成功!',
          duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
        })
      }
    } else if (res.ErrCode === 'Y') { // 执行成功
      let msg = res.message || '执行成功!'
      let msg = res.message || dict['exc_success'] || '执行成功!'
      if (/\n|\r/.test(msg)) {
        msg = msg.replace(/\n|\r/ig, '<br/>')
        msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
      }
      Modal.success({
        title: msg,
        okText: dict['got_it'] || '知道了',
        onOk: () => {
          this.successContinue(sign, id, res, focusField)
        }
@@ -2467,7 +2451,7 @@
        if (!url) {
          notification.warning({
            top: 92,
            message: '尚未添加正式系统链接地址!',
            message: window.GLOB.dict['no_prod_link'] || '尚未设置正式系统链接地址!',
            duration: 5
          })
          return
@@ -2986,7 +2970,7 @@
   */
  execError = (res = {}) => {
    const { btn } = this.props
    const { autoMatic } = this.state
    const { autoMatic, dict } = this.state
    if (this.preCallback) {
      this.setState({
@@ -2998,7 +2982,7 @@
    } else if (autoMatic) {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: 10
      })
@@ -3038,13 +3022,14 @@
    }
    if (res.ErrCode === 'E') {
      let msg = res.message || '执行失败!'
      let msg = res.message || dict['exc_fail'] || '执行失败!'
      if (/\n|\r/.test(msg)) {
        msg = msg.replace(/\n|\r/ig, '<br/>')
        msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
      }
      Modal.error({
        title: msg,
        okText: dict['got_it'] || '知道了',
        onOk: () => {
          this.errorContinue(sign)
        }
@@ -3053,18 +3038,18 @@
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    } else if (res.ErrCode === '-2') {
      this.setState({
        loadingNumber: '',
@@ -3297,7 +3282,7 @@
  modelconfirm = () => {
    const { BID } = this.props
    const { btnconfig, selines } = this.state
    const { btnconfig, selines, dict } = this.state
    let _this = this
    let result = []
@@ -3441,7 +3426,9 @@
      this.execSubmit(selines, () => {}, result)
    } else {
      confirm({
        title: btnconfig.setting.tipTitle || '确定要执行吗?',
        title: btnconfig.setting.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(selines, resolve, result)
@@ -3460,7 +3447,7 @@
   */
  getModels = () => {
    const { BID, btn, BData } = this.props
    const { btnconfig, visible } = this.state
    const { btnconfig, visible, dict } = this.state
    if (!btnconfig || !btnconfig.setting) return null
@@ -3496,10 +3483,10 @@
          />
          <div className="ant-drawer-footer" style={{ position: 'absolute', zIndex: 1, right: 0, bottom: 0, width: '100%', borderTop: '1px solid #e9e9e9', padding: '10px 16px', background: '#fff', textAlign: 'right'}}>
            <Button onClick={this.handleCancel} style={{ marginRight: 8 }}>
              {btnconfig.setting.formType !== 'check' ? '取消' : '关闭'}
              {btnconfig.setting.formType !== 'check' ? dict['cancel'] || '取消' : dict['close'] || '关闭'}
            </Button>
            {btnconfig.setting.formType !== 'check' ? <Button onClick={this.handleOk} loading={this.state.confirmLoading} type="primary">
              确定
              {dict['ok'] || '确定'}
            </Button> : null}
          </div>
        </Drawer>
@@ -3527,6 +3514,8 @@
          wrapClassName={'action-modal' + (btnconfig.setting.moveable === 'true' ? ' moveable-modal modal-' + btn.uuid : '')}
          visible={visible}
          width={width}
          okText={dict['ok'] || '确定'}
          cancelText={dict['cancel'] || '取消'}
          onOk={this.handleOk}
          maskStyle={btnconfig.setting.moveable === 'true' ?  {backgroundColor: 'rgba(0, 0, 0, 0.15)'} : null}
          confirmLoading={this.state.confirmLoading}
@@ -3591,7 +3580,7 @@
  changeLineCount = (count) => {
    const { btn, selectedData } = this.props
    const { disabled } = this.state
    const { disabled, dict } = this.state
    if (disabled) return
@@ -3601,7 +3590,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
@@ -3609,7 +3598,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
src/tabviews/zshare/actionList/popupbutton/index.jsx
@@ -30,6 +30,7 @@
    disabled: false,
    hidden: false,
    loading: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -143,7 +144,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { setting, BID, btn, selectedData, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -154,7 +155,7 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return
@@ -162,7 +163,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: data.length === 0 ? '请选择行!' : '请选择单行数据!',
        message: data.length === 0 ? dict['select_row'] || '请选择行!' : dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -230,7 +231,7 @@
  getPop = () => {
    const { btn } = this.props
    const { popData, primaryId, visible } = this.state
    const { popData, primaryId, visible, dict } = this.state
    let ratio = btn.ratio || 85
@@ -248,7 +249,7 @@
        visible={visible}
        onCancel={this.popclose}
        footer={[
          <Button key="close" onClick={this.popclose}>关闭</Button>
          <Button key="close" onClick={this.popclose}>{dict['close'] || '关闭'}</Button>
        ]}
        destroyOnClose
      >
@@ -292,7 +293,7 @@
          {btn.$view === 'popview' ? <PopView Tab={btn} param={{$BID: (popData ? primaryId : this.props.BID), ...(popData || this.props.BData || {})}} /> : null}
          <div className="close-drawer">
            <Button onClick={this.popclose}>
              关闭
              {dict['close'] || '关闭'}
            </Button>
          </div>
        </Drawer>
src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -37,7 +37,8 @@
    loading: false,
    disabled: false,
    hidden: false,
    autoMatic: false
    autoMatic: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -132,7 +133,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { BID, btn, selectedData, setting, LID } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -141,7 +142,7 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return
@@ -156,7 +157,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
@@ -164,21 +165,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        duration: 5
      })
      return
    } else if (!btn.verify || !btn.verify.printMode) {
      notification.warning({
        top: 92,
        message: '请完善打印验证信息!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && (!btn.verify.setting || btn.verify.columns.length === 0)) {
      notification.warning({
        top: 92,
        message: '自定义打印数据请设置数据源!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -203,7 +190,9 @@
    } else if (btn.execMode === 'prompt') {
      this.setState({ loading: true })
      confirm({
        title: '确定要执行吗?',
        title: dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          _this.triggerPrint(data)
        },
@@ -507,7 +496,7 @@
      if (list.length === 0) {
        notification.warning({
          top: 92,
          message: '未获取到打印数据!',
          message: window.GLOB.dict['no_data'] || '未获取到打印数据!',
          duration: 5
        })
        return false
@@ -534,7 +523,7 @@
      if (!result.ConfigParam) {
        notification.warning({
          top: 92,
          message: '未获取到打印模板信息!',
          message: window.GLOB.dict['no_print_temp'] || '未获取到打印模板信息!',
          duration: 5
        })
        this.setState({ loading: false })
@@ -785,7 +774,7 @@
      notification.warning({
        top: 92,
        message: '自定义函数执行错误!',
        message: window.GLOB.dict['func_error'] || '自定义函数执行错误!',
        duration: 5
      })
    }
@@ -1345,7 +1334,7 @@
    let imgs = []
    if (!res.ConfigParam) {
      error = '未获取到打印模板信息!'
      error = window.GLOB.dict['no_print_temp'] || '未获取到打印模板信息!'
    } else {
      try {
        configParam = JSON.parse(window.decodeURIComponent(window.atob(res.ConfigParam)))
@@ -1502,7 +1491,7 @@
    if (list.length === 0) {
      notification.warning({
        top: 92,
        message: '未获取到打印数据!',
        message: window.GLOB.dict['no_data'] || '未获取到打印数据!',
        duration: 5
      })
      this.setState({ loading: false })
@@ -1621,7 +1610,7 @@
    Api.postekPrint(param).then(res => {
      if (res.retval === '0') {
        if (params.length === 0) {
          this.execSuccess({ ErrCode: 'S', message: '打印请求已发出。', status: true })
          this.execSuccess({ ErrCode: 'S', message: window.GLOB.dict['print_out'] || '打印请求已发出。', status: true })
        } else {
          setTimeout(() => {
            this.loopRFIDPrint(params)
@@ -1639,6 +1628,8 @@
  execPrint = (list, template) => {
    const { btn } = this.props
    const { dict } = this.state
    let _errors = []
    let defaultPrinter = btn.verify.defaultPrinter || 'lackprinter'
@@ -1739,13 +1730,13 @@
      if (btn.verify.emptyTip === 'false') {
        this.execSuccess({
          ErrCode: '-1',
          message: '未获取到打印信息!',
          message: dict['no_data'] || '未获取到打印信息!',
          status: true
        })
      } else {
        this.execError({
          ErrCode: 'N',
          message: '未获取到打印信息!',
          message: dict['no_data'] || '未获取到打印信息!',
          status: false
        })
      }
@@ -1759,7 +1750,7 @@
          lackerror.push(`数据中未获取到模板(${err.title})${err.lacks.join('、')} 字段`)
        }
        if (err.emptys.length > 0) {
          emptyerror.push(`数据中模板(${err.title}) ${err.emptys.join('、')} 字段不可为空`)
          emptyerror.push(dict['not_empty'] ? `${err.title}: ${err.emptys.join('、')} ${dict['not_empty']}` : `数据中模板(${err.title}) ${err.emptys.join('、')} 字段不可为空`)
        }
      })
@@ -1783,7 +1774,7 @@
    if (printerList.length === 0) {
      this.execSuccess({
        ErrCode: '-1',
        message: '未获取到打印信息!',
        message: dict['no_data'] || '未获取到打印信息!',
        status: true
      })
      return
@@ -1795,7 +1786,7 @@
      this.syncMessageSend(printerList, () => {
        this.execSuccess({
          ErrCode: 'S',
          message: '打印请求已发出。',
          message: dict['print_out'] || '打印请求已发出。',
          status: true
        })
      })
@@ -1806,7 +1797,7 @@
      this.syncMessageSend(printerList, () => {
        this.execSuccess({
          ErrCode: 'S',
          message: '打印请求已发出。',
          message: dict['print_out'] || '打印请求已发出。',
          status: true
        })
      })
@@ -1857,7 +1848,7 @@
    socket.onerror = () => {
      this.execError({
        ErrCode: 'N',
        message: '无法连接到:' + btn.verify.linkUrl,
        message: (dict['un_connect'] || '无法连接到') + ':' + btn.verify.linkUrl,
        status: false
      })
    }
@@ -1893,17 +1884,18 @@
   */
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { autoMatic, btnconfig } = this.state
    const { autoMatic, btnconfig, dict } = this.state
    if ((res.ErrCode === 'S' || !res.ErrCode) || autoMatic) { // 执行成功
      notification.success({
        top: 92,
        message: res.message || '执行成功!',
        message: res.message || dict['exc_success'] || '执行成功!',
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.message || '执行成功!'
        title: res.message || dict['exc_success'] || '执行成功!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === '-1') { // 完成后不提示
@@ -1942,7 +1934,7 @@
   */
  execError = (res) => {
    const { btn } = this.props
    const { btnconfig, autoMatic } = this.state
    const { btnconfig, autoMatic, dict } = this.state
    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
      res.ErrCode = 'E'
@@ -1950,23 +1942,24 @@
    if (res.ErrCode === 'E' && !autoMatic) {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N' || autoMatic) {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    }
    
    this.setState({
@@ -2114,7 +2107,7 @@
  }
  modelconfirm = () => {
    const { btnconfig, selines } = this.state
    const { btnconfig, selines, dict } = this.state
    let _this = this
    let result = []
    let _data = {}
@@ -2257,7 +2250,9 @@
      this.execSubmit(selines, () => {}, result)
    } else {
      confirm({
        title: '确定要执行吗?',
        title: dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          _this.triggerPrint(selines, result)
        },
@@ -2273,7 +2268,7 @@
   */
  getModels = () => {
    const { BID, btn } = this.props
    const { btnconfig } = this.state
    const { btnconfig, dict } = this.state
    if (!this.state.visible || !btnconfig || !btnconfig.setting) return null
@@ -2307,6 +2302,8 @@
        visible={this.state.visible}
        confirmLoading={this.state.confirmLoading}
        width={width}
        okText={dict['ok'] || '确定'}
        cancelText={dict['cancel'] || '取消'}
        maskStyle={btnconfig.setting.moveable === 'true' ?  {backgroundColor: 'rgba(0, 0, 0, 0.15)'} : null}
        onOk={this.handleOk}
        onCancel={this.handleCancel}
src/tabviews/zshare/actionList/tabbutton/index.jsx
@@ -22,7 +22,8 @@
  state = {
    disabled: false,
    hidden: false,
    primaryId: ''
    primaryId: '',
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -102,7 +103,7 @@
   */
  actionTrigger = (triggerId, record, type, lid) => {
    const { btn, selectedData, BID, LID } = this.props
    const { disabled } = this.state
    const { disabled, dict } = this.state
    if (disabled || btn.multiMenus) return
    if (triggerId && btn.uuid !== triggerId) return
@@ -114,7 +115,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return false
@@ -122,7 +123,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -187,7 +188,7 @@
      if (!menu) {
        notification.warning({
          top: 92,
          message: '菜单已删除或没有访问权限!',
          message: dict['no_perm'] || '菜单已删除或没有访问权限!',
          duration: 5
        })
        return
@@ -219,6 +220,7 @@
  triggerMenu = (tab) => {
    const { btn, selectedData, BID } = this.props
    const { dict } = this.state
    let data = selectedData || []
@@ -226,7 +228,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return false
@@ -234,7 +236,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -283,7 +285,7 @@
    if (!menu) {
      notification.warning({
        top: 92,
        message: '菜单已删除或没有访问权限!',
        message: dict['no_perm'] || '菜单已删除或没有访问权限!',
        duration: 5
      })
      return
src/tabviews/zshare/mutilform/index.jsx
@@ -6,7 +6,6 @@
import moment from 'moment'
import Api from '@/api'
import { formRule } from '@/utils/option.js'
import Utils from '@/utils/utils.js'
import asyncComponent from '@/utils/asyncComponent'
import MKEmitter from '@/utils/events.js'
@@ -48,7 +47,8 @@
    timestamp: '',
    n_id: '',
    focusId: '',
    reFocusId: ''
    reFocusId: '',
    dict: window.GLOB.dict
  }
  record = {}
@@ -56,6 +56,7 @@
  componentDidMount () {
    const { action, unload } = this.props
    const { dict } = this.state
    let data = {}
    let BData = {}
@@ -315,14 +316,14 @@
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
              callback(dict['single_quot'] || '不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
@@ -334,7 +335,7 @@
        if (!item.lenControl || item.lenControl === 'limit') {
          item.rules.push({
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
            message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
          })
        }
@@ -346,7 +347,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.numbermsg
              message: item.regularText || dict['enter_num'] || '请输入数字!'
            })
          } else if (item.regular === 'letter') {
            let reg = /^[a-zA-Z]*$/
@@ -355,7 +356,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.lettermsg
              message: item.regularText || dict['enter_letter'] || '请输入字母!'
            })
          } else if (item.regular === 'letter_number') {
            let reg = /^[a-zA-Z0-9]*$/
@@ -364,7 +365,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字或字母'
              message: item.regularText || dict['enter_num_letter'] || '请输入数字或字母'
            })
          } else if (item.regular === 'letter&number') {
            let reg = /^[a-zA-Z0-9@_.]*$/
@@ -373,24 +374,24 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字、字母以及@_.'
              message: item.regularText || dict['enter_num_letter_char'] || '请输入数字、字母以及@_.'
            })
          } else if (item.regular === 'phone') {
            item.rules.push({
              pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
              message: item.regularText || '请正确输入手机号'
              message: item.regularText || dict['phone_error'] || '请正确输入手机号'
            })
          } else if (item.regular === 'email') {
            item.rules.push({
              pattern: /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
              message: item.regularText || '请正确输入邮箱地址'
              message: item.regularText || dict['email_error'] || '请正确输入邮箱地址'
            })
          }
        }
      } else if (item.type === 'number') {
        item.rules = [{
          required: true,
          message: item.label + '不可为空!'
          message: item.label + (dict['not_empty'] || '不可为空!')
        }]
        if (typeof(item.min) === 'number' || typeof(item.max) === 'number' || item.notZero === 'true') {
@@ -399,7 +400,7 @@
              if (isNaN(value)) {
                callback()
              } else if (item.notZero === 'true' && value === 0) {
                callback(item.label + '不可为0')
                callback(item.label + (dict['not_zero'] || '不可为0'))
              } else if (typeof(item.min) === 'number' && value < item.min) {
                if (item.min < 1e-6) {
                  if (item.min === 1e-6) {
@@ -418,10 +419,10 @@
                    callback(item.label + '最小值为 ' + item.min)
                  }
                } else {
                  callback(item.label + '最小值为 ' + item.min)
                  callback(item.label + (dict['less_limit'] || '最小值为 ') + item.min)
                }
              } else if (typeof(item.max) === 'number' && value > item.max) {
                callback(item.label + '最大值为 ' + item.max)
                callback(item.label + (dict['max_limit'] || '最大值为 ') + item.max)
              } else {
                callback()
              }
@@ -432,14 +433,14 @@
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
              callback(dict['single_quot'] || '不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
@@ -448,38 +449,38 @@
          }
        }, {
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
          message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
        })
      } else if (item.type === 'brafteditor') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
          message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
        })
      } else if (item.type === 'linkMain' || item.type === 'vercode') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
      } else {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: '请选择' + item.label + '!'
            message: (dict['select_tip'] || '请选择') + item.label + '!'
          })
        }
        if (['cascader', 'checkbox', 'checkcard', 'fileupload', 'multiselect'].includes(item.type) && item.fieldlength) {
          item.rules.push({
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
            message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
          })
        }
      }
src/tabviews/zshare/topSearch/index.jsx
@@ -730,7 +730,7 @@
      const _rules = [
        {
          required: item.required,
          message: item.label + '不可为空!'
          message: item.label + (window.GLOB.dict['not_empty'] || '不可为空!')
        }
      ]
@@ -791,13 +791,13 @@
            wrapperCol={setting.wrapperCol}
          >
            {setting.show ? <Button style={style} type="primary" onClick={this.handleSubmit}>
              搜索
              {window.GLOB.dict['search'] || '搜索'}
            </Button> : null}
            {setting.show ? <Button style={{ marginLeft: 8, ...style }} onClick={this.handleReset}>
              重置
              {window.GLOB.dict['reset'] || '重置'}
            </Button> : null}
            {setting.showAdv ? <Button className={visible ? 'visible' : ''} type="link" onClick={this.handleAdvance}>
              高级{setting.advanceType === 'pulldown' ? <DownOutlined /> : null}
              {window.GLOB.dict['senior'] || '高级'}{setting.advanceType === 'pulldown' ? <DownOutlined /> : null}
            </Button> : null}
          </Form.Item>
        </Col>
@@ -807,7 +807,7 @@
        <Col className="mk-search-col search-button" key="actions">
          <Form.Item>
            <Button type="primary" onClick={this.handleSubmit}>
              搜索
              {window.GLOB.dict['search'] || '搜索'}
            </Button>
          </Form.Item>
        </Col>
@@ -893,7 +893,7 @@
      
            notification.warning({
              top: 92,
              message: '请输入' + labels.join('、') + ' !',
              message: (window.GLOB.dict['input_tip'] || '请输入') + labels.join('、') + ' !',
              duration: 3
            })
            return
@@ -1141,7 +1141,7 @@
          </Row> : null}
        </Form>
        {setting.advanceType === 'modal' ? <Modal
          title="高级搜索"
          title={window.GLOB.dict['adv_search'] || '高级搜索'}
          maskClosable={false}
          visible={visible}
          width={setting.advWidth}
@@ -1157,7 +1157,7 @@
          />
        </Modal> : null}
        {setting.advanceType === 'drawer' ? <Drawer
          title="高级搜索"
          title={window.GLOB.dict['adv_search'] || '高级搜索'}
          className="mk-search-drawer"
          width={setting.advWidth}
          height={setting.advHeight}
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
@@ -232,11 +232,25 @@
    let _value = ''
    if (value === 'default') {
      let fields = usefulfields.filter(item => item.import !== 'false')
      fields = fields.map(col => col.Column).join(',')
      let fields = []
      let decls = []
      usefulfields.forEach(col => {
        if (col.import === 'false') return
        if (col.type === 'date') {
          decls.push(`${col.Column} Nvarchar(50)`)
        } else {
          decls.push(`${col.Column} ${col.type}`)
        }
        fields.push(col.Column)
      })
      decls = decls.join(',')
      fields = fields.join(',')
      
      if (fields) {
        fields = fields + ','
        decls = decls + ','
      }
      let database = btn.sheet.match(/(.*)\.(.*)\.|@db@/ig) || ''
@@ -244,7 +258,7 @@
      database = database ? (database[0] || '') : ''
      _value = `Insert into ${database}${sheet} (${fields}createuserid,createuser,createstaff,bid)\nSelect ${fields}@userid@,@username,@fullname,@BID@ From #${sheet}`
      _value = `/* create table #${sheet} (${decls}jskey nvarchar(50),BID nvarchar(50) ) */\nInsert into ${database}${sheet} (${fields}createuserid,createuser,createstaff,bid)\nSelect ${fields}@userid@,@username,@fullname,@BID@ From #${sheet}`
    } else if (value === 'flowSql') {
      let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
src/templates/sharecomponent/searchcomponent/searchform/index.jsx
@@ -234,8 +234,11 @@
        if (this.record.selectStyle === 'custom') {
          shows.push('backgroundColor')
        }
        if (this.record.multiple === 'dropdown' && this.record.resourceType === '1') {
          shows.push('mark', 'parentField')
        if (this.record.multiple === 'dropdown') {
          shows.push('mark')
          if (this.record.resourceType === '1') {
            shows.push('parentField')
          }
        }
      }
      shows.push('linkField')
src/utils/utils-custom.js
@@ -1799,23 +1799,31 @@
      if (!cell.modal || cell.modal.fields.length === 0) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
      }
    } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
      errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
    } else if (cell.OpenType === 'excelIn') {
      if (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
      }
    } else if (cell.OpenType === 'excelOut') {
      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom' && card.$c_ds && columns.length > 0) {
        let cols = []
        cell.verify.columns.forEach(col => {
          if (col.output === 'false' || col.Column === '$Index') return
          if (!columns.includes(col.Column)) {
            cols.push(col.Column)
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom') {
        if (!card.setting || card.setting.interType !== 'system') {
          errors.push({ level: 0, detail: `按钮“${cell.label}”需自定义导出数据源!`})
        } else if (card.type === 'balcony' || card.subtype === 'propcard') {
          errors.push({ level: 0, detail: `按钮“${cell.label}”需自定义导出数据源!`})
        } else if (card.$c_ds && columns.length > 0) {
          let cols = []
          cell.verify.columns.forEach(col => {
            if (col.output === 'false' || col.Column === '$Index') return
            if (!columns.includes(col.Column)) {
              cols.push(col.Column)
            }
          })
          if (cols.length) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列(${cols.join('、')})在字段集中不存在!`})
          }
        })
        if (cols.length) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列(${cols.join('、')})在字段集中不存在!`})
        }
      }
      }
    }
    if (['pop', 'prompt', 'exec'].includes(cell.OpenType) && cell.verify && !cell.output) {
@@ -1823,6 +1831,32 @@
        errors.push({ level: 0, detail: `按钮“${cell.label}”未设置返回值短信发送无效!`})
      } else if (cell.verify.emailEnable === 'true') {
        errors.push({ level: 0, detail: `按钮“${cell.label}”未设置返回值邮件发送无效!`})
      }
    }
    if (['exec', 'prompt', 'pop', 'form', 'formSubmit'].includes(cell.OpenType)) {
      if (cell.OpenType === 'form' && cell.formType === 'count_line') return
      if (cell.intertype === 'system') {
        if (cell.Ot === 'notRequired' && cell.verify && cell.verify.voucher && cell.verify.voucher.enabled) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了创建凭证函数,需要选择行!`})
        }
      } else if (cell.intertype === 'custom' || cell.intertype === 'outer') {
        if (cell.callbackType === 'script' && (!cell.verify || !cell.verify.cbScripts || !cell.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了自定义脚本回调,回调脚本不可为空!`})
        } else if (cell.procMode === 'system' && cell.Ot === 'notRequired' && cell.verify && cell.verify.voucher && cell.verify.voucher.enabled) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了创建凭证函数,需要选择行!`})
        }
      }
    } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print') {
      if (!cell.verify || !cell.verify.printMode) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”请完善验证信息!`})
      } else if (cell.intertype === 'system' && cell.verify.dataType === 'custom' && (!cell.verify.setting || cell.verify.columns.length === 0)) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”使用了自定义打印数据,请设置数据源!`})
      }
    } else if (cell.OpenType === 'innerpage' || cell.OpenType === 'outerpage') {
      if (!cell.pageTemplate) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”页面类型设置错误!`})
      }
    }
  }
@@ -2601,13 +2635,13 @@
          if (item.wrap.click === 'menu') {
            resetMenu(item.wrap)
          } else if (item.wrap.click === 'menus') {
            resetMenus(config.wrap)
            resetMenus(item.wrap)
          }
        } else if (item.plot && (item.plot.click === 'menu' || item.plot.click === 'menus')) {
          if (item.plot.click === 'menu') {
            resetMenu(item.plot)
          } else if (item.plot.click === 'menus') {
            resetMenus(config.plot)
            resetMenus(item.plot)
          }
        }
        if (item.setting && (!item.wrap || !item.wrap.datatype || item.wrap.datatype === 'dynamic')) {
src/views/appcheck/index.jsx
@@ -1,7 +1,6 @@
import React, {Component} from 'react'
import { Spin, notification, Table, ConfigProvider, Typography, Row, Col, Tooltip } from 'antd'
import { Spin, notification, Table, Typography, Row, Col, Tooltip } from 'antd'
import { QuestionCircleOutlined } from '@ant-design/icons'
import zhCN from 'antd/es/locale/zh_CN'
import Api from '@/api'
import { langs } from '@/store/options.js'
@@ -138,116 +137,114 @@
    return (
      <div className="mk-app-check">
        <ConfigProvider locale={zhCN}>
          <Header view="manage" />
          {loading ?
            <div className="loading-mask">
              <Spin size="large" />
            </div> : null
          }
          <div className="view-wrap">
            <div className="left-view">
              <div className="app-table">
                <Table
                  rowKey="ID"
                  columns={columns}
                  dataSource={applist}
                  pagination={false}
                  rowSelection={{ type: 'radio', selectedRowKeys: selectApp ? [selectApp.ID] : [], onChange: this.onSelectChange }}
                  onRow={(record) => ({ onClick: () => this.setState({ selectApp: record })})}
                />
              </div>
            </div>
            <div className="right-view">
              {selectApp ? <div className="app-title">{selectApp.remark}</div> : null}
              {selectApp && selectApp.sublist.map((item, index) => {
                let css = skinStyle[item.css] ? skinStyle[item.css].name : ''
                let color = skinStyle[item.css] ? skinStyle[item.css].color : '#e8e8e8'
                let binding = ''
                if (item.user_binding) {
                  if (item.user_binding.indexOf('uname_pwd') > -1) {
                    binding = '用户名'
                  }
                  if (item.user_binding.indexOf('sms_vcode') > -1) {
                    binding = binding ? binding + ',手机号' : '手机号'
                  }
                }
                return (
                  <div className="sub-app" key={index} style={{borderColor: color}}>
                    <Row>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">应用类型:</div>
                          <div className="content" style={{fontSize: '18px', fontWeight: 600}}>{item.typename}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">语言:</div>
                          <div className="content" style={{textDecoration: 'underline'}}>{langs[item.lang]}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">权限管理:</div>
                          <div className="content">{item.role_type === 'false' ? '不启用' : '启用'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">皮肤:</div>
                          <div className="content" style={{color: color}}>{css}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          {binding ? <div className="label">
                            <Tooltip placement="topLeft" title="微信公众号登录时,系统用户与微信用户的绑定方式。">
                              <QuestionCircleOutlined className="mk-form-tip" />
                              用户绑定:
                            </Tooltip>
                          </div> : null}
                          <div className="content">{binding}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">标题:</div>
                          <div className="content">{item.title || '无'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">网站头像:</div>
                          <div className="content">{item.favicon ? <img style={{width: '18px', height: '18px'}} src={item.favicon} alt="" /> : '无'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">版权:</div>
                          <div className="content">{item.copyright || '无'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">LOGO:</div>
                          <div className="content">{item.logo ? <img style={{height: '18px'}} src={item.logo} alt="" /> : '无'}</div>
                        </div>
                      </Col>
                    </Row>
                    <div className="action">
                      <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
                    </div>
                  </div>
                )
              })}
        <Header view="manage" />
        {loading ?
          <div className="loading-mask">
            <Spin size="large" />
          </div> : null
        }
        <div className="view-wrap">
          <div className="left-view">
            <div className="app-table">
              <Table
                rowKey="ID"
                columns={columns}
                dataSource={applist}
                pagination={false}
                rowSelection={{ type: 'radio', selectedRowKeys: selectApp ? [selectApp.ID] : [], onChange: this.onSelectChange }}
                onRow={(record) => ({ onClick: () => this.setState({ selectApp: record })})}
              />
            </div>
          </div>
        </ConfigProvider>
          <div className="right-view">
            {selectApp ? <div className="app-title">{selectApp.remark}</div> : null}
            {selectApp && selectApp.sublist.map((item, index) => {
              let css = skinStyle[item.css] ? skinStyle[item.css].name : ''
              let color = skinStyle[item.css] ? skinStyle[item.css].color : '#e8e8e8'
              let binding = ''
              if (item.user_binding) {
                if (item.user_binding.indexOf('uname_pwd') > -1) {
                  binding = '用户名'
                }
                if (item.user_binding.indexOf('sms_vcode') > -1) {
                  binding = binding ? binding + ',手机号' : '手机号'
                }
              }
              return (
                <div className="sub-app" key={index} style={{borderColor: color}}>
                  <Row>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">应用类型:</div>
                        <div className="content" style={{fontSize: '18px', fontWeight: 600}}>{item.typename}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">语言:</div>
                        <div className="content" style={{textDecoration: 'underline'}}>{langs[item.lang]}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">权限管理:</div>
                        <div className="content">{item.role_type === 'false' ? '不启用' : '启用'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">皮肤:</div>
                        <div className="content" style={{color: color}}>{css}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        {binding ? <div className="label">
                          <Tooltip placement="topLeft" title="微信公众号登录时,系统用户与微信用户的绑定方式。">
                            <QuestionCircleOutlined className="mk-form-tip" />
                            用户绑定:
                          </Tooltip>
                        </div> : null}
                        <div className="content">{binding}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">标题:</div>
                        <div className="content">{item.title || '无'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">网站头像:</div>
                        <div className="content">{item.favicon ? <img style={{width: '18px', height: '18px'}} src={item.favicon} alt="" /> : '无'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">版权:</div>
                        <div className="content">{item.copyright || '无'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">LOGO:</div>
                        <div className="content">{item.logo ? <img style={{height: '18px'}} src={item.logo} alt="" /> : '无'}</div>
                      </div>
                    </Col>
                  </Row>
                  <div className="action">
                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
                  </div>
                </div>
              )
            })}
          </div>
        </div>
      </div>
    )
  }
src/views/appmanage/index.jsx
@@ -1,10 +1,9 @@
import React, {Component} from 'react'
import { fromJS } from 'immutable'
import { Spin, notification, Input, Button, Table, Modal, ConfigProvider, Typography, Row, Col, Tooltip } from 'antd'
import { Spin, notification, Input, Button, Table, Modal, Typography, Row, Col, Tooltip } from 'antd'
import { QuestionCircleOutlined } from '@ant-design/icons'
import moment from 'moment'
import md5 from 'md5'
import zhCN from 'antd/es/locale/zh_CN'
import Api from '@/api'
import Utils from '@/utils/utils.js'
@@ -1084,222 +1083,220 @@
    return (
      <div className="mk-app-manage">
        <ConfigProvider locale={zhCN}>
          <Header view="manage" />
          {loading ?
            <div className="loading-mask">
              <Spin size="large" />
            </div> : null
          }
          <div className="view-wrap">
            <div className="left-view">
              <div className="app-table">
                <div className="app-action">
                  <Button className="mk-green" onClick={() => this.setState({ visible: 'plus' })}>添加应用</Button>
                </div>
                <Table
                  rowKey="ID"
                  columns={columns}
                  dataSource={applist}
                  pagination={false}
                  rowSelection={{ type: 'radio', selectedRowKeys: selectApp ? [selectApp.ID] : [], onChange: this.onSelectChange }}
                  onRow={(record) => ({ onClick: () => this.setState({ selectApp: record })})}
                />
        <Header view="manage" />
        {loading ?
          <div className="loading-mask">
            <Spin size="large" />
          </div> : null
        }
        <div className="view-wrap">
          <div className="left-view">
            <div className="app-table">
              <div className="app-action">
                <Button className="mk-green" onClick={() => this.setState({ visible: 'plus' })}>添加应用</Button>
              </div>
              <div className={'trans-table' + (this.state.transTotal <= 10 ? ' no-footer' : '')}>
                <div className="app-action">
                  <Button className="mk-green" onClick={() => this.setState({ transVisible: 'plus' })}>添加传输号</Button>
                  <Search placeholder="综合搜索" onSearch={value => this.tranSearch(value)} enterButton />
                </div>
                <Table
                  rowKey="ID"
                  columns={transcolumns}
                  dataSource={translist}
                  pagination={{
                    current: this.state.transIndex,
                    pageSize: 10,
                    total: this.state.transTotal || 0,
                    showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
                  }}
                  rowSelection={{ type: 'radio', selectedRowKeys: selectTran ? [selectTran.ID] : [], onChange: this.onTransChange }}
                  onRow={(record) => ({ onClick: () => {
                    if (this.forbid) {
                      this.forbid = false
                      return
                    }
                    this.onTransSelect(record)
                  }})}
                  onChange={this.changeTable}
                />
              <Table
                rowKey="ID"
                columns={columns}
                dataSource={applist}
                pagination={false}
                rowSelection={{ type: 'radio', selectedRowKeys: selectApp ? [selectApp.ID] : [], onChange: this.onSelectChange }}
                onRow={(record) => ({ onClick: () => this.setState({ selectApp: record })})}
              />
            </div>
            <div className={'trans-table' + (this.state.transTotal <= 10 ? ' no-footer' : '')}>
              <div className="app-action">
                <Button className="mk-green" onClick={() => this.setState({ transVisible: 'plus' })}>添加传输号</Button>
                <Search placeholder="综合搜索" onSearch={value => this.tranSearch(value)} enterButton />
              </div>
              {selectTran ? <div className="script-table">
                <div className="app-action">
                  <Button className="mk-green" onClick={() => this.setState({ scriptVisible: true })}>添加脚本</Button>
                  <Button className="mk-danger" onClick={this.deleteScripts} style={{marginLeft: '15px'}}>删除</Button>
                  <Search placeholder="综合搜索" defaultValue={this.state.scriptSearchKey} onSearch={value => this.scriptSearch(value)} enterButton />
                </div>
                <Table
                  rowKey="ID"
                  columns={scriptcolumns}
                  dataSource={scriptlist}
                  pagination={{
                    current: this.state.scriptIndex,
                    pageSize: 10,
                    total: this.state.scriptTotal || 0,
                    showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
                  }}
                  rowSelection={{ type: 'checkbox', selectedRowKeys: selectScriptKeys, onChange: this.onScriptChange }}
                  onRow={(record) => ({ onClick: () => this.onScriptSelect(record)})}
                  onChange={this.changeScriptTable}
                />
              </div> : null}
              <Table
                rowKey="ID"
                columns={transcolumns}
                dataSource={translist}
                pagination={{
                  current: this.state.transIndex,
                  pageSize: 10,
                  total: this.state.transTotal || 0,
                  showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
                }}
                rowSelection={{ type: 'radio', selectedRowKeys: selectTran ? [selectTran.ID] : [], onChange: this.onTransChange }}
                onRow={(record) => ({ onClick: () => {
                  if (this.forbid) {
                    this.forbid = false
                    return
                  }
                  this.onTransSelect(record)
                }})}
                onChange={this.changeTable}
              />
            </div>
            <div className="right-view">
              {selectApp ? <div className="app-title">{selectApp.remark}</div> : null}
              {selectApp && selectApp.sublist.map((item, index) => {
                let css = skinStyle[item.css] ? skinStyle[item.css].name : ''
                let color = skinStyle[item.css] ? skinStyle[item.css].color : '#e8e8e8'
                let binding = ''
                if (item.user_binding === 'true') {
                  binding = '用户绑定'
                }
                if (item.share === 'true') {
                  binding = binding ? binding + '、分享' : '分享'
                }
                return (
                  <div className="sub-app" key={index} style={{borderColor: color}}>
                    <Row>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">应用类型:</div>
                          <div className="content" style={{fontSize: '18px', fontWeight: 600}}>{item.typename}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">语言:</div>
                          <div className="content" style={{textDecoration: 'underline'}}>{langs[item.lang]}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">权限管理:</div>
                          <div className="content">{item.role_type === 'false' ? '不启用' : '启用'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          {/* <div className="label">皮肤:</div>
                          <div className="content" style={{color: color}}>{css}</div> */}
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">皮肤:</div>
                          <div className="content" style={{color: color}}>{css}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          {/* {binding ? <div className="label">
                            <Tooltip placement="topLeft" title="微信公众号登录时,系统用户与微信用户的绑定方式。">
                              <QuestionCircleOutlined className="mk-form-tip" />
                              用户绑定:
                            </Tooltip>
                          </div> : null} */}
                          {binding ? <div className="label">
                            <Tooltip placement="topLeft" title="微信公众号或小程序中,绑定系统用户、自定义分享等功能。">
                              <QuestionCircleOutlined className="mk-form-tip" />
                              扩展功能:
                            </Tooltip>
                          </div> : null}
                          <div className="content">{binding}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">标题:</div>
                          <div className="content">{item.title || '无'}</div>
                        </div>
                      </Col>
                      <Col span={12}>
                        <div className="app-item">
                          <div className="label">网站头像:</div>
                          <div className="content">{item.favicon ? <img style={{width: '18px', height: '18px', borderRadius: '4px'}} src={item.favicon} alt="" /> : '无'}</div>
                        </div>
                      </Col>
                    </Row>
                    <div className="action">
                      {item.lang !== 'zh-CN' ? <TransMenu app={item} supApp={selectApp} /> : null}
                      <Button type="link" onClick={() => this.jumpMenu(item)} style={{color: 'rgba(30, 228, 224, 1)'}}>菜单&权限</Button>
                      <Button type="link" onClick={() => this.setState({ selectSubApp: item, subVisible: 'edit' })} style={{color: '#8E44AD'}}>修改</Button>
                      <Button type="link" onClick={() => this.deleteSubApp(item)} style={{color: '#ff4d4f'}}>删除</Button>
                      <Button type="link" onClick={() => this.jumpApp(item)}>编辑应用</Button>
                      <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
                    </div>
                  </div>
                )
              })}
            </div>
            {selectTran ? <div className="script-table">
              <div className="app-action">
                <Button className="mk-green" onClick={() => this.setState({ scriptVisible: true })}>添加脚本</Button>
                <Button className="mk-danger" onClick={this.deleteScripts} style={{marginLeft: '15px'}}>删除</Button>
                <Search placeholder="综合搜索" defaultValue={this.state.scriptSearchKey} onSearch={value => this.scriptSearch(value)} enterButton />
              </div>
              <Table
                rowKey="ID"
                columns={scriptcolumns}
                dataSource={scriptlist}
                pagination={{
                  current: this.state.scriptIndex,
                  pageSize: 10,
                  total: this.state.scriptTotal || 0,
                  showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`
                }}
                rowSelection={{ type: 'checkbox', selectedRowKeys: selectScriptKeys, onChange: this.onScriptChange }}
                onRow={(record) => ({ onClick: () => this.onScriptSelect(record)})}
                onChange={this.changeScriptTable}
              />
            </div> : null}
          </div>
          <Modal
            title={'编辑应用'}
            width={'600px'}
            maskClosable={false}
            visible={visible !== false}
            onCancel={() => this.setState({visible: false, confirmloading: false})}
            confirmLoading={this.state.confirmloading}
            onOk={this.submitCard}
            cancelText="取消"
            okText="确定"
            destroyOnClose
          >
            <MutilForm type={visible} card={visible === 'edit' ? selectApp : ''} wrappedComponentRef={(inst) => this.mobcardRef = inst} inputSubmit={this.submitCard} />
          </Modal>
          <Modal
            title={transVisible === 'plus' ? '添加传输号' : '编辑传输号'}
            width={'600px'}
            maskClosable={false}
            visible={transVisible !== false}
            onCancel={() => this.setState({transVisible: false, confirmloading: false})}
            confirmLoading={this.state.confirmloading}
            onOk={this.submitTrans}
            cancelText="取消"
            okText="确定"
            destroyOnClose
          >
            <TransForm type={transVisible} card={transVisible === 'edit' ? this.state.editTran : ''} wrappedComponentRef={(inst) => this.transRef = inst} inputSubmit={this.submitTrans} />
          </Modal>
          <Modal
            title={'添加脚本'}
            width={900}
            maskClosable={false}
            visible={scriptVisible}
            onCancel={() => this.setState({scriptVisible: false, confirmloading: false})}
            confirmLoading={this.state.confirmloading}
            onOk={this.submitScript}
            cancelText="取消"
            okText="确定"
            destroyOnClose
          >
            <ScriptForm applist={applist} wrappedComponentRef={(inst) => this.scriptRef = inst} inputSubmit={this.submitScript} />
          </Modal>
          <Modal
            title={subVisible === 'plus' ? '添加子应用' : '编辑子应用'}
            width={'850px'}
            maskClosable={false}
            visible={subVisible !== false}
            onCancel={() => this.setState({subVisible: false, confirmloading: false})}
            confirmLoading={this.state.confirmloading}
            onOk={this.submitSubCard}
            cancelText="取消"
            okText="确定"
            destroyOnClose
          >
            <SubMutilForm type={subVisible} card={subVisible === 'edit' ? selectSubApp : ''} wrappedComponentRef={(inst) => this.submobcardRef = inst} inputSubmit={this.submitSubCard} />
          </Modal>
        </ConfigProvider>
          <div className="right-view">
            {selectApp ? <div className="app-title">{selectApp.remark}</div> : null}
            {selectApp && selectApp.sublist.map((item, index) => {
              let css = skinStyle[item.css] ? skinStyle[item.css].name : ''
              let color = skinStyle[item.css] ? skinStyle[item.css].color : '#e8e8e8'
              let binding = ''
              if (item.user_binding === 'true') {
                binding = '用户绑定'
              }
              if (item.share === 'true') {
                binding = binding ? binding + '、分享' : '分享'
              }
              return (
                <div className="sub-app" key={index} style={{borderColor: color}}>
                  <Row>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">应用类型:</div>
                        <div className="content" style={{fontSize: '18px', fontWeight: 600}}>{item.typename}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">语言:</div>
                        <div className="content" style={{textDecoration: 'underline'}}>{langs[item.lang]}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">权限管理:</div>
                        <div className="content">{item.role_type === 'false' ? '不启用' : '启用'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        {/* <div className="label">皮肤:</div>
                        <div className="content" style={{color: color}}>{css}</div> */}
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">皮肤:</div>
                        <div className="content" style={{color: color}}>{css}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        {/* {binding ? <div className="label">
                          <Tooltip placement="topLeft" title="微信公众号登录时,系统用户与微信用户的绑定方式。">
                            <QuestionCircleOutlined className="mk-form-tip" />
                            用户绑定:
                          </Tooltip>
                        </div> : null} */}
                        {binding ? <div className="label">
                          <Tooltip placement="topLeft" title="微信公众号或小程序中,绑定系统用户、自定义分享等功能。">
                            <QuestionCircleOutlined className="mk-form-tip" />
                            扩展功能:
                          </Tooltip>
                        </div> : null}
                        <div className="content">{binding}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">标题:</div>
                        <div className="content">{item.title || '无'}</div>
                      </div>
                    </Col>
                    <Col span={12}>
                      <div className="app-item">
                        <div className="label">网站头像:</div>
                        <div className="content">{item.favicon ? <img style={{width: '18px', height: '18px', borderRadius: '4px'}} src={item.favicon} alt="" /> : '无'}</div>
                      </div>
                    </Col>
                  </Row>
                  <div className="action">
                    {item.lang !== 'zh-CN' ? <TransMenu app={item} supApp={selectApp} /> : null}
                    <Button type="link" onClick={() => this.jumpMenu(item)} style={{color: 'rgba(30, 228, 224, 1)'}}>菜单&权限</Button>
                    <Button type="link" onClick={() => this.setState({ selectSubApp: item, subVisible: 'edit' })} style={{color: '#8E44AD'}}>修改</Button>
                    <Button type="link" onClick={() => this.deleteSubApp(item)} style={{color: '#ff4d4f'}}>删除</Button>
                    <Button type="link" onClick={() => this.jumpApp(item)}>编辑应用</Button>
                    <Paragraph style={{display: 'inline-block', margin: 0}} copyable={{ text: `${window.GLOB.baseurl}${item.typename === 'pad' ? 'mob' : item.typename}/index.html#/index/${this.state.selectApp.kei_no}/${item.typename !== 'pc' ? item.typename + '/' : ''}${item.lang}` }}></Paragraph>
                  </div>
                </div>
              )
            })}
          </div>
        </div>
        <Modal
          title={'编辑应用'}
          width={'600px'}
          maskClosable={false}
          visible={visible !== false}
          onCancel={() => this.setState({visible: false, confirmloading: false})}
          confirmLoading={this.state.confirmloading}
          onOk={this.submitCard}
          cancelText="取消"
          okText="确定"
          destroyOnClose
        >
          <MutilForm type={visible} card={visible === 'edit' ? selectApp : ''} wrappedComponentRef={(inst) => this.mobcardRef = inst} inputSubmit={this.submitCard} />
        </Modal>
        <Modal
          title={transVisible === 'plus' ? '添加传输号' : '编辑传输号'}
          width={'600px'}
          maskClosable={false}
          visible={transVisible !== false}
          onCancel={() => this.setState({transVisible: false, confirmloading: false})}
          confirmLoading={this.state.confirmloading}
          onOk={this.submitTrans}
          cancelText="取消"
          okText="确定"
          destroyOnClose
        >
          <TransForm type={transVisible} card={transVisible === 'edit' ? this.state.editTran : ''} wrappedComponentRef={(inst) => this.transRef = inst} inputSubmit={this.submitTrans} />
        </Modal>
        <Modal
          title={'添加脚本'}
          width={900}
          maskClosable={false}
          visible={scriptVisible}
          onCancel={() => this.setState({scriptVisible: false, confirmloading: false})}
          confirmLoading={this.state.confirmloading}
          onOk={this.submitScript}
          cancelText="取消"
          okText="确定"
          destroyOnClose
        >
          <ScriptForm applist={applist} wrappedComponentRef={(inst) => this.scriptRef = inst} inputSubmit={this.submitScript} />
        </Modal>
        <Modal
          title={subVisible === 'plus' ? '添加子应用' : '编辑子应用'}
          width={'850px'}
          maskClosable={false}
          visible={subVisible !== false}
          onCancel={() => this.setState({subVisible: false, confirmloading: false})}
          confirmLoading={this.state.confirmloading}
          onOk={this.submitSubCard}
          cancelText="取消"
          okText="确定"
          destroyOnClose
        >
          <SubMutilForm type={subVisible} card={subVisible === 'edit' ? selectSubApp : ''} wrappedComponentRef={(inst) => this.submobcardRef = inst} inputSubmit={this.submitSubCard} />
        </Modal>
      </div>
    )
  }
src/views/basedesign/index.jsx
@@ -1,6 +1,5 @@
import React, {Component} from 'react'
import { notification, Spin, ConfigProvider } from 'antd'
import zhCN from 'antd/es/locale/zh_CN'
import { notification, Spin } from 'antd'
import Api from '@/api'
import asyncComponent from '@/utils/asyncComponent'
@@ -187,58 +186,56 @@
    return (
      <div className="mk-base-design-wrap">
        <ConfigProvider locale={zhCN}>
          <Header/>
          {this.state.tabview === 'CommonTable' ?
            <ComTableConfig
              menu={editMenu}
              reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'SubTable' ?
            <SubTable
              menu={editMenu}
              editTab={this.state.editTab}
              editSubTab={this.state.editSubTab}
              tabConfig={this.state.tabConfig}
              btnTab={btnTab}
              btnTabConfig={this.state.btnTabConfig}
              config={subConfig}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'Modal' ?
            <ModalConfig
              menu={editMenu}
              editTab={this.state.editTab}
              tabConfig={this.state.tabConfig}
              editSubTab={this.state.editSubTab}
              subTabConfig={this.state.subTabConfig}
              btnTab={btnTab}
              btnTabConfig={this.state.btnTabConfig}
              editAction={this.state.editAction}
              subConfig={subConfig}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'TreePage' ?
            <TreePageConfig
              menu={editMenu}
              reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'FormTab' ?
            <UpdateFormTab
              menu={editMenu}
              btnTab={btnTab}
              config={subConfig}
              handleView={this.handleView}
            /> : null
          }
          {loading ? <Spin className="loading-view" size="large"/> : null}
        </ConfigProvider>
        <Header/>
        {this.state.tabview === 'CommonTable' ?
          <ComTableConfig
            menu={editMenu}
            reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
            handleView={this.handleView}
          /> : null
        }
        {this.state.tabview === 'SubTable' ?
          <SubTable
            menu={editMenu}
            editTab={this.state.editTab}
            editSubTab={this.state.editSubTab}
            tabConfig={this.state.tabConfig}
            btnTab={btnTab}
            btnTabConfig={this.state.btnTabConfig}
            config={subConfig}
            handleView={this.handleView}
          /> : null
        }
        {this.state.tabview === 'Modal' ?
          <ModalConfig
            menu={editMenu}
            editTab={this.state.editTab}
            tabConfig={this.state.tabConfig}
            editSubTab={this.state.editSubTab}
            subTabConfig={this.state.subTabConfig}
            btnTab={btnTab}
            btnTabConfig={this.state.btnTabConfig}
            editAction={this.state.editAction}
            subConfig={subConfig}
            handleView={this.handleView}
          /> : null
        }
        {this.state.tabview === 'TreePage' ?
          <TreePageConfig
            menu={editMenu}
            reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
            handleView={this.handleView}
          /> : null
        }
        {this.state.tabview === 'FormTab' ?
          <UpdateFormTab
            menu={editMenu}
            btnTab={btnTab}
            config={subConfig}
            handleView={this.handleView}
          /> : null
        }
        {loading ? <Spin className="loading-view" size="large"/> : null}
      </div>
    )
  }
src/views/imdesign/index.jsx
@@ -2,12 +2,11 @@
import { withRouter } from 'react-router'
import { is, fromJS } from 'immutable'
import moment from 'moment'
import { ConfigProvider, notification, Modal, Collapse, Button, Spin } from 'antd'
import { notification, Modal, Collapse, Button, Spin } from 'antd'
import { DoubleLeftOutlined, DoubleRightOutlined, LeftOutlined, UserOutlined, EllipsisOutlined } from '@ant-design/icons'
import Api from '@/api'
import Utils from '@/utils/utils.js'
import antdZhCN from 'antd/es/locale/zh_CN'
// import MKEmitter from '@/utils/events.js'
import asyncComponent from '@/utils/asyncComponent'
import getWrapForm from './options'
@@ -422,93 +421,91 @@
    const { loading, settingshow, controlshow, MenuId, config, menuloading } = this.state
    return (
      <ConfigProvider locale={antdZhCN}>
        <div className="mk-mob-view" id="mk-mob-design-view">
          <Header/>
          {loading ? <Spin className="view-spin" size="large" /> : null}
          <div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
            <div className="draw">
              {settingshow ? <DoubleLeftOutlined onClick={() => {this.setState({settingshow: false})}} /> : null}
              {!settingshow ? <DoubleRightOutlined onClick={() => {this.setState({settingshow: true})}} /> : null}
            </div>
            <div className="pc-setting-tools">
              <Collapse accordion defaultActiveKey="basedata" bordered={false}>
                {/* 基本信息 */}
                <Panel header="基本信息" forceRender key="basedata">
                  {/* 菜单信息 */}
                  {config ? <MenuForm
                    config={config}
                    MenuId={MenuId}
                    updateConfig={this.updateConfig}
                  /> : null}
                </Panel>
                <Panel header="页面样式" key="background">
                  {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
                </Panel>
              </Collapse>
            </div>
      <div className="mk-mob-view" id="mk-mob-design-view">
        <Header/>
        {loading ? <Spin className="view-spin" size="large" /> : null}
        <div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
          <div className="draw">
            {settingshow ? <DoubleLeftOutlined onClick={() => {this.setState({settingshow: false})}} /> : null}
            {!settingshow ? <DoubleRightOutlined onClick={() => {this.setState({settingshow: true})}} /> : null}
          </div>
          <div className={'menu-control ' + (!controlshow ? 'hidden' : '')}>
            <div className="draw">
              {controlshow ? <DoubleRightOutlined onClick={() => {this.setState({controlshow: false})}}/> : null}
              {!controlshow ? <DoubleLeftOutlined onClick={() => {this.setState({controlshow: true})}}/> : null}
            </div>
            <div className="wrap">
              <Button type="primary" onClick={this.submitConfig} id="save-config" loading={menuloading}>保存</Button>
              <NormalForm title="即时通信设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
                <Button type="default" style={{borderColor: 'rgb(64, 169, 255)', color: 'rgb(64, 169, 255)'}}>设置</Button>
              </NormalForm>
              <Button type="default" className="mk-border-purple" onClick={this.backView}>后退</Button>
              <CreateView resetmenu={this.getAppMenus} />
              <Transfer MenuID={MenuId} />
              <Button type="default" onClick={this.closeView}>关闭</Button>
            </div>
          <div className="pc-setting-tools">
            <Collapse accordion defaultActiveKey="basedata" bordered={false}>
              {/* 基本信息 */}
              <Panel header="基本信息" forceRender key="basedata">
                {/* 菜单信息 */}
                {config ? <MenuForm
                  config={config}
                  MenuId={MenuId}
                  updateConfig={this.updateConfig}
                /> : null}
              </Panel>
              <Panel header="页面样式" key="background">
                {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
              </Panel>
            </Collapse>
          </div>
          <div className={'menu-body menu-view'}>
            <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
              <div className="instant-message" style={config ? config.style : null}>
                <div className="header">
                  <LeftOutlined/>
                  <span className="title">朋友</span>
                  {config && config.wrap.linkmenu ? <EllipsisOutlined onDoubleClick={this.changeEditMenu}/> : null}
                </div>
                <div className="mk-content-wrap">
                  <div className="line-wrap">
                    <div className="time-line">12:34</div>
                    <div className="line-msg">
                      <div className="portrait">
                        <div className="img"><UserOutlined /></div>
                      </div>
                      <div className="msg">
                        <div className="title">朋友</div>
                        <div className="words">您好</div>
                      </div>
        </div>
        <div className={'menu-control ' + (!controlshow ? 'hidden' : '')}>
          <div className="draw">
            {controlshow ? <DoubleRightOutlined onClick={() => {this.setState({controlshow: false})}}/> : null}
            {!controlshow ? <DoubleLeftOutlined onClick={() => {this.setState({controlshow: true})}}/> : null}
          </div>
          <div className="wrap">
            <Button type="primary" onClick={this.submitConfig} id="save-config" loading={menuloading}>保存</Button>
            <NormalForm title="即时通信设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
              <Button type="default" style={{borderColor: 'rgb(64, 169, 255)', color: 'rgb(64, 169, 255)'}}>设置</Button>
            </NormalForm>
            <Button type="default" className="mk-border-purple" onClick={this.backView}>后退</Button>
            <CreateView resetmenu={this.getAppMenus} />
            <Transfer MenuID={MenuId} />
            <Button type="default" onClick={this.closeView}>关闭</Button>
          </div>
        </div>
        <div className={'menu-body menu-view'}>
          <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
            <div className="instant-message" style={config ? config.style : null}>
              <div className="header">
                <LeftOutlined/>
                <span className="title">朋友</span>
                {config && config.wrap.linkmenu ? <EllipsisOutlined onDoubleClick={this.changeEditMenu}/> : null}
              </div>
              <div className="mk-content-wrap">
                <div className="line-wrap">
                  <div className="time-line">12:34</div>
                  <div className="line-msg">
                    <div className="portrait">
                      <div className="img"><UserOutlined /></div>
                    </div>
                  </div>
                  <div className="line-wrap">
                    <div className="time-line">12:45</div>
                    <div className="line-msg right">
                      <div className="msg">
                        <div className="words">
                          您好
                        </div>
                      </div>
                      <div className="portrait">
                        <div className="img"><UserOutlined /></div>
                      </div>
                    <div className="msg">
                      <div className="title">朋友</div>
                      <div className="words">您好</div>
                    </div>
                  </div>
                </div>
                <div className="send-wrap">
                  <div className="adm-input"></div>
                  <div className="send"><Button>发送</Button></div>
                <div className="line-wrap">
                  <div className="time-line">12:45</div>
                  <div className="line-msg right">
                    <div className="msg">
                      <div className="words">
                        您好
                      </div>
                    </div>
                    <div className="portrait">
                      <div className="img"><UserOutlined /></div>
                    </div>
                  </div>
                </div>
              </div>
              <div className="send-wrap">
                <div className="adm-input"></div>
                <div className="send"><Button>发送</Button></div>
              </div>
            </div>
          </div>
          <StyleController />
        </div>
      </ConfigProvider>
        <StyleController />
      </div>
    )
  }
}
src/views/interface/index.jsx
@@ -1,6 +1,4 @@
import React, {Component} from 'react'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/es/locale/zh_CN'
import Header from './header'
import History from './history'
@@ -12,11 +10,9 @@
  render () {
    return (
      <div className="interface-view">
        <ConfigProvider locale={zhCN}>
          <Header key="header"/>
          <History key="history"/>
          <WorkSpace key="workspace"/>
        </ConfigProvider>
        <Header key="header"/>
        <History key="history"/>
        <WorkSpace key="workspace"/>
      </div>
    )
  }
src/views/login/index.jsx
@@ -654,6 +654,12 @@
            if (res.lang_translation_js && res.lang_data && res.lang_data[0] && (res.lang_data.length > 1 || res.lang_data[0].Lang !== 'zh-CN')) {
              let lang = sessionStorage.getItem('lang')
              let js_trans = res.lang_translation_js.map(item => {
                if (['not_empty', 'not_zero', 'max_limit', 'less_limit']) {
                  item.translation = ' ' + item.translation
                }
                if (['input_tip', 'select_tip', 'max_limit', 'less_limit']) {
                  item.translation = item.translation + ' '
                }
                if (lang === item.lang) {
                  window.GLOB.dict[item.msn_code] = item.translation
                }
src/views/main/index.jsx
@@ -1,7 +1,4 @@
import React, {Component} from 'react'
import { ConfigProvider } from 'antd'
// import enUS from 'antd/es/locale/en_US'
import zhCN from 'antd/es/locale/zh_CN'
import asyncComponent from '@/utils/asyncComponent'
import Header from '@/components/header'
@@ -76,14 +73,12 @@
    return (
      <div className="mk-main-view">
        <ConfigProvider locale={zhCN}>
          <Header key="header"/>
          {navBar === 'shutter' ? <Sidemenu key="sidemenu"/> : null}
          {navBar === 'shutter' || navBar === 'menu_board_navigation' ?
            <Tabview key="tabview"/> :
            <Breadview key="breadview"/>}
          {window.GLOB.systemType === 'production' ? <QueryLog /> : null}
        </ConfigProvider>
        <Header key="header"/>
        {navBar === 'shutter' ? <Sidemenu key="sidemenu"/> : null}
        {navBar === 'shutter' || navBar === 'menu_board_navigation' ?
          <Tabview key="tabview"/> :
          <Breadview key="breadview"/>}
        {window.GLOB.systemType === 'production' ? <QueryLog /> : null}
        <ImgScale />
      </div>
    )
src/views/menudesign/index.jsx
@@ -4,7 +4,7 @@
import { is, fromJS } from 'immutable'
import moment from 'moment'
import HTML5Backend from 'react-dnd-html5-backend'
import { ConfigProvider, notification, Modal, Collapse, Card, Switch, Button, Typography, Spin } from 'antd'
import { notification, Modal, Collapse, Card, Switch, Button, Typography, Spin } from 'antd'
import { DoubleLeftOutlined, DoubleRightOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
import html2canvas from 'html2canvas'
import md5 from 'md5'
@@ -12,7 +12,6 @@
import Api from '@/api'
import Utils, { setGLOBFuncs } from '@/utils/utils.js'
import { langs } from '@/store/options'
import antdZhCN from 'antd/es/locale/zh_CN'
import MKEmitter from '@/utils/events.js'
import { getTables, getFuncsAndInters, getLangTrans } from '@/utils/utils-custom.js'
import asyncComponent from '@/utils/asyncComponent'
@@ -23,7 +22,6 @@
const { Panel } = Collapse
const { confirm } = Modal
const { Paragraph } = Typography
const _locale = antdZhCN
const MenuForm = asyncComponent(() => import('./menuform'))
const HomeForm = asyncComponent(() => import('./homeform'))
@@ -1212,7 +1210,7 @@
    const { view, comloading, MenuType, MenuId, config, settingshow, ParentId, menuloading, eyeopen, needUpdate, langName } = this.state
    return (
      <ConfigProvider locale={_locale}>
      <>
        <Header menuName={config ? config.MenuName + langName : ''}/>
        <DndProvider backend={HTML5Backend}>
          {view !== 'popview' ? <div className={'pc-menu-view ' + (MenuType || '')}>
@@ -1289,7 +1287,7 @@
        <ModalController />
        <StyleController />
        <StyleCombController />
      </ConfigProvider>
      </>
    )
  }
}
src/views/mkiframe/index.jsx
@@ -1,6 +1,5 @@
import React, {Component} from 'react'
import { Spin, notification, ConfigProvider } from 'antd'
import zhCN from 'antd/es/locale/zh_CN'
import { Spin, notification } from 'antd'
import Api from '@/api'
import asyncComponent from '@/utils/asyncLoadComponent'
@@ -267,11 +266,9 @@
    return (
      <div className="main-iframe">
        <ConfigProvider locale={zhCN}>
          {loading ? <Spin size="large" /> : null}
          {!loading && type === 'CustomPage' ? <CustomPage MenuID={MenuId} param={{$BID: BID}} changeTemp={this.changeTemp}/> : null}
          {!loading && type === 'BaseTable' ? <BaseTable MenuID={MenuId} param={{$BID: BID}} changeTemp={this.changeTemp}/> : null}
        </ConfigProvider>
        {loading ? <Spin size="large" /> : null}
        {!loading && type === 'CustomPage' ? <CustomPage MenuID={MenuId} param={{$BID: BID}} changeTemp={this.changeTemp}/> : null}
        {!loading && type === 'BaseTable' ? <BaseTable MenuID={MenuId} param={{$BID: BID}} changeTemp={this.changeTemp}/> : null}
        <ImgScale />
      </div>
    )
src/views/mobdesign/index.jsx
@@ -3,14 +3,13 @@
import { withRouter } from 'react-router'
import { is, fromJS } from 'immutable'
import HTML5Backend from 'react-dnd-html5-backend'
import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
import { notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
import moment from 'moment'
import md5 from 'md5'
import Api from '@/api'
import Utils, { setGLOBFuncs } from '@/utils/utils.js'
import antdZhCN from 'antd/es/locale/zh_CN'
import MKEmitter from '@/utils/events.js'
import MenuUtils, { getTables, getFuncsAndInters, getLangTrans } from '@/utils/utils-custom.js'
import asyncComponent from '@/utils/asyncComponent'
@@ -2075,92 +2074,90 @@
    const { view, viewType, comloading, loading, settingshow, controlshow, activeKey, MenuId, config, menuloading, adapters, eyeopen, needUpdate } = this.state
    return (
      <ConfigProvider locale={antdZhCN}>
        <div className={'mk-mob-view ' + viewType} id="mk-mob-design-view">
          <Header/>
          {loading ? <Spin className="view-spin" size="large" /> : null}
          <DndProvider backend={HTML5Backend}>
            {view !== 'popview' ? <><div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
              <div className="draw">
                {settingshow ? <DoubleLeftOutlined onClick={() => {this.setState({settingshow: false})}} /> : null}
                {!settingshow ? <DoubleRightOutlined onClick={() => {this.setState({settingshow: true})}} /> : null}
              </div>
              <div className="pc-setting-tools">
                <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
                  {/* 基本信息 */}
                  <Panel header="基本信息" forceRender className="basedata" key="basedata">
                    {config ? <>
                      <MenuForm
                        config={config}
                        MenuId={MenuId}
                        adapters={adapters}
                        updateConfig={(con) => {
                          this.updateConfig(con)
                          if (con.direction !== config.direction) {
                            this.changeView(con.direction)
                          }
                        }}
                      />
                      <UrlFieldComponent config={config} updateConfig={this.updateConfig}/>
                      {/* 表名添加 */}
                      <TableComponent config={config} updatetable={this.updateConfig}/>
                      <Paragraph style={{padding: '15px 0px 0px 18px'}} copyable={{ text: MenuId }}>菜单ID</Paragraph>
                      <Paragraph style={{padding: '10px 0px 0px 18px'}} copyable={{ text:  `${window.GLOB.baseurl}mob/index.html#/index/${sessionStorage.getItem('kei_no')}/${sessionStorage.getItem('typename')}/${sessionStorage.getItem('lang')}/${MenuId}/@BID@` }}>菜单链接</Paragraph>
                      <NormalCss config={config} updateConfig={this.updateConfig}/>
                    </> : null}
                  </Panel>
                  {/* 组件添加 */}
                  <Panel header="组件" className="component" key="component">
                    <SourceWrap />
                  </Panel>
                  <Panel header="元素" key="element">
                    <Modulecell />
                  </Panel>
                  <Panel header="页面样式" key="background">
                    {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
                  </Panel>
                </Collapse>
              </div>
      <div className={'mk-mob-view ' + viewType} id="mk-mob-design-view">
        <Header/>
        {loading ? <Spin className="view-spin" size="large" /> : null}
        <DndProvider backend={HTML5Backend}>
          {view !== 'popview' ? <><div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
            <div className="draw">
              {settingshow ? <DoubleLeftOutlined onClick={() => {this.setState({settingshow: false})}} /> : null}
              {!settingshow ? <DoubleRightOutlined onClick={() => {this.setState({settingshow: true})}} /> : null}
            </div>
            <div className={'menu-control' + (!controlshow ? ' hidden' : '')}>
              <div className="draw">
                {controlshow ? <DoubleRightOutlined onClick={() => {this.setState({controlshow: false})}}/> : null}
                {!controlshow ? <DoubleLeftOutlined onClick={() => {this.setState({controlshow: true})}}/> : null}
              </div>
              <div className="wrap">
                <Button type="primary" className={needUpdate ? 'update-tip' : ''} onClick={this.submitConfig} id="save-config" loading={menuloading}>保存</Button>
                {config ? <Switch className="big" checkedChildren="启" unCheckedChildren="停" checked={config.enabled} onChange={this.onEnabledChange} /> : null}
                <ArrowLeftOutlined title="后退" className="back-view" onClick={this.backView}/>
                {config ? <Debug config={config}/> : null}
                <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 组件名</Button>
                <CreateView resetmenu={this.getAppMenus} />
                <PasteController insert={this.insert} />
                <TableNodes config={config} />
                <ViewNodes config={config} MenuId={MenuId}/>
                <SysInterface config={config} updateConfig={this.updateConfig}/>
                <PictureController/>
                <Quotecomponent config={config} updateConfig={this.updateConfig}/>
                <StyleCombControlButton menu={config} />
                <Button className="mk-border-green set-home" onClick={this.setHomeView}><HomeOutlined /> 设为首页</Button>
                <Button className="mk-border-purple set-login" onClick={this.setLoginView}><LoginOutlined /> 设为登录页</Button>
                <ReplaceField type="custom" config={config} updateConfig={this.resetConfig}/>
                <Transfer MenuID={MenuId} />
                {config ? <Versions MenuId={MenuId} Template="webPage" checklog={this.checklog} updateConfig={this.updateLogConfig}/> : null}
                <Button type="default" onClick={this.closeView}>关闭</Button>
              </div>
            <div className="pc-setting-tools">
              <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
                {/* 基本信息 */}
                <Panel header="基本信息" forceRender className="basedata" key="basedata">
                  {config ? <>
                    <MenuForm
                      config={config}
                      MenuId={MenuId}
                      adapters={adapters}
                      updateConfig={(con) => {
                        this.updateConfig(con)
                        if (con.direction !== config.direction) {
                          this.changeView(con.direction)
                        }
                      }}
                    />
                    <UrlFieldComponent config={config} updateConfig={this.updateConfig}/>
                    {/* 表名添加 */}
                    <TableComponent config={config} updatetable={this.updateConfig}/>
                    <Paragraph style={{padding: '15px 0px 0px 18px'}} copyable={{ text: MenuId }}>菜单ID</Paragraph>
                    <Paragraph style={{padding: '10px 0px 0px 18px'}} copyable={{ text:  `${window.GLOB.baseurl}mob/index.html#/index/${sessionStorage.getItem('kei_no')}/${sessionStorage.getItem('typename')}/${sessionStorage.getItem('lang')}/${MenuId}/@BID@` }}>菜单链接</Paragraph>
                    <NormalCss config={config} updateConfig={this.updateConfig}/>
                  </> : null}
                </Panel>
                {/* 组件添加 */}
                <Panel header="组件" className="component" key="component">
                  <SourceWrap />
                </Panel>
                <Panel header="元素" key="element">
                  <Modulecell />
                </Panel>
                <Panel header="页面样式" key="background">
                  {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
                </Panel>
              </Collapse>
            </div>
            <div className={'menu-body menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
              {config && !comloading ? <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
                <MobShell menu={config} handleList={this.updateConfig} />
              </div> : null}
            </div></> : <PopView btn={this.state.popConfig} save={this.submitPopConfig} cancel={this.closePop}/>}
          </DndProvider>
          <StyleController />
          <StyleCombController />
          <ModalController />
          <SearchController />
        </div>
      </ConfigProvider>
          </div>
          <div className={'menu-control' + (!controlshow ? ' hidden' : '')}>
            <div className="draw">
              {controlshow ? <DoubleRightOutlined onClick={() => {this.setState({controlshow: false})}}/> : null}
              {!controlshow ? <DoubleLeftOutlined onClick={() => {this.setState({controlshow: true})}}/> : null}
            </div>
            <div className="wrap">
              <Button type="primary" className={needUpdate ? 'update-tip' : ''} onClick={this.submitConfig} id="save-config" loading={menuloading}>保存</Button>
              {config ? <Switch className="big" checkedChildren="启" unCheckedChildren="停" checked={config.enabled} onChange={this.onEnabledChange} /> : null}
              <ArrowLeftOutlined title="后退" className="back-view" onClick={this.backView}/>
              {config ? <Debug config={config}/> : null}
              <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 组件名</Button>
              <CreateView resetmenu={this.getAppMenus} />
              <PasteController insert={this.insert} />
              <TableNodes config={config} />
              <ViewNodes config={config} MenuId={MenuId}/>
              <SysInterface config={config} updateConfig={this.updateConfig}/>
              <PictureController/>
              <Quotecomponent config={config} updateConfig={this.updateConfig}/>
              <StyleCombControlButton menu={config} />
              <Button className="mk-border-green set-home" onClick={this.setHomeView}><HomeOutlined /> 设为首页</Button>
              <Button className="mk-border-purple set-login" onClick={this.setLoginView}><LoginOutlined /> 设为登录页</Button>
              <ReplaceField type="custom" config={config} updateConfig={this.resetConfig}/>
              <Transfer MenuID={MenuId} />
              {config ? <Versions MenuId={MenuId} Template="webPage" checklog={this.checklog} updateConfig={this.updateLogConfig}/> : null}
              <Button type="default" onClick={this.closeView}>关闭</Button>
            </div>
          </div>
          <div className={'menu-body menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
            {config && !comloading ? <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
              <MobShell menu={config} handleList={this.updateConfig} />
            </div> : null}
          </div></> : <PopView btn={this.state.popConfig} save={this.submitPopConfig} cancel={this.closePop}/>}
        </DndProvider>
        <StyleController />
        <StyleCombController />
        <ModalController />
        <SearchController />
      </div>
    )
  }
}
src/views/pcdesign/index.jsx
@@ -3,7 +3,7 @@
import { withRouter } from 'react-router'
import { is, fromJS } from 'immutable'
import HTML5Backend from 'react-dnd-html5-backend'
import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
import { notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
import moment from 'moment'
import md5 from 'md5'
@@ -11,7 +11,6 @@
import Api from '@/api'
import Utils, { setGLOBFuncs } from '@/utils/utils.js'
import { getTables, getFuncsAndInters, getLangTrans } from '@/utils/utils-custom.js'
import antdZhCN from 'antd/es/locale/zh_CN'
import MKEmitter from '@/utils/events.js'
import MenuUtils from '@/utils/utils-custom.js'
import asyncComponent from '@/utils/asyncComponent'
@@ -1723,7 +1722,7 @@
    const { view, loading, comloading, activeKey, settingshow, controlshow, MenuId, config, menuloading, eyeopen, needUpdate } = this.state
    return (
      <ConfigProvider locale={antdZhCN}>
      <>
        <DndProvider backend={HTML5Backend}>
          {view !== 'popview' ? <div className={'mk-pc-view '} id="mk-pc-design-view">
            {loading ? <Spin className="view-spin" size="large" /> : null}
@@ -1800,7 +1799,7 @@
        <StyleController />
        <StyleCombController />
        <ModalController />
      </ConfigProvider>
      </>
    )
  }
}
src/views/rolemanage/index.jsx
@@ -1,9 +1,8 @@
import React, {Component} from 'react'
import { fromJS } from 'immutable'
import { Spin, notification, Button, Table, Modal, ConfigProvider, Tree, Input, Empty } from 'antd'
import { Spin, notification, Button, Table, Modal, Tree, Input, Empty } from 'antd'
import moment from 'moment'
import md5 from 'md5'
import zhCN from 'antd/es/locale/zh_CN'
import { ApiOutlined } from '@ant-design/icons'
import Api from '@/api'
@@ -920,61 +919,59 @@
    return (
      <div className="mk-role-manage">
        <ConfigProvider locale={zhCN}>
          <Header app={app} />
          {loading ?
            <div className="loading-mask">
              <Spin size="large" />
            </div> : null
          }
          <div className="view-wrap">
            <div className="left-view">
              <div className="app-table">
                <div className="app-action">
                  <Button className="mk-green" onClick={this.triggerThaw}>解冻菜单</Button>
                  <Search placeholder="综合搜索" onSearch={value => this.setState({ searchkey: value })} enterButton />
                </div>
                <Table
                  rowKey="MenuID"
                  columns={columns}
                  dataSource={_menulist}
                  pagination={false}
                  onChange={this.changeTable}
                />
              </div>
            </div>
            <div className="right-view">
        <Header app={app} />
        {loading ?
          <div className="loading-mask">
            <Spin size="large" />
          </div> : null
        }
        <div className="view-wrap">
          <div className="left-view">
            <div className="app-table">
              <div className="app-action">
                <Button className="mk-primary" onClick={this.initTree}>重置</Button>
                {/* <Button className="mk-purple" onClick={this.syncTree}>同步</Button> */}
                <Button className="mk-green save" onClick={this.saveTree}>保存</Button>
                <Button className="mk-green" onClick={this.triggerThaw}>解冻菜单</Button>
                <Search placeholder="综合搜索" onSearch={value => this.setState({ searchkey: value })} enterButton />
              </div>
              {trees && trees.length ? <Tree
                className="draggable-tree"
                defaultExpandedKeys={this.state.expandedKeys}
                // showLine
                draggable
                blockNode
                onDrop={this.onDrop}
              >
                {this.renderNode(trees)}
              </Tree> : <div className="empty">
                <Empty />
              </div>}
              <Table
                rowKey="MenuID"
                columns={columns}
                dataSource={_menulist}
                pagination={false}
                onChange={this.changeTable}
              />
            </div>
          </div>
          <Modal
            title="解除冻结"
            visible={this.state.visible}
            width={600}
            onOk={this.thawSubmit}
            confirmLoading={this.state.confirmLoading}
            onCancel={() => this.setState({visible: false, targetKeys: []})}
            destroyOnClose
          >
            <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>
          </Modal>
        </ConfigProvider>
          <div className="right-view">
            <div className="app-action">
              <Button className="mk-primary" onClick={this.initTree}>重置</Button>
              {/* <Button className="mk-purple" onClick={this.syncTree}>同步</Button> */}
              <Button className="mk-green save" onClick={this.saveTree}>保存</Button>
            </div>
            {trees && trees.length ? <Tree
              className="draggable-tree"
              defaultExpandedKeys={this.state.expandedKeys}
              // showLine
              draggable
              blockNode
              onDrop={this.onDrop}
            >
              {this.renderNode(trees)}
            </Tree> : <div className="empty">
              <Empty />
            </div>}
          </div>
        </div>
        <Modal
          title="解除冻结"
          visible={this.state.visible}
          width={600}
          onOk={this.thawSubmit}
          confirmLoading={this.state.confirmLoading}
          onCancel={() => this.setState({visible: false, targetKeys: []})}
          destroyOnClose
        >
          <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>
        </Modal>
      </div>
    )
  }
src/views/systemfunc/index.jsx
@@ -1,7 +1,5 @@
import React, {Component} from 'react'
import { ConfigProvider } from 'antd'
import { withRouter } from 'react-router-dom'
import zhCN from 'antd/es/locale/zh_CN'
import asyncComponent from '@/utils/asyncComponent'
import Header from './header'
@@ -59,11 +57,9 @@
  render () {
    return (
      <div className="mk-main-view">
        <ConfigProvider locale={zhCN}>
          <Sidemenu key="sidemenu"/>
          <Tabview key="tabview"/>
          <Header key="header"/>
        </ConfigProvider>
        <Sidemenu key="sidemenu"/>
        <Tabview key="tabview"/>
        <Header key="header"/>
        <ImgScale />
      </div>
    )
src/views/systemproc/index.jsx
@@ -1,7 +1,5 @@
import React, {Component} from 'react'
import { ConfigProvider } from 'antd'
import { withRouter } from 'react-router-dom'
import zhCN from 'antd/es/locale/zh_CN'
import Header from '../systemfunc/header'
import Proc from './proc'
@@ -20,10 +18,8 @@
    return (
      <div className="mk-proc-view">
        <ConfigProvider locale={zhCN}>
          <Header key="header"/>
          <Proc func={func} />
        </ConfigProvider>
        <Header key="header"/>
        <Proc func={func} />
      </div>
    )
  }
src/views/tabledesign/index.jsx
@@ -4,14 +4,13 @@
import { is, fromJS } from 'immutable'
import moment from 'moment'
import HTML5Backend from 'react-dnd-html5-backend'
import { ConfigProvider, notification, Modal, Collapse, Card, Switch, Button, Typography } from 'antd'
import { notification, Modal, Collapse, Card, Switch, Button, Typography } from 'antd'
import { DoubleLeftOutlined, DoubleRightOutlined } from '@ant-design/icons'
import md5 from 'md5'
import Api from '@/api'
import Utils, { setGLOBFuncs } from '@/utils/utils.js'
import { langs } from '@/store/options'
import antdZhCN from 'antd/es/locale/zh_CN'
import MKEmitter from '@/utils/events.js'
import { getTables, getFuncsAndInters, getLangTrans } from '@/utils/utils-custom.js'
import SourceElement from '@/templates/zshare/dragsource'
@@ -24,7 +23,6 @@
const { Panel } = Collapse
const { confirm } = Modal
const { Paragraph } = Typography
const _locale = antdZhCN
const MenuForm = asyncComponent(() => import('./menuform'))
const PopView = asyncComponent(() => import('./popview'))
@@ -864,7 +862,7 @@
    const { view, activeKey, comloading, MenuId, config, settingshow, ParentId, menuloading, langName } = this.state
    return (
      <ConfigProvider locale={_locale}>
      <>
        <Header menuName={config ? config.MenuName + langName : ''}/>
        <DndProvider backend={HTML5Backend}>
        {view !== 'popview' ? <div className="pc-table-view">
@@ -941,7 +939,7 @@
        </DndProvider>
        <StyleController />
        <ModalController />
      </ConfigProvider>
      </>
    )
  }
}