peng.peng
2 years ago
8 changed files with 1495 additions and 1182 deletions
File diff suppressed because it is too large
@ -0,0 +1,237 @@ |
|||
import React, { useEffect, useState } from 'react'; |
|||
import { connect } from 'react-redux'; |
|||
import { Modal, Input, Form, Tabs, Avatar, Checkbox, Button, Select } from 'antd'; |
|||
import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons'; |
|||
const { TabPane } = Tabs; |
|||
const { TextArea } = Input; |
|||
const CheckboxGroup = Checkbox.Group; |
|||
const ReleaseModal = ({ actions, dispatch, onConfirm, onCancel, editData = {} }) => { |
|||
|
|||
const { metadataManagement } = actions; |
|||
const [activeKey, setActiveKeyl] = useState("field") |
|||
const [fieldList, setFiedList] = useState([]) |
|||
const [fieldData, setFiedData] = useState([]) |
|||
const [database, setDatabase] = useState({}) |
|||
const [fieldValue, setFiedValue] = useState([]) |
|||
const [indeterminate, setIndeterminate] = useState(false) |
|||
const [fromData, setFromData] = useState([{ value1: '', value2: '', value3: '' }]) |
|||
const [sql, setSql] = useState() |
|||
const [form] = Form.useForm(); |
|||
useEffect(() => { |
|||
|
|||
dispatch(metadataManagement.listStructuredData({ id: editData?.id, parent: editData?.parent })).then(res => { |
|||
if (res.success) { |
|||
setFiedData(res.payload.data?.field || []) |
|||
setFiedList(res.payload.data?.field?.map(v => v.code) || []) |
|||
setDatabase(res.payload.data?.database || {}) |
|||
} |
|||
|
|||
}) |
|||
}, []); |
|||
|
|||
|
|||
|
|||
let operator = [{ value: '=', label: '=' }, |
|||
{ value: '!=', label: '!=' }, |
|||
{ value: '>', label: '>' }, |
|||
{ value: '<', label: '<' }, |
|||
{ value: '>=', label: '>=' }, |
|||
{ value: '<=', label: '<=' }, |
|||
{ value: 'BETWEEN', label: 'BETWEEN' }, |
|||
{ value: 'LIKE', label: 'LIKE' }, |
|||
{ value: 'IN', label: 'IN' }] |
|||
|
|||
return ( |
|||
<Modal title={'发布REST服务'} open={true} destroyOnClose |
|||
width={800} |
|||
// onOk={() => handleOk(null)}
|
|||
onCancel={onCancel} |
|||
footer={null} |
|||
> |
|||
<div style={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-around' }}> |
|||
{[{ name: '选择字段', key: "field" }, |
|||
{ name: '配置条件', key: "condition" }, |
|||
{ name: '预览SQL', key: "SQL" }, |
|||
{ name: '服务发布', key: "release" }].map((v, index) => { |
|||
let title = [] |
|||
if (index > 0) { |
|||
title.push(<div style={{ width: '14%', border: '1px solid #0000004a' }}></div>) |
|||
} |
|||
title.push(<div style={{ width: '14%', color: activeKey == v.key ? '#1e6ee5' : "", }}> |
|||
<Avatar style={{ |
|||
backgroundColor: activeKey == v.key ? "rgb(30 110 229 / 74%)" : 'rgb(200 192 185)' |
|||
}} |
|||
size="large" icon={index + 1} /> |
|||
{v.name} |
|||
</div>) |
|||
return title |
|||
})} |
|||
</div> |
|||
<Tabs activeKey={activeKey} onChange={v => { |
|||
setActiveKeyl(v) |
|||
}} > |
|||
|
|||
|
|||
<TabPane key="field"> |
|||
<div style={{ fontSize: 20, fontWeight: 600 }}>选择字段</div> |
|||
{/* <div style={{ marginLeft: 20 }}> */} |
|||
<Checkbox indeterminate={indeterminate} style={{ margin: '20px 40px' }} onChange={e => { |
|||
setFiedValue(e.target.checked ? fieldList : []); |
|||
setIndeterminate(e.target.checked); |
|||
}}> |
|||
全选 |
|||
</Checkbox> |
|||
<div style={{ display: 'flex', marginLeft: 40 }}> |
|||
<div style={{ marginRight: 8 }}>字段:</div> |
|||
<CheckboxGroup options={fieldList} value={fieldValue} onChange={v => { |
|||
setFiedValue(v) |
|||
if (v?.length == fieldList?.length) { |
|||
setIndeterminate(true) |
|||
} else { |
|||
setIndeterminate(false) |
|||
} |
|||
}} /> |
|||
</div> |
|||
</TabPane> |
|||
|
|||
|
|||
<TabPane key="condition"> |
|||
<div style={{ fontSize: 20, margin: '20px 0', fontWeight: 600 }}>配置条件:</div> |
|||
{fromData?.map((f, index) => { |
|||
return <div key={'key' + index} style={{ display: 'flex', marginBottom: 16 }}> |
|||
<Select |
|||
style={{ width: 200, marginRight: 10 }} value={f.value1 || null} |
|||
placeholder="请选择字段" |
|||
onChange={v => { |
|||
fromData?.splice(index, 1, { value1: v, value2: f.value2, value3: f.value3 }) |
|||
setFromData([...fromData]) |
|||
}} |
|||
options={fieldValue?.map(d => ({ value: d, label: d })) || []} |
|||
allowClear |
|||
/> |
|||
<Select |
|||
style={{ width: 200, marginRight: 10 }} value={f.value2 || null} |
|||
placeholder="请选择条件" |
|||
onChange={v => { |
|||
fromData?.splice(index, 1, { value1: f.value1, value2: v, value3: f.value3 }) |
|||
setFromData([...fromData]) |
|||
}} |
|||
options={operator} |
|||
allowClear |
|||
/> |
|||
<Input |
|||
style={{ width: 200, marginRight: 10 }} value={f.value3} |
|||
placeholder="请输入值" |
|||
onChange={v => { |
|||
fromData?.splice(index, 1, { value1: f.value1, value2: f.value2, value3: v?.target?.value }) |
|||
setFromData([...fromData]) |
|||
}} |
|||
allowClear |
|||
/> |
|||
{index == 0 ? |
|||
<PlusCircleOutlined style={{ fontSize: 20, marginTop: 6 }} onClick={() => { |
|||
fromData?.splice(index, 0, { value1: '', value2: '', value3: '' }) |
|||
setFromData([...fromData]) |
|||
}} /> |
|||
: <MinusCircleOutlined style={{ fontSize: 20, marginTop: 6 }} onClick={() => { |
|||
fromData?.splice(index, 1) |
|||
setFromData([...fromData]) |
|||
}} /> |
|||
} |
|||
</div> |
|||
})} |
|||
</TabPane> |
|||
|
|||
<TabPane key="SQL"> |
|||
<div style={{ fontSize: 20, marginBottom: 20, fontWeight: 600, display: 'flex', justifyContent: 'space-between' }}>预览SQL:<Button onClick={() => { |
|||
|
|||
console.log(editData); |
|||
console.log(database); |
|||
console.log(fromData); |
|||
let whereOption = [] |
|||
fromData.map(s => { |
|||
whereOption.push(`${editData?.code}.${s.value1} ${s.value2} ${s.value3}`); |
|||
}) |
|||
|
|||
let sqlData = `SELECT * FROM ${editData?.code} ${fromData.length ? 'WHERE ' + whereOption.join(' AND ') : ''}` |
|||
|
|||
setSql(sqlData) |
|||
}}>生成SQL</Button></div> |
|||
<TextArea value={sql} autoSize={{ minRows: 5 }} disabled={true} /> |
|||
|
|||
|
|||
</TabPane> |
|||
<TabPane key="release"> |
|||
<div style={{ fontSize: 20, marginBottom: 10, fontWeight: 600 }}>服务发布:</div> |
|||
<div style={{ display: 'flex' }}>接口名称:<Input style={{ width: 180 }} placeholder='请输入' /></div> |
|||
<div style={{ display: 'flex', margin: '10px 0 10px 30px' }}>URL: <Select |
|||
style={{ width: 200, marginRight: 10 }} |
|||
onChange={v => { |
|||
|
|||
}} |
|||
defaultValue={"GET"} |
|||
options={[{ value: "GET", label: "GET" }, |
|||
{ value: "POST", label: "POST" }, |
|||
{ value: "PUT", label: "PUT" }, |
|||
{ value: "DEL", label: "DEL" },]} |
|||
allowClear |
|||
/> |
|||
<Input style={{ width: 180, marginLeft: 20 }} placeholder='请输入' /> |
|||
</div> |
|||
<div style={{ display: 'flex', marginLeft: 20 }}>返回值: |
|||
<div style={{ display: 'flex', width: 250, flexDirection: 'column', alignItems: 'center' }}> |
|||
<div key={'fieldData' + index} style={{ display: 'flex' }}> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>名称</div> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>意义</div> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>说明</div> |
|||
</div> |
|||
{fieldData?.map((s, index) => { |
|||
return <div key={'fieldData' + index} style={{ display: 'flex' }}> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>{s.code}</div> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>{s.name}</div> |
|||
<div style={{ width: 80, border: '1px solid #dcc' }}>{s.type}</div> |
|||
</div> |
|||
})} |
|||
</div> |
|||
</div> |
|||
</TabPane> |
|||
</Tabs > |
|||
|
|||
|
|||
<div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: 20 }}> |
|||
{activeKey == 'condition' || activeKey == 'SQL' || activeKey == 'release' ? <Button type="primary" onClick={() => { |
|||
if (activeKey == 'condition') { |
|||
setActiveKeyl('field') |
|||
} else if (activeKey == 'SQL') { |
|||
setActiveKeyl('condition') |
|||
} else if (activeKey == 'release') { |
|||
setActiveKeyl('SQL') |
|||
} |
|||
}}>上一步</Button> : ""} |
|||
{activeKey == 'condition' || activeKey == 'SQL' || activeKey == 'field' ? <Button style={{ marginLeft: 10 }} type="primary" onClick={() => { |
|||
if (activeKey == 'field') { |
|||
setActiveKeyl('condition') |
|||
} else if (activeKey == 'condition') { |
|||
setActiveKeyl('SQL') |
|||
} else if (activeKey == 'SQL') { |
|||
setActiveKeyl('release') |
|||
} |
|||
}}>下一步</Button> : ""} |
|||
{activeKey == 'release' ? <Button type="primary" style={{ marginLeft: 10 }} onClick={() => { |
|||
|
|||
}}>完成 </Button> : ""} |
|||
<Button style={{ marginLeft: 10 }} onClick={() => onCancel()}>取消</Button> |
|||
</div> |
|||
|
|||
</Modal > |
|||
) |
|||
} |
|||
function mapStateToProps (state) { |
|||
const { global, auth, } = state; |
|||
return { |
|||
user: auth.user, |
|||
actions: global.actions, |
|||
clientHeight: global.clientHeight, |
|||
}; |
|||
} |
|||
export default connect(mapStateToProps)(ReleaseModal) |
Loading…
Reference in new issue