From d2cd4f695559cf1ee8e95a65fbb88c5abfdbb32a Mon Sep 17 00:00:00 2001 From: mtvpls Date: Sat, 13 Dec 2025 13:46:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=88=96=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=97=B6=E9=87=8D=E7=BD=AEcf=E5=B0=8F?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/login/page.tsx | 27 +++++++++++++++++++++------ src/app/register/page.tsx | 31 +++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index d97e7c4..7e0920e 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -80,6 +80,7 @@ function LoginPageClient() { const [turnstileToken, setTurnstileToken] = useState(null); const [turnstileLoaded, setTurnstileLoaded] = useState(false); const [siteConfig, setSiteConfig] = useState(null); + const [turnstileWidgetId, setTurnstileWidgetId] = useState(null); const { siteName } = useSite(); @@ -155,12 +156,13 @@ function LoginPageClient() { const container = document.getElementById('turnstile-container'); if (container && (window as any).turnstile) { - (window as any).turnstile.render('#turnstile-container', { + const widgetId = (window as any).turnstile.render('#turnstile-container', { sitekey: siteConfig.TurnstileSiteKey, callback: (token: string) => { setTurnstileToken(token); }, }); + setTurnstileWidgetId(widgetId); } }, [turnstileLoaded, siteConfig]); @@ -201,16 +203,29 @@ function LoginPageClient() { // 如果不记住密码,清除已存储的信息 localStorage.removeItem('rememberedCredentials'); } - + const redirect = searchParams.get('redirect') || '/'; router.replace(redirect); - } else if (res.status === 401) { - setError('密码错误'); } else { - const data = await res.json().catch(() => ({})); - setError(data.error ?? '服务器错误'); + // 登录失败,重置Turnstile + if (siteConfig?.LoginRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) { + (window as any).turnstile.reset(turnstileWidgetId); + setTurnstileToken(null); + } + + if (res.status === 401) { + setError('密码错误'); + } else { + const data = await res.json().catch(() => ({})); + setError(data.error ?? '服务器错误'); + } } } catch (error) { + // 网络错误,重置Turnstile + if (siteConfig?.LoginRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) { + (window as any).turnstile.reset(turnstileWidgetId); + setTurnstileToken(null); + } setError('网络错误,请稍后重试'); } finally { setLoading(false); diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx index 65410d5..7d37b16 100644 --- a/src/app/register/page.tsx +++ b/src/app/register/page.tsx @@ -80,6 +80,7 @@ function RegisterPageClient() { const [turnstileToken, setTurnstileToken] = useState(null); const [turnstileLoaded, setTurnstileLoaded] = useState(false); const [siteConfig, setSiteConfig] = useState(null); + const [turnstileWidgetId, setTurnstileWidgetId] = useState(null); const { siteName } = useSite(); @@ -133,12 +134,13 @@ function RegisterPageClient() { const container = document.getElementById('turnstile-container'); if (container && (window as any).turnstile) { - (window as any).turnstile.render('#turnstile-container', { + const widgetId = (window as any).turnstile.render('#turnstile-container', { sitekey: siteConfig.TurnstileSiteKey, callback: (token: string) => { setTurnstileToken(token); }, }); + setTurnstileWidgetId(widgetId); } }, [turnstileLoaded, siteConfig]); @@ -183,16 +185,29 @@ function RegisterPageClient() { // 注册成功,跳转到登录页 const redirect = searchParams.get('redirect') || '/login'; router.replace(redirect); - } else if (res.status === 400) { - const data = await res.json().catch(() => ({})); - setError(data.error || '注册失败'); - } else if (res.status === 409) { - setError('用户名已存在'); } else { - const data = await res.json().catch(() => ({})); - setError(data.error ?? '服务器错误'); + // 注册失败,重置Turnstile + if (siteConfig?.RegistrationRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) { + (window as any).turnstile.reset(turnstileWidgetId); + setTurnstileToken(null); + } + + if (res.status === 400) { + const data = await res.json().catch(() => ({})); + setError(data.error || '注册失败'); + } else if (res.status === 409) { + setError('用户名已存在'); + } else { + const data = await res.json().catch(() => ({})); + setError(data.error ?? '服务器错误'); + } } } catch (error) { + // 网络错误,重置Turnstile + if (siteConfig?.RegistrationRequireTurnstile && turnstileWidgetId !== null && (window as any).turnstile) { + (window as any).turnstile.reset(turnstileWidgetId); + setTurnstileToken(null); + } setError('网络错误,请稍后重试'); } finally { setLoading(false);