blob: bffa5bfc583dff08cfe87bd2a99b7cf732f1dad0 [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">
76 <Button type="link">编辑</Button>
77 {record.userType !== 1 && (
78 <Popconfirm
79 title="确定要删除该用户吗?"
80 onConfirm={() => handleDelete(record.username)}
81 okText="确定"
82 cancelText="取消"
83 >
84 <Button type="link" danger>删除</Button>
85 </Popconfirm>
86 )}
87 </Space>
88 ),
89 },
90 ];
91
92 return (
93 <div className="p-6">
94 <Title level={2}>管理员控制面板</Title>
95 <div className="flex gap-4 mb-6">
96 <Card title="用户统计" className="w-1/3">
97 <div className="flex items-center">
98 <UserOutlined className="text-2xl mr-2" />
99 <span className="text-xl">{users.length} 名用户</span>
100 </div>
101 </Card>
102 <Card title="资源统计" className="w-1/3">
103 <div className="flex items-center">
104 <UploadOutlined className="text-2xl mr-2" />
105 <span className="text-xl">25 个资源</span>
106 </div>
107 </Card>
108 <Card title="系统状态" className="w-1/3">
109 <div className="flex items-center">
110 <SettingOutlined className="text-2xl mr-2" />
111 <span className="text-xl">运行正常</span>
112 </div>
113 </Card>
114 </div>
115 <Card title="用户管理">
116 {loading ? (
117 <div className="flex justify-center py-8">
118 <Spin size="large" tip="加载中..." />
119 </div>
120 ) : (
121 <Table columns={columns} dataSource={users} />
122 )}
123 </Card>
124 </div>
125 );
126};
127
128export default AdminPanel;