INIT
This commit is contained in:
173
frontend/src/app/admin/page.tsx
Normal file
173
frontend/src/app/admin/page.tsx
Normal file
@@ -0,0 +1,173 @@
|
||||
"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 {
|
||||
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 (
|
||||
<SidebarProvider>
|
||||
<AdminSidebar />
|
||||
<AdminDashboardContent />
|
||||
</SidebarProvider>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user