From cb9ade2afd2a367ad767bc605ab7086c695dd010 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期五, 09 十二月 2022 15:53:32 +0800 Subject: [PATCH] 2022-12-09 --- src/menu/sysinterface/index.jsx | 174 ++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 116 insertions(+), 58 deletions(-) diff --git a/src/menu/sysinterface/index.jsx b/src/menu/sysinterface/index.jsx index fcd9dcb..240fea2 100644 --- a/src/menu/sysinterface/index.jsx +++ b/src/menu/sysinterface/index.jsx @@ -1,14 +1,15 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import { Modal, Button, Popconfirm, message } from 'antd' -import { StopTwoTone, ApiOutlined, CopyOutlined, EditOutlined, CheckCircleTwoTone, DeleteOutlined } from '@ant-design/icons' +import { Modal, Button, Popconfirm, message, notification } from 'antd' +import { StopTwoTone, DatabaseOutlined, CopyOutlined, CheckCircleTwoTone, DeleteOutlined, PlusOutlined, SwapOutlined } from '@ant-design/icons' import Utils from '@/utils/utils.js' import asyncComponent from '@/utils/asyncComponent' +import MKEmitter from '@/utils/events.js' import './index.scss' -const SettingForm = asyncComponent(() => import('./settingform')) +const DataSource = asyncComponent(() => import('@/menu/datasource')) const EditTable = asyncComponent(() => import('@/templates/zshare/editTable')) class InterfaceController extends Component { @@ -19,12 +20,10 @@ state = { visible: false, - setvisible: false, interfaces: [], - card: null, columns: [ { - title: '鎺ュ彛鍚嶇О', + title: '鍚嶇О', dataIndex: 'name', width: '50%' }, @@ -53,8 +52,9 @@ dataIndex: 'operation', render: (text, record) => (<div style={{textAlign: 'center'}}> - <span onClick={() => this.handleEdit(record)} style={{color: '#1890ff', cursor: 'pointer', fontSize: '16px', marginRight: '15px'}}><EditOutlined /></span> - <span onClick={() => {this.copy(record)}} style={{color: '#26C281', cursor: 'pointer', fontSize: '16px', marginRight: '15px'}}><CopyOutlined /></span> + <DataSource config={record} updateConfig={this.update}/> + <span onClick={() => this.handleStatus(record)} style={{color: '#8E44AD', cursor: 'pointer', fontSize: '16px', marginRight: '15px'}}><SwapOutlined /></span> + <span onClick={() => this.copy(record)} style={{color: '#26C281', cursor: 'pointer', fontSize: '16px', marginRight: '15px'}}><CopyOutlined /></span> <Popconfirm overlayClassName="popover-confirm" title="纭畾鍒犻櫎锛�" @@ -107,8 +107,46 @@ }) } - handleEdit = (record) => { - this.setState({card: record, setvisible: true}) + handleStatus = (record) => { + const { config } = this.props + + if (record.status === 'false') { + if (record.setting.interType === 'system' && record.setting.execute !== 'false' && !record.setting.dataresource) { + notification.warning({ + top: 92, + message: '鏈缃暟鎹簮锛屼笉鍙惎鐢紒', + duration: 5 + }) + return + } else if (!record.setting.primaryKey) { + notification.warning({ + top: 92, + message: '鏈缃富閿紝涓嶅彲鍚敤锛�', + duration: 5 + }) + return + } else if (record.columns.length === 0) { + notification.warning({ + top: 92, + message: '鏈坊鍔犲瓧娈甸泦锛屼笉鍙惎鐢紒', + duration: 5 + }) + return + } + } + + record = fromJS(record).toJS() + record.status = record.status === 'false' ? 'true' : 'false' + + let interfaces = this.state.interfaces.map(item => { + if (item.uuid !== record.uuid) { + return item + } + return record + }) + + this.setState({ interfaces }) + this.props.updateConfig({...config, interfaces}) } deleteScript = (record) => { @@ -122,41 +160,70 @@ changeScripts = (interfaces) => { const { config } = this.props + interfaces = interfaces.map(item => { + item.$tables = this.getTables(item) + return item + }) + this.setState({ interfaces }) this.props.updateConfig({...config, interfaces}) } - settingSave = () => { + getTables = (record) => { + let tables = [] + let cuts = [] + let cutreg = /(from|update|insert\s+into)\s+(@db@)?[a-z_]+/ig + let trimreg = /(from|update|insert\s+into)\s+(@db@)?/ig + + if (record.setting.interType === 'system') { + if (record.setting.execute !== 'false') { + let tbs = record.setting.dataresource.match(cutreg) + tbs && cuts.push(...tbs) + } + record.scripts && record.scripts.forEach(script => { + if (script.status === 'false') return + let tbs = script.sql.match(cutreg) + tbs && cuts.push(...tbs) + }) + } else { + let tb = record.setting.tableName.replace(/@db@|\s+/ig, '') + if (/[a-z_]+/ig.test(tb)) { + tables.push(tb) + } + } + + cuts = cuts.map(item => item.replace(trimreg, '')) + tables.push(...cuts) + tables = tables.filter(Boolean) + tables = Array.from(new Set(tables)) + + return tables + } + + update = (record) => { const { config } = this.props - const { card } = this.state - let interfaces = fromJS(this.state.interfaces).toJS() - this.settingRef.handleConfirm().then(res => { - interfaces = interfaces.map(item => { - if (item.uuid === card.uuid) { - res.uuid = item.uuid + if (record.setting.primaryKey && record.columns.length > 0) { + record.status = 'true' + } else if (record.columns.length === 0) { + record.status = 'false' + } + record.name = record.setting.name + record.$tables = this.getTables(record) - if (res.procMode !== 'inner' && res.preScripts && res.preScripts.filter(item => item.status !== 'false').length === 0) { - message.warning('鏈缃墠缃剼鏈紝涓嶅彲鍚敤锛�') - res.status = 'false' - } else if (res.callbackType === 'script' && res.cbScripts && res.cbScripts.filter(item => item.status !== 'false').length === 0) { - message.warning('鏈缃洖璋冭剼鏈紝涓嶅彲鍚敤锛�') - res.status = 'false' - } - - return res - } + let interfaces = this.state.interfaces.map(item => { + if (item.uuid !== record.uuid) { return item - }) - - this.setState({ - card: null, - setvisible: false, - interfaces - }) - - this.props.updateConfig({...config, interfaces}) + } + return record }) + + this.setState({ interfaces }) + this.props.updateConfig({...config, interfaces}) + + setTimeout(() => { + MKEmitter.emit('mkUpdateInter', record, {delay: 0}) + }, 10) } addInterface = () => { @@ -165,11 +232,14 @@ interfaces.push({ uuid: Utils.getuuid(), - name: 'interface ' + (interfaces.length + 1), - procMode: 'script', - callbackType: 'script', - preScripts: [], - cbScripts: [] + name: '鏁版嵁婧�' + (interfaces.length + 1), + status: 'false', + format: 'array', + type: 'interface', + pageable: false, + setting: { interType: 'system', name: '鏁版嵁婧�' + (interfaces.length + 1), status: 'false' }, + columns: [], + scripts: [], }) this.setState({ @@ -179,13 +249,13 @@ } render() { - const { visible, setvisible, columns, interfaces, card } = this.state + const { visible, columns, interfaces } = this.state return ( <div className="mk-sys-interface" style={{display: 'inline-block'}}> - <Button className="mk-border-green" onClick={this.trigger}><ApiOutlined /> 鎺ュ彛绠$悊</Button> + <Button className="mk-border-green" onClick={this.trigger}><DatabaseOutlined /> 鍏叡鏁版嵁婧�</Button> <Modal - title="鎺ュ彛绠$悊" + title="鍏叡鏁版嵁婧�" wrapClassName="interface-controller-modal" visible={visible} width={800} @@ -198,20 +268,8 @@ ]} destroyOnClose > - <Button key="add-interface" className="mk-border-green" onClick={this.addInterface}> 娣诲姞 </Button> - <EditTable key="manage-interface" actions={['move', 'copy']} type="interface" data={interfaces} columns={columns} onChange={this.changeScripts}/> - </Modal> - <Modal - title={card ? card.name : '鎺ュ彛'} - wrapClassName="interface-edit-modal" - visible={setvisible} - width={900} - maskClosable={false} - onOk={this.settingSave} - onCancel={() => { this.setState({ setvisible: false })}} - destroyOnClose - > - <SettingForm config={card} wrappedComponentRef={(inst) => this.settingRef = inst}/> + <PlusOutlined key="add-interface" onClick={this.addInterface}/> + <EditTable key="manage-interface" actions={['copy']} type="interface" data={interfaces} columns={columns} onChange={this.changeScripts}/> </Modal> </div> ) -- Gitblit v1.8.0