king
2022-07-06 be22457344d6d3fc079de2a4f0a1e06e4c0f85c3
2022-07-06
15个文件已修改
3个文件已添加
738 ■■■■■ 已修改文件
package-lock.json 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/actionform/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/formconfig.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/cardcellList/index.jsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funcMegvii/index.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funczip/index.jsx 448 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funczip/index.scss 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/funczip/mock.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/index.jsx 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/normalbutton/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/actioncomponent/actionform/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/formconfig.jsx 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/index.jsx 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/interface/header/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/loginform.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -9261,6 +9261,11 @@
        "schema-utils": "^1.0.0"
      }
    },
    "file-saver": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
    },
    "filename-regex": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
@@ -10746,7 +10751,7 @@
    "immediate": {
      "version": "3.0.6",
      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
    },
    "immer": {
      "version": "1.10.0",
@@ -12430,14 +12435,14 @@
      }
    },
    "jszip": {
      "version": "3.6.0",
      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz",
      "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==",
      "version": "3.10.0",
      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz",
      "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==",
      "requires": {
        "lie": "~3.3.0",
        "pako": "~1.0.2",
        "readable-stream": "~2.3.6",
        "set-immediate-shim": "~1.0.1"
        "setimmediate": "^1.0.5"
      }
    },
    "killable": {
@@ -18842,11 +18847,6 @@
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
    },
    "set-immediate-shim": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
    },
    "set-value": {
      "version": "2.0.1",
package.json
@@ -45,6 +45,7 @@
    "eslint-plugin-react-hooks": "^1.6.1",
    "exceljs": "^4.2.1",
    "file-loader": "3.0.1",
    "file-saver": "^2.0.5",
    "fs-extra": "7.0.1",
    "html-webpack-plugin": "4.0.0-beta.5",
    "html2canvas": "^1.0.0-rc.7",
@@ -60,6 +61,7 @@
    "js-table2excel": "^1.0.3",
    "jsbarcode": "^3.11.3",
    "jssha": "^3.2.0",
    "jszip": "^3.10.0",
    "md5": "^2.2.1",
    "mini-css-extract-plugin": "0.5.0",
    "moment": "^2.24.0",
src/api/index.js
@@ -108,6 +108,29 @@
  }
  /**
   * @description 微信业务请求
   */
  wxRequest (url, method, param) {
    let _url = window.GLOB.location + ':8080/' + window.GLOB.service + url
    if (process.env.NODE_ENV === 'production') {
      _url = document.location.origin + ':8080/' + window.GLOB.service + url
    }
    if (param) {
      return axios({
        url: _url,
        method,
        data: param
      })
    } else {
      return axios({
        url: _url,
        method
      })
    }
  }
  /**
   * @description 直接请求
   * @param {Object} param 查询及提交参数
   */
