import React, { useState, useEffect } from 'react'; import { Card, Row, Col, Statistic, Spin, message, Button, Tag } from 'antd'; import { DatabaseOutlined, CloudServerOutlined, WarningOutlined, PoweroffOutlined, HomeOutlined, MonitorOutlined, SettingOutlined, ArrowUpOutlined, ArrowDownOutlined, DashboardOutlined, ReloadOutlined } from '@ant-design/icons'; import axios from 'axios'; function Dashboard() { const [stats, setStats] = useState({ totalDevices: 0, totalRacks: 0, totalRooms: 0, faultDevices: 0, deviceGrowth: 2.5, // 示例增长数据 faultTrend: -12.3 // 示例趋势数据 }); const [loading, setLoading] = useState(true); useEffect(() => { // 获取统计数据 const fetchStats = async () => { try { setLoading(true); // 获取所有设备 const devicesRes = await axios.get('/api/devices'); // 设备API返回的是包含total和devices数组的对象 const totalDevices = devicesRes.data.total; // 获取所有设备以统计故障设备数量 const allDevicesRes = await axios.get('/api/devices', { params: { pageSize: totalDevices } }); const allDevices = allDevicesRes.data.devices || allDevicesRes.data; const faultDevices = allDevices.filter(device => device.status === 'fault').length; // 获取所有机柜 const racksRes = await axios.get('/api/racks'); const racks = racksRes.data; const totalRacks = racks.length; // 获取所有机房 const roomsRes = await axios.get('/api/rooms'); const rooms = roomsRes.data; const totalRooms = rooms.length; setStats({ totalDevices, totalRacks, totalRooms, faultDevices, // 保留或更新趋势数据 deviceGrowth: stats.deviceGrowth || 0, faultTrend: stats.faultTrend || 0 }); } catch (error) { message.error('获取统计数据失败'); console.error('获取统计数据失败:', error); } finally { setLoading(false); } }; fetchStats(); }, []); // 科技感配色主题 const theme = { primary: '#1890ff', // 科技蓝 primaryDark: '#096dd9', // 深蓝 secondary: '#722ed1', // 紫色 success: '#52c41a', // 绿色 warning: '#faad14', // 橙色 error: '#ff4d4f', // 红色 background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', cardBg: 'rgba(255, 255, 255, 0.95)', textPrimary: '#262626', textSecondary: '#8c8c8c' }; const containerStyle = { minHeight: '100vh', background: 'linear-gradient(135deg, #e3f2fd 0%, #f3e5f5 100%)', padding: '24px' }; const headerStyle = { textAlign: 'center', marginBottom: '32px' }; const titleStyle = { fontSize: '2.5rem', fontWeight: '700', background: theme.background, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', margin: '0 0 8px 0' }; const subtitleStyle = { fontSize: '1.1rem', color: theme.textSecondary, margin: '0' }; const statCardStyle = { borderRadius: '16px', border: 'none', boxShadow: '0 4px 16px rgba(24, 144, 255, 0.1)', background: theme.cardBg, backdropFilter: 'blur(10px)', transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)', position: 'relative', overflow: 'hidden', cursor: 'pointer' }; const statCardHoverStyle = { transform: 'translateY(-4px)', boxShadow: '0 8px 32px rgba(24, 144, 255, 0.2)' }; const trendStyle = (trend) => ({ display: 'flex', alignItems: 'center', fontSize: '0.875rem', fontWeight: '500', color: trend > 0 ? theme.success : theme.error, marginTop: '8px' }); const systemOverviewStyle = { marginTop: '32px' }; const overviewCardStyle = { borderRadius: '20px', border: 'none', boxShadow: '0 8px 32px rgba(24, 144, 255, 0.15)', background: theme.cardBg, backdropFilter: 'blur(10px)' }; const welcomeSectionStyle = { background: theme.background, borderRadius: '12px', padding: '20px', textAlign: 'center', color: 'white', marginBottom: '24px' }; const navigationGridStyle = { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(160px, 1fr))', gap: '16px', marginBottom: '24px' }; const navButtonStyle = { height: 'auto', padding: '20px 16px', borderRadius: '12px', border: '2px solid rgba(24, 144, 255, 0.1)', background: 'rgba(24, 144, 255, 0.02)', transition: 'all 0.3s ease', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '8px' }; const navButtonHoverStyle = { borderColor: theme.primary, background: 'rgba(24, 144, 255, 0.1)', transform: 'translateY(-2px)' }; const navIconStyle = { fontSize: '2rem', color: theme.primary }; const navTextStyle = { fontSize: '0.95rem', fontWeight: '600', color: theme.textPrimary }; const systemInfoStyle = { background: 'linear-gradient(135deg, #e8f4fd 0%, #f0f9ff 100%)', borderRadius: '12px', padding: '16px', border: '1px solid rgba(24, 144, 255, 0.1)' }; return (
实时监控 • 智能管理 • 高效运维
专业的机房设备管理解决方案
系统版本: v1.0.0
最后更新:{new Date().toLocaleDateString()}