blob: 2d91b30ced224896e29dfd9ba2a4174eb821a82c [file] [log] [blame]
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;