"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 { Input } from "@/components/ui/input" import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { useToast } from "@/components/ui/use-toast" import { useAuth } from "@/context/auth-context" import { BookOpen, Edit, Eye, Plus, Search, Trash2 } from "lucide-react" import Link from "next/link" import { useRouter } from "next/navigation" import { useEffect, useState } from "react" import { fetchWithAuth } from "@/lib/api" interface Book { bookId: number title: string isbn: string price: number stock: number publishDate: string publisherName: string description: string coverImage: string author: string[] } interface BooksResponse { pageNum: number pageSize: number total: number data: Book[] } export default function AdminBooksPage() { const { user } = useAuth() const router = useRouter() const { toast } = useToast() const [books, setBooks] = useState(null) const [loading, setLoading] = useState(true) const [currentPage, setCurrentPage] = useState(1) const [searchTerm, setSearchTerm] = useState("") useEffect(() => { // 检查用户是否登录且是管理员 if (!user) { toast({ title: "请先登录", description: "您需要登录后才能访问管理页面", variant: "destructive", }) router.push("/login") return } if (!user.isAdmin) { toast({ title: "权限不足", description: "您没有管理员权限", variant: "destructive", }) router.push("/") return } const fetchBooks = async () => { setLoading(true) try { let url = `book/all?pageNum=${currentPage}&pageSize=10` if (searchTerm) { url = `book/search/title?title=${encodeURIComponent(searchTerm)}&pageNum=${currentPage}&pageSize=10` } const response = await fetchWithAuth(url) const result = await response.json() if (result.code === 0) { setBooks(result.data) } else { toast({ variant: "destructive", title: "获取图书失败", description: result.msg || "无法获取图书信息", }) } } catch (error) { toast({ variant: "destructive", title: "获取图书失败", description: "服务器连接错误,请稍后再试", }) } finally { setLoading(false) } } fetchBooks() }, [user, router, toast, currentPage, searchTerm]) const handlePageChange = (page: number) => { setCurrentPage(page) } const handleSearch = (e: React.FormEvent) => { e.preventDefault() setCurrentPage(1) } const handleDeleteBook = async (bookId: number) => { if (confirm("确定要删除这本图书吗?此操作不可撤销。")) { try { const response = await fetchWithAuth(`book/admin/delete/${bookId}`, { method: "DELETE", }) const result = await response.json() if (result.code === 0) { toast({ title: "删除成功", description: "图书已成功删除", }) // 刷新图书列表 if (books && books.data.length === 1 && currentPage > 1) { setCurrentPage(currentPage - 1) } else { // 保持在当前页,但刷新数据 const updatedBooks = { ...books } as BooksResponse updatedBooks.data = updatedBooks.data.filter((book) => book.bookId !== bookId) updatedBooks.total -= 1 setBooks(updatedBooks) } } else { toast({ variant: "destructive", title: "删除失败", description: result.msg || "无法删除图书", }) } } catch (error) { toast({ variant: "destructive", title: "删除失败", description: "服务器连接错误,请稍后再试", }) } } } if (!user || !user.isAdmin) { return null } return (
图书管理系统 - 管理后台

图书管理

图书列表
setSearchTerm(e.target.value)} />
{loading ? (
加载中...
) : !books || books.data.length === 0 ? (

没有找到图书

{searchTerm ? "尝试使用不同的搜索词" : "添加一些图书开始管理"}

{!searchTerm && ( )}
) : ( <>
ID 标题 ISBN 价格 库存 出版社 操作 {books.data.map((book) => ( {book.bookId} {book.title} {book.isbn} ¥{book.price.toFixed(2)} {book.stock} {book.publisherName}
))}
{books.total > books.pageSize && ( { e.preventDefault() if (currentPage > 1) handlePageChange(currentPage - 1) }} className={currentPage === 1 ? "pointer-events-none opacity-50" : ""} /> {Array.from({ length: Math.min(5, Math.ceil(books.total / books.pageSize)) }).map( (_, index) => { let pageNumber = currentPage - 2 + index if (pageNumber < 1) pageNumber = index + 1 if (pageNumber > Math.ceil(books.total / books.pageSize)) pageNumber = Math.ceil(books.total / books.pageSize) - (4 - index) return ( { e.preventDefault() handlePageChange(pageNumber) }} isActive={currentPage === pageNumber} > {pageNumber} ) }, )} { e.preventDefault() if (currentPage < Math.ceil(books.total / books.pageSize)) { handlePageChange(currentPage + 1) } }} className={ currentPage >= Math.ceil(books.total / books.pageSize) ? "pointer-events-none opacity-50" : "" } /> )} )}
) }