diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx
new file mode 100644
index 0000000..ee5c5ed
--- /dev/null
+++ b/src/app/admin/page.tsx
@@ -0,0 +1,32 @@
+"use client";
+import useSWR from "swr";
+
+const fetcher = (url: string) => fetch(url).then((r) => r.json());
+
+export default function AdminDashboardPage() {
+ const { data } = useSWR<{ users: number; posts: number; comments: number; reportsOpen: number; pendingReviews: number }>("/api/admin/dashboard", fetcher);
+ const m = data ?? { users: 0, posts: 0, comments: 0, reportsOpen: 0, pendingReviews: 0 };
+ return (
+
+
관리자 대시보드
+
+
+
+
+
+
+
+
+ );
+}
+
+function Card({ label, value }: { label: string; value: number }) {
+ return (
+
+ );
+}
+
+
diff --git a/src/app/api/admin/dashboard/route.ts b/src/app/api/admin/dashboard/route.ts
new file mode 100644
index 0000000..ecb9588
--- /dev/null
+++ b/src/app/api/admin/dashboard/route.ts
@@ -0,0 +1,15 @@
+import { NextResponse } from "next/server";
+import prisma from "@/lib/prisma";
+
+export async function GET() {
+ const [users, posts, comments, reports, pendingReviews] = await Promise.all([
+ prisma.user.count(),
+ prisma.post.count(),
+ prisma.comment.count(),
+ prisma.report.count({ where: { status: "open" } }),
+ prisma.post.count({ where: { status: "hidden" } }),
+ ]);
+ return NextResponse.json({ users, posts, comments, reportsOpen: reports, pendingReviews });
+}
+
+
diff --git a/todolist.txt b/todolist.txt
index facb764..5ff2587 100644
--- a/todolist.txt
+++ b/todolist.txt
@@ -69,7 +69,7 @@
9.5 사진 중심 카테고리 프리셋(해상도/비율/워터마크 옵션) o
[관리자(Admin)]
-10.1 대시보드 핵심 지표 위젯
+10.1 대시보드 핵심 지표 위젯 o
10.2 게시판 스키마/설정 관리 UI
10.3 사용자 검색/정지/권한 변경
10.4 공지/배너 등록 및 노출 설정