From 3f566a0b08dd947e189941a145ab5985e116207c Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 23 Jan 2026 16:11:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(annotation):=20=E6=9B=BF=E6=8D=A2=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E9=85=8D=E7=BD=AE=E8=A1=A8=E5=8D=95=E4=B8=BA=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E7=BC=96=E8=BE=91=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 TemplateConfigurationForm 组件并引入 TemplateConfigurationTreeEditor - 使用 useTagConfig Hook 获取标签配置 - 将自定义XML状态 customXml 替换为 labelConfig - 删除模板编辑标签页和选择模板状态管理 - 更新XML解析逻辑支持更多对象和标注控件类型 - 添加配置验证功能确保至少包含数据对象和标注控件 - 在模板详情页面使用树形编辑器显示配置详情 - 更新任务创建页面集成新的树形配置编辑器 - 调整预览数据生成功能适配新的XML解析方式 --- .../DataAnnotation/Create/CreateTask.tsx | 392 ++------ .../components/CreateAnnotationTaskDialog.tsx | 437 ++++----- .../Template/TemplateDetail.tsx | 99 +- .../DataAnnotation/Template/TemplateForm.tsx | 26 +- .../pages/DataAnnotation/annotation.model.ts | 2 +- .../DataAnnotation/annotation.tagconfig.ts | 11 +- .../TemplateConfigurationTreeEditor.tsx | 860 ++++++++++++++++++ .../app/db/models/annotation_management.py | 4 +- .../annotation/config/label_studio_tags.yaml | 64 +- .../module/annotation/interface/template.py | 2 +- .../app/module/annotation/schema/template.py | 8 +- .../app/module/annotation/service/template.py | 62 +- .../annotation/utils/config_validator.py | 111 ++- scripts/db/data-annotation-init.sql | 205 ++--- 14 files changed, 1383 insertions(+), 900 deletions(-) create mode 100644 frontend/src/pages/DataAnnotation/components/TemplateConfigurationTreeEditor.tsx diff --git a/frontend/src/pages/DataAnnotation/Create/CreateTask.tsx b/frontend/src/pages/DataAnnotation/Create/CreateTask.tsx index e475416..48f077f 100644 --- a/frontend/src/pages/DataAnnotation/Create/CreateTask.tsx +++ b/frontend/src/pages/DataAnnotation/Create/CreateTask.tsx @@ -1,180 +1,108 @@ -import type React from "react"; import { useEffect, useState } from "react"; -import { Card, Button, Input, Select, Divider, Form, message, Radio } from "antd"; +import { Button, Input, Select, Form, message, Radio } from "antd"; import TextArea from "antd/es/input/TextArea"; -import { - DatabaseOutlined, - CheckOutlined, - PlusOutlined, -} from "@ant-design/icons"; -import { mockTemplates } from "@/mock/annotation"; -import CustomTemplateDialog from "./components/CustomTemplateDialog"; -import TemplateConfigurationForm from "../components/TemplateConfigurationForm"; +import { DatabaseOutlined } from "@ant-design/icons"; import { Link, useNavigate } from "react-router"; import { ArrowLeft } from "lucide-react"; import { queryDatasetsUsingGet } from "../../DataManagement/dataset.api"; +import { mapDataset } from "@/pages/DataManagement/dataset.const"; +import type { Dataset } from "@/pages/DataManagement/dataset.model"; import { - DatasetType, - type Dataset, -} from "@/pages/DataManagement/dataset.model"; - -interface Template { - id: string; - name: string; - category: string; - description: string; - type: "text" | "image"; - preview?: string; - icon: React.ReactNode; - isCustom?: boolean; -} - -const templateCategories = ["Computer Vision", "Natural Language Processing"]; + createAnnotationTaskUsingPost, + queryAnnotationTemplatesUsingGet, +} from "../annotation.api"; +import type { AnnotationTemplate } from "../annotation.model"; +import TemplateConfigurationTreeEditor from "../components/TemplateConfigurationTreeEditor"; export default function AnnotationTaskCreate() { const navigate = useNavigate(); const [form] = Form.useForm(); - const [showCustomTemplateDialog, setShowCustomTemplateDialog] = - useState(false); - const [selectedCategory, setSelectedCategory] = useState("Computer Vision"); - const [configMode, setConfigMode] = useState<"template" | "custom">("template"); - const [searchQuery, setSearchQuery] = useState(""); - const [datasetFilter, setDatasetFilter] = useState("all"); - const [selectedTemplate, setSelectedTemplate] = useState