"use client" import type React from "react" import { AdminNav } from "@/components/admin-nav" import { ThemeToggle } from "@/components/theme-toggle" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Textarea } from "@/components/ui/textarea" import { useToast } from "@/components/ui/use-toast" import { useAuth } from "@/context/auth-context" import { zodResolver } from "@hookform/resolvers/zod" import { BookOpen, Edit, Plus, Search, Trash2 } from "lucide-react" import { useRouter } from "next/navigation" import { useEffect, useState } from "react" import { useForm } from "react-hook-form" import * as z from "zod" import { fetchWithAuth } from "@/lib/api" interface Publisher { publisherId: number name: string address: string } const formSchema = z.object({ name: z.string().min(1, "出版社名称不能为空"), address: z.string().optional(), }) export default function AdminPublishersPage() { const { user } = useAuth() const router = useRouter() const { toast } = useToast() const [publishers, setPublishers] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") const [filteredPublishers, setFilteredPublishers] = useState([]) const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [currentPublisher, setCurrentPublisher] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) const addForm = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", address: "", }, }) const editForm = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", address: "", }, }) useEffect(() => { // 检查用户是否登录且是管理员 if (!user) { toast({ title: "请先登录", description: "您需要登录后才能访问管理页面", variant: "destructive", }) router.push("/login") return } if (!user.isAdmin) { toast({ title: "权限不足", description: "您没有管理员权限", variant: "destructive", }) router.push("/") return } const fetchPublishers = async () => { try { const response = await fetchWithAuth("publisher/all") const result = await response.json() if (result.code === 0) { setPublishers(result.data) setFilteredPublishers(result.data) } else { toast({ variant: "destructive", title: "获取出版社失败", description: result.msg || "无法获取出版社信息", }) } } catch (error) { toast({ variant: "destructive", title: "获取出版社失败", description: "服务器连接错误,请稍后再试", }) } finally { setLoading(false) } } fetchPublishers() }, [user, router, toast]) useEffect(() => { if (searchTerm) { const filtered = publishers.filter((publisher) => publisher.name.toLowerCase().includes(searchTerm.toLowerCase())) setFilteredPublishers(filtered) } else { setFilteredPublishers(publishers) } }, [searchTerm, publishers]) const handleSearch = (e: React.FormEvent) => { e.preventDefault() } const handleAddPublisher = async (values: z.infer) => { setIsSubmitting(true) try { const response = await fetchWithAuth("publisher/add", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(values), }) const result = await response.json() if (result.code === 0) { toast({ title: "添加成功", description: "出版社已成功添加", }) // 更新本地状态 setPublishers([...publishers, result.data]) // 重置表单并关闭对话框 addForm.reset() setIsAddDialogOpen(false) } else { toast({ variant: "destructive", title: "添加失败", description: result.msg || "无法添加出版社", }) } } catch (error) { toast({ variant: "destructive", title: "添加失败", description: "服务器连接错误,请稍后再试", }) } finally { setIsSubmitting(false) } } const handleEditPublisher = async (values: z.infer) => { if (!currentPublisher) return setIsSubmitting(true) try { const response = await fetchWithAuth(`publisher/update/${currentPublisher.publisherId}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(values), }) const result = await response.json() if (result.code === 0) { toast({ title: "更新成功", description: "出版社信息已成功更新", }) // 更新本地状态 const updatedPublishers = publishers.map((publisher) => publisher.publisherId === currentPublisher.publisherId ? result.data : publisher, ) setPublishers(updatedPublishers) // 重置表单并关闭对话框 editForm.reset() setIsEditDialogOpen(false) setCurrentPublisher(null) } else { toast({ variant: "destructive", title: "更新失败", description: result.msg || "无法更新出版社信息", }) } } catch (error) { toast({ variant: "destructive", title: "更新失败", description: "服务器连接错误,请稍后再试", }) } finally { setIsSubmitting(false) } } const handleDeletePublisher = async (publisherId: number) => { if (confirm("确定要删除这个出版社吗?此操作不可撤销。")) { try { const response = await fetchWithAuth(`publisher/delete/${publisherId}`, { method: "DELETE", }) const result = await response.json() if (result.code === 0) { toast({ title: "删除成功", description: "出版社已成功删除", }) // 更新本地状态 const updatedPublishers = publishers.filter((publisher) => publisher.publisherId !== publisherId) setPublishers(updatedPublishers) } else { toast({ variant: "destructive", title: "删除失败", description: result.msg || "无法删除出版社", }) } } catch (error) { toast({ variant: "destructive", title: "删除失败", description: "服务器连接错误,请稍后再试", }) } } } const openEditDialog = (publisher: Publisher) => { setCurrentPublisher(publisher) editForm.reset({ name: publisher.name, address: publisher.address, }) setIsEditDialogOpen(true) } if (!user || !user.isAdmin) { return null } return (
图书管理系统 - 管理后台

出版社管理

添加出版社 添加一个新的出版社到系统中
( 出版社名称 )} /> ( 地址