feat: 首次登录引导与注册修复
All checks were successful
CI / build-and-test (push) Successful in 20m12s
CI / deploy (push) Successful in 1m18s

This commit is contained in:
SpecialX
2026-01-12 10:49:30 +08:00
parent 15fcf2bc78
commit 8577280ab2
12 changed files with 653 additions and 25 deletions

View File

@@ -3,7 +3,7 @@
import * as React from "react"
import Link from "next/link"
import { Bell, Menu, Search } from "lucide-react"
import { signOut } from "next-auth/react"
import { signOut, useSession } from "next-auth/react"
import { Button } from "@/shared/components/ui/button"
import { Input } from "@/shared/components/ui/input"
@@ -30,6 +30,19 @@ import { useSidebar } from "./sidebar-provider"
export function SiteHeader() {
const { toggleSidebar, isMobile } = useSidebar()
const { data: session, status } = useSession()
const name = session?.user?.name ?? ""
const email = session?.user?.email ?? ""
const displayName = name || email || (status === "loading" ? "加载中..." : "未登录")
const fallbackBase = name || email || "?"
const avatarFallback = fallbackBase
.split(/\s+/)
.filter(Boolean)
.slice(0, 2)
.map((p) => p[0]?.toUpperCase())
.join("")
return (
<header className="bg-background/95 supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50 flex h-16 items-center border-b px-4 backdrop-blur-sm">
@@ -80,15 +93,17 @@ export function SiteHeader() {
<DropdownMenuTrigger asChild>
<Button variant="ghost" className="relative size-8 rounded-full">
<Avatar className="size-8">
<AvatarFallback>AD</AvatarFallback>
<AvatarFallback>{avatarFallback}</AvatarFallback>
</Avatar>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56" align="end" forceMount>
<DropdownMenuLabel className="font-normal">
<div className="flex flex-col space-y-1">
<p className="text-sm font-medium leading-none">Admin User</p>
<p className="text-muted-foreground text-xs leading-none">admin@nextedu.com</p>
<p className="text-sm font-medium leading-none">{displayName}</p>
{email ? (
<p className="text-muted-foreground text-xs leading-none">{email}</p>
) : null}
</div>
</DropdownMenuLabel>
<DropdownMenuSeparator />