import { useEffect, useState } from 'react'; import { Card, Col, Row, message, Typography, Descriptions, Progress, Table, Space } from 'antd'; import type { TableColumnsType } from 'antd'; import { SettingOutlined, FileTextOutlined, DesktopOutlined, CoffeeOutlined, HddOutlined, } from '@ant-design/icons'; import dayjs from 'dayjs'; import { getServerInfo } from '../../api/monitor/server'; import type { ServerDiskInfo, ServerInfoResponse } from '@/types/api'; import './server-monitor.css'; const { Text } = Typography; const defaultServerInfo: ServerInfoResponse = { cpu: {}, mem: {}, jvm: {}, sys: {}, sysFiles: [], }; const parseTime = (time?: string | number | Date, pattern = 'YYYY-MM-DD HH:mm:ss'): string => { return time ? dayjs(time).format(pattern) : ''; }; const toNumber = (value: unknown): number => { if (typeof value === 'number') { return Number.isFinite(value) ? value : 0; } if (typeof value === 'string') { const parsed = Number.parseFloat(value); return Number.isFinite(parsed) ? parsed : 0; } return 0; }; const renderUsageProgress = (usage: unknown) => { const percent = Math.floor(toNumber(usage)); let status: 'normal' | 'exception' | 'active' | 'success' = 'normal'; if (percent > 80) { status = 'exception'; } else if (percent > 60) { status = 'active'; } return ; }; const ServerMonitorPage = () => { const [serverInfo, setServerInfo] = useState(defaultServerInfo); const [loading, setLoading] = useState(true); useEffect(() => { const getList = async () => { setLoading(true); const hide = message.loading('正在加载服务监控数据,请稍候!', 0); try { const response = await getServerInfo(); setServerInfo(response); } catch (error: unknown) { console.error('Failed to fetch server info:', error); message.error('获取服务监控数据失败'); } finally { setLoading(false); hide(); } }; void getList(); }, []); const diskColumns: TableColumnsType = [ { title: '盘符路径', dataIndex: 'dirName', align: 'center' }, { title: '文件系统', dataIndex: 'sysTypeName', align: 'center' }, { title: '盘符类型', dataIndex: 'typeName', align: 'center' }, { title: '总大小', dataIndex: 'total', align: 'center' }, { title: '可用大小', dataIndex: 'free', align: 'center' }, { title: '已用大小', dataIndex: 'used', align: 'center' }, { title: '已用百分比', dataIndex: 'usage', align: 'center', render: (usage) => ( 80 ? 'danger' : 'secondary'}> {toNumber(usage)}% {renderUsageProgress(usage)} ), }, ]; return (
CPU} loading={loading}> {serverInfo.cpu?.cpuNum} {serverInfo.cpu?.used}% {renderUsageProgress(serverInfo.cpu?.used)} {serverInfo.cpu?.sys}% {renderUsageProgress(serverInfo.cpu?.sys)} {serverInfo.cpu?.free}% {renderUsageProgress(serverInfo.cpu?.free)} 内存} loading={loading}> 总内存 {serverInfo.mem?.total}G {serverInfo.jvm?.total}M 80 ? 'danger' : 'secondary'}> {serverInfo.mem?.used}G 80 ? 'danger' : 'secondary'}> {serverInfo.jvm?.used}M {serverInfo.mem?.free}G {serverInfo.jvm?.free}M {renderUsageProgress(serverInfo.mem?.usage)} {renderUsageProgress(serverInfo.jvm?.usage)} 服务器信息} loading={loading}> {serverInfo.sys?.computerName} {serverInfo.sys?.osName} {serverInfo.sys?.computerIp} {serverInfo.sys?.osArch} Java虚拟机信息} loading={loading}> {serverInfo.jvm?.name} {serverInfo.jvm?.version} {parseTime(serverInfo.jvm?.startTime)} {serverInfo.jvm?.runTime} {serverInfo.jvm?.home} {serverInfo.sys?.userDir} {serverInfo.jvm?.inputArgs} 磁盘状态} loading={loading}> `${record.dirName ?? 'disk'}-${record.sysTypeName ?? ''}-${record.typeName ?? ''}` } pagination={false} size="small" bordered columns={diskColumns} /> ); }; export default ServerMonitorPage;