From 85abba9bbf82249aaabb4b1c5a6b05347f88fb22 Mon Sep 17 00:00:00 2001 From: JetSprow Date: Thu, 30 Apr 2026 15:04:21 +1000 Subject: [PATCH] feat: polish lite auth entry points --- src/app/(auth)/_components/auth-shell.tsx | 3 +- src/app/(auth)/forgot-password/page.tsx | 2 +- src/app/(auth)/layout.tsx | 6 ++-- src/app/(auth)/login/login-page-client.tsx | 29 +++++++++++++------ src/app/(auth)/login/page.tsx | 4 +-- src/app/(auth)/register/page.tsx | 4 ++- .../(auth)/register/register-page-client.tsx | 3 +- src/app/layout.tsx | 7 +++-- src/components/shared/site-footer.tsx | 17 +++++++---- src/lib/product.ts | 6 ++++ 10 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 src/lib/product.ts diff --git a/src/app/(auth)/_components/auth-shell.tsx b/src/app/(auth)/_components/auth-shell.tsx index 94bf6b1..da11da7 100644 --- a/src/app/(auth)/_components/auth-shell.tsx +++ b/src/app/(auth)/_components/auth-shell.tsx @@ -3,6 +3,7 @@ import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { cn } from "@/lib/utils"; import { PublicNotice } from "../public-notice"; import { SiteFooter } from "@/components/shared/site-footer"; +import { PRODUCT_EDITION } from "@/lib/product"; export function AuthShell({ children }: { children: ReactNode }) { return ( @@ -36,7 +37,7 @@ export function AuthCard({ {(title || description) && (
- S + {PRODUCT_EDITION.slice(0, 1)}
{title &&

{title}

} {description &&

{description}

} diff --git a/src/app/(auth)/forgot-password/page.tsx b/src/app/(auth)/forgot-password/page.tsx index 8c8e5ba..9a0f95b 100644 --- a/src/app/(auth)/forgot-password/page.tsx +++ b/src/app/(auth)/forgot-password/page.tsx @@ -3,7 +3,7 @@ import { ForgotPasswordClient } from "./forgot-password-client"; export const metadata: Metadata = { title: "找回密码", - description: "通过邮箱重设 J-Board 账户密码。", + description: "通过邮箱重设 J-Board Lite 账户密码。", }; export default function ForgotPasswordPage() { diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 6170624..ee2959f 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -7,10 +7,10 @@ import { PageTransition } from "@/components/shared/page-transition"; export const metadata: Metadata = { title: { - default: "登录与注册", - template: "%s | J-Board", + default: "账户入口", + template: "%s | J-Board Lite", }, - description: "登录或注册 J-Board 账号。", + description: "登录 J-Board Lite 账号,或通过邮箱找回密码。", }; export default async function AuthLayout({ diff --git a/src/app/(auth)/login/login-page-client.tsx b/src/app/(auth)/login/login-page-client.tsx index 17c4bc3..57b0479 100644 --- a/src/app/(auth)/login/login-page-client.tsx +++ b/src/app/(auth)/login/login-page-client.tsx @@ -9,9 +9,16 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { TurnstileWidget } from "@/components/shared/turnstile-widget"; +import { PRODUCT_NAME } from "@/lib/product"; import { AuthCard, AuthErrorMessage, AuthShell } from "../_components/auth-shell"; -export function LoginPageClient({ siteKey }: { siteKey?: string | null }) { +export function LoginPageClient({ + siteKey, + allowRegistration, +}: { + siteKey?: string | null; + allowRegistration: boolean; +}) { const router = useRouter(); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); @@ -43,7 +50,7 @@ export function LoginPageClient({ siteKey }: { siteKey?: string | null }) { return ( - +
@@ -63,13 +70,17 @@ export function LoginPageClient({ siteKey }: { siteKey?: string | null }) { 忘记密码 - - - 没有账户?{" "} - - 注册 - - + {allowRegistration && ( + <> + + + 没有账户?{" "} + + 注册 + + + + )} {error === "邮箱尚未验证,请先查收验证邮件" && ( <> diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index 89c4879..7ac1b21 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -4,10 +4,10 @@ import { LoginPageClient } from "./login-page-client"; export const metadata: Metadata = { title: "登录", - description: "登录 J-Board 账户并进入用户中心。", + description: "登录 J-Board Lite 账户并进入用户中心。", }; export default async function LoginPage() { const config = await getAppConfig(); - return ; + return ; } diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx index 1bd22a9..a410885 100644 --- a/src/app/(auth)/register/page.tsx +++ b/src/app/(auth)/register/page.tsx @@ -1,13 +1,15 @@ import type { Metadata } from "next"; +import { redirect } from "next/navigation"; import { getAppConfig } from "@/services/app-config"; import { RegisterPageClient } from "./register-page-client"; export const metadata: Metadata = { title: "注册", - description: "创建 J-Board 新账户并开始订阅服务。", + description: "创建 J-Board Lite 新账户并开始订阅服务。", }; export default async function RegisterPage() { const config = await getAppConfig(); + if (!config.allowRegistration) redirect("/login"); return ; } diff --git a/src/app/(auth)/register/register-page-client.tsx b/src/app/(auth)/register/register-page-client.tsx index 83bd9d7..ec47236 100644 --- a/src/app/(auth)/register/register-page-client.tsx +++ b/src/app/(auth)/register/register-page-client.tsx @@ -8,6 +8,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { TurnstileWidget } from "@/components/shared/turnstile-widget"; import { getErrorMessage } from "@/lib/errors"; +import { PRODUCT_NAME } from "@/lib/product"; import { AuthCard, AuthErrorMessage, AuthShell } from "../_components/auth-shell"; export function RegisterPageClient({ siteKey }: { siteKey?: string | null }) { @@ -80,7 +81,7 @@ export function RegisterPageClient({ siteKey }: { siteKey?: string | null }) { return ( - +
diff --git a/src/app/layout.tsx b/src/app/layout.tsx index efa3788..73003ad 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,14 +1,15 @@ import type { Metadata } from "next"; import { Toaster } from "@/components/ui/sonner"; import { ThemeProvider } from "@/components/shared/theme-provider"; +import { PRODUCT_NAME } from "@/lib/product"; import "./globals.css"; export const metadata: Metadata = { title: { - default: "J-Board - JB面板", - template: "%s | J-Board", + default: `${PRODUCT_NAME} - JB面板轻量版`, + template: `%s | ${PRODUCT_NAME}`, }, - description: "J-Board(JB面板)订阅共享与节点管理平台", + description: "J-Board Lite(JB面板轻量版)订阅共享与节点管理平台", }; export default function RootLayout({ diff --git a/src/components/shared/site-footer.tsx b/src/components/shared/site-footer.tsx index a313c2d..1a6ba97 100644 --- a/src/components/shared/site-footer.tsx +++ b/src/components/shared/site-footer.tsx @@ -1,23 +1,28 @@ import { GitFork } from "lucide-react"; import { cn } from "@/lib/utils"; import { ThemeToggle } from "./theme-toggle"; - -const GITHUB_URL = "https://github.com/JetSprow/J-Board"; +import { PRODUCT_EDITION, PRODUCT_NAME, PRODUCT_REPOSITORY_URL, PRODUCT_VERSION } from "@/lib/product"; export function SiteFooter({ className }: { className?: string }) { return (