import { useEffect, useRef, useState, type ReactNode } from 'react' import { Button, Card, Form, Input, InputNumber, message, Select, Space, Switch, Table, Tabs, Tag, Typography, } from 'antd' import axios from 'axios' import AppLayout from '../../components/AppLayout/AppLayout' const { Title, Text } = Typography interface SystemSettings { system_name: string refresh_interval: number auto_refresh: boolean data_retention_days: number max_concurrent_tasks: number } interface NotificationSettings { email_enabled: boolean email_address: string critical_alerts: boolean warning_alerts: boolean daily_summary: boolean } interface SecuritySettings { session_timeout: number max_login_attempts: number password_policy: string } interface CollectorSettings { id: number name: string source: string module: string priority: string frequency_minutes: number frequency: string is_active: boolean last_run_at: string | null last_status: string | null next_run_at: string | null } function SettingsPanel({ loading, children, }: { loading: boolean children: ReactNode }) { return (
{children}
) } function Settings() { const [loading, setLoading] = useState(true) const [savingCollectorId, setSavingCollectorId] = useState(null) const [collectors, setCollectors] = useState([]) const collectorTableRegionRef = useRef(null) const [collectorTableHeight, setCollectorTableHeight] = useState(360) const [systemForm] = Form.useForm() const [notificationForm] = Form.useForm() const [securityForm] = Form.useForm() const fetchSettings = async () => { try { setLoading(true) const response = await axios.get('/api/v1/settings') systemForm.setFieldsValue(response.data.system) notificationForm.setFieldsValue(response.data.notifications) securityForm.setFieldsValue(response.data.security) setCollectors(response.data.collectors || []) } catch (error) { message.error('获取系统配置失败') console.error(error) } finally { setLoading(false) } } useEffect(() => { fetchSettings() }, []) useEffect(() => { const updateTableHeight = () => { const regionHeight = collectorTableRegionRef.current?.offsetHeight || 0 setCollectorTableHeight(Math.max(220, regionHeight - 56)) } updateTableHeight() if (typeof ResizeObserver === 'undefined') { return undefined } const observer = new ResizeObserver(updateTableHeight) if (collectorTableRegionRef.current) observer.observe(collectorTableRegionRef.current) return () => observer.disconnect() }, [collectors.length]) const saveSection = async (section: 'system' | 'notifications' | 'security', values: object) => { try { await axios.put(`/api/v1/settings/${section}`, values) message.success('配置已保存') await fetchSettings() } catch (error) { message.error('保存失败') console.error(error) } } const updateCollectorField = (id: number, field: keyof CollectorSettings, value: string | number | boolean) => { setCollectors((prev) => prev.map((collector) => (collector.id === id ? { ...collector, [field]: value } : collector)) ) } const saveCollector = async (collector: CollectorSettings) => { try { setSavingCollectorId(collector.id) await axios.put(`/api/v1/settings/collectors/${collector.id}`, { is_active: collector.is_active, priority: collector.priority, frequency_minutes: collector.frequency_minutes, }) message.success(`${collector.name} 配置已更新`) await fetchSettings() } catch (error) { message.error('采集调度配置保存失败') console.error(error) } finally { setSavingCollectorId(null) } } const collectorColumns = [ { title: '数据源', dataIndex: 'name', key: 'name', render: (_: string, record: CollectorSettings) => (
{record.name}
{record.source}
), }, { title: '层级', dataIndex: 'module', key: 'module', width: 90, render: (module: string) => {module}, }, { title: '优先级', dataIndex: 'priority', key: 'priority', width: 130, render: (priority: string, record: CollectorSettings) => ( ), }, { key: 'notifications', label: '通知策略', children: (
saveSection('notifications', values)}>
), }, { key: 'security', label: '安全策略', children: (
saveSection('security', values)}>