refactor(services): 重构服务文件结构,将服务按功能分类到不同目录

- 将服务文件按功能分类到core、ai、analytics、security等目录
- 修复logger导入路径问题,统一使用相对路径
- 更新相关文件的导入路径引用
- 添加新的批量操作组件导出文件
- 修复dashboard页面中的类型错误
- 添加dotenv依赖到package.json
This commit is contained in:
2026-03-25 13:46:26 +08:00
parent e59d7c6620
commit 2748456d8a
598 changed files with 74404 additions and 9576 deletions

View File

@@ -0,0 +1,154 @@
import React, { useState, useEffect } from 'react';
import { Card, Table, Button, Space, Input, message, Tag, Modal, Form, Select, DatePicker, Row, Col, Statistic } from 'antd';
import { ReloadOutlined, PlusOutlined, SearchOutlined } from '@ant-design/icons';
import { MonitoringDataSource } from '@/services/monitoringDataSource';
import type { MonitoringItem } from '@/services/monitoringDataSource';
const { Option } = Select;
const { RangePicker } = DatePicker;
const MonitoringPage: React.FC = () => {
const [data, setData] = useState<MonitoringItem[]>([]);
const [loading, setLoading] = useState(false);
const [searchText, setSearchText] = useState('');
const [modalVisible, setModalVisible] = useState(false);
const [form] = Form.useForm();
useEffect(() => {
loadData();
}, []);
const loadData = async () => {
setLoading(true);
try {
const result = await MonitoringDataSource.list();
setData(result);
} catch (error: unknown) {
const errorMessage = error instanceof Error ? error.message : String(error);
message.error(`加载失败: ${errorMessage}`);
} finally {
setLoading(false);
}
};
const handleCreate = async (values: any) => {
try {
await MonitoringDataSource.create(values);
message.success('创建成功');
setModalVisible(false);
form.resetFields();
loadData();
} catch (error: unknown) {
const errorMessage = error instanceof Error ? error.message : String(error);
message.error(`创建失败: ${errorMessage}`);
}
};
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 200,
},
{
title: '名称',
dataIndex: 'name',
key: 'name',
},
{
title: '状态',
dataIndex: 'status',
key: 'status',
render: (status: string) => {
const color = status === 'ACTIVE' ? 'green' : status === 'INACTIVE' ? 'red' : 'default';
return <Tag color={color}>{status}</Tag>;
},
},
{
title: '创建时间',
dataIndex: 'createdAt',
key: 'createdAt',
width: 180,
},
{
title: '操作',
key: 'action',
width: 150,
render: (_: any, record: MonitoringItem) => (
<Space>
<Button type="link" size="small"></Button>
<Button type="link" size="small"></Button>
</Space>
),
},
];
return (
<div>
<Card>
<Row gutter={16} style={{ marginBottom: 16 }}>
<Col span={6}>
<Statistic title="总数" value={data.length} />
</Col>
<Col span={6}>
<Statistic
title="活跃"
value={data.filter(item => item.status === 'ACTIVE').length}
valueStyle={{ color: '#3f8600' }}
/>
</Col>
</Row>
<div style={{ marginBottom: 16 }}>
<Space>
<Input
placeholder="搜索..."
prefix={<SearchOutlined />}
value={searchText}
onChange={(e) => setSearchText(e.target.value)}
style={{ width: 200 }}
/>
<Button type="primary" icon={<PlusOutlined />} onClick={() => setModalVisible(true)}>
</Button>
<Button icon={<ReloadOutlined />} onClick={loadData}>
</Button>
</Space>
</div>
<Table
columns={columns}
dataSource={data.filter(item =>
item.name?.toLowerCase().includes(searchText.toLowerCase())
)}
rowKey="id"
loading={loading}
pagination={{ pageSize: 20 }}
/>
</Card>
<Modal
title="新建"
open={modalVisible}
onCancel={() => setModalVisible(false)}
onOk={() => form.submit()}
>
<Form form={form} layout="vertical" onFinish={handleCreate}>
<Form.Item name="name" label="名称" rules={[{ required: true }]}>
<Input placeholder="请输入名称" />
</Form.Item>
<Form.Item name="status" label="状态" rules={[{ required: true }]}>
<Select placeholder="请选择状态">
<Option value="ACTIVE"></Option>
<Option value="INACTIVE"></Option>
</Select>
</Form.Item>
</Form>
</Modal>
</div>
);
};
export default MonitoringPage;