From 2fc039020924f327b7a445bb9eb0d5e9301e0b3a Mon Sep 17 00:00:00 2001 From: mtvpls Date: Thu, 4 Dec 2025 10:03:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E7=9C=8B=E5=AF=86=E7=A0=81=E5=92=8C=E8=AE=B0?= =?UTF-8?q?=E4=BD=8F=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/login/page.tsx | 86 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 11 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 8523639..fdc11cc 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,7 +2,7 @@ 'use client'; -import { AlertCircle, CheckCircle } from 'lucide-react'; +import { AlertCircle, CheckCircle, Eye, EyeOff } from 'lucide-react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Suspense, useEffect, useState } from 'react'; @@ -75,6 +75,8 @@ function LoginPageClient() { const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [shouldAskUsername, setShouldAskUsername] = useState(false); + const [rememberPassword, setRememberPassword] = useState(false); + const [showPassword, setShowPassword] = useState(false); const { siteName } = useSite(); @@ -82,7 +84,26 @@ function LoginPageClient() { useEffect(() => { if (typeof window !== 'undefined') { const storageType = (window as any).RUNTIME_CONFIG?.STORAGE_TYPE; - setShouldAskUsername(storageType && storageType !== 'localstorage'); + const shouldAsk = storageType && storageType !== 'localstorage'; + setShouldAskUsername(shouldAsk); + + // 从localStorage读取记住的密码信息 + const rememberedCredentials = localStorage.getItem('rememberedCredentials'); + if (rememberedCredentials) { + try { + const credentials = JSON.parse(rememberedCredentials); + if (credentials.password) { + setPassword(credentials.password); + } + if (credentials.username && shouldAsk) { + setUsername(credentials.username); + } + setRememberPassword(true); + } catch (error) { + // 清除无效的数据 + localStorage.removeItem('rememberedCredentials'); + } + } } }, []); @@ -104,6 +125,19 @@ function LoginPageClient() { }); if (res.ok) { + // 处理记住密码逻辑 + if (rememberPassword) { + const credentials: any = { password }; + // 如果需要用户名且有用户名,就保存用户名 + if (shouldAskUsername && username) { + credentials.username = username; + } + localStorage.setItem('rememberedCredentials', JSON.stringify(credentials)); + } else { + // 如果不记住密码,清除已存储的信息 + localStorage.removeItem('rememberedCredentials'); + } + const redirect = searchParams.get('redirect') || '/'; router.replace(redirect); } else if (res.status === 401) { @@ -152,21 +186,51 @@ function LoginPageClient() { - setPassword(e.target.value)} - /> +
+ setPassword(e.target.value)} + /> + +
{error && (

{error}

)} + {/* 记住密码复选框 */} +
+ setRememberPassword(e.target.checked)} + /> + +
+ {/* 登录按钮 */}