226 lines
6.4 KiB
TypeScript
Raw Normal View History

2025-05-15 14:05:03 +08:00
import React, { useState, useEffect } from 'react';
import { Table, Button, message, Space, Spin, Form, Input, Select, Modal } from 'antd';
import TemplateContainer from '@/pages/TemplateContainer';
import { useModel } from '@umijs/max';
2025-05-15 14:05:03 +08:00
import { objectToQueryString } from '@/services/services/common';
import { GetDataInfoTypeOption, GetDataInfoTypeOptions } from '@/services/enum/dataInfo';
import { SearchOutlined } from '@ant-design/icons';
import { ColumnsType } from 'antd/lib/table';
import JsonView from '@uiw/react-json-view';
import cusRequest from '@/request';
2025-05-15 14:05:03 +08:00
const DataInfo: React.FC = () => {
const [loading, setLoading] = useState<boolean>(false);
const [dataList, setDataList] = useState<DataInfoModel.DataInfoBase[]>([]);
const { initialState } = useModel('@@initialState');
const [messageApi, messageHolder] = message.useMessage();
const [form] = Form.useForm();
const [tableParams, setTableParams] = useState<TableModel.TableParams>({
pagination: {
current: 1,
pageSize: 10,
showQuickJumper: true,
totalBoundaryShowSizeChanger: true,
},
});
useEffect(() => {
QueryDataInfoCollection(tableParams, form.getFieldsValue());
}, []);
async function QueryDataInfoCollection(tableParams: TableModel.TableParams, options?: any) {
try {
setLoading(true);
let data = {
...options,
page: tableParams.pagination?.current,
pageSize: tableParams.pagination?.pageSize,
};
let query = objectToQueryString(data);
let res = await cusRequest<DataInfoModel.QueryDataInfoData>(`/lms/Other/QueryDataInfoCollection?${query}`, {
2025-05-15 14:05:03 +08:00
method: 'GET',
});
if (res.code != 1) {
throw new Error(res.message);
}
let resData = res.data;
if (resData?.collection == undefined) {
messageApi.error('请求获取数据为空,请重试!');
return;
}
2025-05-15 14:05:03 +08:00
setDataList(resData.collection);
setTableParams({
pagination: {
...tableParams.pagination,
total: resData.total,
},
});
messageApi.success('Data fetched successfully');
} catch (error: any) {
messageApi.error(error.message);
} finally {
setLoading(false);
}
}
const [isModalVisible, setIsModalVisible] = useState<boolean>(false);
const [currentJsonData, setCurrentJsonData] = useState<any>(null);
const [isJsonFormat, setIsJsonFormat] = useState<boolean>(false);
function CheckJson(str: string) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
// Function to handle clicking on data
const handleDataClick = (dataString: string) => {
let isJsonString = CheckJson(dataString);
if (isJsonString) {
const jsonData = JSON.parse(dataString);
setCurrentJsonData(jsonData);
setIsJsonFormat(true);
} else {
// 不是JSON格式直接展示原始字符串
setCurrentJsonData(dataString);
setIsJsonFormat(false);
}
setIsModalVisible(true);
};
// 关闭Modal的函数
const handleModalClose = () => {
setIsModalVisible(false);
setCurrentJsonData(null);
};
const columns: ColumnsType<DataInfoModel.DataInfoBase> = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
},
{
title: '类型',
dataIndex: 'type',
key: 'type',
render: (text, record) => GetDataInfoTypeOption(record.type),
},
{
title: '数据字符串',
dataIndex: 'dataString',
key: 'dataString',
width: 250,
ellipsis: {
showTitle: false,
},
render: (text) => (
<a onClick={() => handleDataClick(text)} style={{ cursor: 'pointer', color: 'black' }}>
{text}
</a>
),
},
{
title: '创建时间',
dataIndex: 'createdTime',
key: 'createdTime',
width: 180,
},
{
title: 'Actions',
key: 'actions',
render: (_: any) => (
<Space size="middle">
<Button type="link" danger>
Delete
</Button>
</Space>
),
},
];
return (
<TemplateContainer navTheme={initialState?.settings?.navTheme ?? 'light'}>
2025-05-15 14:05:03 +08:00
<Spin spinning={loading}>
<Form
form={form}
layout="inline"
onFinish={(values) => QueryDataInfoCollection(tableParams, values)}
style={{ marginBottom: 16 }}
>
{/* <Form.Item name="id" label="ID">
<Input placeholder="ID" style={{ width: 200 }} />
</Form.Item>
<Form.Item name="dataString" label="数据字符串">
<Input placeholder="数据字符串" style={{ width: 200 }} />
</Form.Item> */}
<Form.Item name="type" label="数据类型">
<Select
placeholder="数据类型"
style={{ width: 180 }}
allowClear
options={GetDataInfoTypeOptions()}
/>
</Form.Item>
<Form.Item>
<Space>
<Button type="primary" htmlType="submit" icon={<SearchOutlined />}>
</Button>
<Button onClick={() => form.resetFields()}></Button>
</Space>
</Form.Item>
</Form>
<Table columns={columns} dataSource={dataList} rowKey="id" pagination={{ pageSize: 10 }} />
{/* JSON 数据查看器 Modal */}
<Modal
title="数据详情"
open={isModalVisible}
onCancel={handleModalClose}
footer={null}
width={800}
>
{isJsonFormat ? (
<JsonView
value={currentJsonData}
displayDataTypes={false}
displayObjectSize={false}
enableClipboard={true}
style={{
padding: '10px',
borderRadius: '4px',
maxHeight: '70vh',
overflow: 'auto',
}}
/>
) : (
<pre
style={{
whiteSpace: 'pre-wrap',
wordWrap: 'break-word',
maxHeight: '70vh',
overflow: 'auto',
padding: '10px',
background: '#f5f5f5',
borderRadius: '4px',
}}
>
{currentJsonData}
</pre>
)}
</Modal>
</Spin>
{messageHolder}
</TemplateContainer>
);
};
export default DataInfo;