政务数据资源中心(Government data Resource center) 03专项3期主要建设内容
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

229 lines
7.4 KiB

import React, { useEffect, useState } from 'react'
import { Spin, Popconfirm, Tree, Row, Col, Button } from 'antd';
import { connect } from 'react-redux';
import ProTable from '@ant-design/pro-table';
import MetaModelModal from '../components/modelModal'
const TreeNode = Tree.TreeNode;
const DATABASE_TYPE = ['目录', '库', '表', '字段', '主键', '外键', '索引'];
function MetaModelManagement(props) {
const { loading, clientHeight, actions, dispatch, metaModel } = props;
const [selectedKeys, setSelectKeys] = useState([DATABASE_TYPE[0]])
const [pageSize, setPageSize] = useState(10);
const [currentPage, setCurrentPage] = useState(1);
const queryData = (search) => {
const query = {
limit: search ? 10 : pageSize || 10,
page: search ? 1 : currentPage || 1,
modelType: selectedKeys[0]
}
dispatch(actions.metadataManagement.getMetaModelList(query));
}
useEffect(() => {
queryData();
}, [pageSize, currentPage, selectedKeys]);
const handleDelete = (id) => {
dispatch(actions.metadataManagement.deleteMetaModel(id)).then(() => {
queryData();
});
};
const onFinish = async (values, editData) => {
if (editData) {
const dataToSave = { ...values }
return dispatch(
actions.metadataManagement.modifyMetaModel(editData.id, dataToSave, values?.msg || ''),
).then(() => {
queryData();
});
}
return dispatch(actions.metadataManagement.addMetaModel({
modelType: selectedKeys[0],
...values,
})).then(() => {
queryData();
});
};
const columns = [
{
title: '属性名称',
dataIndex: 'attributeName',
ellipsis: true,
search: false,
},
{
title: '属性代码',
dataIndex: 'attributeCode',
ellipsis: true,
search: false,
},
{
title: '数据类型',
dataIndex: 'dataType',
ellipsis: true,
search: false,
},
{
title: '输入控件',
dataIndex: 'control',
ellipsis: true,
search: false,
},
{
title: '长度',
dataIndex: 'length',
ellipsis: true,
search: false,
},
{
title: '允许为空',
dataIndex: 'nullable',
ellipsis: true,
search: false,
render: (text, record) => record?.nullable ? '是' : '否'
},
{
title: '是否只读',
dataIndex: 'readOnly',
ellipsis: true,
search: false,
render: (text, record) => record?.readOnly ? '是' : '否'
},
{
title: '描述',
dataIndex: 'description',
ellipsis: true,
search: false,
},
{
title: '操作',
width: 160,
key: 'option',
valueType: 'option',
render: (text, record) => {
const options = [];
options.push(<MetaModelModal
triggerRender={<a>编辑</a>}
editData={record}
title="编辑模型"
onFinish={onFinish}
models={metaModel?.rows || []}
key="editModel"
/>)
options.push(
<Popconfirm
key="del"
placement="top"
title="是否确认删除该模型?"
onConfirm={() => handleDelete(record.id)}
okText="是"
cancelText="否"
>
<a>删除</a>
</Popconfirm>)
return options;
},
},
];
return <Spin spinning={loading}>
<Row>
<Col style={{ width: 240 }}>
<Tree
height={clientHeight - 95}
defaultExpandedKeys={[]}
selectedKeys={selectedKeys}
onSelect={(keys, e) => {
if (e.selected) {
setCurrentPage(1);
setSelectKeys(keys)
}
}}
defaultExpandAll={true}
>
<TreeNode title={'数据库'} key={'数据库'} selectable={false}>
<TreeNode selectable={false} title={'关系型数据库'} key={'关系型数据库'}>
{DATABASE_TYPE.map(s => <TreeNode title={s} key={s} />)}
</TreeNode>
</TreeNode>
<TreeNode title={'文件'} key={'文件'} />
<TreeNode title={'接口'} key={'接口'} />
</Tree>
</Col>
<Col style={{ width: 'calc(100% - 240px)' }}>
<ProTable
columns={columns}
rowKey="id"
request={async (param) => {
}}
dateFormatter="string"
search={false}
scroll={
{
scrollToFirstRowOnChange: true,
y: clientHeight - 260
}
}
pagination={{
size: 'large',
total: metaModel?.count,
showSizeChanger: true,
// showQuickJumper: true,
current: currentPage,
pageSize: pageSize || 10,
pageSizeOptions: [10, 20, 50],
showTotal: (total) => {
return <span style={{ fontSize: 15 }}>{`${Math.ceil(total / pageSize)}页,${total}`}</span>
},
onShowSizeChange: (currentPage, pageSize) => {
setCurrentPage(currentPage);
setPageSize(pageSize);
},
onChange: (page, pageSize) => {
setCurrentPage(page);
setPageSize(pageSize);
}
}}
dataSource={metaModel?.rows || []}
headerTitle={[
<MetaModelModal
triggerRender={<Button type='primary'>新建</Button>}
title="新建模型"
onFinish={onFinish}
key="addModel"
models={metaModel?.rows || []}
/>
]}
options={false}
/>
</Col>
</Row>
</Spin>
}
function mapStateToProps(state) {
const {
auth, global, metaModel
} = state;
return {
loading: metaModel.isRequesting,
clientHeight: global.clientHeight,
actions: global.actions,
metaModel: metaModel?.data || {}
};
}
export default connect(mapStateToProps)(MetaModelManagement);