From e9b3f13eeccc9bceecfcf87cc1135fd1ea028afb Mon Sep 17 00:00:00 2001 From: bruce Date: Thu, 4 Jun 2026 02:33:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E6=B2=BB=E7=90=86=E5=8F=B0=E5=89=8D=E5=8F=B0=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E4=B8=8E=E7=BB=B4=E6=8A=A4=E5=AF=BC=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/platform_ui/services.py | 91 +++++++++++++++++++++++ apps/platform_ui/views.py | 4 +- templates/platform_ui/knowledge_base.html | 45 +++++++++++ tests/test_platform_ui.py | 25 +++++++ 4 files changed, 163 insertions(+), 2 deletions(-) diff --git a/apps/platform_ui/services.py b/apps/platform_ui/services.py index 48e3728..79a9fda 100644 --- a/apps/platform_ui/services.py +++ b/apps/platform_ui/services.py @@ -1,3 +1,5 @@ +from django.urls import reverse + from agent_core.governance import load_governance_config @@ -404,3 +406,92 @@ def get_platform_demo_context(): "owners": owners, "operation_logs": operation_logs, } + + +def build_knowledge_base_context(selected_view: str) -> dict: + """ + 组装知识库治理台上下文。 + + 页面层只负责展示,治理对象导航、当前对象说明和 CRUD 入口统一由服务层提供。 + """ + context = get_platform_demo_context() + governance_objects = _build_governance_objects() + active_object = next( + (item for item in governance_objects if item["key"] == selected_view), + governance_objects[0], + ) + context.update( + { + "governance_objects": governance_objects, + "active_governance_object": active_object, + } + ) + return context + + +def _build_governance_objects() -> list[dict]: + return [ + { + "key": "rule_packages", + "title": "法规规则包", + "summary": "按章-条-要求项-模板字段维护规则包版本和启停状态。", + "detail_title": "法规规则包详情", + "detail_copy": "支持新增、编辑、复制新版本、启停和查看章节要求详情。", + "actions": ["新增规则包", "编辑规则包", "复制新版本", "启用 / 停用", "查看章节要求详情"], + "admin_url": reverse("admin:index"), + }, + { + "key": "knowledge_sources", + "title": "RAG 文档源", + "summary": "维护法规资料、模板资料和业务资料的入库版本。", + "detail_title": "RAG 文档源详情", + "detail_copy": "支持上传新文档源、替换版本、编辑元数据、停用和重新入库。", + "actions": ["上传新文档源", "替换版本", "编辑元数据", "停用文档源", "重新入库"], + "admin_url": reverse("admin:index"), + }, + { + "key": "rag_chunks", + "title": "RAG 切片", + "summary": "查看切片摘要、章节、召回状态和证据命中历史。", + "detail_title": "RAG 切片详情", + "detail_copy": "支持手工切片、摘要编辑、合并拆分、删除和重建向量。", + "actions": ["新增手工切片", "编辑切片摘要", "合并切片", "拆分切片", "重建向量"], + "admin_url": reverse("admin:index"), + }, + { + "key": "field_schemas", + "title": "字段 Schema", + "summary": "维护回填字段、强一致字段和来源优先级。", + "detail_title": "字段 Schema 详情", + "detail_copy": "支持新增字段、编辑字段、版本复制和启停管理。", + "actions": ["新增字段", "编辑字段", "启停字段", "复制 schema 版本", "查看来源优先级"], + "admin_url": reverse("admin:index"), + }, + { + "key": "template_mappings", + "title": "Word 模板与字段映射", + "summary": "管理输出模板版本、占位符映射和阻断条件影响范围。", + "detail_title": "Word 模板与字段映射详情", + "detail_copy": "支持上传模板、编辑占位符映射、启停版本和模板预览。", + "actions": ["上传模板", "编辑模板元数据", "编辑占位符映射", "启用 / 停用版本", "预览模板"], + "admin_url": reverse("admin:platform_ui_wordtemplatemapping_changelist"), + }, + { + "key": "owner_mappings", + "title": "责任人映射", + "summary": "按章节和风险类型维护责任角色、责任人和飞书标识。", + "detail_title": "责任人映射详情", + "detail_copy": "支持新增、编辑、启停、删除以及批量导入责任人映射。", + "actions": ["新增映射", "编辑映射", "启停映射", "删除映射", "批量导入映射"], + "admin_url": reverse("admin:platform_ui_ownermapping_changelist"), + }, + { + "key": "feishu_configs", + "title": "飞书通知配置", + "summary": "固定支持 task_completed / task_failed 两类通知并维护消息模板。", + "detail_title": "飞书通知配置详情", + "detail_copy": "支持新增配置、编辑消息模板、启停配置和发送测试消息。", + "actions": ["新增配置", "编辑配置", "切换消息模板", "启用 / 停用", "发送测试消息"], + "admin_url": reverse("admin:platform_ui_feishunotifyconfig_changelist"), + }, + ] diff --git a/apps/platform_ui/views.py b/apps/platform_ui/views.py index b44a112..61cd51a 100644 --- a/apps/platform_ui/views.py +++ b/apps/platform_ui/views.py @@ -1,10 +1,10 @@ from django.shortcuts import render -from .services import get_platform_demo_context +from .services import build_knowledge_base_context, get_platform_demo_context def knowledge_base(request): - context = get_platform_demo_context() + context = build_knowledge_base_context(request.GET.get("view", "")) return render(request, "platform_ui/knowledge_base.html", context) diff --git a/templates/platform_ui/knowledge_base.html b/templates/platform_ui/knowledge_base.html index a6c0792..d051d18 100644 --- a/templates/platform_ui/knowledge_base.html +++ b/templates/platform_ui/knowledge_base.html @@ -18,6 +18,51 @@ {% endfor %} +
+
+

