Skip to content

Commit 7ac0771

Browse files
author
CodeJudge
committed
feat: 登录记住我 + 测试用例编号
1 parent 5f2e398 commit 7ac0771

4 files changed

Lines changed: 17 additions & 4 deletions

File tree

backend/src/controllers/authController.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function register(req, res) {
2525
}
2626

2727
function login(req, res) {
28-
const { email, password } = req.body;
28+
const { email, password, rememberMe } = req.body;
2929
if (!email || !password) {
3030
return res.status(400).json({ error: '请输入邮箱和密码' });
3131
}
@@ -35,7 +35,8 @@ function login(req, res) {
3535
}
3636
// Update last login
3737
run('UPDATE users SET last_login = datetime() WHERE id = ?', [user.id]);
38-
const token = jwt.sign({ id: user.id, username: user.username, email: user.email, role: user.role }, JWT_SECRET, { expiresIn: '7d' });
38+
const expiresIn = rememberMe ? '30d' : '7d';
39+
const token = jwt.sign({ id: user.id, username: user.username, email: user.email, role: user.role }, JWT_SECRET, { expiresIn });
3940
res.json({
4041
token,
4142
user: { id: user.id, username: user.username, email: user.email, role: user.role, last_login: new Date().toISOString() },

frontend/src/pages/AdminProblemForm.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ export default function AdminProblemForm() {
412412
<div className="space-y-3">
413413
{testCases.map((tc, index) => (
414414
<div key={index} className="card p-4 relative">
415+
<div className="absolute top-2 left-3 text-xs text-dark-500 font-mono">#{index + 1}</div>
415416
{testCases.length > 1 && (
416417
<button
417418
type="button"

frontend/src/pages/Login.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export default function Login() {
1010
const navigate = useNavigate();
1111
const [email, setEmail] = useState('');
1212
const [password, setPassword] = useState('');
13+
const [rememberMe, setRememberMe] = useState(false);
1314
const [submitting, setSubmitting] = useState(false);
1415

1516
useEffect(() => {
@@ -26,7 +27,7 @@ export default function Login() {
2627
}
2728
setSubmitting(true);
2829
try {
29-
const res = await api.auth.login({ email: email.trim(), password });
30+
const res = await api.auth.login({ email: email.trim(), password, rememberMe });
3031
login(res.token, res.user);
3132
toast.success('登录成功');
3233
navigate('/', { replace: true });
@@ -84,6 +85,16 @@ export default function Login() {
8485
</div>
8586
</div>
8687

88+
<label className="flex items-center gap-2 cursor-pointer select-none">
89+
<input
90+
type="checkbox"
91+
checked={rememberMe}
92+
onChange={(e) => setRememberMe(e.target.checked)}
93+
className="w-4 h-4 rounded border-dark-600 bg-dark-800 text-primary-500 focus:ring-primary-500/30"
94+
/>
95+
<span className="text-sm text-dark-400">记住我(30天有效)</span>
96+
</label>
97+
8798
<button
8899
type="submit"
89100
disabled={submitting}

frontend/src/services/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const api = {
3131
auth: {
3232
register: (body: { username: string; email: string; password: string }) =>
3333
request<{ token: string; user: import('../types').User }>('/auth/register', { method: 'POST', body: JSON.stringify(body) }),
34-
login: (body: { email: string; password: string }) =>
34+
login: (body: { email: string; password: string; rememberMe?: boolean }) =>
3535
request<{ token: string; user: import('../types').User }>('/auth/login', { method: 'POST', body: JSON.stringify(body) }),
3636
profile: () => request<import('../types').User>('/auth/profile'),
3737
leaderboard: () => request<any[]>('/auth/leaderboard'),

0 commit comments

Comments
 (0)