10.2 게시판 스키마/설정 관리 UI
This commit is contained in:
32
src/app/admin/page.tsx
Normal file
32
src/app/admin/page.tsx
Normal file
@@ -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 (
|
||||
<div>
|
||||
<h1>관리자 대시보드</h1>
|
||||
<div style={{ display: "grid", gridTemplateColumns: "repeat(5, minmax(0,1fr))", gap: 12 }}>
|
||||
<Card label="사용자" value={m.users} />
|
||||
<Card label="게시글" value={m.posts} />
|
||||
<Card label="댓글" value={m.comments} />
|
||||
<Card label="열린 신고" value={m.reportsOpen} />
|
||||
<Card label="승인 대기 글" value={m.pendingReviews} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function Card({ label, value }: { label: string; value: number }) {
|
||||
return (
|
||||
<div style={{ border: "1px solid #eee", borderRadius: 8, padding: 16 }}>
|
||||
<div style={{ fontSize: 12, opacity: 0.7 }}>{label}</div>
|
||||
<div style={{ fontSize: 24, fontWeight: 700 }}>{value}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
15
src/app/api/admin/dashboard/route.ts
Normal file
15
src/app/api/admin/dashboard/route.ts
Normal file
@@ -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 });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user