"use client" import { MainNav } from "@/components/main-nav" import { SearchBar } from "@/components/search-bar" import { ThemeToggle } from "@/components/theme-toggle" import { UserNav } from "@/components/user-nav" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination" import { useToast } from "@/components/ui/use-toast" import { useAuth } from "@/context/auth-context" import { Package } from "lucide-react" import Link from "next/link" import { useRouter } from "next/navigation" import { useEffect, useState } from "react" import { fetchWithAuth } from "@/lib/api" interface OrderItem { orderItemId: number bookId: number bookTitle: string quantity: number unitPrice: number } interface Order { orderId: number readerId: number readerName: string orderDate: string totalAmount: number status: string items: OrderItem[] } interface OrdersResponse { pageNum: number pageSize: number total: number data: Order[] } export default function OrdersPage() { const [orders, setOrders] = useState(null) const [loading, setLoading] = useState(true) const [currentPage, setCurrentPage] = useState(1) const { toast } = useToast() const router = useRouter() const { user } = useAuth() useEffect(() => { if (!user) { toast({ title: "请先登录", description: "您需要登录后才能查看订单", variant: "destructive", }) router.push("/login") return } const fetchOrders = async () => { try { const response = await fetchWithAuth(`orders/my?pageNum=${currentPage}&pageSize=10`) const result = await response.json() if (result.code === 0) { setOrders(result.data) } else { toast({ variant: "destructive", title: "获取订单失败", description: result.msg || "无法获取订单信息", }) } } catch (error) { toast({ variant: "destructive", title: "获取订单失败", description: "服务器连接错误,请稍后再试", }) } finally { setLoading(false) } } fetchOrders() }, [currentPage, toast, router, user]) const handlePageChange = (page: number) => { setCurrentPage(page) } if (loading) { return (
加载中...
) } return (

我的订单

{!orders || orders.data.length === 0 ? (

您还没有订单

去购买一些图书吧

) : ( <>
{orders.data.map((order) => (
订单号: {order.orderId} {order.status}

下单时间: {new Date(order.orderDate).toLocaleString()}

{order.items.slice(0, 2).map((item) => (

{item.bookTitle}

¥{item.unitPrice.toFixed(2)} × {item.quantity}

¥{(item.unitPrice * item.quantity).toFixed(2)}
))} {order.items.length > 2 && (

...等 {order.items.length} 件商品

)}
总计: ¥{order.totalAmount.toFixed(2)}
))}
{orders.total > orders.pageSize && ( { e.preventDefault() if (currentPage > 1) handlePageChange(currentPage - 1) }} className={currentPage === 1 ? "pointer-events-none opacity-50" : ""} /> {Array.from({ length: Math.ceil(orders.total / orders.pageSize) }).map((_, index) => ( { e.preventDefault() handlePageChange(index + 1) }} isActive={currentPage === index + 1} > {index + 1} ))} { e.preventDefault() if (currentPage < Math.ceil(orders.total / orders.pageSize)) { handlePageChange(currentPage + 1) } }} className={ currentPage >= Math.ceil(orders.total / orders.pageSize) ? "pointer-events-none opacity-50" : "" } /> )} )}
) }