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 });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
9.5 사진 중심 카테고리 프리셋(해상도/비율/워터마크 옵션) o
|
9.5 사진 중심 카테고리 프리셋(해상도/비율/워터마크 옵션) o
|
||||||
|
|
||||||
[관리자(Admin)]
|
[관리자(Admin)]
|
||||||
10.1 대시보드 핵심 지표 위젯
|
10.1 대시보드 핵심 지표 위젯 o
|
||||||
10.2 게시판 스키마/설정 관리 UI
|
10.2 게시판 스키마/설정 관리 UI
|
||||||
10.3 사용자 검색/정지/권한 변경
|
10.3 사용자 검색/정지/권한 변경
|
||||||
10.4 공지/배너 등록 및 노출 설정
|
10.4 공지/배너 등록 및 노출 설정
|
||||||
|
|||||||
Reference in New Issue
Block a user