| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | } |
| | | |
| | | /** |
| | | * @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 查询及提交参数 |
| | | */ |
| | |
| | | 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)) |
| | |
| | | ] |
| | | |
| | | 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 }, |
| | |
| | | { value: 'print', text: '标签打印' }, |
| | | { value: 'closetab', text: '标签关闭' }, |
| | | { value: 'megvii', text: '旷视面板机' }, |
| | | { value: 'filezip', text: '文件压缩包' }, |
| | | ] |
| | | |
| | | if (isApp) { |
| | |
| | | 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'], |
| | |
| | | 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) { |
| | |
| | | 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')) |
| | |
| | | /> |
| | | </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> |
| | | ) |
| | | } |
| | | } |
| | | } |
| | |
| | | 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' |
| | |
| | | loading: true, |
| | | lines: data |
| | | }) |
| | | |
| | | this.getIpList() |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | export default withRouter(FuncButton) |
| | | export default FuncButton |
New file |
| | |
| | | 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 |
New file |
| | |
| | | .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); |
| | | } |
| | | } |
New file |
| | |
| | | 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": "" |
| | | } |
| | | ] |
| | | } |
| | |
| | | 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 = { |
| | |
| | | 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 |
| | |
| | | }) |
| | | } |
| | | |
| | | 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) |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | 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()) |
| | |
| | | } |
| | | |
| | | 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' |
| | |
| | | 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') |
| | | } |
| | | } |
| | | |
| | |
| | | ] |
| | | |
| | | 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 }, |
| | |
| | | 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 [ |
| | | { |
| | |
| | | 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', |
| | |
| | | */ |
| | | export function getActionForm (card, config, usefulFields, type, menulist = [], printTemps = [], tabs = []) { |
| | | let columns = (config.columns || []).filter(col => col.field) |
| | | usefulFields = [] |
| | | |
| | | let opentypes = [ |
| | | { |
| | |
| | | }, { |
| | | value: 'megvii', |
| | | text: '旷视面板机' |
| | | }, { |
| | | value: 'filezip', |
| | | text: '文件压缩包' |
| | | }] |
| | | }, |
| | | { // 旷视面板机接口 待扩展 |
| | |
| | | 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 |
| | | }, |
| | | { |
| | |
| | | key: 'preFunc', |
| | | label: '前置函数', |
| | | initVal: card.preFunc || '', |
| | | tooltip: `函数名称需以${usefulFields.join(', ')}等字符开始;前置函数执行完成后,结果会传入内部函数中,此时内部函数会异步执行;当前置函数返回中ErrCode等于-1时,将不再执行内部函数。`, |
| | | tooltip: usefulFields.length ? `函数名称需以${usefulFields.join(', ')}等字符开始;前置函数执行完成后,结果会传入内部函数中,此时内部函数会异步执行;当前置函数返回中ErrCode等于-1时,将不再执行内部函数。` : '', |
| | | fields: usefulFields, |
| | | required: false, |
| | | readonly: false |
| | |
| | | </Radio.Group> |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={24}></Col> |
| | | <Col span={8}> |
| | | <Form.Item label={ |
| | | <Tooltip placement="bottomLeft" title={'选择发送短信时,需完善短信设置。'}> |
| | |
| | | </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>->应用服务->开发者中心->短信模板。</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}> |
| | |
| | | </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>->应用服务->开发者中心->短信模板。</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} |
| | |
| | | import React, {Component} from 'react' |
| | | import { withRouter } from 'react-router-dom' |
| | | |
| | | import Utils from '@/utils/utils.js' |
| | | import avatar from '@/assets/img/avatar.jpg' |
| | |
| | | } |
| | | } |
| | | |
| | | export default withRouter(Header) |
| | | export default Header |
| | |
| | | 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' |
| | | |