'use client'; import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Calendar, BookOpen, Search, CheckCircle, Clock, AlertTriangle } from 'lucide-react'; // Mock data - replace with actual API async function fetchBorrowHistory() { return { success: true, data: [ { borrowId: 1, book: { title: '深入理解计算机系统', authors: ['Randal E. Bryant'], isbn: '9787111544937' }, borrowDate: '2024-12-01', dueDate: '2024-12-31', returnDate: '2024-12-28', renewTimes: 1, status: 'returned', fineAmount: '0' }, { borrowId: 2, book: { title: 'Python编程实战', authors: ['Mark Lutz'], isbn: '9787111627295' }, borrowDate: '2025-01-05', dueDate: '2025-02-04', returnDate: null, renewTimes: 1, status: 'borrowed', fineAmount: '0' }, { borrowId: 3, book: { title: '数据结构与算法', authors: ['Thomas H. Cormen'], isbn: '9787111407010' }, borrowDate: '2024-11-15', dueDate: '2024-12-15', returnDate: '2024-12-20', renewTimes: 0, status: 'returned', fineAmount: '5.00' } ] }; } export default function StudentHistoryPage() { const [statusFilter, setStatusFilter] = useState(''); const [searchTerm, setSearchTerm] = useState(''); const { data, isLoading, error } = useQuery({ queryKey: ['student-history', statusFilter, searchTerm], queryFn: fetchBorrowHistory, }); const getStatusBadge = (status: string, dueDate: string, returnDate: string | null) => { if (status === 'returned') { const wasOverdue = returnDate && new Date(returnDate) > new Date(dueDate); return ( {wasOverdue ? '逾期归还' : '正常归还'} ); } const isOverdue = new Date(dueDate) < new Date(); return ( {isOverdue ? : } {isOverdue ? '逾期' : '借阅中'} ); }; const filteredData = data?.data?.filter((record: any) => { const matchesStatus = !statusFilter || record.status === statusFilter; const matchesSearch = !searchTerm || record.book.title.toLowerCase().includes(searchTerm.toLowerCase()) || record.book.authors.some((author: string) => author.toLowerCase().includes(searchTerm.toLowerCase()) ); return matchesStatus && matchesSearch; }); return (
{/* Header */}

借阅历史

查看您的借阅记录和归还历史

{/* Statistics */}

总借阅次数

{data?.data?.length || 0}

当前借阅

{data?.data?.filter((r: any) => r.status === 'borrowed').length || 0}

已归还

{data?.data?.filter((r: any) => r.status === 'returned').length || 0}

逾期次数

{data?.data?.filter((r: any) => (r.status === 'returned' && r.returnDate && new Date(r.returnDate) > new Date(r.dueDate)) || (r.status === 'borrowed' && new Date(r.dueDate) < new Date()) ).length || 0}

{/* Search and Filters */}
setSearchTerm(e.target.value)} />
{/* Results */} {isLoading ? (

加载中...

) : error ? (

加载失败,请重试

) : ( <> {/* History List */}
{filteredData?.map((record: any) => (

{record.book.title}

{getStatusBadge(record.status, record.dueDate, record.returnDate)}

作者: {record.book.authors.join(', ')}

ISBN: {record.book.isbn}

借阅日期: {new Date(record.borrowDate).toLocaleDateString('zh-CN')}
应还日期: {new Date(record.dueDate).toLocaleDateString('zh-CN')}
{record.returnDate && (
归还日期: {new Date(record.returnDate).toLocaleDateString('zh-CN')}
)}
续借次数: {record.renewTimes}/2
{record.fineAmount && parseFloat(record.fineAmount) > 0 && (
罚款: ¥{parseFloat(record.fineAmount).toFixed(2)}
)}
))}
{/* No results */} {filteredData?.length === 0 && (

{data?.data?.length === 0 ? '暂无借阅记录' : '没有找到符合条件的记录'}

)} )}
); }