"use client" import { useEffect, useState } from "react" import { Card, CardContent, CardFooter } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { useToast } from "@/components/ui/use-toast" import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination" import Link from "next/link" import { ShoppingCart } from "lucide-react" import { useCart } from "@/context/cart-context" 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 function BookList() { const [books, setBooks] = useState(null) const [loading, setLoading] = useState(true) const [currentPage, setCurrentPage] = useState(1) const { toast } = useToast() const { addToCart } = useCart() useEffect(() => { const fetchBooks = async () => { try { const response = await fetchWithAuth(`book/all?pageNum=${currentPage}&pageSize=8`) 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() }, [currentPage, toast]) const handlePageChange = (page: number) => { setCurrentPage(page) } const handleAddToCart = (book: Book) => { addToCart({ id: book.bookId, title: book.title, price: book.price, quantity: 1, coverImage: book.coverImage || "/placeholder.svg?height=100&width=80", }) toast({ title: "已添加到购物车", description: book.title, }) } if (loading) { return (
{Array.from({ length: 8 }).map((_, index) => (
))}
) } if (!books || books.data.length === 0) { return (

暂无图书

) } return (
{books.data.map((book) => (
{book.title}

{book.title}

{book.author.join(", ")}

¥{book.price.toFixed(2)}
))}
{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" : "" } /> )}
) }