"use client"; import { useState, useEffect } from "react"; import { adminAPI } from "@/lib/api"; import { format } from "date-fns"; import { MessageSquare, Plus, Trash2, RefreshCw, Pencil } from "lucide-react"; interface AdminCategory { id: number; slug: string; name: string; description: string | null; post_count: number; } interface AdminPost { id: number; title: string; author_name: string; category_name: string; reply_count: number; created_at: string; } export default function ForumAdminPage() { const [tab, setTab] = useState<"categories" | "posts">("categories"); const [categories, setCategories] = useState([]); const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [confirmDelete, setConfirmDelete] = useState<{ type: "cat" | "post"; id: number } | null>(null); // Category form const [showCatForm, setShowCatForm] = useState(false); const [editingCat, setEditingCat] = useState(null); const [catForm, setCatForm] = useState({ name: "", slug: "", description: "" }); const loadCategories = () => { adminAPI.listForumCategories() .then(setCategories) .catch(console.error); }; const loadPosts = () => { adminAPI.listForumPosts() .then(setPosts) .catch(console.error); }; useEffect(() => { setLoading(true); Promise.all([loadCategories(), loadPosts()]).finally(() => setLoading(false)); }, []); const handleSaveCategory = async () => { try { if (editingCat) { await adminAPI.updateForumCategory(editingCat.id, catForm); } else { await adminAPI.createForumCategory(catForm); } setShowCatForm(false); setEditingCat(null); setCatForm({ name: "", slug: "", description: "" }); loadCategories(); } catch (e) { console.error(e); } }; const handleDeleteCategory = async (id: number) => { try { await adminAPI.deleteForumCategory(id); setConfirmDelete(null); loadCategories(); } catch (e) { console.error(e); } }; const handleDeletePost = async (id: number) => { try { await adminAPI.deleteForumPost(id); setConfirmDelete(null); loadPosts(); } catch (e) { console.error(e); } }; const startEditCat = (cat: AdminCategory) => { setEditingCat(cat); setCatForm({ name: cat.name, slug: cat.slug, description: cat.description || "" }); setShowCatForm(true); }; if (loading) { return
加载中...
; } return (

论坛管理

{tab === "categories" && (
{!showCatForm ? ( ) : (

{editingCat ? "编辑分类" : "新增分类"}

setCatForm((f) => ({ ...f, name: e.target.value }))} className="w-full mt-1 px-3 py-1.5 text-sm border rounded-lg bg-background focus:outline-none focus:ring-1 focus:ring-primary" />
setCatForm((f) => ({ ...f, slug: e.target.value }))} className="w-full mt-1 px-3 py-1.5 text-sm border rounded-lg bg-background focus:outline-none focus:ring-1 focus:ring-primary" />
setCatForm((f) => ({ ...f, description: e.target.value }))} className="w-full mt-1 px-3 py-1.5 text-sm border rounded-lg bg-background focus:outline-none focus:ring-1 focus:ring-primary" />
)}
{categories.map((cat) => ( ))}
名称 Slug 描述 帖子数 操作
{cat.name} {cat.slug} {cat.description || "—"} {cat.post_count}
{confirmDelete?.type === "cat" && confirmDelete.id === cat.id ? (
) : ( )}
)} {tab === "posts" && (
共 {posts.length} 个帖子
{posts.length === 0 ? ( ) : posts.map((p) => ( ))}
标题 作者 分类 回复数 时间 操作
暂无帖子
{p.title} {p.author_name} {p.category_name} {p.reply_count} {format(new Date(p.created_at), "yyyy/M/d HH:mm")} {confirmDelete?.type === "post" && confirmDelete.id === p.id ? (
) : ( )}
)}
); }