From c51e0fab2fd32c652d93f2e17e6aee6c29c8aad4 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 21 Jan 2026 01:00:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(dataset):=20=E6=B7=BB=E5=8A=A0=E5=AD=90?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=88=9B=E5=BB=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在创建页面集成父数据集ID传递逻辑 - 使用useMemo缓存location状态中的parentDatasetId - 添加useEffect同步parentDatasetId到表单状态 - 实现handleCreateChildDataset函数用于导航到创建页面 - 在数据集详情页的操作菜单中添加"创建子数据集"选项 - 为子数据集创建按钮添加PlusOutlined图标 - 定义CreateDatasetLocationState接口规范传递参数类型 --- .../DataManagement/Create/CreateDataset.tsx | 29 +++++++++--- .../DataManagement/Detail/DatasetDetail.tsx | 45 +++++++++++++------ 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/frontend/src/pages/DataManagement/Create/CreateDataset.tsx b/frontend/src/pages/DataManagement/Create/CreateDataset.tsx index 356dac4..5479324 100644 --- a/frontend/src/pages/DataManagement/Create/CreateDataset.tsx +++ b/frontend/src/pages/DataManagement/Create/CreateDataset.tsx @@ -1,24 +1,37 @@ -import { useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { ArrowLeft } from "lucide-react"; import { Button, Form, App } from "antd"; -import { Link, useNavigate } from "react-router"; +import { Link, useLocation, useNavigate } from "react-router"; import { createDatasetUsingPost } from "../dataset.api"; import { DatasetType } from "../dataset.model"; import BasicInformation from "./components/BasicInformation"; export default function DatasetCreate() { const navigate = useNavigate(); + const location = useLocation(); const { message } = App.useApp(); const [form] = Form.useForm(); - const [newDataset, setNewDataset] = useState({ + const parentDatasetId = useMemo(() => { + const state = location.state as CreateDatasetLocationState | null; + return state?.parentDatasetId || ""; + }, [location.state]); + const [newDataset, setNewDataset] = useState(() => ({ name: "", description: "", datasetType: DatasetType.TEXT, tags: [], - parentDatasetId: "", - }); + parentDatasetId, + })); + + useEffect(() => { + if (!parentDatasetId) { + return; + } + setNewDataset((prev) => ({ ...prev, parentDatasetId })); + form.setFieldsValue({ parentDatasetId }); + }, [form, parentDatasetId]); const handleSubmit = async () => { const formValues = await form.validateFields(); @@ -39,7 +52,7 @@ export default function DatasetCreate() { }; const handleValuesChange = (_, allValues) => { - setNewDataset({ ...newDataset, ...allValues }); + setNewDataset((prev) => ({ ...prev, ...allValues })); }; return ( @@ -82,3 +95,7 @@ export default function DatasetCreate() { ); } + +interface CreateDatasetLocationState { + parentDatasetId?: string; +} diff --git a/frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx b/frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx index 4a45100..af9c00e 100644 --- a/frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx +++ b/frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx @@ -1,12 +1,13 @@ import { useEffect, useMemo, useState } from "react"; import { Breadcrumb, App, Tabs } from "antd"; import { - ReloadOutlined, - DownloadOutlined, - UploadOutlined, - EditOutlined, - DeleteOutlined, -} from "@ant-design/icons"; + ReloadOutlined, + DownloadOutlined, + UploadOutlined, + EditOutlined, + DeleteOutlined, + PlusOutlined, +} from "@ant-design/icons"; import DetailHeader from "@/components/DetailHeader"; import { mapDataset, datasetTypeMap } from "../dataset.const"; import type { Dataset } from "@/pages/DataManagement/dataset.model"; @@ -45,7 +46,7 @@ export default function DatasetDetail() { const [parentDataset, setParentDataset] = useState(null); const filesOperation = useFilesOperation(dataset); - const [showUploadDialog, setShowUploadDialog] = useState(false); + const [showUploadDialog, setShowUploadDialog] = useState(false); const navigateItems = useMemo(() => { const items = [ { @@ -66,6 +67,14 @@ export default function DatasetDetail() { }); return items; }, [dataset, parentDataset]); + const handleCreateChildDataset = () => { + if (!dataset?.id) { + return; + } + navigate("/data/management/create", { + state: { parentDatasetId: dataset.id }, + }); + }; const fetchDataset = async () => { if (!id) { return; @@ -158,12 +167,22 @@ export default function DatasetDetail() { ]; // 数据集操作列表 - const operations = [ - { - key: "edit", - label: "编辑", - icon: , - onClick: () => { + const operations = [ + ...(dataset?.id && !dataset.parentDatasetId + ? [ + { + key: "create-child", + label: "创建子数据集", + icon: , + onClick: handleCreateChildDataset, + }, + ] + : []), + { + key: "edit", + label: "编辑", + icon: , + onClick: () => { setShowEditDialog(true); }, },