治理对象导航

+

按治理对象切换当前列表和维护入口,保持法规、RAG、字段、模板和通知口径统一。

+
    + {% for item in governance_objects %} +
  • + + {{ item.title }} + +
    {{ item.summary }}
    + {% if active_governance_object.key == item.key %} +
    + 当前对象:{{ item.title }} +
    + {% endif %} +
  • + {% endfor %} +
+
+ +
+
+
+

{{ active_governance_object.detail_title }}

+

{{ active_governance_object.detail_copy }}

+
+ +
+
+ 当前对象:{{ active_governance_object.title }} +
+
+ {% for action in active_governance_object.actions %} +
+

{{ action }}

+

该操作在 V1 通过后台维护与治理台入口统一承接。

+
+ {% endfor %} +
+
+
+
{% for section in governance_sections %}
diff --git a/tests/test_platform_ui.py b/tests/test_platform_ui.py index 8a8bbd9..73d7367 100644 --- a/tests/test_platform_ui.py +++ b/tests/test_platform_ui.py @@ -146,3 +146,28 @@ def test_governance_models_are_registered_in_admin(): assert OwnerMapping in admin.site._registry assert FeishuNotifyConfig in admin.site._registry assert WordTemplateMapping in admin.site._registry + + +def test_knowledge_base_page_shows_governance_object_navigation_and_active_panel(client): + response = client.get(reverse("platform_ui:knowledge-base"), {"view": "owner_mappings"}) + + content = response.content.decode("utf-8") + assert response.status_code == 200 + assert "治理对象导航" in content + assert "法规规则包" in content + assert "RAG 文档源" in content + assert "Word 模板与字段映射" in content + assert "责任人映射详情" in content + assert "当前对象:责任人映射" in content + assert "批量导入映射" in content + + +def test_knowledge_base_page_exposes_governance_crud_entry_links(client): + response = client.get(reverse("platform_ui:knowledge-base"), {"view": "template_mappings"}) + + content = response.content.decode("utf-8") + assert response.status_code == 200 + assert "上传模板" in content + assert "编辑占位符映射" in content + assert "预览模板" in content + assert reverse("admin:platform_ui_wordtemplatemapping_changelist") in content