import { CloudServerOutlined, HddOutlined, ReloadOutlined, ThunderboltOutlined } from '@ant-design/icons' import { useEffect, useMemo, useState } from 'react' import { Button, Card, Col, Progress, Row, Skeleton, Space, Statistic, Typography } from 'antd' import { Bar, BarChart, CartesianGrid, Cell, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts' import { inventoryApi } from '@/lib/api' import type { ServerState } from '@/types/system' function formatStorageFromMb(valueMb: number) { if (valueMb >= 1024 * 1024) { return `${(valueMb / (1024 * 1024)).toFixed(2)} TB` } if (valueMb >= 1024) { return `${(valueMb / 1024).toFixed(1)} GB` } return `${valueMb} MB` } export function ServerStatePage() { const [server, setServer] = useState(null) const [loading, setLoading] = useState(true) const loadServerInfo = async () => { setLoading(true) try { const response = await inventoryApi.getServerInfo() setServer(response.data.server) } finally { setLoading(false) } } useEffect(() => { void loadServerInfo() }, []) const cpuChartData = useMemo( () => server?.cpu.cpus.map((usage, index) => ({ name: `CPU ${index + 1}`, usage: Number(usage.toFixed(1)), })) || [], [server], ) const averageCpuUsage = useMemo(() => { if (!cpuChartData.length) { return 0 } const total = cpuChartData.reduce((sum, item) => sum + item.usage, 0) return Number((total / cpuChartData.length).toFixed(1)) }, [cpuChartData]) const diskSummary = useMemo(() => { const disks = server?.disk || [] const totalMb = disks.reduce((sum, item) => sum + item.totalMb, 0) const usedMb = disks.reduce((sum, item) => sum + item.usedMb, 0) const usedPercent = totalMb ? Number(((usedMb / totalMb) * 100).toFixed(1)) : 0 return { totalMb, usedMb, usedPercent } }, [server]) return (
服务器状态 页面按 CPU、内存、磁盘和运行时信息聚合展示,便于快速判断资源压力和运行状态。
{loading ? ( ) : server ? (
运行中 {server.os.goos.toUpperCase()} · Go Runtime 当前运行时包含 {server.os.numGoroutine} 个 goroutine,编译器为 {server.os.compiler}, Go 版本为 {server.os.goVersion}。
逻辑 CPU {server.os.numCpu}
CPU 平均负载 {averageCpuUsage}%
内存占用 {server.ram.usedPercent}%
CPU 负载
内存负载
CPU 核心数 {server.cpu.cores}
Goroutine {server.os.numGoroutine}
已用内存 {formatStorageFromMb(server.ram.usedMb)}
磁盘占用 {diskSummary.usedPercent}%
}>
[`${Number(value ?? 0).toFixed(1)}%`, '占用率']} /> {cpuChartData.map((item) => ( = 80 ? '#c34747' : item.usage >= 60 ? '#d29b2f' : '#d16f3f'} /> ))}
}>
}>
{server.disk.map((diskItem) => (
{diskItem.mountPoint} 已用 {formatStorageFromMb(diskItem.usedMb)} / {formatStorageFromMb(diskItem.totalMb)}
{diskItem.usedPercent}%
))}
) : null}
) }