Files
genome2025/frontend/src/app/admin/page.tsx

177 lines
5.8 KiB
TypeScript

"use client"
import * as React from "react"
import { useRouter } from "next/navigation"
import { AdminSidebar } from "@/components/layout/admin-sidebar"
import { AdminHeader } from "@/components/layout/admin-header"
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import { useAuthStore } from "@/store/auth-store"
import { AuthGuard } from "@/components/auth/auth-guard"
import {
IconFileUpload,
IconUsers,
IconChartBar,
IconDatabase,
} from "@tabler/icons-react"
function AdminDashboardContent() {
const { user } = useAuthStore()
const router = useRouter()
// 관리자 권한 체크
React.useEffect(() => {
const isAdmin = user?.userRole === 'ADMIN'
if (user && !isAdmin) {
alert('관리자만 접근 가능합니다.')
router.push('/dashboard')
}
}, [user, router])
const isAdmin = user?.userRole === 'ADMIN'
if (!user || !isAdmin) {
return null
}
const quickLinks = [
{
title: "파일 업로드",
description: "유전체 데이터 파일 업로드",
icon: IconFileUpload,
href: "/admin/upload",
color: "bg-blue-500",
},
{
title: "농장주별 집계",
description: "농장주별 유전체 데이터 조회",
icon: IconChartBar,
href: "/admin/genome-mapping",
color: "bg-green-500",
},
{
title: "사용자 관리",
description: "시스템 사용자 관리",
icon: IconUsers,
href: "/admin/users",
color: "bg-purple-500",
},
]
return (
<SidebarInset>
<AdminHeader
breadcrumbs={[
{ label: "관리자 대시보드" }
]}
/>
<div className="flex flex-1 flex-col gap-2">
<div className="flex flex-col gap-4 py-4 md:gap-6 md:py-6">
{/* 헤더 */}
<div className="px-4 lg:px-6">
<div className="rounded-lg p-6 border" style={{ backgroundColor: '#3b82f610' }}>
<h1 className="text-2xl font-bold mb-2"> </h1>
<p className="text-sm text-muted-foreground">
.
</p>
</div>
</div>
{/* 빠른 링크 */}
<div className="px-4 lg:px-6">
<div className="grid gap-4 md:grid-cols-3">
{quickLinks.map((link) => {
const Icon = link.icon
return (
<Card
key={link.href}
className="cursor-pointer hover:shadow-lg transition-shadow"
onClick={() => router.push(link.href)}
>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">
{link.title}
</CardTitle>
<div className={`${link.color} p-2 rounded-lg`}>
<Icon className="h-5 w-5 text-white" />
</div>
</CardHeader>
<CardContent>
<p className="text-xs text-muted-foreground">
{link.description}
</p>
</CardContent>
</Card>
)
})}
</div>
</div>
{/* 최근 활동 */}
<div className="px-4 lg:px-6">
<Card>
<CardHeader>
<CardTitle> </CardTitle>
<CardDescription>
</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
<div className="flex items-center gap-4 p-4 rounded-lg bg-muted/50">
<IconDatabase className="h-8 w-8 text-blue-500" />
<div className="flex-1">
<h3 className="font-semibold"> </h3>
<p className="text-sm text-muted-foreground">
5 .
</p>
</div>
</div>
<div className="flex items-center gap-4 p-4 rounded-lg bg-muted/50">
<IconChartBar className="h-8 w-8 text-green-500" />
<div className="flex-1">
<h3 className="font-semibold"> </h3>
<p className="text-sm text-muted-foreground">
.
</p>
</div>
</div>
<div className="flex items-center gap-4 p-4 rounded-lg bg-muted/50">
<IconUsers className="h-8 w-8 text-purple-500" />
<div className="flex-1">
<h3 className="font-semibold"> </h3>
<p className="text-sm text-muted-foreground">
.
</p>
</div>
</div>
</div>
</CardContent>
</Card>
</div>
</div>
</div>
</SidebarInset>
)
}
export default function AdminDashboardPage() {
return (
<AuthGuard>
<SidebarProvider>
<AdminSidebar />
<AdminDashboardContent />
</SidebarProvider>
</AuthGuard>
)
}