src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -383,6 +383,11 @@
        shows.push('reload')
      } else if (_funcType === 'megvii') {
        shows.push('subFunc', 'progress')
      } else if (_funcType === 'filezip') {
        reOptions.Ot = requireOptions
        reRequired.innerFunc = false
        shows.push('innerFunc', 'Ot', 'execSuccess', 'execError', 'urlkey')
      } else if (_funcType === 'pay') {
        shows.push('payType', 'Ot', 'execSuccess', 'execError', 'syncComponent', 'openmenu')
        reOptions.Ot = requireOptions.filter(op => ['requiredSgl'].includes(op.value))
@@ -670,7 +675,7 @@
        ]
  
        if (item.key === 'innerFunc') {
          let str = '^(' + item.fields.join('|') + ')'
          let str = item.fields && item.fields.length ? '^(' + item.fields.join('|') + ')' : '^'
          let _patten = new RegExp(str + formRule.func.innerPattern + '$', 'g')
          rules.push(
            { pattern: _patten, message: formRule.func.innerMessage },
src/menu/components/share/actioncomponent/formconfig.jsx
@@ -89,6 +89,7 @@
    { value: 'print', text: '标签打印' },
    { value: 'closetab', text: '标签关闭' },
    { value: 'megvii', text: '旷视面板机' },
    { value: 'filezip', text: '文件压缩包' },
  ]
  
  if (isApp) {
@@ -303,6 +304,15 @@
      required: false,
    },
    {
      type: 'text',
      key: 'urlkey',
      label: '地址字段',
      initVal: card.urlkey || '',
      tooltip: '图片(文件)链接的字段名。',
      required: false,
      readonly: false
    },
    {
      type: 'select',
      key: 'pageTemplate',
      label: Formdict['model.form.newpage.type'],
src/menu/components/share/actioncomponent/index.jsx
@@ -173,6 +173,10 @@
    let functip = <div>
      <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p>
    </div>
    if (!ableField) { // 无字段限制
      functip = ''
    }
    let menulist = sessionStorage.getItem('fstMenuList')
    if (menulist) {
src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -23,6 +23,7 @@
const ChangeUserButton = asyncComponent(() => import('@/tabviews/zshare/actionList/changeuserbutton'))
const PrintButton = asyncComponent(() => import('@/tabviews/zshare/actionList/printbutton'))
const FuncMegvii = asyncComponent(() => import('@/tabviews/zshare/actionList/funcMegvii'))
const FuncZip = asyncComponent(() => import('@/tabviews/zshare/actionList/funczip'))
const BarCode = asyncElementComponent(() => import('@/components/barcode'))
const QrCode = asyncElementComponent(() => import('@/components/qrcode'))
const MkProgress = asyncElementComponent(() => import('@/components/mkProgress'))
@@ -887,6 +888,18 @@
              />
            </Col>
          )
        } else if (card.funcType === 'filezip') {
          return (
            <Col key={card.uuid} className="mk-cell-btn" style={card.wrapStyle} span={card.width}>
              <FuncZip
                btn={card}
                BID={data.$$BID}
                disabled={_disabled}
                setting={cards.setting}
                selectedData={_data}
              />
            </Col>
          )
        }
      }
    }
src/tabviews/zshare/actionList/funcMegvii/index.jsx
@@ -1,6 +1,5 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'
import { is, fromJS } from 'immutable'
import { Button, Modal, notification, message, Progress } from 'antd'
import CryptoJS from 'crypto-js'
@@ -129,7 +128,6 @@
      loading: true,
      lines: data
    })
    this.getIpList()
  }
