Files
DataMate/frontend/vite.config.ts
Jerry Yan 3a9afe3480 feat(kg): 实现 Phase 3.2 Human-in-the-loop 编辑
核心功能:
- 实体/关系编辑表单(创建/更新/删除)
- 批量操作(批量删除节点/边)
- 审核流程(提交审核 → 待审核列表 → 通过/拒绝)
- 编辑模式切换(查看/编辑模式)
- 权限控制(knowledgeGraphWrite 权限)

新增文件(后端,9 个):
- EditReview.java - 审核记录领域模型(Neo4j 节点)
- EditReviewRepository.java - 审核记录仓储(CRUD + 分页查询)
- EditReviewService.java - 审核业务服务(提交/通过/拒绝,通过时自动执行变更)
- EditReviewController.java - REST API(POST submit, POST approve/reject, GET pending)
- DTOs: SubmitReviewRequest, EditReviewVO, ReviewActionRequest, BatchDeleteRequest
- EditReviewServiceTest.java - 单元测试(21 tests)
- EditReviewControllerTest.java - 集成测试(10 tests)

新增文件(前端,3 个):
- EntityEditForm.tsx - 实体创建/编辑表单(Modal,支持名称/类型/描述/别名/置信度)
- RelationEditForm.tsx - 关系创建/编辑表单(Modal,支持源/目标实体搜索、关系类型、权重/置信度)
- ReviewPanel.tsx - 审核面板(待审核列表,通过/拒绝操作,拒绝带备注)

修改文件(后端,7 个):
- GraphEntityService.java - 新增 batchDeleteEntities(),updateEntity 支持 confidence
- GraphRelationService.java - 新增 batchDeleteRelations()
- GraphEntityController.java - 删除批量删除端点(改为审核流程)
- GraphRelationController.java - 删除批量删除端点(改为审核流程)
- UpdateEntityRequest.java - 添加 confidence 字段
- KnowledgeGraphErrorCode.java - 新增 REVIEW_NOT_FOUND、REVIEW_ALREADY_PROCESSED
- PermissionRuleMatcher.java - 添加 /api/knowledge-graph/** 写操作权限规则

修改文件(前端,8 个):
- knowledge-graph.model.ts - 新增 EditReviewVO、ReviewOperationType、ReviewStatus 类型
- knowledge-graph.api.ts - BASE 改为 /api/knowledge-graph(走网关权限链),新增审核相关 API,删除批量删除直删方法
- vite.config.ts - 更新 dev proxy 路径
- NodeDetail.tsx - 新增 editMode 属性,编辑模式下显示编辑/删除按钮
- RelationDetail.tsx - 新增 editMode 属性,编辑模式下显示编辑/删除按钮
- KnowledgeGraphPage.tsx - 新增编辑模式开关(需要 knowledgeGraphWrite 权限)、创建实体/关系工具栏按钮、审核 Tab、批量操作
- GraphCanvas.tsx - 支持多选(editMode 时)、onSelectionChange 回调
- graphConfig.ts - 支持 multiSelect 参数

审核流程:
- 所有编辑操作(创建/更新/删除/批量删除)都通过 submitReview 提交审核
- 审核通过后,EditReviewService.applyChange() 自动执行变更
- 批量删除端点已删除,只能通过审核流程

权限控制:
- API 路径从 /knowledge-graph 改为 /api/knowledge-graph,走网关权限链
- 编辑模式开关需要 knowledgeGraphWrite 权限
- PermissionRuleMatcher 添加 /api/knowledge-graph/** 写操作规则

Bug 修复(Codex 审查后修复):
- P0: 权限绕过(API 路径改为 /api/knowledge-graph)
- P1: 审核流程未接入(所有编辑操作改为 submitReview)
- P1: 批量删除绕过审核(删除直删端点,改为审核流程)
- P1: confidence 字段丢失(UpdateEntityRequest 添加 confidence)
- P2: 审核提交校验不足(添加跨字段校验器)
- P2: 批量删除安全(添加 @Size(max=100) 限制,收集失败 ID)
- P2: 前端错误处理(分开处理表单校验和 API 失败)

测试结果:
- 后端: 311 tests pass  (280 → 311, +31 new)
- 前端: eslint clean , tsc clean , vite build success 
2026-02-20 20:38:03 +08:00

48 lines
1.5 KiB
TypeScript

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import path from "path"; // 需要安装 Node.js 的类型声明(@types/node)
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), tailwindcss()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"), // 将 @/ 映射到 src/ 目录
},
},
server: {
// headers: {
// "Access-Control-Allow-Origin": "*",
// "access-control-allow-headers":
// "Origin, X-Requested-With, Content-Type, Accept",
// },
proxy: {
"/api/knowledge-graph": {
target: "http://localhost:8080",
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/api/, ""),
},
"^/api": {
target: "http://localhost:8080", // 本地后端服务地址
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/api/, "/api"),
configure: (proxy, options) => {
// proxy 是 'http-proxy' 的实例
proxy.on("proxyReq", (proxyReq, req, res) => {
// 可以在这里修改请求头
proxyReq.removeHeader("referer");
proxyReq.removeHeader("origin");
});
proxy.on("proxyRes", (proxyRes, req, res) => {
delete proxyRes.headers["set-cookie"];
proxyRes.headers["cookies"] = ""; // 清除 cookies 头
});
},
},
},
},
});