feat(admin): 实现管理员登录和删除功能
- 新增管理员登录接口和相关逻辑
- 实现帖子和评论的删除功能
- 更新用户权限检查逻辑
- 优化登录页面,增加管理员登录入口
- 调整论坛页面布局,增加删除按钮
Change-Id: I6b81fa7296ec9642ca14e249ede517f2fec3d077
diff --git a/src/features/auth/pages/AdminLoginPage.jsx b/src/features/auth/pages/AdminLoginPage.jsx
new file mode 100644
index 0000000..248fcb1
--- /dev/null
+++ b/src/features/auth/pages/AdminLoginPage.jsx
@@ -0,0 +1,157 @@
+import React, { useState } from "react";
+import { useNavigate, Link } from "react-router-dom";
+import {
+ Form,
+ Input,
+ Button,
+ Card,
+ Typography,
+ Space,
+ Divider,
+ message,
+ Alert,
+} from "antd";
+import { UserOutlined, LockOutlined, CrownOutlined } from "@ant-design/icons";
+import { useAuth } from "../contexts/AuthContext";
+
+const { Title, Text } = Typography;
+
+const AdminLoginPage = () => {
+ const [loading, setLoading] = useState(false);
+ const navigate = useNavigate();
+ const { adminLogin, isAuthenticated, user } = useAuth();
+
+ React.useEffect(() => {
+ // 如果已经登录且是管理员,重定向到管理面板
+ if (isAuthenticated && user && user.role === 'admin') {
+ navigate("/admin");
+ }
+ }, [isAuthenticated, user, navigate]);
+
+ const onFinish = async (values) => {
+ setLoading(true);
+ try {
+ const params = {
+ username: values.username,
+ password: values.password,
+ };
+ const userData = await adminLogin(params);
+
+ console.log("admin login userData:", userData);
+ // 管理员登录成功后直接导航到管理面板
+ if (userData && userData.uid.includes('admin')) {
+ navigate("/admin");
+ } else {
+ message.error("该账号不是管理员账号");
+ }
+ } catch (error) {
+ console.error("Admin login page error:", error);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+ <div className="flex justify-center items-center min-h-screen bg-gradient-to-br from-orange-100 to-red-100 p-4">
+ <Card className="w-full max-w-md shadow-xl rounded-lg border-t-4 border-t-orange-500">
+ <div className="text-center mb-8">
+ <div className="mb-4">
+ <CrownOutlined className="text-4xl text-orange-500" />
+ </div>
+ <Title level={2} className="!mb-2 text-orange-700">
+ 管理员登录
+ </Title>
+ <Text type="secondary">请使用管理员账号登录系统</Text>
+ </div>
+
+ <Alert
+ message="管理员登录"
+ description="此页面仅供系统管理员使用,请确认您拥有管理员权限。"
+ type="warning"
+ showIcon
+ className="mb-6"
+ />
+
+ <Form
+ name="admin_login_form"
+ initialValues={{ remember: true }}
+ onFinish={onFinish}
+ size="large"
+ layout="vertical"
+ className="space-y-6"
+ >
+ <Form.Item
+ name="username"
+ rules={[{ required: true, message: "请输入管理员用户名!" }]}
+ >
+ <Input
+ prefix={<UserOutlined className="site-form-item-icon" />}
+ placeholder="管理员用户名"
+ />
+ </Form.Item>
+ <Form.Item
+ name="password"
+ rules={[{ required: true, message: "请输入管理员密码!" }]}
+ >
+ <Input.Password
+ prefix={<LockOutlined className="site-form-item-icon" />}
+ placeholder="管理员密码"
+ />
+ </Form.Item>
+ <Form.Item>
+ <Button
+ type="primary"
+ htmlType="submit"
+ className="w-full !text-base bg-orange-500 border-orange-500 hover:bg-orange-600 hover:border-orange-600"
+ loading={loading}
+ >
+ 管理员登录
+ </Button>
+ </Form.Item>
+ </Form>
+
+ <Divider plain>
+ <span className="text-slate-500">其他选项</span>
+ </Divider>
+
+ <div className="text-center space-y-3">
+ <div>
+ <Link
+ to="/login"
+ className="font-medium text-blue-600 hover:text-blue-700 hover:underline"
+ >
+ 普通用户登录
+ </Link>
+ </div>
+ <div>
+ <Text type="secondary" className="mr-1">
+ 还没有账号?
+ </Text>
+ <Link
+ to="/register"
+ className="font-medium text-blue-600 hover:text-blue-700 hover:underline"
+ >
+ 立即注册
+ </Link>
+ </div>
+ </div>
+
+ {/* 管理员测试账号提示 */}
+ <div className="mt-8 p-4 bg-orange-50 rounded-md border border-orange-200">
+ <Text
+ type="secondary"
+ className="block mb-2 font-semibold text-orange-700"
+ >
+ 管理员测试账号
+ </Text>
+ <ul className="space-y-1 text-sm text-orange-600 list-disc list-inside">
+ <li>admin / admin123</li>
+ <li>IcyIron / 111111</li>
+ </ul>
+ </div>
+ </Card>
+ </div>
+ );
+};
+
+export default AdminLoginPage;
\ No newline at end of file