Skip to content

Commit c837117

Browse files
committed
frontend: 数据集上传使用切片
1 parent ce8b08e commit c837117

File tree

9 files changed

+139
-147
lines changed

9 files changed

+139
-147
lines changed

frontend/src/components/CardView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ function CardView<T extends BaseCardDataType>(props: CardViewProps<T>) {
170170

171171
return (
172172
<div className="flex-1 flex flex-col overflow-auto">
173-
<div className="flex-1 overflow-auto grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-4">
173+
<div className="overflow-auto grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-4">
174174
{data.map((item) => (
175175
<div
176176
key={item.id}

frontend/src/pages/DataCleansing/Home/components/TaskList.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,11 @@ export default function TaskList() {
7070

7171
const taskOperations = (record) => {
7272
const isRunning = record.status?.value === TaskStatus.RUNNING;
73-
const isPending = record.status?.value === TaskStatus.PENDING;
74-
73+
const showStart = [
74+
TaskStatus.PENDING,
75+
TaskStatus.FAILED,
76+
TaskStatus.STOPPED,
77+
].includes(record.status?.value);
7578
const pauseBtn = {
7679
key: "pause",
7780
label: "暂停",
@@ -87,7 +90,7 @@ export default function TaskList() {
8790
};
8891
return [
8992
isRunning && pauseBtn,
90-
isPending && startBtn,
93+
showStart && startBtn,
9194
{
9295
key: "delete",
9396
label: "删除",

frontend/src/pages/DataManagement/Create/CreateDataset.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export default function DatasetCreate() {
156156
message.error("请上传文件");
157157
return;
158158
}
159-
handleUpload(message, dataset);
159+
handleUpload(dataset);
160160
}
161161
if (importConfig.source === DataSource.NAS) {
162162
message.error("请填写NAS地址和共享路径");

frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ export default function DatasetDetail() {
8181
message.success("文件下载成功");
8282
};
8383

84+
useEffect(() => {
85+
const refreshDataset = () => {
86+
fetchDataset();
87+
}
88+
window.addEventListener("update:dataset", handleRefresh);
89+
window.addEventListener("update:dataset-status", refreshDataset);
90+
return () => {
91+
window.removeEventListener("update:dataset", handleRefresh);
92+
window.removeEventListener("update:dataset-status", refreshDataset);
93+
};
94+
}, []);
95+
8496
// 基本信息描述项
8597
const statistics = [
8698
{
@@ -189,7 +201,7 @@ export default function DatasetDetail() {
189201
open={showUploadDialog}
190202
onCancel={() => setShowUploadDialog(false)}
191203
onOk={async () => {
192-
await handleUpload(message, dataset);
204+
await handleUpload(dataset);
193205
setShowUploadDialog(false);
194206
filesOperation.fetchFiles();
195207
}}

frontend/src/pages/DataManagement/dataset.api.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,10 @@ export function deleteDatasetVersionUsingDelete(
172172
*/
173173

174174
export function preUploadUsingPost(id: string | number, data: any) {
175-
console.log('pre upload');
176-
177-
return post(`/api/data-management/datasets/${id}/upload/pre-upload`, data);
175+
return post(
176+
`/api/data-management/datasets/${id}/files/upload/pre-upload`,
177+
data
178+
);
178179
}
179180

180181
export function cancelUploadUsingPut(id) {
@@ -186,13 +187,12 @@ export function cancelUploadUsingPut(id) {
186187
}
187188

188189
export function uploadFileChunkUsingPost(id: string | number, params, config) {
189-
return upload(`/api/data-management/datasets/${id}/files/upload/chunk`, params, {
190-
headers: {
191-
accept: "*/*",
192-
"Content-Type": "multipart/form-data;charset=UTF-8",
193-
},
194-
showLoading: false,
195-
isUploading: true,
196-
...config,
197-
});
190+
return post(
191+
`/api/data-management/datasets/${id}/files/upload/chunk`,
192+
params,
193+
{
194+
showLoading: false,
195+
...config,
196+
}
197+
);
198198
}

frontend/src/pages/DataManagement/hooks/useImportFile.tsx

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,63 @@
11
import { Upload, type UploadFile } from "antd";
22
import { InboxOutlined } from "@ant-design/icons";
3-
import { useState } from "react";
3+
import { useMemo, useState } from "react";
44
import type { Dataset } from "@/pages/DataManagement/dataset.model";
5-
import { uploadDatasetFileUsingPost } from "../dataset.api";
5+
import { sliceFile } from "@/utils/file.util";
66

77
const { Dragger } = Upload;
88

99
export const useImportFile = () => {
1010
const [fileList, setFileList] = useState<UploadFile[]>([]);
11+
const fileSliceList = useMemo(() => {
12+
const sliceList = fileList.map((file) => {
13+
const slices = sliceFile(file);
14+
return { originFile: file, slices, name: file.name, size: file.size };
15+
});
16+
return sliceList;
17+
}, [fileList]);
1118

1219
const resetFiles = () => {
1320
setFileList([]);
1421
};
1522

16-
const handleUpload = async (message: any, dataset: Dataset) => {
23+
const handleUpload = async (dataset: Dataset) => {
1724
const formData = new FormData();
1825
fileList.forEach((file) => {
19-
console.log(file);
2026
formData.append("file", file);
2127
});
22-
await uploadDatasetFileUsingPost(dataset?.id, formData);
28+
window.dispatchEvent(
29+
new CustomEvent("upload:dataset", {
30+
detail: { dataset, files: fileSliceList },
31+
})
32+
);
2333
resetFiles();
24-
message.success("文件上传成功");
34+
};
35+
36+
const handleBeforeUpload = (file: UploadFile) => {
37+
setFileList([...fileList, file]);
38+
return false;
39+
};
40+
41+
const handleRemoveFile = (file: UploadFile) => {
42+
const index = fileList.indexOf(file);
43+
const newFileList = fileList.slice();
44+
newFileList.splice(index, 1);
45+
setFileList(newFileList);
2546
};
2647

2748
const importFileRender = () => (
2849
<Dragger
2950
className="w-full"
3051
fileList={fileList}
31-
onRemove={(file) => {
32-
const index = fileList.indexOf(file);
33-
const newFileList = fileList.slice();
34-
newFileList.splice(index, 1);
35-
setFileList(newFileList);
36-
}}
37-
beforeUpload={(file) => {
38-
setFileList([...fileList, file]);
39-
40-
return false;
41-
}}
52+
onRemove={handleRemoveFile}
53+
beforeUpload={handleBeforeUpload}
54+
multiple
4255
>
4356
<p className="ant-upload-drag-icon">
4457
<InboxOutlined />
4558
</p>
4659
<p className="ant-upload-text">本地文件上传</p>
47-
<p className="ant-upload-hint">
48-
拖拽文件到此处或点击选择文件,支持 JPG, PNG, TXT, JSON 等格式
49-
</p>
60+
<p className="ant-upload-hint">拖拽文件到此处或点击选择文件</p>
5061
</Dragger>
5162
);
5263

frontend/src/pages/Layout/Sidebar.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,24 @@ const AsiderAndHeaderLayout = () => {
3939
initActiveItem();
4040
}, [pathname]);
4141

42-
const toggleShowTaskPopover = (show: boolean = true) => {
43-
const taskEl = document.getElementById("header-task-popover");
44-
if (show && !taskEl?.classList.contains("show-task-popover")) {
45-
taskEl?.classList?.add("show-task-popover");
46-
return;
47-
}
48-
if (!show && taskEl?.classList.contains("show-task-popover")) {
49-
taskEl?.classList?.remove("show-task-popover");
50-
}
51-
};
42+
useEffect(() => {
43+
const handleShowTaskPopover = (event: CustomEvent) => {
44+
const { show } = event.detail;
45+
setTaskCenterVisible(show);
46+
};
47+
48+
window.addEventListener(
49+
"show:task-popover",
50+
handleShowTaskPopover as EventListener
51+
);
52+
53+
return () => {
54+
window.removeEventListener(
55+
"show:task-popover",
56+
handleShowTaskPopover as EventListener
57+
);
58+
};
59+
}, []);
5260

5361
return (
5462
<div
@@ -99,6 +107,7 @@ const AsiderAndHeaderLayout = () => {
99107
{sidebarOpen ? (
100108
<div className="space-y-2">
101109
<Popover
110+
forceRender
102111
title={
103112
<div className="flex items-center justify-between gap-2 border-b border-gray-200 pb-2 mb-2">
104113
<h4 className="font-bold">任务中心</h4>
@@ -111,6 +120,7 @@ const AsiderAndHeaderLayout = () => {
111120
open={taskCenterVisible}
112121
content={<TaskUpload />}
113122
trigger="click"
123+
destroyOnHidden={false}
114124
>
115125
<Button block onClick={() => setTaskCenterVisible(true)}>
116126
任务中心
@@ -124,10 +134,12 @@ const AsiderAndHeaderLayout = () => {
124134
<div className="space-y-2">
125135
<div className="relative">
126136
<Popover
137+
forceRender
127138
title="任务中心"
128139
open={taskCenterVisible}
129140
content={<TaskUpload />}
130141
trigger="click"
142+
destroyOnHidden={false}
131143
>
132144
<Button
133145
block

0 commit comments

Comments
 (0)