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;