| import React, { useState, useEffect } from 'react'; | |
| import { useNavigate, useLocation } from 'react-router-dom'; | |
| import { getUserTorrents, deleteTorrent } from '../../api/personal'; | |
| import './personalSubpage.css'; | |
| const Upload = ({ onLogout }) => { | |
| const navigate = useNavigate(); | |
| const location = useLocation(); | |
| const [torrents, setTorrents] = useState([]); | |
| const [loading, setLoading] = useState(true); | |
| const [error, setError] = useState(null); | |
| const [pagination, setPagination] = useState({ | |
| page: 1, | |
| size: 5, | |
| total: 0 | |
| }); | |
| // 格式化日期 | |
| const formatDate = (dateString) => { | |
| const date = new Date(dateString); | |
| return date.toLocaleString(); | |
| }; | |
| // 获取上传记录 | |
| const fetchTorrents = async () => { | |
| try { | |
| setLoading(true); | |
| const { records, total } = await getUserTorrents(pagination.page, pagination.size); | |
| setTorrents(records); | |
| setPagination(prev => ({ ...prev, total })); | |
| } catch (err) { | |
| setError(err.message); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| // 删除种子 | |
| const handleDelete = async (id) => { | |
| if (window.confirm('确定要删除这个种子吗?此操作不可撤销!')) { | |
| try { | |
| await deleteTorrent(id); | |
| // 删除成功后刷新列表 | |
| fetchTorrents(); | |
| } catch (err) { | |
| alert('删除失败: ' + err.message); | |
| } | |
| } | |
| }; | |
| // 计算总页数 | |
| const totalPages = Math.ceil(pagination.total / pagination.size); | |
| // 生成页码数组 | |
| const getPageNumbers = () => { | |
| const pages = []; | |
| const maxVisiblePages = 5; // 最多显示5个页码 | |
| let startPage = Math.max(1, pagination.page - Math.floor(maxVisiblePages / 2)); | |
| let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1); | |
| // 调整起始页码,确保始终显示 maxVisiblePages 个页码(如果总页数足够) | |
| if (endPage - startPage + 1 < maxVisiblePages) { | |
| startPage = Math.max(1, endPage - maxVisiblePages + 1); | |
| } | |
| for (let i = startPage; i <= endPage; i++) { | |
| pages.push(i); | |
| } | |
| return pages; | |
| }; | |
| // 直接跳转到指定页码 | |
| const jumpToPage = (page) => { | |
| if (page >= 1 && page <= totalPages && page !== pagination.page) { | |
| setPagination(prev => ({ ...prev, page })); | |
| } | |
| }; | |
| // 分页改变 | |
| const handlePageChange = (newPage) => { | |
| setPagination(prev => ({ ...prev, page: newPage })); | |
| }; | |
| useEffect(() => { | |
| fetchTorrents(); | |
| }, [pagination.page]); | |
| const handleBack = () => { | |
| navigate('/personal', { | |
| state: { | |
| fromSubpage: true, | |
| dashboardTab: location.state?.dashboardTab | |
| }, | |
| replace: true | |
| }); | |
| }; | |
| if (loading) { | |
| return <div className="subpage-container">加载中...</div>; | |
| } | |
| if (error) { | |
| return <div className="subpage-container">错误: {error}</div>; | |
| } | |
| return ( | |
| <div className="subpage-container"> | |
| <button className="back-button" onClick={handleBack}> | |
| 返回个人中心 | |
| </button> | |
| <h2 className="page-title">上传记录</h2> | |
| <table className="uploads-table"> | |
| <thead> | |
| <tr> | |
| <th>资源名称</th> | |
| <th>大小</th> | |
| <th>上传时间</th> | |
| <th>下载次数</th> | |
| <th>操作</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| {torrents.map(torrent => ( | |
| <tr key={torrent.id} className="list-item"> | |
| <td>{torrent.torrentName}</td> | |
| <td>{torrent.formattedSize}</td> | |
| <td>{formatDate(torrent.createTime)}</td> | |
| <td>{torrent.downloadCount || 0}</td> | |
| <td> | |
| <button | |
| className="action-btn delete-btn" | |
| onClick={() => handleDelete(torrent.id)} | |
| > | |
| 删除 | |
| </button> | |
| </td> | |
| </tr> | |
| ))} | |
| </tbody> | |
| </table> | |
| {/* 修改后的分页控件 */} | |
| <div className="pagination"> | |
| <button | |
| disabled={pagination.page <= 1} | |
| onClick={() => jumpToPage(1)} | |
| className="page-nav" | |
| > | |
| 首页 | |
| </button> | |
| <button | |
| disabled={pagination.page <= 1} | |
| onClick={() => jumpToPage(pagination.page - 1)} | |
| className="page-nav" | |
| > | |
| 上一页 | |
| </button> | |
| {/* 显示页码 */} | |
| {getPageNumbers().map(number => ( | |
| <button | |
| key={number} | |
| onClick={() => jumpToPage(number)} | |
| className={`page-number ${pagination.page === number ? 'active' : ''}`} | |
| > | |
| {number} | |
| </button> | |
| ))} | |
| {/* 显示省略号(如果有更多页) */} | |
| {totalPages > getPageNumbers()[getPageNumbers().length - 1] && ( | |
| <span className="ellipsis">...</span> | |
| )} | |
| <button | |
| disabled={pagination.page >= totalPages} | |
| onClick={() => jumpToPage(pagination.page + 1)} | |
| className="page-nav" | |
| > | |
| 下一页 | |
| </button> | |
| <button | |
| disabled={pagination.page >= totalPages} | |
| onClick={() => jumpToPage(totalPages)} | |
| className="page-nav" | |
| > | |
| 末页 | |
| </button> | |
| <div className="page-info"> | |
| <span>共 {totalPages} 页</span> | |
| <span>跳至</span> | |
| <input | |
| type="number" | |
| min="1" | |
| max={totalPages} | |
| onKeyDown={(e) => { | |
| if (e.key === 'Enter') { | |
| const page = parseInt(e.target.value); | |
| if (!isNaN(page)) { | |
| jumpToPage(Math.max(1, Math.min(page, totalPages))); | |
| e.target.value = ''; | |
| } | |
| } | |
| }} | |
| /> | |
| <span>页</span> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default Upload; |