|
@@ -1,75 +1,237 @@
|
|
|
import React from 'react';
|
|
import React from 'react';
|
|
|
-import {
|
|
|
|
|
- Card, Row, Col, Typography, Statistic, Space
|
|
|
|
|
-} from 'antd';
|
|
|
|
|
-import {
|
|
|
|
|
- UserOutlined, BellOutlined, EyeOutlined
|
|
|
|
|
-} from '@ant-design/icons';
|
|
|
|
|
-
|
|
|
|
|
-const { Title } = Typography;
|
|
|
|
|
|
|
+import { Users, Bell, Eye, TrendingUp, TrendingDown, Activity } from 'lucide-react';
|
|
|
|
|
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/client/components/ui/card';
|
|
|
|
|
+import { Badge } from '@/client/components/ui/badge';
|
|
|
|
|
+import { Progress } from '@/client/components/ui/progress';
|
|
|
|
|
|
|
|
// 仪表盘页面
|
|
// 仪表盘页面
|
|
|
export const DashboardPage = () => {
|
|
export const DashboardPage = () => {
|
|
|
|
|
+ const stats = [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '活跃用户',
|
|
|
|
|
+ value: '112,893',
|
|
|
|
|
+ icon: Users,
|
|
|
|
|
+ color: 'text-blue-500',
|
|
|
|
|
+ bgColor: 'bg-blue-50',
|
|
|
|
|
+ trend: 12.5,
|
|
|
|
|
+ trendDirection: 'up',
|
|
|
|
|
+ description: '较昨日增长 12.5%',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '系统消息',
|
|
|
|
|
+ value: '93',
|
|
|
|
|
+ icon: Bell,
|
|
|
|
|
+ color: 'text-yellow-500',
|
|
|
|
|
+ bgColor: 'bg-yellow-50',
|
|
|
|
|
+ trend: 0,
|
|
|
|
|
+ trendDirection: 'neutral',
|
|
|
|
|
+ description: '其中 5 条未读',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '在线用户',
|
|
|
|
|
+ value: '1,128',
|
|
|
|
|
+ icon: Eye,
|
|
|
|
|
+ color: 'text-purple-500',
|
|
|
|
|
+ bgColor: 'bg-purple-50',
|
|
|
|
|
+ trend: 32.1,
|
|
|
|
|
+ trendDirection: 'up',
|
|
|
|
|
+ description: '当前在线率 32.1%',
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ const recentActivities = [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ user: '张三',
|
|
|
|
|
+ action: '登录系统',
|
|
|
|
|
+ time: '2分钟前',
|
|
|
|
|
+ status: 'success',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 2,
|
|
|
|
|
+ user: '李四',
|
|
|
|
|
+ action: '创建了新用户',
|
|
|
|
|
+ time: '5分钟前',
|
|
|
|
|
+ status: 'info',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 3,
|
|
|
|
|
+ user: '王五',
|
|
|
|
|
+ action: '删除了用户',
|
|
|
|
|
+ time: '10分钟前',
|
|
|
|
|
+ status: 'warning',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 4,
|
|
|
|
|
+ user: '赵六',
|
|
|
|
|
+ action: '修改了配置',
|
|
|
|
|
+ time: '15分钟前',
|
|
|
|
|
+ status: 'info',
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ const systemMetrics = [
|
|
|
|
|
+ {
|
|
|
|
|
+ name: 'CPU使用率',
|
|
|
|
|
+ value: 65,
|
|
|
|
|
+ color: 'bg-green-500',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '内存使用率',
|
|
|
|
|
+ value: 78,
|
|
|
|
|
+ color: 'bg-blue-500',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '磁盘使用率',
|
|
|
|
|
+ value: 45,
|
|
|
|
|
+ color: 'bg-purple-500',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '网络使用率',
|
|
|
|
|
+ value: 32,
|
|
|
|
|
+ color: 'bg-orange-500',
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
- <div>
|
|
|
|
|
- <div className="mb-6 flex justify-between items-center">
|
|
|
|
|
- <Title level={2}>仪表盘</Title>
|
|
|
|
|
|
|
+ <div className="space-y-6">
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <h1 className="text-3xl font-bold tracking-tight">仪表盘</h1>
|
|
|
|
|
+ <p className="text-muted-foreground">
|
|
|
|
|
+ 欢迎回来!这里是系统概览和关键指标。
|
|
|
|
|
+ </p>
|
|
|
</div>
|
|
</div>
|
|
|
- <Row gutter={[16, 16]}>
|
|
|
|
|
- <Col xs={24} sm={12} lg={8}>
|
|
|
|
|
- <Card className="shadow-sm transition-all duration-300 hover:shadow-md">
|
|
|
|
|
- <div className="flex items-center justify-between mb-2">
|
|
|
|
|
- <Typography.Title level={5}>活跃用户</Typography.Title>
|
|
|
|
|
- <UserOutlined style={{ fontSize: 24, color: '#1890ff' }} />
|
|
|
|
|
- </div>
|
|
|
|
|
- <Statistic
|
|
|
|
|
- value={112893}
|
|
|
|
|
- loading={false}
|
|
|
|
|
- valueStyle={{ fontSize: 28 }}
|
|
|
|
|
- prefix={<span style={{ color: '#52c41a' }}>↑</span>}
|
|
|
|
|
- suffix="人"
|
|
|
|
|
- />
|
|
|
|
|
- <div style={{ marginTop: 8, fontSize: 12, color: '#8c8c8c' }}>
|
|
|
|
|
- 较昨日增长 12.5%
|
|
|
|
|
- </div>
|
|
|
|
|
- </Card>
|
|
|
|
|
- </Col>
|
|
|
|
|
- <Col xs={24} sm={12} lg={8}>
|
|
|
|
|
- <Card className="shadow-sm transition-all duration-300 hover:shadow-md">
|
|
|
|
|
- <div className="flex items-center justify-between mb-2">
|
|
|
|
|
- <Typography.Title level={5}>系统消息</Typography.Title>
|
|
|
|
|
- <BellOutlined style={{ fontSize: 24, color: '#faad14' }} />
|
|
|
|
|
- </div>
|
|
|
|
|
- <Statistic
|
|
|
|
|
- value={93}
|
|
|
|
|
- loading={false}
|
|
|
|
|
- valueStyle={{ fontSize: 28 }}
|
|
|
|
|
- prefix={<span style={{ color: '#faad14' }}>●</span>}
|
|
|
|
|
- suffix="条"
|
|
|
|
|
- />
|
|
|
|
|
- <div style={{ marginTop: 8, fontSize: 12, color: '#8c8c8c' }}>
|
|
|
|
|
- 其中 5 条未读
|
|
|
|
|
- </div>
|
|
|
|
|
- </Card>
|
|
|
|
|
- </Col>
|
|
|
|
|
- <Col xs={24} sm={12} lg={8}>
|
|
|
|
|
- <Card className="shadow-sm transition-all duration-300 hover:shadow-md">
|
|
|
|
|
- <div className="flex items-center justify-between mb-2">
|
|
|
|
|
- <Typography.Title level={5}>在线用户</Typography.Title>
|
|
|
|
|
- <EyeOutlined style={{ fontSize: 24, color: '#722ed1' }} />
|
|
|
|
|
|
|
+
|
|
|
|
|
+ {/* 统计卡片 */}
|
|
|
|
|
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
|
|
|
|
+ {stats.map((stat, index) => {
|
|
|
|
|
+ const Icon = stat.icon;
|
|
|
|
|
+ return (
|
|
|
|
|
+ <Card key={index} className="transition-all duration-300 hover:shadow-lg">
|
|
|
|
|
+ <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
|
|
|
+ <CardTitle className="text-sm font-medium">
|
|
|
|
|
+ {stat.title}
|
|
|
|
|
+ </CardTitle>
|
|
|
|
|
+ <div className={`p-2 rounded-full ${stat.bgColor}`}>
|
|
|
|
|
+ <Icon className={`h-4 w-4 ${stat.color}`} />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ <CardContent>
|
|
|
|
|
+ <div className="text-2xl font-bold">{stat.value}</div>
|
|
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
|
|
+ {stat.trendDirection === 'up' && (
|
|
|
|
|
+ <TrendingUp className="h-4 w-4 text-green-500" />
|
|
|
|
|
+ )}
|
|
|
|
|
+ {stat.trendDirection === 'down' && (
|
|
|
|
|
+ <TrendingDown className="h-4 w-4 text-red-500" />
|
|
|
|
|
+ )}
|
|
|
|
|
+ <p className="text-xs text-muted-foreground">{stat.description}</p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </CardContent>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ );
|
|
|
|
|
+ })}
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-7">
|
|
|
|
|
+ {/* 系统性能 */}
|
|
|
|
|
+ <Card className="lg:col-span-4">
|
|
|
|
|
+ <CardHeader>
|
|
|
|
|
+ <CardTitle>系统性能</CardTitle>
|
|
|
|
|
+ <CardDescription>
|
|
|
|
|
+ 当前系统各项资源的使用情况
|
|
|
|
|
+ </CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ <CardContent>
|
|
|
|
|
+ <div className="space-y-4">
|
|
|
|
|
+ {systemMetrics.map((metric, index) => (
|
|
|
|
|
+ <div key={index} className="space-y-2">
|
|
|
|
|
+ <div className="flex justify-between text-sm">
|
|
|
|
|
+ <span className="font-medium">{metric.name}</span>
|
|
|
|
|
+ <span className="text-muted-foreground">{metric.value}%</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Progress value={metric.value} className="h-2" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ ))}
|
|
|
</div>
|
|
</div>
|
|
|
- <Statistic
|
|
|
|
|
- value={1128}
|
|
|
|
|
- loading={false}
|
|
|
|
|
- valueStyle={{ fontSize: 28 }}
|
|
|
|
|
- suffix="人"
|
|
|
|
|
- />
|
|
|
|
|
- <div style={{ marginTop: 8, fontSize: 12, color: '#8c8c8c' }}>
|
|
|
|
|
- 当前在线率 32.1%
|
|
|
|
|
|
|
+ </CardContent>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+
|
|
|
|
|
+ {/* 最近活动 */}
|
|
|
|
|
+ <Card className="lg:col-span-3">
|
|
|
|
|
+ <CardHeader>
|
|
|
|
|
+ <CardTitle>最近活动</CardTitle>
|
|
|
|
|
+ <CardDescription>
|
|
|
|
|
+ 系统最新操作记录
|
|
|
|
|
+ </CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ <CardContent>
|
|
|
|
|
+ <div className="space-y-4">
|
|
|
|
|
+ {recentActivities.map((activity) => (
|
|
|
|
|
+ <div key={activity.id} className="flex items-center space-x-4">
|
|
|
|
|
+ <div className="flex-shrink-0">
|
|
|
|
|
+ <div className={`p-2 rounded-full ${
|
|
|
|
|
+ activity.status === 'success' ? 'bg-green-100' :
|
|
|
|
|
+ activity.status === 'warning' ? 'bg-yellow-100' : 'bg-blue-100'
|
|
|
|
|
+ }`}>
|
|
|
|
|
+ <Activity className={`h-4 w-4 ${
|
|
|
|
|
+ activity.status === 'success' ? 'text-green-600' :
|
|
|
|
|
+ activity.status === 'warning' ? 'text-yellow-600' : 'text-blue-600'
|
|
|
|
|
+ }`} />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div className="flex-1 space-y-1">
|
|
|
|
|
+ <p className="text-sm font-medium">
|
|
|
|
|
+ {activity.user} {activity.action}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <p className="text-sm text-muted-foreground">
|
|
|
|
|
+ {activity.time}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ ))}
|
|
|
</div>
|
|
</div>
|
|
|
- </Card>
|
|
|
|
|
- </Col>
|
|
|
|
|
- </Row>
|
|
|
|
|
|
|
+ </CardContent>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ {/* 快捷操作 */}
|
|
|
|
|
+ <Card>
|
|
|
|
|
+ <CardHeader>
|
|
|
|
|
+ <CardTitle>快捷操作</CardTitle>
|
|
|
|
|
+ <CardDescription>
|
|
|
|
|
+ 常用的管理功能
|
|
|
|
|
+ </CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ <CardContent>
|
|
|
|
|
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
|
|
|
|
|
+ <Card className="hover:shadow-md transition-all cursor-pointer">
|
|
|
|
|
+ <CardHeader className="pb-3">
|
|
|
|
|
+ <CardTitle className="text-base">用户管理</CardTitle>
|
|
|
|
|
+ <CardDescription>查看和管理所有用户</CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ <Card className="hover:shadow-md transition-all cursor-pointer">
|
|
|
|
|
+ <CardHeader className="pb-3">
|
|
|
|
|
+ <CardTitle className="text-base">系统设置</CardTitle>
|
|
|
|
|
+ <CardDescription>配置系统参数</CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ <Card className="hover:shadow-md transition-all cursor-pointer">
|
|
|
|
|
+ <CardHeader className="pb-3">
|
|
|
|
|
+ <CardTitle className="text-base">数据备份</CardTitle>
|
|
|
|
|
+ <CardDescription>执行数据备份操作</CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ <Card className="hover:shadow-md transition-all cursor-pointer">
|
|
|
|
|
+ <CardHeader className="pb-3">
|
|
|
|
|
+ <CardTitle className="text-base">日志查看</CardTitle>
|
|
|
|
|
+ <CardDescription>查看系统日志</CardDescription>
|
|
|
|
|
+ </CardHeader>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </CardContent>
|
|
|
|
|
+ </Card>
|
|
|
</div>
|
|
</div>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|