2025-09-16 11:32:59 +08:00

390 lines
24 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client';
import { useState, useEffect } from 'react';
import { getTranslations, type Language } from '@/lib/languages';
export default function ConsolePage({ params }: { params: { lang: string } }) {
const [isLoaded, setIsLoaded] = useState(false);
const [activeSection, setActiveSection] = useState('overview');
const lang = params.lang as Language;
const t = getTranslations(lang);
useEffect(() => {
setIsLoaded(true);
}, []);
const menuItems = [
{ key: 'overview', label: '概览', icon: '📊' },
{ key: 'servers', label: '云服务器', icon: '💻' },
{ key: 'storage', label: '存储', icon: '💾' },
{ key: 'network', label: '网络', icon: '🌐' },
{ key: 'security', label: '安全', icon: '🛡️' },
{ key: 'monitoring', label: '监控', icon: '📈' },
{ key: 'billing', label: '账单', icon: '💳' },
];
return (
<div className="max-w-7xl mx-auto px-6 py-20">
<div
className={`transform transition-all duration-1000 ${isLoaded ? 'translate-y-0 opacity-100' : 'translate-y-10 opacity-0'}`}
>
{/* Header */}
<div className="text-center mb-16">
<h1 className="text-5xl md:text-7xl font-bold mb-6">
<span className="text-purple-400"></span>
</h1>
<p className="text-xl md:text-2xl text-cyan-400 mb-4"></p>
<p className="text-lg text-gray-300 max-w-3xl mx-auto">
</p>
</div>
{/* Console Layout */}
<div className="grid lg:grid-cols-4 gap-8">
{/* Sidebar */}
<div className="lg:col-span-1">
<div className="bg-black/50 border border-purple-500/30 rounded-lg p-6">
<h3 className="text-xl font-bold text-purple-400 mb-6"></h3>
<nav className="space-y-2">
{menuItems.map((item) => (
<button
key={item.key}
onClick={() => setActiveSection(item.key)}
className={`w-full flex items-center p-3 rounded-lg transition-all duration-300 ${
activeSection === item.key
? 'bg-purple-500/20 border border-purple-400 text-purple-400'
: 'text-gray-400 hover:text-purple-400 hover:bg-purple-500/10'
}`}
>
<span className="mr-3 text-xl">{item.icon}</span>
{item.label}
</button>
))}
</nav>
</div>
</div>
{/* Main Content */}
<div className="lg:col-span-3">
<div className="bg-black/50 border border-purple-500/30 rounded-lg p-8">
{activeSection === 'overview' && (
<div>
<h2 className="text-3xl font-bold text-purple-400 mb-8">
</h2>
{/* Quick Stats */}
<div className="grid md:grid-cols-4 gap-6 mb-8">
{[
{
label: '云服务器',
value: '12',
icon: '💻',
color: 'text-blue-400',
},
{
label: '存储空间',
value: '2.5TB',
icon: '💾',
color: 'text-green-400',
},
{
label: '网络流量',
value: '156GB',
icon: '🌐',
color: 'text-cyan-400',
},
{
label: '本月费用',
value: '¥1,234',
icon: '💳',
color: 'text-yellow-400',
},
].map((stat, index) => (
<div
key={index}
className="p-4 border border-gray-700 rounded-lg text-center"
>
<div className="text-3xl mb-2">{stat.icon}</div>
<div
className={`text-2xl font-bold ${stat.color} mb-1`}
>
{stat.value}
</div>
<div className="text-gray-400 text-sm">
{stat.label}
</div>
</div>
))}
</div>
{/* Recent Activities */}
<div className="grid md:grid-cols-2 gap-8">
<div>
<h3 className="text-xl font-bold text-purple-400 mb-4">
</h3>
<div className="space-y-3">
{[
{
action: '创建云服务器',
time: '2分钟前',
status: 'success',
},
{
action: '备份数据',
time: '1小时前',
status: 'success',
},
{
action: '升级配置',
time: '3小时前',
status: 'warning',
},
{
action: '重启服务器',
time: '1天前',
status: 'info',
},
].map((activity, index) => (
<div
key={index}
className="flex items-center justify-between p-3 border border-gray-700 rounded"
>
<div>
<div className="text-gray-300">
{activity.action}
</div>
<div className="text-gray-500 text-sm">
{activity.time}
</div>
</div>
<div
className={`w-3 h-3 rounded-full ${
activity.status === 'success'
? 'bg-green-500'
: activity.status === 'warning'
? 'bg-yellow-500'
: activity.status === 'info'
? 'bg-blue-500'
: 'bg-gray-500'
}`}
></div>
</div>
))}
</div>
</div>
<div>
<h3 className="text-xl font-bold text-purple-400 mb-4">
</h3>
<div className="space-y-3">
{[
{
service: '云服务器',
status: '正常',
uptime: '99.9%',
},
{
service: '云存储',
status: '正常',
uptime: '99.8%',
},
{
service: '网络服务',
status: '正常',
uptime: '99.9%',
},
{
service: '安全防护',
status: '正常',
uptime: '100%',
},
].map((service, index) => (
<div
key={index}
className="flex items-center justify-between p-3 border border-gray-700 rounded"
>
<div>
<div className="text-gray-300">
{service.service}
</div>
<div className="text-gray-500 text-sm">
: {service.uptime}
</div>
</div>
<div className="text-green-400 font-bold">
{service.status}
</div>
</div>
))}
</div>
</div>
</div>
</div>
)}
{activeSection === 'servers' && (
<div>
<div className="flex justify-between items-center mb-8">
<h2 className="text-3xl font-bold text-purple-400">
</h2>
<button className="px-6 py-3 bg-gradient-to-r from-purple-500 to-pink-500 text-white font-bold rounded-lg hover:opacity-90 transition-all duration-300">
</button>
</div>
<div className="space-y-4">
{[
{
name: 'web-server-01',
status: '运行中',
cpu: '2核',
memory: '4GB',
ip: '192.168.1.10',
},
{
name: 'db-server-01',
status: '运行中',
cpu: '4核',
memory: '8GB',
ip: '192.168.1.11',
},
{
name: 'app-server-01',
status: '已停止',
cpu: '2核',
memory: '4GB',
ip: '192.168.1.12',
},
].map((server, index) => (
<div
key={index}
className="p-6 border border-gray-700 rounded-lg"
>
<div className="flex items-center justify-between">
<div>
<h3 className="text-xl font-bold text-purple-400 mb-2">
{server.name}
</h3>
<div className="flex items-center space-x-4 text-gray-400">
<span>{server.cpu}</span>
<span>{server.memory}</span>
<span>{server.ip}</span>
</div>
</div>
<div className="flex items-center space-x-4">
<span
className={`px-3 py-1 rounded-full text-sm ${
server.status === '运行中'
? 'bg-green-500/20 text-green-400'
: 'bg-red-500/20 text-red-400'
}`}
>
{server.status}
</span>
<button className="px-4 py-2 border border-purple-500/30 rounded text-purple-400 hover:border-purple-400 transition-colors">
</button>
</div>
</div>
</div>
))}
</div>
</div>
)}
{activeSection === 'monitoring' && (
<div>
<h2 className="text-3xl font-bold text-purple-400 mb-8">
</h2>
<div className="grid md:grid-cols-2 gap-8">
<div className="p-6 border border-gray-700 rounded-lg">
<h3 className="text-xl font-bold text-purple-400 mb-4">
CPU 使
</h3>
<div className="space-y-4">
{[
{ server: 'web-server-01', usage: 45 },
{ server: 'db-server-01', usage: 78 },
{ server: 'app-server-01', usage: 23 },
].map((item, index) => (
<div key={index}>
<div className="flex justify-between mb-2">
<span className="text-gray-300">
{item.server}
</span>
<span className="text-purple-400">
{item.usage}%
</span>
</div>
<div className="w-full bg-gray-700 rounded-full h-2">
<div
className="h-2 bg-gradient-to-r from-purple-500 to-pink-500 rounded-full"
style={{ width: `${item.usage}%` }}
></div>
</div>
</div>
))}
</div>
</div>
<div className="p-6 border border-gray-700 rounded-lg">
<h3 className="text-xl font-bold text-purple-400 mb-4">
使
</h3>
<div className="space-y-4">
{[
{ server: 'web-server-01', usage: 62 },
{ server: 'db-server-01', usage: 89 },
{ server: 'app-server-01', usage: 34 },
].map((item, index) => (
<div key={index}>
<div className="flex justify-between mb-2">
<span className="text-gray-300">
{item.server}
</span>
<span className="text-purple-400">
{item.usage}%
</span>
</div>
<div className="w-full bg-gray-700 rounded-full h-2">
<div
className="h-2 bg-gradient-to-r from-blue-500 to-cyan-500 rounded-full"
style={{ width: `${item.usage}%` }}
></div>
</div>
</div>
))}
</div>
</div>
</div>
</div>
)}
{/* Other sections can be added similarly */}
{activeSection !== 'overview' &&
activeSection !== 'servers' &&
activeSection !== 'monitoring' && (
<div className="text-center py-20">
<div className="text-6xl mb-4">🚧</div>
<h3 className="text-2xl font-bold text-purple-400 mb-4">
</h3>
<p className="text-gray-400">
...
</p>
</div>
)}
</div>
</div>
</div>
</div>
</div>
);
}