You've already forked DataMate
核心功能: - G6 v5 力导向图,支持交互式缩放、平移、拖拽 - 5 种布局模式:force, circular, grid, radial, concentric - 双击展开节点邻居到图中(增量探索) - 全文搜索,类型过滤,结果高亮(变暗/高亮状态) - 节点详情抽屉:实体属性、别名、置信度、关系列表(可导航) - 关系详情抽屉:类型、源/目标、权重、置信度、属性 - 查询构建器:最短路径/全路径查询,可配置 maxDepth/maxPaths - 基于 UUID 的图加载(输入或 URL 参数 ?graphId=...) - 大图性能优化(200 节点阈值,超过时禁用动画) 新增文件(13 个): - knowledge-graph.model.ts - TypeScript 接口,匹配 Java DTOs - knowledge-graph.api.ts - API 服务,包含所有 KG REST 端点 - knowledge-graph.const.ts - 实体类型颜色、关系类型标签、中文显示名称 - graphTransform.ts - 后端数据 → G6 节点/边格式转换 + 合并工具 - graphConfig.ts - G6 v5 图配置(节点/边样式、行为、布局) - hooks/useGraphData.ts - 数据钩子:加载子图、展开节点、搜索、合并 - hooks/useGraphLayout.ts - 布局钩子:5 种布局类型 - components/GraphCanvas.tsx - G6 v5 画布,力导向布局,缩放/平移/拖拽 - components/SearchPanel.tsx - 全文实体搜索,类型过滤 - components/NodeDetail.tsx - 实体详情抽屉 - components/RelationDetail.tsx - 关系详情抽屉 - components/QueryBuilder.tsx - 路径查询构建器 - Home/KnowledgeGraphPage.tsx - 主页面,整合所有组件 修改文件(5 个): - package.json - 添加 @antv/g6 v5 依赖 - vite.config.ts - 添加 /knowledge-graph 代理规则 - auth/permissions.ts - 添加 knowledgeGraphRead/knowledgeGraphWrite - pages/Layout/menu.tsx - 添加知识图谱菜单项(Network 图标) - routes/routes.ts - 添加 /data/knowledge-graph 路由 新增文档(10 个): - docs/knowledge-graph/ - 完整的知识图谱设计文档 Bug 修复(Codex 审查后修复): - P1: 详情抽屉状态与选中状态不一致(显示旧数据) - P1: 查询构建器未实现(最短路径/多路径查询) - P2: 实体类型映射 Organization → Org(匹配后端) - P2: getSubgraph depth 参数无效(改用正确端点) - P2: AllPathsVO 字段名不一致(totalPaths → pathCount) - P2: 搜索取消逻辑无效(传递 AbortController.signal) - P2: 大图性能优化(动画降级) - P3: 移除未使用的类型导入 构建验证: - tsc --noEmit ✅ clean - eslint ✅ 0 errors/warnings - vite build ✅ successful
334 lines
10 KiB
TypeScript
334 lines
10 KiB
TypeScript
import { createBrowserRouter } from "react-router";
|
|
import MainLayout from "../pages/Layout/MainLayout";
|
|
|
|
import DataCollection from "@/pages/DataCollection/Home/DataCollectionPage";
|
|
import CollectionTaskCreate from "@/pages/DataCollection/Create/CreateTask";
|
|
|
|
import DatasetManagement from "@/pages/DataManagement/Home/DataManagement";
|
|
import DatasetCreate from "@/pages/DataManagement/Create/CreateDataset";
|
|
import DatasetDetail from "@/pages/DataManagement/Detail/DatasetDetail";
|
|
import KnowledgeManagementPage from "@/pages/KnowledgeManagement/Home/KnowledgeManagementPage";
|
|
import KnowledgeSetDetail from "@/pages/KnowledgeManagement/Detail/KnowledgeSetDetail";
|
|
import KnowledgeManagementSearch from "@/pages/KnowledgeManagement/Search/KnowledgeManagementSearch";
|
|
|
|
import DataCleansing from "@/pages/DataCleansing/Home/DataCleansing";
|
|
import CleansingTaskCreate from "@/pages/DataCleansing/Create/CreateTask";
|
|
import CleansingTaskDetail from "@/pages/DataCleansing/Detail/TaskDetail";
|
|
import CleansingTemplateCreate from "@/pages/DataCleansing/Create/CreateTemplate";
|
|
|
|
import DataAnnotation from "@/pages/DataAnnotation/Home/DataAnnotation";
|
|
import AnnotationTaskCreate from "@/pages/DataAnnotation/Create/CreateTask";
|
|
import LabelStudioTextEditor from "@/pages/DataAnnotation/Annotate/LabelStudioTextEditor";
|
|
import AnnotationOperatorTaskCreate from "@/pages/DataAnnotation/OperatorCreate/CreateTask";
|
|
|
|
import DataSynthesisPage from "@/pages/SynthesisTask/DataSynthesis";
|
|
import InstructionTemplateCreate from "@/pages/SynthesisTask/CreateTemplate";
|
|
import SynthesisTaskCreate from "@/pages/SynthesisTask/CreateTask";
|
|
|
|
import DataEvaluationPage from "@/pages/DataEvaluation/Home/DataEvaluation";
|
|
import EvaluationTaskReport from "@/pages/DataEvaluation/Report/EvaluationReport";
|
|
import ManualEvaluatePage from "@/pages/DataEvaluation/Evaluate/ManualEvaluate";
|
|
|
|
import KnowledgeBasePage from "@/pages/KnowledgeBase/Home/KnowledgeBasePage";
|
|
import KnowledgeBaseDetailPage from "@/pages/KnowledgeBase/Detail/KnowledgeBaseDetail";
|
|
import KnowledgeBaseFileDetailPage from "@/pages/KnowledgeBase/FileDetail/KnowledgeBaseFileDetail";
|
|
import KnowledgeBaseSearch from "@/pages/KnowledgeBase/Search/KnowledgeBaseSearch";
|
|
|
|
import OperatorMarketPage from "@/pages/OperatorMarket/Home/OperatorMarket";
|
|
import OperatorPluginCreate from "@/pages/OperatorMarket/Create/OperatorPluginCreate";
|
|
import OperatorPluginDetail from "@/pages/OperatorMarket/Detail/OperatorPluginDetail";
|
|
import RatioTasksPage from "@/pages/RatioTask/Home/RatioTask.tsx";
|
|
import CreateRatioTask from "@/pages/RatioTask/Create/CreateRatioTask.tsx";
|
|
import TaskCoordinationPage from "@/pages/TaskCoordination/Home/TaskCoordination";
|
|
import MyTasksPage from "@/pages/TaskCoordination/MyTasks/MyTasks";
|
|
import OrchestrationPage from "@/pages/Orchestration/Orchestration";
|
|
import WorkflowEditor from "@/pages/Orchestration/WorkflowEditor";
|
|
import { withErrorBoundary } from "@/components/ErrorBoundary";
|
|
import AgentPage from "@/pages/Agent/Agent.tsx";
|
|
import RatioTaskDetail from "@/pages/RatioTask/Detail/RatioTaskDetail";
|
|
import CleansingTemplateDetail from "@/pages/DataCleansing/Detail/TemplateDetail";
|
|
import SynthFileTask from "@/pages/SynthesisTask/SynthFileTask.tsx";
|
|
import EvaluationDetailPage from "@/pages/DataEvaluation/Detail/TaskDetail.tsx";
|
|
import SynthDataDetail from "@/pages/SynthesisTask/SynthDataDetail.tsx";
|
|
import Home from "@/pages/Home/Home";
|
|
import ContentGenerationPage from "@/pages/ContentGeneration/ContentGenerationPage";
|
|
import LoginPage from "@/pages/Login/LoginPage";
|
|
import ProtectedRoute from "@/components/ProtectedRoute";
|
|
import ForbiddenPage from "@/pages/Forbidden/ForbiddenPage";
|
|
import KnowledgeGraphPage from "@/pages/KnowledgeGraph/Home/KnowledgeGraphPage";
|
|
|
|
const router = createBrowserRouter([
|
|
{
|
|
path: "/login",
|
|
Component: LoginPage,
|
|
},
|
|
{
|
|
path: "/",
|
|
Component: Home,
|
|
},
|
|
{
|
|
Component: ProtectedRoute,
|
|
children: [
|
|
{
|
|
path: "/403",
|
|
Component: ForbiddenPage,
|
|
},
|
|
{
|
|
path: "/chat",
|
|
Component: withErrorBoundary(AgentPage),
|
|
},
|
|
{
|
|
path: "/orchestration",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: withErrorBoundary(OrchestrationPage),
|
|
},
|
|
{
|
|
path: "create-workflow",
|
|
Component: withErrorBoundary(WorkflowEditor),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "/data",
|
|
Component: withErrorBoundary(MainLayout),
|
|
children: [
|
|
{
|
|
path: "collection",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: DataCollection,
|
|
},
|
|
{
|
|
path: "create-task",
|
|
Component: CollectionTaskCreate,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "management",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: DatasetManagement,
|
|
},
|
|
{
|
|
path: "create/:id?",
|
|
Component: DatasetCreate,
|
|
},
|
|
{
|
|
path: "detail/:id",
|
|
Component: DatasetDetail,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "knowledge-management",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: KnowledgeManagementPage,
|
|
},
|
|
{
|
|
path: "search",
|
|
Component: KnowledgeManagementSearch,
|
|
},
|
|
{
|
|
path: "detail/:id",
|
|
Component: KnowledgeSetDetail,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "cleansing",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: DataCleansing,
|
|
},
|
|
{
|
|
path: "create-task",
|
|
Component: CleansingTaskCreate,
|
|
},
|
|
{
|
|
path: "task-detail/:id",
|
|
Component: CleansingTaskDetail,
|
|
},
|
|
{
|
|
path: "create-template",
|
|
Component: CleansingTemplateCreate,
|
|
},
|
|
{
|
|
path: "template-detail/:id",
|
|
Component: CleansingTemplateDetail,
|
|
},
|
|
{
|
|
path: "update-template/:id",
|
|
Component: CleansingTemplateCreate,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "annotation",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: DataAnnotation,
|
|
},
|
|
{
|
|
path: "create-task",
|
|
Component: AnnotationTaskCreate,
|
|
},
|
|
{
|
|
path: "create-auto-task",
|
|
Component: AnnotationOperatorTaskCreate,
|
|
},
|
|
{
|
|
path: "annotate/:projectId",
|
|
Component: LabelStudioTextEditor,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "content-generation",
|
|
Component: ContentGenerationPage,
|
|
},
|
|
{
|
|
path: "synthesis/task",
|
|
children: [
|
|
{
|
|
path: "",
|
|
Component: DataSynthesisPage,
|
|
},
|
|
{
|
|
path: "create-template",
|
|
Component: InstructionTemplateCreate,
|
|
},
|
|
{
|
|
path: "create",
|
|
Component: SynthesisTaskCreate,
|
|
},
|
|
{
|
|
path: ":id",
|
|
Component: SynthFileTask
|
|
},
|
|
{
|
|
path: "file/:id/detail",
|
|
Component: SynthDataDetail,
|
|
}
|
|
],
|
|
},
|
|
{
|
|
path: "synthesis/ratio-task",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: RatioTasksPage,
|
|
},
|
|
{
|
|
path: "create",
|
|
Component: CreateRatioTask,
|
|
},
|
|
{
|
|
path: "detail/:id",
|
|
Component: RatioTaskDetail,
|
|
}
|
|
],
|
|
},
|
|
{
|
|
path: "evaluation",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: DataEvaluationPage,
|
|
},
|
|
{
|
|
path: "detail/:id",
|
|
Component: EvaluationDetailPage,
|
|
},
|
|
{
|
|
path: "task-report/:id",
|
|
Component: EvaluationTaskReport,
|
|
},
|
|
{
|
|
path: "manual-evaluate/:id",
|
|
Component: ManualEvaluatePage,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "knowledge-base",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: KnowledgeBasePage,
|
|
},
|
|
{
|
|
path: "search",
|
|
Component: KnowledgeBaseSearch,
|
|
},
|
|
{
|
|
path: "detail/:id",
|
|
Component: KnowledgeBaseDetailPage,
|
|
},
|
|
{
|
|
path: "file-detail/:id",
|
|
Component: KnowledgeBaseFileDetailPage,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "knowledge-graph",
|
|
Component: withErrorBoundary(KnowledgeGraphPage),
|
|
},
|
|
{
|
|
path: "task-coordination",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: TaskCoordinationPage,
|
|
},
|
|
{
|
|
path: "my-tasks",
|
|
Component: MyTasksPage,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "operator-market",
|
|
children: [
|
|
{
|
|
path: "",
|
|
index: true,
|
|
Component: OperatorMarketPage,
|
|
},
|
|
{
|
|
path: "create/:id?",
|
|
Component: OperatorPluginCreate,
|
|
},
|
|
{
|
|
path: "plugin-detail/:id",
|
|
Component: OperatorPluginDetail,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
]
|
|
}
|
|
]);
|
|
|
|
export default router;
|