@@ -545,4 +543,4 @@
  }
}
export default withRouter(FuncButton)
export default FuncButton
src/tabviews/zshare/actionList/funczip/index.jsx
New file
@@ -0,0 +1,448 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Button, Modal, notification, message, Progress } from 'antd'
import JSZip from 'jszip'
import { saveAs } from 'file-saver'
import Utils from '@/utils/utils.js'
import Api from '@/api'
import MKEmitter from '@/utils/events.js'
import MkIcon from '@/components/mk-icon'
import './index.scss'
class FuncZip extends Component {
  static propTpyes = {
    btn: PropTypes.object,            // 按钮
    disabled: PropTypes.any,          // 行按钮禁用
  }
  state = {
    loading: false,
    disabled: false,
    loadingNumber: '',
    loadingTotal: '',
    hidden: false,
    visible: false
  }
  UNSAFE_componentWillMount () {
    const { btn, selectedData } = this.props
    let disabled = false
    if (btn.controlField && selectedData && selectedData.length > 0) { // 表格中按钮隐藏控制
      selectedData.forEach(item => {
        let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
        if (btn.controlVals.includes(s)) {
          disabled = true
        }
      })
      this.setState({hidden: disabled && btn.control === 'hidden'})
    }
    if (this.props.disabled || disabled) {
      this.setState({disabled: true})
    }
  }
  componentDidMount () {
    MKEmitter.addListener('triggerBtnId', this.actionTrigger)
  }
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { btn, selectedData } = this.props
    let disabled = false
    if (btn.controlField && !is(fromJS(nextProps.selectedData || []), fromJS(selectedData || []))) {
      if (nextProps.selectedData && nextProps.selectedData.length > 0) { // 表格中按钮隐藏控制
        nextProps.selectedData.forEach(item => {
          let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
          if (btn.controlVals.includes(s)) {
            disabled = true
          }
        })
      }
      this.setState({hidden: disabled && btn.control === 'hidden'})
    }
    if (nextProps.disabled || disabled) {
      this.setState({disabled: true})
    } else {
      this.setState({disabled: false})
    }
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  componentWillUnmount () {
    this.setState = () => {
      return
    }
    MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
  }
  /**
   * @description 触发按钮操作
   */
  actionTrigger = (triggerId, record, type) => {
    const { Tab, BID, btn, selectedData, setting } = this.props
    const { loading, disabled } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
    if (((Tab && Tab.supMenu) || setting.supModule) && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        duration: 5
      })
      return
    } else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(selectedData || []), fromJS(record))) {
      return
    }
    let data = record || selectedData || []
    if (btn.Ot !== 'notRequired' && data.length === 0) {
      notification.warning({
        top: 92,
        message: '请选择行!',
        duration: 5
      })
      return
    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        duration: 5
      })
      return
    }
    // Api.wxRequest('wxpay/getaccesstoken', 'get').then(res => {
    //   let token = res.oa_access_token
    //   Api.wxRequest(`cgi-bin/template/get_all_private_template?access_token=${token}`, 'get')
    // })
    this.setState({
      loading: true
    })
    if (btn.innerFunc) {
      let params = []
      let param = {
        func: btn.innerFunc,
        BID: BID || ''
      }
      if (btn.Ot === 'notRequired') {
        params.push(param)
      } else if (btn.Ot === 'requiredSgl') {
        param.ID = data[0].$$uuid || ''
        params.push(param)
      } else if (btn.Ot === 'required') {
        params = data.map(item => {
          return {
            ...param,
            ID: item.$$uuid || ''
          }
        })
      } else if (btn.Ot === 'requiredOnce') {
        param.ID = data.map(item => item.$$uuid || '').filter(Boolean).join(',')
        params.push(param)
      }
      this.getInnerData(params)
    } else {
      this.downloadZipImage(data, btn.urlkey).then((res) => {
        if (res) {
          this.execError({ErrCode: res})
        } else {
          this.execSuccess()
        }
      }, (err) => {
        this.execError({ErrCode: err})
      })
    }
  }
  getInnerData = (params) => {
    let param = params.shift()
    Api.genericInterface(param).then(res => {
      if (res.status) {
        this.downloadZipImage(res.data, this.props.btn.urlkey).then((res) => {
          if (params.length === 0) {
            if (res) {
              this.execError({ErrCode: res})
            } else {
              this.execSuccess()
            }
          } else {
            this.getInnerData(params)
          }
        }, (err) => {
          if (params.length === 0) {
            this.execError({ErrCode: err})
          } else {
            this.getInnerData(params)
          }
        })
      } else {
        this.execError(res)
      }
    })
  }
  downloadZipImage = (imgArr, imgKey = '') => {
    let images = []
    if (imgArr && imgArr.length > 0) {
      let names = []
      let imgs = []
      imgArr.forEach(item => {
        let itemImg = imgKey ? item[imgKey] : item
        if (!itemImg || !/^data:image|jpg$|jpeg$|png$|gif$/.test(itemImg)) return
        if (imgs.includes(itemImg)) return
        let name = Utils.getguid() + '.png'
        if (/.(jpg|jpeg|png|gif)$/.test(itemImg)) {
          let _name = itemImg.replace(/.*\//ig, '')
          if (!names.includes(_name)) {
            name = _name
          }
        }
        imgs.push(itemImg)
        names.push(name)
        images.push({url: itemImg, name: name})
      })
    }
    if (images.length === 0) {
      return Promise.reject('01')
    }
    const zip = new JSZip()
    const imgFolder = zip.folder('images') // 创建images文件夹
    return new Promise((resolve, reject) => {
      let deffers = images.map((img) => {
        return new Promise(resolve => {
          this.getBase64(img.url).then((base64) => {
            if (base64) {
              base64 = base64.split('base64,')[1]
              imgFolder.file(img.name, base64, {
                base64: true
              })
              resolve(true)
            } else {
              resolve(false)
            }
          })
        })
      })
      Promise.all(deffers).then((res) => {
        let hasSuccess = res.filter((m) => m).length > 0
        let hasError = res.filter((m) => !m).length > 0
        if (hasSuccess) {
          zip.generateAsync({
            type: 'blob'
          }).then((blob) => {
            saveAs(blob, Utils.getguid() + '.zip')
            if (hasError) {
              resolve('02')
            } else {
              resolve('')
            }
          })
        } else {
          reject('03')
        }
      })
    })
  }
  /**
   * 将图片转换成base64 并返回路径
   * @param img
   * @param {number} width 调用时传入具体像素值,控制大小 ,不传则默认图像大小
   * @param {number} height
   * @returns {string}
   */
  getBase64Image = (img, width = 0, height = 0) => {
    const canvas = document.createElement('canvas')
    canvas.width = width ? width : img.width
    canvas.height = height ? height : img.height
    const ctx = canvas.getContext('2d')
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
    const dataURL = canvas.toDataURL()
    return dataURL
  }
  /**
   * 加载图片 加载成功后经图片返回
   * @param img
   * @returns {Promise<any>}
   */
  getBase64 = (img) => {
    if (/^data:image/.test(img)) {
      return Promise.resolve(img)
    } else {
      const image = new Image()
      image.crossOrigin = '*'
      image.src = img
      return new Promise((resolve, reject) => {
        image.onload = () => {
          let base64 = ''
          try {
            base64 = this.getBase64Image(image)
          } catch (e) {
            base64 = ''
          }
          resolve(base64)
        }
        image.onerror = () => {
          resolve('')
        }
      })
    }
  }
  /**
   * @description 操作成功后处理
   * 1、excel导出,成功后取消导出按钮加载中状态
   * 2、状态码为 S 时,显示成功信息后系统默认信息
   * 3、状态码为 -1 时,不显示任何信息
   * 4、模态框执行成功后是否关闭
   * 5、通知主列表刷新
   */
  execSuccess = () => {
    const { btn } = this.props
    this.setState({
      loading: false,
      loadingNumber: '',
      loadingTotal: ''
    })
    if (btn.execSuccess !== 'never') {
      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn)
    }
  }
  /**
   * @description 操作失败后处理
   */
  execError = (res) => {
    const { btn } = this.props
    this.setState({
      loading: false,
      loadingNumber: '',
      loadingTotal: ''
    })
    if (res.ErrCode === '01') {
      message.error('未获取到下载文件。')
      return
    } else if (res.ErrCode === '02') {
      Modal.error({
        title: '部分文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
      })
      return
    } else if (res.ErrCode === '03') {
      Modal.error({
        title: '文件下载失败:1、请检查文件路径是否正确,2、请检查文件是否跨域。',
      })
      return
    } else if (res.ErrCode === 'E') {
      Modal.error({
        title: res.message || res.ErrMesg,
      })
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || res.ErrMesg,
        duration: 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || res.ErrMesg,
        duration: 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || res.ErrMesg)
    }
    if (btn.execError !== 'never') {
      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn)
    }
  }
  render() {
    const { btn } = this.props
    const { loading, disabled, hidden, loadingNumber, loadingTotal } = this.state
    if (hidden) return null
    let label = ''
    let icon = ''
    let type = 'link'
    let className = ''
    if (btn.show === 'button') {
      label = btn.label
      icon = btn.icon || ''
    } else if (btn.show === 'link') {
      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
      icon = ''
    } else if (btn.show === 'icon') {
      icon = btn.icon || ''
    } else if (!btn.$toolbtn) {
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
    } else {
      type = ''
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
    }
    if (loadingNumber && !loadingTotal && btn.$toolbtn && (!btn.show || btn.show === 'button')) {
      label = (loadingNumber && !loadingTotal ? `(${loadingNumber})` : '') + btn.label
    }
    return (
      <>
        <Button
          type={type}
          title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
          loading={loading}
          disabled={disabled}
          style={btn.style}
          icon={icon}
          className={className}
          onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
        >{label}</Button>
        {loadingTotal ? <Progress className="mk-button-progress" percent={(loadingTotal - loadingNumber) / loadingTotal * 100} size="small" showInfo={false} /> : null}
      </>
    )
  }
}
export default FuncZip
src/tabviews/zshare/actionList/funczip/index.scss
New file
@@ -0,0 +1,26 @@
.ip-list-modal {
  .ip-item {
    display: inline-block;
    border: 1px solid #d9d9d9;
    padding: 10px;
    height: 100px;
    width: calc(33% - 20px);
    margin: 10px;
    cursor: pointer;
    .ip {
      color: #000000;
    }
    .remark {
      word-break: break-all;
      text-overflow: ellipsis;
      display: -webkit-box;
      -webkit-box-orient: vertical;
      -webkit-line-clamp: 2;
      overflow: hidden;
    }
  }
  .ip-item.active {
    border-color: var(--mk-sys-color);
    box-shadow: 0 0 2px var(--mk-sys-color);
  }
}
src/tabviews/zshare/actionList/funczip/mock.js
New file
@@ -0,0 +1,27 @@
export const mockdata = {
  data: [
    {
      "recognition_type": "staff",
      "id": "2226169",
      "type": "persons",
      "is_admin": "true",
      "person_name": "king",
      "card_number": "mk001",
      "person_code": "2018",
      "id_number": "130982193002054729",
      "group_list": "1",
      "face_data":""
    },
    {
      "recognition_type": "staff",
      "id": "3272487",
      "is_admin": 'false',
      "person_name": "jinfei",
      "card_number": "mk002",
      "person_code": "02",
      "id_number": "",
      "group_list": "1",
      "face_data": ""
    }
  ]
}
src/tabviews/zshare/actionList/index.jsx
@@ -15,6 +15,7 @@
const ChangeUserButton = asyncComponent(() => import('./changeuserbutton'))
const PrintButton = asyncComponent(() => import('./printbutton'))
const FuncMegvii = asyncComponent(() => import('./funcMegvii'))
const FuncZip = asyncComponent(() => import('./funczip'))
class ActionList extends Component {
  static propTpyes = {
@@ -164,6 +165,19 @@
              selectedData={selectedData}
            />
          )
        } else if (item.funcType === 'filezip') {
          return (
            <FuncZip
              key={item.uuid}
              show={item.show || 'actionList'}
              disabled={lock || false}
              BID={BID}
              Tab={Tab}
              btn={item}
              setting={setting}
              selectedData={selectedData}
            />
          )
        }
      }
      return null
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -1530,14 +1530,15 @@
      })
    }
    if (btn.verify && btn.verify.noteEnable === 'true') {
      this.sendMessage()
    }
    let id = ''
    if (btn.output) {
      id = res.mk_b_id || res[btn.output] || ''
    }
    if (btn.verify && btn.verify.noteEnable === 'true' && id) {
      this.sendMessage(id)
    }
    if (res.mk_icon) {
      sessionStorage.setItem('avatar', res.mk_icon)
    }
