diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 5c835945..d5d8550d 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -13,6 +13,7 @@
"antd": "^5.27.0",
"i18next": "^25.8.0",
"jssha": "^3.3.1",
+ "jszip": "^3.10.1",
"lucide-react": "^0.539.0",
"mammoth": "^1.11.0",
"react": "^18.1.1",
diff --git a/frontend/package.json b/frontend/package.json
index e517ad48..b3be598e 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,6 +16,7 @@
"antd": "^5.27.0",
"i18next": "^25.8.0",
"jssha": "^3.3.1",
+ "jszip": "^3.10.1",
"lucide-react": "^0.539.0",
"mammoth": "^1.11.0",
"react": "^18.1.1",
diff --git a/frontend/src/pages/DataManagement/Detail/components/Overview.tsx b/frontend/src/pages/DataManagement/Detail/components/Overview.tsx
index ff1853f0..4e65298f 100644
--- a/frontend/src/pages/DataManagement/Detail/components/Overview.tsx
+++ b/frontend/src/pages/DataManagement/Detail/components/Overview.tsx
@@ -30,6 +30,7 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) {
pagination,
selectedFiles,
setSelectedFiles,
+ clearSelection,
previewVisible,
previewFileName,
previewContent,
@@ -43,6 +44,7 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) {
handleDownloadFile,
handleBatchDeleteFiles,
handleBatchExport,
+ handleSelectionChange,
handleCreateDirectory,
handleDownloadDirectory,
handleDeleteDirectory,
@@ -50,11 +52,15 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) {
handleRenameDirectory,
} = filesOperation;
- // 文件列表多选配置
+ // 文件列表多选配置(支持跨页选择)
const rowSelection = {
- onChange: (selectedRowKeys: React.Key[], selectedRows: any[]) => {
- setSelectedFiles(selectedRowKeys as number[]);
- },
+ selectedRowKeys: selectedFiles,
+ onChange: handleSelectionChange,
+ preserveSelectedRowKeys: true, // 关键:跨页时保持选中状态
+ getCheckboxProps: (record: any) => ({
+ // 目录和文件都可以选择
+ name: record.fileName,
+ }),
};
// 显示删除确认弹窗
@@ -428,18 +434,36 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) {
{selectedFiles.length > 0 && (
- {t("dataManagement.detail.selectedFiles", { count: selectedFiles.length })}
+ 已选择 {selectedFiles.length} 项
+ {(() => {
+ const dirCount = selectedFiles.filter(id => typeof id === 'string' && id.startsWith('directory-')).length;
+ const fileCount = selectedFiles.length - dirCount;
+ if (dirCount > 0 && fileCount > 0) {
+ return ` (${fileCount} 个文件, ${dirCount} 个文件夹)`;
+ } else if (dirCount > 0) {
+ return ` (${dirCount} 个文件夹)`;
+ } else if (fileCount > 0) {
+ return ` (${fileCount} 个文件)`;
+ }
+ return '';
+ })()}
+