page
import React, { useState } from 'react';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Server, Activity, AlertCircle } from 'lucide-react';
const DataCenterMonitor = () => {
const [activeCity, setActiveCity] = useState('shanghai');
const cityData = {
shanghai: {
name: '上海',
lab: '泰山稳定性实验室',
facility: '浦东电脑实验室',
equipment: {
online: 500,
offline: 80
},
tasks: {
healthy: 500,
subHealthy: 50,
blocked: 80
}
},
nanjing: {
name: '南京',
lab: '金陵稳定性实验室',
facility: '江宁计算中心',
equipment: {
online: 420,
offline: 60
},
tasks: {
healthy: 400,
subHealthy: 40,
blocked: 40
}
},
xian: {
name: '西安',
lab: '秦岭稳定性实验室',
facility: '高新技术园区',
equipment: {
online: 380,
offline: 50
},
tasks: {
healthy: 360,
subHealthy: 35,
blocked: 35
}
}
};
const currentData = cityData[activeCity];
return (
<div className="min-h-screen bg-gradient-to-br from-slate-50 to-slate-100 p-8">
<div className="max-w-7xl mx-auto">
<div className="mb-8">
<h1 className="text-3xl font-bold text-slate-800 mb-2">数据中心监控系统</h1>
<p className="text-slate-600">实时监控各地数据中心设备与任务状态</p>
</div>
{/* 城市选择 Tabs */}
<Tabs value={activeCity} onValueChange={setActiveCity} className="mb-8">
<TabsList className="grid w-full max-w-md grid-cols-3 bg-white shadow-sm">
<TabsTrigger value="shanghai" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">
上海
</TabsTrigger>
<TabsTrigger value="nanjing" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">
南京
</TabsTrigger>
<TabsTrigger value="xian" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">
西安
</TabsTrigger>
</TabsList>
</Tabs>
{/* 实验室信息卡片 */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
<Card className="bg-white shadow-lg border-t-4 border-t-blue-500">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-slate-700">
<Server className="w-5 h-5 text-blue-600" />
实验室名称
</CardTitle>
</CardHeader>
<CardContent>
<p className="text-2xl font-semibold text-slate-800">{currentData.lab}</p>
</CardContent>
</Card>
<Card className="bg-white shadow-lg border-t-4 border-t-purple-500">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-slate-700">
<Activity className="w-5 h-5 text-purple-600" />
实验设施
</CardTitle>
</CardHeader>
<CardContent>
<p className="text-2xl font-semibold text-slate-800">{currentData.facility}</p>
</CardContent>
</Card>
</div>
{/* 主监控面板 */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* 左侧:服务器机房图片区域 */}
<Card className="bg-gradient-to-br from-slate-800 to-slate-900 shadow-2xl overflow-hidden">
<CardContent className="p-0 relative h-96 flex items-center justify-center">
{/* 模拟服务器机架 */}
<div className="absolute inset-0 flex items-center justify-center opacity-20">
<div className="grid grid-cols-8 gap-1">
{[...Array(64)].map((_, i) => (
<div
key={i}
className="w-3 h-16 bg-blue-500 rounded-sm"
style={{
animationDelay: `${i * 0.05}s`,
animation: 'pulse 2s infinite'
}}
/>
))}
</div>
</div>
<div className="relative z-10 text-center">
<Server className="w-24 h-24 text-blue-400 mx-auto mb-4" />
<p className="text-white text-lg font-semibold">数据中心机房</p>
<Badge variant="outline" className="mt-2 text-green-400 border-green-400">
运行中
</Badge>
</div>
</CardContent>
</Card>
{/* 右侧:状态监控 */}
<div className="space-y-6">
{/* 设备状态 */}
<Card className="bg-white shadow-lg">
<CardHeader>
<CardTitle className="text-lg font-semibold text-slate-700">设备状态</CardTitle>
</CardHeader>
<CardContent>
<div className="grid grid-cols-2 gap-6">
<div className="text-center p-4 bg-green-50 rounded-lg">
<p className="text-sm text-slate-600 mb-1">Online</p>
<p className="text-4xl font-bold text-green-600">{currentData.equipment.online}</p>
</div>
<div className="text-center p-4 bg-red-50 rounded-lg">
<p className="text-sm text-slate-600 mb-1">Offline</p>
<p className="text-4xl font-bold text-red-600">{currentData.equipment.offline}</p>
</div>
</div>
</CardContent>
</Card>
{/* 任务状态 */}
<Card className="bg-white shadow-lg">
<CardHeader>
<CardTitle className="text-lg font-semibold text-slate-700">任务状态</CardTitle>
</CardHeader>
<CardContent>
<div className="grid grid-cols-3 gap-4">
<div className="text-center p-4 bg-emerald-50 rounded-lg">
<p className="text-sm text-slate-600 mb-1">健康</p>
<p className="text-3xl font-bold text-emerald-600">{currentData.tasks.healthy}</p>
</div>
<div className="text-center p-4 bg-amber-50 rounded-lg">
<p className="text-sm text-slate-600 mb-1">亚健康</p>
<p className="text-3xl font-bold text-amber-600">{currentData.tasks.subHealthy}</p>
</div>
<div className="text-center p-4 bg-rose-50 rounded-lg">
<p className="text-sm text-slate-600 mb-1">阻塞</p>
<p className="text-3xl font-bold text-rose-600">{currentData.tasks.blocked}</p>
</div>
</div>
</CardContent>
</Card>
{/* 健康度指示器 */}
<Card className="bg-gradient-to-r from-blue-500 to-blue-600 shadow-lg">
<CardContent className="p-6">
<div className="flex items-center justify-between text-white">
<div className="flex items-center gap-3">
<AlertCircle className="w-6 h-6" />
<span className="text-lg font-semibold">系统健康度</span>
</div>
<span className="text-3xl font-bold">
{Math.round((currentData.tasks.healthy / (currentData.tasks.healthy + currentData.tasks.subHealthy + currentData.tasks.blocked)) * 100)}%
</span>
</div>
</CardContent>
</Card>
</div>
</div>
</div>
</div>
);
};
export default DataCenterMonitor;