import { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { Activity, Cpu, HardDrive, Clock, Zap, RefreshCw, Pause, Play } from 'lucide-react'; import { useAuth } from '../context/AuthContext'; import { cn } from '../lib/utils'; export default function Monitor() { const { token: adminToken } = useAuth(); const [stats, setStats] = useState({ cpu: 0, memory: { used: 0, total: 0, percentage: 0 }, uptime: 0, requests: 0, status: 'idle', idleTime: 0 }); const [isLoading, setIsLoading] = useState(true); const [autoRefresh, setAutoRefresh] = useState(false); const fetchStats = async () => { setIsLoading(true); try { const [monitorRes, keyStatsRes] = await Promise.all([ fetch('/admin/status', { headers: { 'X-Admin-Token': adminToken } }), fetch('/admin/keys/stats', { headers: { 'X-Admin-Token': adminToken } }) ]); const monitor = await monitorRes.json(); const keyStats = await keyStatsRes.json(); // Parse memory string "123.45 MB / 16384.00 MB" let memUsed = 0, memTotal = 0, memPercent = 0; if (monitor.systemMemory) { const parts = monitor.systemMemory.split(' / '); if (parts.length === 2) { memUsed = parseFloat(parts[0]); memTotal = parseFloat(parts[1]); if (memTotal > 0) { memPercent = ((memUsed / memTotal) * 100).toFixed(1); } } } setStats({ cpu: monitor.cpu || 0, memory: { used: memUsed * 1024 * 1024, // Convert back to bytes for display consistency if needed, or just use raw total: memTotal * 1024 * 1024, percentage: memPercent, display: monitor.systemMemory }, uptime: monitor.uptime || '0s', // Backend returns formatted string requests: keyStats.totalRequests || 0, status: monitor.idle === '活跃' ? 'busy' : 'idle', idleTime: monitor.idleTime || 0 }); } catch (error) { console.error('Failed to fetch monitor stats', error); } finally { setIsLoading(false); } }; useEffect(() => { fetchStats(); }, [adminToken]); useEffect(() => { let interval; if (autoRefresh) { interval = setInterval(fetchStats, 5000); } return () => clearInterval(interval); }, [autoRefresh, adminToken]); const formatUptime = (seconds) => { const d = Math.floor(seconds / (3600 * 24)); const h = Math.floor((seconds % (3600 * 24)) / 3600); const m = Math.floor((seconds % 3600) / 60); const s = Math.floor(seconds % 60); return `${d}d ${h}h ${m}m ${s}s`; }; return (

系统监控

实时监控服务器资源和状态

服务器状态

{stats.status === 'busy' ? '繁忙' : '空闲'} 空闲时间: {stats.idleTime}s
); } function MonitorCard({ title, value, subtext, icon: Icon, color, bg, className }) { return (

{title}

{value}
{subtext &&
{subtext}
}
); }