@@ -1595,13 +1596,14 @@
    }
  }
  sendMessage = () => {
  sendMessage = (id) => {
    const { btn : { verify } } = this.props
    let param = {
      func: 's_get_sms_local',
      TypeCharOne: verify.noteTemp, // N不同内容,Y相同内容
      TypeCharTwo: verify.noteType  // N定时,Y实时
      TypeCharTwo: verify.noteType, // N定时,Y实时
      upid: id
    }
    param.LText = Utils.formatOptions(Utils.getuuid())
@@ -1680,13 +1682,14 @@
      }
      if (Ltext.length === 0) return
      Ltext = Ltext.join(';')
      _param.LText = window.btoa(window.encodeURIComponent(Ltext))
      _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
      _param.rduri = 'http://sso.mk9h.cn/webapi/dostars'
      _param.rduri = 'https://sso.mk9h.cn/webapi/dostars'
      _param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
      _param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
src/templates/sharecomponent/actioncomponent/actionform/index.jsx
@@ -275,6 +275,11 @@
        shows.push('refreshTab')
      } else if (_funcType === 'megvii') {
        shows.push('subFunc', 'progress')
      } else if (_funcType === 'filezip') {
        reOptions.Ot = requireOptions
        reRequired.innerFunc = false
        shows.push('innerFunc', 'Ot', 'execSuccess', 'execError', 'urlkey')
      }
    }
