blob: 2982270f8d96f12c759629c4ad21436308616219 [file] [log] [blame]
2130105001e07a12025-06-09 18:00:40 +08001import React, { useState, useEffect } from 'react';
2import axios from 'axios';
3import './AuthStyle.css'; // 引入样式文件
4
5const UserAuth = () => {
6 // 状态管理
7 const [registerData, setRegisterData] = useState({
8 username: '',
9 password: '',
10 code: '',
11 email: '',
12 emailcode: ''
13 });
14 const [loginData, setLoginData] = useState({
15 username: '',
16 password: ''
17 });
18 const [activeTab, setActiveTab] = useState('login');
19 const [message, setMessage] = useState('');
20 const [error, setError] = useState('');
21 const [countdown, setCountdown] = useState(0);
22 const [isLoading, setIsLoading] = useState(false);
23
24 // 倒计时效果
25 useEffect(() => {
26 if (countdown > 0) {
27 const timer = setTimeout(() => setCountdown(countdown - 1), 1000);
28 return () => clearTimeout(timer);
29 }
30 }, [countdown]);
31
32 // 输入处理
33 const handleChange = (e, formType) => {
34 const { name, value } = e.target;
35 formType === 'register'
36 ? setRegisterData(prev => ({ ...prev, [name]: value }))
37 : setLoginData(prev => ({ ...prev, [name]: value }));
38 };
39
40 // 发送验证码
41 const handleSendCode = async () => {
42 if (!registerData.email) {
43 setError('请输入邮箱地址');
44 return;
45 }
46
47 try {
48 setIsLoading(true);
49 const response = await axios.post('http://localhost:8080/user/sendCode', null, {
50 params: { email: registerData.email }
51 });
52
53 if (response.data?.success) {
54 setMessage('验证码已发送');
55 setError('');
56 setCountdown(60);
57 } else {
58 setError(response.data?.message || '发送失败');
59 }
60 } catch (err) {
61 setError(err.response?.data?.message || '发送出错');
62 } finally {
63 setIsLoading(false);
64 }
65 };
66
67 // 注册提交
68 const handleRegister = async (e) => {
69 e.preventDefault();
70 if (Object.values(registerData).some(v => !v)) {
71 setError('请填写所有字段');
72 return;
73 }
74
75 try {
76 setIsLoading(true);
77 const response = await axios.post('http://localhost:8080/user/register', {
78 username: registerData.username,
79 password: registerData.password,
80 email: registerData.email
81 }, {
82 params: {
83 code: registerData.code,
84 emailcode: registerData.emailcode
85 }
86 });
87
88 if (response.data?.success) {
89 setMessage('注册成功');
90 setActiveTab('login');
91 setRegisterData({
92 username: '',
93 password: '',
94 code: '',
95 email: '',
96 emailcode: ''
97 });
98 } else {
99 setError(response.data?.message || '注册失败');
100 }
101 } catch (err) {
102 setError(err.response?.data?.message || '注册出错');
103 } finally {
104 setIsLoading(false);
105 }
106 };
107
108 // 登录提交
109 const handleLogin = async (e) => {
110 e.preventDefault();
111 if (!loginData.username || !loginData.password) {
112 setError('请输入用户名和密码');
113 return;
114 }
115
116 try {
117 setIsLoading(true);
118 const response = await axios.post('http://localhost:8080/user/login', null, {
119 params: {
120 username: loginData.username,
121 password: loginData.password
122 }
123 });
124
125 if (response.data?.success) {
126 localStorage.setItem('user', JSON.stringify(response.data.user));
127 if(response.data.user.permission==0)
128 window.location.href = '/';
129 else
130 window.location.href = '/';
131 } else {
132 setError(response.data?.message || '登录失败');
133 }
134 } catch (err) {
135 setError(err.response?.data?.message || '登录出错');
136 } finally {
137 setIsLoading(false);
138 }
139 };
140
141 return (
142 <div className="auth-wrapper">
143 <div className="auth-container">
144 <div className="auth-header">
145 <h1>PT Share</h1>
146 <p>专业资源分享平台</p>
147 </div>
148
149 <div className="auth-card">
150 <div className="tabs">
151 <button
152 className={`tab-btn ${activeTab === 'login' ? 'active' : ''}`}
153 onClick={() => setActiveTab('login')}
154 >
155 登录
156 </button>
157 <button
158 className={`tab-btn ${activeTab === 'register' ? 'active' : ''}`}
159 onClick={() => setActiveTab('register')}
160 >
161 注册
162 </button>
163 <div
164 className="tab-indicator"
165 style={{ left: activeTab === 'login' ? '0' : '50%' }}
166 />
167 </div>
168
169 <div className={`message ${error ? 'error' : ''}`}>
170 {error || message}
171 </div>
172
173 {activeTab === 'login' ? (
174 <form onSubmit={handleLogin} className="auth-form">
175 <div className="form-group">
176 <input
177 type="text"
178 name="username"
179 value={loginData.username}
180 onChange={(e) => handleChange(e, 'login')}
181 placeholder="用户名"
182 required
183 />
184 </div>
185 <div className="form-group">
186 <input
187 type="password"
188 name="password"
189 value={loginData.password}
190 onChange={(e) => handleChange(e, 'login')}
191 placeholder="密码"
192 required
193 />
194 </div>
195 <button type="submit" className="submit-btn" disabled={isLoading}>
196 {isLoading ? <div className="spinner"></div> : '登 录'}
197 </button>
198 </form>
199 ) : (
200 <form onSubmit={handleRegister} className="auth-form">
201 <div className="form-group">
202 <input
203 type="text"
204 name="username"
205 value={registerData.username}
206 onChange={(e) => handleChange(e, 'register')}
207 placeholder="用户名"
208 required
209 />
210 </div>
211 <div className="form-group">
212 <input
213 type="password"
214 name="password"
215 value={registerData.password}
216 onChange={(e) => handleChange(e, 'register')}
217 placeholder="密码"
218 required
219 />
220 </div>
221 <div className="form-group">
222 <input
223 type="text"
224 name="code"
225 value={registerData.code}
226 onChange={(e) => handleChange(e, 'register')}
227 placeholder="邀请码"
228 required
229 />
230 </div>
231 <div className="form-group">
232 <input
233 type="email"
234 name="email"
235 value={registerData.email}
236 onChange={(e) => handleChange(e, 'register')}
237 placeholder="邮箱"
238 required
239 />
240 </div>
241 <div className="form-group with-button">
242 <input
243 type="text"
244 name="emailcode"
245 value={registerData.emailcode}
246 onChange={(e) => handleChange(e, 'register')}
247 placeholder="验证码"
248 required
249 />
250 <button
251 type="button"
252 onClick={handleSendCode}
253 disabled={countdown > 0 || isLoading}
254 className="code-btn"
255 >
256 {countdown > 0 ? `${countdown}s` : '获取验证码'}
257 </button>
258 </div>
259 <button type="submit" className="submit-btn" disabled={isLoading}>
260 {isLoading ? <div className="spinner"></div> : '注 册'}
261 </button>
262 </form>
263 )}
264 </div>
265
266 <div className="auth-footer">
267 <p>© {new Date().getFullYear()} PT Share - 专业资源分享平台</p>
268 </div>
269 </div>
270 </div>
271 );
272};
273
274export default UserAuth;