blob: 5296647c4f0476b14c0e0c48d5b49717a7e3bdd2 [file] [log] [blame]
ybtda5978b2025-05-31 15:58:05 +08001import React, { useState, useEffect } from 'react';
2import { Card, Table, Button, Space, Typography, message, Popconfirm, Spin } from 'antd';
3import { UserOutlined, UploadOutlined, SettingOutlined } from '@ant-design/icons';
ybtbac75f22025-06-08 22:31:15 +08004import { getUserList, deleteUser } from '@/api/auth';
ybt0d010e52025-06-09 00:29:36 +08005import { useAuth } from '@/features/auth/contexts/AuthContext';
ybtda5978b2025-05-31 15:58:05 +08006
7const { Title } = Typography;
8
9const AdminPanel = () => {
10 const [users, setUsers] = useState([]);
11 const [loading, setLoading] = useState(true);
ybt0d010e52025-06-09 00:29:36 +080012 const { user } = useAuth();
ybtda5978b2025-05-31 15:58:05 +080013
14 // 获取管理员信息
ybt0d010e52025-06-09 00:29:36 +080015 const adminUser = user;
ybtda5978b2025-05-31 15:58:05 +080016
17 // 加载用户数据
18 useEffect(() => {
19 fetchUsers();
20 }, []);
21
22 // 获取用户列表
23 const fetchUsers = async () => {
24 try {
25 setLoading(true);
ybt0d010e52025-06-09 00:29:36 +080026 const params = {
27 username: adminUser.username,
28 };
29 const response = await getUserList(params);
30 if (response && response.data) {
ybtda5978b2025-05-31 15:58:05 +080031 const userList = response.data.users || [];
ybt0d010e52025-06-09 00:29:36 +080032 const totalNumber = response.data.amount || 0;
ybtda5978b2025-05-31 15:58:05 +080033 // 添加key属性
34 const formattedUsers = userList.map(user => ({
35 ...user,
ybt0d010e52025-06-09 00:29:36 +080036 key: user.uid,
37 role: user.level,
ybtda5978b2025-05-31 15:58:05 +080038 status: '正常'
39 }));
40 setUsers(formattedUsers);
41 }
42 } catch (error) {
ybt0d010e52025-06-09 00:29:36 +080043 message.error('获取用户列表失败');
ybtda5978b2025-05-31 15:58:05 +080044 } finally {
45 setLoading(false);
46 }
47 };
48
49 // 删除用户
50 const handleDelete = async (username) => {
51 try {
ybt0d010e52025-06-09 00:29:36 +080052 const params = {
53 username: adminUser.username,
54 targetUsername: username,
55 };
56 const response = await deleteUser(params);
57 if (response.message) {
58 message.success(response.message || '用户删除成功');
ybtda5978b2025-05-31 15:58:05 +080059 fetchUsers(); // 重新加载用户列表
60 }
61 } catch (error) {
62 message.error(error.message || '删除用户失败');
63 }
64 };
65
66 const columns = [
67 { title: '用户名', dataIndex: 'username', key: 'username' },
68 { title: '角色', dataIndex: 'role', key: 'role' },
69 { title: '状态', dataIndex: 'status', key: 'status' },
70 { title: '注册日期', dataIndex: 'createTime', key: 'createTime' },
71 {
72 title: '操作',
73 key: 'action',
74 render: (_, record) => (
75 <Space size="middle">
ybtda5978b2025-05-31 15:58:05 +080076 {record.userType !== 1 && (
77 <Popconfirm
78 title="确定要删除该用户吗?"
79 onConfirm={() => handleDelete(record.username)}
80 okText="确定"
81 cancelText="取消"
82 >
83 <Button type="link" danger>删除</Button>
84 </Popconfirm>
85 )}
86 </Space>
87 ),
88 },
89 ];
90
91 return (
92 <div className="p-6">
93 <Title level={2}>管理员控制面板</Title>
94 <div className="flex gap-4 mb-6">
95 <Card title="用户统计" className="w-1/3">
96 <div className="flex items-center">
97 <UserOutlined className="text-2xl mr-2" />
98 <span className="text-xl">{users.length} 名用户</span>
99 </div>
100 </Card>
101 <Card title="资源统计" className="w-1/3">
102 <div className="flex items-center">
103 <UploadOutlined className="text-2xl mr-2" />
104 <span className="text-xl">25 个资源</span>
105 </div>
106 </Card>
107 <Card title="系统状态" className="w-1/3">
108 <div className="flex items-center">
109 <SettingOutlined className="text-2xl mr-2" />
110 <span className="text-xl">运行正常</span>
111 </div>
112 </Card>
113 </div>
114 <Card title="用户管理">
115 {loading ? (
116 <div className="flex justify-center py-8">
117 <Spin size="large" tip="加载中..." />
118 </div>
119 ) : (
120 <Table columns={columns} dataSource={users} />
121 )}
122 </Card>
123 </div>
124 );
125};
126
127export default AdminPanel;