@@ -512,7 +517,7 @@
        ]
  
        if (item.key === 'innerFunc') {
          let str = '^(' + item.fields.join('|') + ')'
          let str = item.fields && item.fields.length ? '^(' + item.fields.join('|') + ')' : '^'
          let _patten = new RegExp(str + formRule.func.innerPattern + '$', 'g')
          rules.push(
            { pattern: _patten, message: formRule.func.innerMessage },
src/templates/zshare/formconfig.jsx
@@ -13,6 +13,17 @@
export function getTreeSettingForm (setting, usefulFields = [], MenuID) {
  let str = '^(' + usefulFields.join('|') + ')'
  let _patten = new RegExp(str + formRule.func.innerPattern + '$', 'g')
  let rules = [{
    max: formRule.func.max,
    message: formRule.func.maxMessage
  }]
  if (usefulFields.length > 0) {
    rules.push({
      pattern: _patten,
      message: formRule.func.innerMessage
    })
  }
  return [
    {
@@ -103,19 +114,11 @@
      key: 'innerFunc',
      label: Formdict['header.form.innerFunc'],
      initVal: setting.innerFunc || '',
      tooltip: '开头可用字符:' + usefulFields.join(', '),
      tooltip: usefulFields.length ? '开头可用字符:' + usefulFields.join(', ') : '',
      placement: 'bottomLeft',
      required: false,
      readonly: false,
      rules: [
        {
          pattern: _patten,
          message: formRule.func.innerMessage
        }, {
          max: formRule.func.max,
          message: formRule.func.maxMessage
        }
      ]
      rules: rules
    },
    {
      type: 'datasource',
@@ -875,6 +878,7 @@
 */
export function getActionForm (card, config, usefulFields, type, menulist = [], printTemps = [], tabs = []) {
  let columns = (config.columns || []).filter(col => col.field)
  usefulFields = []
  let opentypes = [
    {
@@ -971,6 +975,9 @@
      }, {
        value: 'megvii',
        text: '旷视面板机'
      }, {
        value: 'filezip',
        text: '文件压缩包'
      }]
    },
    { // 旷视面板机接口 待扩展
@@ -1050,9 +1057,18 @@
      key: 'innerFunc',
      label: Formdict['header.form.innerFunc'],
      initVal: card.innerFunc || '',
      tooltip: `函数名称需以${usefulFields.join(', ')}等字符开始。`,
      tooltip: usefulFields.length ? `函数名称需以${usefulFields.join(', ')}等字符开始。` : '',
      fields: usefulFields,
      required: card.intertype === 'inner',
      readonly: false
    },
    {
      type: 'text',
      key: 'urlkey',
      label: '地址字段',
      initVal: card.urlkey || '',
      tooltip: '图片(文件)链接的字段名。',
      required: false,
      readonly: false
    },
    {
@@ -1462,7 +1478,7 @@
      key: 'preFunc',
      label: '前置函数',
      initVal: card.preFunc || '',
      tooltip: `函数名称需以${usefulFields.join(', ')}等字符开始;前置函数执行完成后,结果会传入内部函数中,此时内部函数会异步执行;当前置函数返回中ErrCode等于-1时,将不再执行内部函数。`,
      tooltip: usefulFields.length ? `函数名称需以${usefulFields.join(', ')}等字符开始;前置函数执行完成后,结果会传入内部函数中,此时内部函数会异步执行;当前置函数返回中ErrCode等于-1时,将不再执行内部函数。` : '',
      fields: usefulFields,
      required: false,
      readonly: false
src/templates/zshare/verifycard/index.jsx
@@ -1567,6 +1567,7 @@
                    </Radio.Group>
                  </Form.Item>
                </Col>
                <Col span={24}></Col>
                <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'选择发送短信时,需完善短信设置。'}>
@@ -1581,7 +1582,12 @@
                  </Form.Item>
                </Col>
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label="短信模板">
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={<span>短信模板添加地址:<a target="_blank" rel="noopener noreferrer" href="https://cloud.mk9h.cn/admin/index.html">云中心</a>-&gt;应用服务-&gt;开发者中心-&gt;短信模板。</span>}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      短信模板
                    </Tooltip>
                  }>
                    <Select value={verify.noteCode} onSelect={this.onNoteCodeChange}>
                      {notes.map(option =>
                        <Select.Option key={option.value} id={option.id} value={option.value}>
@@ -1605,13 +1611,74 @@
                  </Form.Item>
                </Col> : null}
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label="短信内容">
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'当向多个用户发送短信时,短信内容是否相同。'}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      短信内容
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.noteTemp} onChange={(e) => {this.onOptionChange(e, 'noteTemp')}}>
                      <Radio value="Y">相同</Radio>
                      <Radio value="N">不同</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col> : null}
                {/* <Col span={24}></Col>
                <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'选择发送短信时,需完善短信设置。'}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      公众号消息
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.wxEnable} onChange={(e) => {this.onOptionChange(e, 'noteEnable')}}>
                      <Radio value="true">开启</Radio>
                      <Radio value="false">不开启</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col>
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={<span>短信模板添加地址:<a target="_blank" rel="noopener noreferrer" href="https://cloud.mk9h.cn/admin/index.html">云中心</a>-&gt;应用服务-&gt;开发者中心-&gt;短信模板。</span>}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      短信模板
                    </Tooltip>
                  }>
                    <Select value={verify.noteCode} onSelect={this.onNoteCodeChange}>
                      {notes.map(option =>
                        <Select.Option key={option.value} id={option.id} value={option.value}>
                          {option.name}
                        </Select.Option>
                      )}
                    </Select>
                  </Form.Item>
                </Col> : null}
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'实时发送最多同时发送5个用户,定时发送最多同时发送100个用户。'}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      发送方式
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.noteType} onChange={(e) => {this.onOptionChange(e, 'noteType')}}>
                      <Radio value="Y">实时</Radio>
                      <Radio value="N">定时</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col> : null}
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'当向多个用户发送短信时,短信内容是否相同。'}>
                      <QuestionCircleOutlined className="mk-form-tip" />
                      短信内容
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.noteTemp} onChange={(e) => {this.onOptionChange(e, 'noteTemp')}}>
                      <Radio value="Y">相同</Radio>
                      <Radio value="N">不同</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col> : null} */}
              </Row>
            </Form>
          </TabPane> : null}
src/views/interface/header/index.jsx
@@ -1,5 +1,4 @@
import React, {Component} from 'react'
import { withRouter } from 'react-router-dom'
import Utils from '@/utils/utils.js'
import avatar from '@/assets/img/avatar.jpg'
@@ -36,4 +35,4 @@
  }
}
export default withRouter(Header)
export default Header
src/views/login/loginform.jsx
@@ -299,7 +299,7 @@
      param.LText = md5(`${_phone}mingke${window.GLOB.appkey}${param.timestamp}`)
      param.secretkey = md5(`${param.LText}mingke${param.timestamp}`)
      param.rduri = 'http://sso.mk9h.cn/webapi/dostars'
      param.rduri = 'https://sso.mk9h.cn/webapi/dostars'
      param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
      param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'