feat(auth): 实现登录注册功能并重构 App 组件
- 新增登录和注册页面组件
- 实现用户认证和权限管理逻辑
- 重构 App 组件,使用 Router 和 AuthProvider
- 添加管理员面板和论坛页面组件
Change-Id: Iaa4502616970e75e3268537f73c75dac8f60e24d
diff --git a/src/features/admin/pages/AdminPanel.jsx b/src/features/admin/pages/AdminPanel.jsx
new file mode 100644
index 0000000..93d8d87
--- /dev/null
+++ b/src/features/admin/pages/AdminPanel.jsx
@@ -0,0 +1,118 @@
+import React, { useState, useEffect } from 'react';
+import { Card, Table, Button, Space, Typography, message, Popconfirm, Spin } from 'antd';
+import { UserOutlined, UploadOutlined, SettingOutlined } from '@ant-design/icons';
+import { getUserList, deleteUser } from '../../auth/services/authApi';
+
+const { Title } = Typography;
+
+const AdminPanel = () => {
+ const [users, setUsers] = useState([]);
+ const [loading, setLoading] = useState(true);
+
+ // 获取管理员信息
+ const adminUser = JSON.parse(localStorage.getItem('user') || '{}');
+
+ // 加载用户数据
+ useEffect(() => {
+ fetchUsers();
+ }, []);
+
+ // 获取用户列表
+ const fetchUsers = async () => {
+ try {
+ setLoading(true);
+ const response = await getUserList(adminUser.username);
+ if (response.success) {
+ const userList = response.data.users || [];
+ // 添加key属性
+ const formattedUsers = userList.map(user => ({
+ ...user,
+ key: user.id,
+ role: user.userType === 1 ? '管理员' : '普通用户',
+ status: '正常'
+ }));
+ setUsers(formattedUsers);
+ }
+ } catch (error) {
+ message.error(error.message || '获取用户列表失败');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ // 删除用户
+ const handleDelete = async (username) => {
+ try {
+ const response = await deleteUser(adminUser.username, username);
+ if (response.success) {
+ message.success('用户删除成功');
+ fetchUsers(); // 重新加载用户列表
+ }
+ } catch (error) {
+ message.error(error.message || '删除用户失败');
+ }
+ };
+
+ const columns = [
+ { title: '用户名', dataIndex: 'username', key: 'username' },
+ { title: '角色', dataIndex: 'role', key: 'role' },
+ { title: '状态', dataIndex: 'status', key: 'status' },
+ { title: '注册日期', dataIndex: 'createTime', key: 'createTime' },
+ {
+ title: '操作',
+ key: 'action',
+ render: (_, record) => (
+ <Space size="middle">
+ <Button type="link">编辑</Button>
+ {record.userType !== 1 && (
+ <Popconfirm
+ title="确定要删除该用户吗?"
+ onConfirm={() => handleDelete(record.username)}
+ okText="确定"
+ cancelText="取消"
+ >
+ <Button type="link" danger>删除</Button>
+ </Popconfirm>
+ )}
+ </Space>
+ ),
+ },
+ ];
+
+ return (
+ <div className="p-6">
+ <Title level={2}>管理员控制面板</Title>
+ <div className="flex gap-4 mb-6">
+ <Card title="用户统计" className="w-1/3">
+ <div className="flex items-center">
+ <UserOutlined className="text-2xl mr-2" />
+ <span className="text-xl">{users.length} 名用户</span>
+ </div>
+ </Card>
+ <Card title="资源统计" className="w-1/3">
+ <div className="flex items-center">
+ <UploadOutlined className="text-2xl mr-2" />
+ <span className="text-xl">25 个资源</span>
+ </div>
+ </Card>
+ <Card title="系统状态" className="w-1/3">
+ <div className="flex items-center">
+ <SettingOutlined className="text-2xl mr-2" />
+ <span className="text-xl">运行正常</span>
+ </div>
+ </Card>
+ </div>
+ <Card title="用户管理">
+ {loading ? (
+ <div className="flex justify-center py-8">
+ <Spin size="large" tip="加载中..." />
+ </div>
+ ) : (
+ <Table columns={columns} dataSource={users} />
+ )}
+ </Card>
+ </div>
+ );
+};
+
+export default AdminPanel;
\ No newline at end of file