blob: f27ac02cdbb6cdcf6290c773effa4ca7bc90fbc9 [file] [log] [blame]
ybt02e716d2025-04-15 17:19:32 +08001import React, { useState } from 'react';
2import { useNavigate, Link } from 'react-router-dom';
3import { Form, Input, Button, Checkbox, Card, message, Typography, Space, Divider } from 'antd';
4import { UserOutlined, LockOutlined } from '@ant-design/icons';
5import request from '../utils/request'; // 替换为我们的请求工具
6
7const { Title, Text } = Typography;
8
9const Login = () => {
10 const [loading, setLoading] = useState(false);
11 const navigate = useNavigate();
12
13 const onFinish = async (values) => {
14 setLoading(true);
15 try {
16 const response = await request.post('/api/auth/login', {
17 username: values.username,
18 password: values.password
19 });
20
21 if (response.data.code === 200) {
22 // 登录成功
23 localStorage.setItem('token', response.data.data.token);
24 localStorage.setItem('user', JSON.stringify(response.data.data.user));
25
26 // 存储用户权限信息
27 if (response.data.data.permissions) {
28 localStorage.setItem('permissions', JSON.stringify(response.data.data.permissions));
29 }
30
31 message.success('登录成功');
32 navigate('/');
33 } else {
34 message.error(response.data.message || '登录失败');
35 }
36 } catch (error) {
37 console.error('登录错误:', error);
38 // 错误处理已在拦截器中完成,这里不需要额外处理
39 } finally {
40 setLoading(false);
41 }
42 };
43
44 return (
45 <div className="flex justify-center items-center min-h-screen bg-gray-100 p-4">
46 <Card className="w-full max-w-md shadow-lg">
47 <div className="text-center mb-6">
48 <Title level={2} className="mb-2">PT网站登录</Title>
49 <Text type="secondary">欢迎回来,请登录您的账号</Text>
50 </div>
51
52 <Form
53 name="login"
54 initialValues={{ remember: true }}
55 onFinish={onFinish}
56 size="large"
57 layout="vertical"
58 >
59 <Form.Item
60 name="username"
61 rules={[{ required: true, message: '请输入用户名!' }]}
62 >
63 <Input prefix={<UserOutlined />} placeholder="用户名" />
64 </Form.Item>
65
66 <Form.Item
67 name="password"
68 rules={[{ required: true, message: '请输入密码!' }]}
69 >
70 <Input.Password prefix={<LockOutlined />} placeholder="密码" />
71 </Form.Item>
72
73 <Form.Item>
74 <div className="flex justify-between items-center">
75 <Form.Item name="remember" valuePropName="checked" noStyle>
76 <Checkbox>记住我</Checkbox>
77 </Form.Item>
78 <a className="text-blue-500 hover:text-blue-700" href="#">
79 忘记密码
80 </a>
81 </div>
82 </Form.Item>
83
84 <Form.Item>
85 <Button type="primary" htmlType="submit" className="w-full" loading={loading}>
86 登录
87 </Button>
88 </Form.Item>
89
90 <Divider plain>或者</Divider>
91
92 <div className="text-center">
93 <Text type="secondary" className="mr-2">还没有账号?</Text>
94 <Link to="/register" className="text-blue-500 hover:text-blue-700">立即注册</Link>
95 </div>
96 </Form>
97
98 <div className="mt-6 p-4 bg-gray-50 rounded-md">
99 <Text type="secondary" className="block mb-2">提示:测试账号</Text>
100 <ul className="space-y-1 text-sm text-gray-600">
101 <li>管理员: admin / admin123</li>
102 <li>普通用户: user / user123</li>
103 <li>版主: moderator / mod123</li>
104 <li>老手: veteran / vet123</li>
105 <li>新人: newbie / new123</li>
106 <li>黑户: blacklisted / black123</li>
107 </ul>
108 </div>
109 </Card>
110 </div>
111 );
112};
113
114export default Login;