fix:
parent
57c5589df8
commit
ba305312c9
@ -0,0 +1,337 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Button, Table, Input, Space, Tooltip, message, Card, Row, Col, Select } from 'antd';
|
||||
import { SearchOutlined, PlusOutlined, EditOutlined, DeleteOutlined, ArrowLeftOutlined } from '@ant-design/icons';
|
||||
import { history } from 'umi';
|
||||
import StandardTable from '@/components/StandardTable';
|
||||
import styles from './AtmospherePollutantLibrary.less';
|
||||
|
||||
const { Option } = Select;
|
||||
|
||||
const AtmospherePollutantLibrary = () => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
||||
const [tableData, setTableData] = useState({
|
||||
list: [],
|
||||
pagination: {
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
}
|
||||
});
|
||||
|
||||
// 表格列定义
|
||||
const columns = [
|
||||
{
|
||||
title: '污染物名称',
|
||||
dataIndex: 'pollutantName',
|
||||
key: 'pollutantName',
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '污染物代码',
|
||||
dataIndex: 'pollutantCode',
|
||||
key: 'pollutantCode',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '污染物类型',
|
||||
dataIndex: 'pollutantType',
|
||||
key: 'pollutantType',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: 'CAS号',
|
||||
dataIndex: 'casNumber',
|
||||
key: 'casNumber',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '分子式',
|
||||
dataIndex: 'molecularFormula',
|
||||
key: 'molecularFormula',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '分子量',
|
||||
dataIndex: 'molecularWeight',
|
||||
key: 'molecularWeight',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '排放标准',
|
||||
dataIndex: 'emissionStandard',
|
||||
key: 'emissionStandard',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '监测方法',
|
||||
dataIndex: 'monitoringMethod',
|
||||
key: 'monitoringMethod',
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '危害特性',
|
||||
dataIndex: 'hazardCharacteristics',
|
||||
key: 'hazardCharacteristics',
|
||||
width: 200,
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
width: 120,
|
||||
render: (_, record) => (
|
||||
<Space size="middle">
|
||||
<Tooltip title="编辑">
|
||||
<EditOutlined
|
||||
style={{ color: '#1890ff', cursor: 'pointer' }}
|
||||
onClick={() => handleEdit(record)}
|
||||
/>
|
||||
</Tooltip>
|
||||
<Tooltip title="删除">
|
||||
<DeleteOutlined
|
||||
style={{ color: '#ff4d4f', cursor: 'pointer' }}
|
||||
onClick={() => handleDelete(record)}
|
||||
/>
|
||||
</Tooltip>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
// 模拟表格数据
|
||||
const mockTableData = [
|
||||
{
|
||||
key: '1',
|
||||
pollutantName: '二氧化硫',
|
||||
pollutantCode: 'SO2',
|
||||
pollutantType: '气态污染物',
|
||||
casNumber: '7446-09-5',
|
||||
molecularFormula: 'SO2',
|
||||
molecularWeight: '64.07',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '定电位电解法',
|
||||
hazardCharacteristics: '刺激性气体,对呼吸道有强烈刺激作用'
|
||||
},
|
||||
{
|
||||
key: '2',
|
||||
pollutantName: '氮氧化物',
|
||||
pollutantCode: 'NOx',
|
||||
pollutantType: '气态污染物',
|
||||
casNumber: '10102-43-9',
|
||||
molecularFormula: 'NO2',
|
||||
molecularWeight: '46.01',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '化学发光法',
|
||||
hazardCharacteristics: '刺激性气体,可引起肺水肿'
|
||||
},
|
||||
{
|
||||
key: '3',
|
||||
pollutantName: '颗粒物',
|
||||
pollutantCode: 'PM10',
|
||||
pollutantType: '颗粒物',
|
||||
casNumber: '-',
|
||||
molecularFormula: '-',
|
||||
molecularWeight: '-',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '重量法',
|
||||
hazardCharacteristics: '可吸入颗粒物,影响呼吸系统'
|
||||
},
|
||||
{
|
||||
key: '4',
|
||||
pollutantName: '一氧化碳',
|
||||
pollutantCode: 'CO',
|
||||
pollutantType: '气态污染物',
|
||||
casNumber: '630-08-0',
|
||||
molecularFormula: 'CO',
|
||||
molecularWeight: '28.01',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '非分散红外法',
|
||||
hazardCharacteristics: '无色无味气体,与血红蛋白结合影响氧运输'
|
||||
},
|
||||
{
|
||||
key: '5',
|
||||
pollutantName: '挥发性有机物',
|
||||
pollutantCode: 'VOCs',
|
||||
pollutantType: '有机污染物',
|
||||
casNumber: '-',
|
||||
molecularFormula: '-',
|
||||
molecularWeight: '-',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '气相色谱法',
|
||||
hazardCharacteristics: '具有挥发性,部分具有致癌性'
|
||||
},
|
||||
{
|
||||
key: '6',
|
||||
pollutantName: '苯',
|
||||
pollutantCode: 'C6H6',
|
||||
pollutantType: '有机污染物',
|
||||
casNumber: '71-43-2',
|
||||
molecularFormula: 'C6H6',
|
||||
molecularWeight: '78.11',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '气相色谱法',
|
||||
hazardCharacteristics: '致癌物质,长期接触可导致白血病'
|
||||
},
|
||||
{
|
||||
key: '7',
|
||||
pollutantName: '甲苯',
|
||||
pollutantCode: 'C7H8',
|
||||
pollutantType: '有机污染物',
|
||||
casNumber: '108-88-3',
|
||||
molecularFormula: 'C7H8',
|
||||
molecularWeight: '92.14',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '气相色谱法',
|
||||
hazardCharacteristics: '神经毒性,影响中枢神经系统'
|
||||
},
|
||||
{
|
||||
key: '8',
|
||||
pollutantName: '二甲苯',
|
||||
pollutantCode: 'C8H10',
|
||||
pollutantType: '有机污染物',
|
||||
casNumber: '1330-20-7',
|
||||
molecularFormula: 'C8H10',
|
||||
molecularWeight: '106.17',
|
||||
emissionStandard: 'GB 16297-1996',
|
||||
monitoringMethod: '气相色谱法',
|
||||
hazardCharacteristics: '神经毒性,长期接触可影响造血系统'
|
||||
}
|
||||
];
|
||||
|
||||
useEffect(() => {
|
||||
setTableData({
|
||||
list: mockTableData,
|
||||
pagination: {
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: mockTableData.length
|
||||
}
|
||||
});
|
||||
}, []);
|
||||
|
||||
// 处理编辑操作
|
||||
const handleEdit = (record) => {
|
||||
message.info(`编辑 ${record.pollutantName} 功能开发中`);
|
||||
};
|
||||
|
||||
// 处理删除操作
|
||||
const handleDelete = (record) => {
|
||||
message.success(`删除 ${record.pollutantName} 成功`);
|
||||
};
|
||||
|
||||
// 处理新增操作
|
||||
const handleAdd = () => {
|
||||
message.info('新增功能开发中');
|
||||
};
|
||||
|
||||
// 处理表格变化
|
||||
const handleTableChange = (pagination) => {
|
||||
setTableData(prev => ({
|
||||
...prev,
|
||||
pagination: {
|
||||
...prev.pagination,
|
||||
current: pagination.current,
|
||||
pageSize: pagination.pageSize
|
||||
}
|
||||
}));
|
||||
};
|
||||
|
||||
// 处理搜索
|
||||
const handleSearch = (value) => {
|
||||
message.info(`搜索: ${value}`);
|
||||
};
|
||||
|
||||
// 处理返回操作
|
||||
const handleBack = () => {
|
||||
history.goBack();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={styles.atmospherePollutantLibrary}>
|
||||
{/* 页面头部 */}
|
||||
<div className={styles.pageHeader}>
|
||||
<div className={styles.headerLeft}>
|
||||
<Button
|
||||
type="text"
|
||||
icon={<ArrowLeftOutlined />}
|
||||
onClick={handleBack}
|
||||
className={styles.backButton}
|
||||
>
|
||||
返回
|
||||
</Button>
|
||||
<div className={styles.pageTitle}>
|
||||
<h1>大气污染特征污染物名录库</h1>
|
||||
<p>待开发暂定</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 搜索和操作区域 */}
|
||||
<Card className={styles.searchCard}>
|
||||
<Row gutter={16} align="middle">
|
||||
<Col span={6}>
|
||||
<Input.Search
|
||||
placeholder="请输入污染物名称或代码"
|
||||
allowClear
|
||||
enterButton={<SearchOutlined />}
|
||||
onSearch={handleSearch}
|
||||
className={styles.searchInput}
|
||||
/>
|
||||
</Col>
|
||||
<Col span={4}>
|
||||
<Select placeholder="污染物类型" allowClear className={styles.filterSelect}>
|
||||
<Option value="气态污染物">气态污染物</Option>
|
||||
<Option value="颗粒物">颗粒物</Option>
|
||||
<Option value="有机污染物">有机污染物</Option>
|
||||
</Select>
|
||||
</Col>
|
||||
<Col span={4}>
|
||||
<Select placeholder="排放标准" allowClear className={styles.filterSelect}>
|
||||
<Option value="GB 16297-1996">GB 16297-1996</Option>
|
||||
<Option value="GB 3095-2012">GB 3095-2012</Option>
|
||||
</Select>
|
||||
</Col>
|
||||
<Col span={4} offset={6}>
|
||||
<Button
|
||||
type="primary"
|
||||
icon={<PlusOutlined />}
|
||||
onClick={handleAdd}
|
||||
className={styles.addButton}
|
||||
>
|
||||
新增污染物
|
||||
</Button>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
{/* 数据表格 */}
|
||||
<Card className={styles.tableCard}>
|
||||
<StandardTable
|
||||
columns={columns}
|
||||
data={tableData}
|
||||
onChange={handleTableChange}
|
||||
rowKey="key"
|
||||
size="small"
|
||||
rowSelection={{
|
||||
selectedRowKeys,
|
||||
onChange: setSelectedRowKeys,
|
||||
getCheckboxProps: (record) => ({
|
||||
name: record.pollutantName,
|
||||
}),
|
||||
}}
|
||||
pagination={{
|
||||
showTotal: (total, range) => `共 ${total} 条`,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
defaultPageSize: 10,
|
||||
size: 'small',
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default AtmospherePollutantLibrary;
|
||||
@ -0,0 +1,166 @@
|
||||
.atmospherePollutantLibrary {
|
||||
padding: 24px;
|
||||
background: #f5f5f5;
|
||||
min-height: 100vh;
|
||||
|
||||
.pageHeader {
|
||||
margin-bottom: 24px;
|
||||
background: #fff;
|
||||
padding: 24px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.headerLeft {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
|
||||
.backButton {
|
||||
color: #1890ff;
|
||||
font-size: 16px;
|
||||
padding: 8px 16px;
|
||||
height: auto;
|
||||
border: 1px solid #d9d9d9;
|
||||
border-radius: 6px;
|
||||
transition: all 0.3s;
|
||||
|
||||
&:hover {
|
||||
color: #40a9ff;
|
||||
border-color: #40a9ff;
|
||||
background: #f0f8ff;
|
||||
}
|
||||
}
|
||||
|
||||
.pageTitle {
|
||||
h1 {
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
color: #262626;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 8px 0 0 0;
|
||||
font-size: 14px;
|
||||
color: #8c8c8c;
|
||||
line-height: 1.4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.searchCard {
|
||||
margin-bottom: 24px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.searchInput {
|
||||
.ant-input-search-button {
|
||||
background: #1890ff;
|
||||
border-color: #1890ff;
|
||||
|
||||
&:hover {
|
||||
background: #40a9ff;
|
||||
border-color: #40a9ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.filterSelect {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.addButton {
|
||||
background: #52c41a;
|
||||
border-color: #52c41a;
|
||||
font-weight: 500;
|
||||
|
||||
&:hover {
|
||||
background: #73d13d;
|
||||
border-color: #73d13d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tableCard {
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
|
||||
:global(.ant-table) {
|
||||
.ant-table-thead > tr > th {
|
||||
background: #fafafa;
|
||||
font-weight: 600;
|
||||
color: #262626;
|
||||
border-bottom: 2px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.ant-table-tbody > tr > td {
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.ant-table-tbody > tr:hover > td {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
}
|
||||
|
||||
:global(.ant-pagination) {
|
||||
margin-top: 16px;
|
||||
text-align: right;
|
||||
|
||||
.ant-pagination-total-text {
|
||||
color: #8c8c8c;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 响应式设计
|
||||
@media (max-width: 768px) {
|
||||
padding: 16px;
|
||||
|
||||
.pageHeader {
|
||||
padding: 16px;
|
||||
|
||||
.headerLeft {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
|
||||
.pageTitle h1 {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.searchCard {
|
||||
:global(.ant-row) {
|
||||
.ant-col {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 表格操作按钮样式
|
||||
:global(.ant-table-tbody) {
|
||||
.anticon {
|
||||
font-size: 16px;
|
||||
transition: all 0.3s;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 卡片阴影效果
|
||||
.searchCard,
|
||||
.tableCard {
|
||||
transition: box-shadow 0.3s;
|
||||
|
||||
&:hover {
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue