2026-03-17 13:17:02 +08:00

193 lines
8.0 KiB
TypeScript

"use client"
import { useEffect } from "react"
import { useRouter } from "next/navigation"
import { DashboardShell } from "@/components/dashboard-shell"
import { DashboardHeader } from "@/components/dashboard-header"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Overview } from "@/components/overview"
import { RecentActivity } from "@/components/recent-activity"
import { Brain, Music, Shirt, User, Database, Sparkles } from "lucide-react"
import { StatCard } from "@/components/stat-card"
import Link from "next/link"
export default function DashboardPage() {
const router = useRouter()
// 检查用户是否已登录
// 在实际应用中,这里应该检查用户的会话或令牌
useEffect(() => {
try {
// 模拟检查登录状态
const isLoggedIn = localStorage.getItem("isLoggedIn")
if (!isLoggedIn) {
// 如果未登录,重定向到登录页面
router.push("/login")
}
} catch (error) {
console.error("登录状态检查失败:", error)
}
}, [router])
return (
<DashboardShell>
<DashboardHeader heading="管理后台" text="洛天依APP管理系统">
<Button
className="bg-gradient-to-r from-pink-500 to-purple-600 hover:from-pink-600 hover:to-purple-700 transition-all duration-300 shadow-md hover:shadow-lg"
asChild
>
<Link href="/settings">
<Sparkles className="mr-2 h-4 w-4" />
</Link>
</Button>
</DashboardHeader>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
<StatCard
title="总用户数"
value="12,345"
change="+180 来自上周"
icon={<User className="h-5 w-5 text-pink-500" />}
trend="up"
/>
<StatCard
title="活跃用户"
value="5,732"
change="+12% 来自上月"
icon={<User className="h-5 w-5 text-purple-500" />}
trend="up"
/>
<StatCard
title="卡牌激活"
value="8,942"
change="+24% 来自上月"
icon={<Database className="h-5 w-5 text-blue-500" />}
trend="up"
/>
<StatCard
title="对话次数"
value="573,128"
change="+19% 来自上月"
icon={<Brain className="h-5 w-5 text-teal-500" />}
trend="up"
/>
</div>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-7">
<Card className="col-span-4 border-none shadow-lg bg-gradient-to-br from-white to-purple-50">
<CardHeader>
<CardTitle className="text-xl font-bold flex items-center">
<span className="bg-clip-text text-transparent bg-gradient-to-r from-purple-600 to-pink-600">
</span>
<div className="ml-2 h-1 w-10 bg-gradient-to-r from-purple-600 to-pink-600 rounded-full"></div>
</CardTitle>
</CardHeader>
<CardContent className="pl-2">
<Overview />
</CardContent>
</Card>
<Card className="col-span-3 border-none shadow-lg bg-gradient-to-br from-white to-blue-50">
<CardHeader>
<CardTitle className="text-xl font-bold flex items-center">
<span className="bg-clip-text text-transparent bg-gradient-to-r from-blue-600 to-teal-600"></span>
<div className="ml-2 h-1 w-10 bg-gradient-to-r from-blue-600 to-teal-600 rounded-full"></div>
</CardTitle>
<CardDescription></CardDescription>
</CardHeader>
<CardContent>
<RecentActivity />
</CardContent>
</Card>
</div>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3 mt-4">
<Card className="border-none shadow-lg hover:shadow-xl transition-all duration-300 bg-gradient-to-br from-white to-pink-50 overflow-hidden relative group">
<CardHeader className="flex flex-row items-center justify-between space-y-0">
<CardTitle className="text-lg font-bold bg-clip-text text-transparent bg-gradient-to-r from-pink-600 to-purple-600">
</CardTitle>
<div className="p-2 rounded-full bg-gradient-to-r from-pink-100 to-purple-100">
<Brain className="h-6 w-6 text-pink-600" />
</div>
</CardHeader>
<CardContent>
<div className="grid gap-2">
<Button variant="outline" className="justify-start" asChild>
<Link href="/ai-model"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/ai-model/fine-tuning"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/ai-model/voice-clone"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/ai-model/knowledge-base"></Link>
</Button>
</div>
</CardContent>
</Card>
<Card className="border-none shadow-lg hover:shadow-xl transition-all duration-300 bg-gradient-to-br from-white to-purple-50 overflow-hidden relative group">
<CardHeader className="flex flex-row items-center justify-between space-y-0">
<CardTitle className="text-lg font-bold bg-clip-text text-transparent bg-gradient-to-r from-purple-600 to-indigo-600">
</CardTitle>
<div className="p-2 rounded-full bg-gradient-to-r from-purple-100 to-indigo-100">
<Shirt className="h-6 w-6 text-purple-600" />
</div>
</CardHeader>
<CardContent>
<div className="grid gap-2">
<Button variant="outline" className="justify-start" asChild>
<Link href="/outfits"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/props"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/home-decor"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/food"></Link>
</Button>
</div>
</CardContent>
</Card>
<Card className="border-none shadow-lg hover:shadow-xl transition-all duration-300 bg-gradient-to-br from-white to-blue-50 overflow-hidden relative group">
<CardHeader className="flex flex-row items-center justify-between space-y-0">
<CardTitle className="text-lg font-bold bg-clip-text text-transparent bg-gradient-to-r from-blue-600 to-teal-600">
</CardTitle>
<div className="p-2 rounded-full bg-gradient-to-r from-blue-100 to-teal-100">
<Music className="h-6 w-6 text-blue-600" />
</div>
</CardHeader>
<CardContent>
<div className="grid gap-2">
<Button variant="outline" className="justify-start" asChild>
<Link href="/songs"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/dances"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/affinity"></Link>
</Button>
<Button variant="outline" className="justify-start" asChild>
<Link href="/achievements"></Link>
</Button>
</div>
</CardContent>
</Card>
</div>
</DashboardShell>
)
}