feat: 增强知识库治理台前台入口与维护导航

This commit is contained in:
2026-06-04 02:33:17 +08:00
parent 0250bd360a
commit e9b3f13eec
4 changed files with 163 additions and 2 deletions

View File

@@ -1,3 +1,5 @@
from django.urls import reverse
from agent_core.governance import load_governance_config from agent_core.governance import load_governance_config
@@ -404,3 +406,92 @@ def get_platform_demo_context():
"owners": owners, "owners": owners,
"operation_logs": operation_logs, "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"),
},
]

View File

@@ -1,10 +1,10 @@
from django.shortcuts import render 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): 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) return render(request, "platform_ui/knowledge_base.html", context)

View File

@@ -18,6 +18,51 @@
{% endfor %} {% endfor %}
</section> </section>
<section class="workspace-grid" style="grid-template-columns: 280px minmax(0, 1fr);">
<article class="panel">
<h2 class="section-title">治理对象导航</h2>
<p class="section-copy">按治理对象切换当前列表和维护入口保持法规、RAG、字段、模板和通知口径统一。</p>
<ul class="detail-list">
{% for item in governance_objects %}
<li class="detail-item">
<strong>
<a href="?view={{ item.key }}">{{ item.title }}</a>
</strong>
<div class="muted">{{ item.summary }}</div>
{% if active_governance_object.key == item.key %}
<div class="badge-row" style="margin-top: 8px;">
<span class="pill pill-accent">当前对象:{{ item.title }}</span>
</div>
{% endif %}
</li>
{% endfor %}
</ul>
</article>
<article class="panel">
<div class="section-heading">
<div>
<h2 class="section-title">{{ active_governance_object.detail_title }}</h2>
<p class="section-copy">{{ active_governance_object.detail_copy }}</p>
</div>
<div class="button-row">
<a class="button" href="{{ active_governance_object.admin_url }}">进入后台维护</a>
</div>
</div>
<div class="badge-row" style="margin-bottom: 14px;">
<span class="pill pill-accent">当前对象:{{ active_governance_object.title }}</span>
</div>
<div class="grid-3">
{% for action in active_governance_object.actions %}
<article class="panel" style="padding: 14px;">
<h3 class="section-title" style="font-size: 0.98rem;">{{ action }}</h3>
<p class="section-copy">该操作在 V1 通过后台维护与治理台入口统一承接。</p>
</article>
{% endfor %}
</div>
</article>
</section>
<section class="grid-3"> <section class="grid-3">
{% for section in governance_sections %} {% for section in governance_sections %}
<article class="panel"> <article class="panel">

View File

@@ -146,3 +146,28 @@ def test_governance_models_are_registered_in_admin():
assert OwnerMapping in admin.site._registry assert OwnerMapping in admin.site._registry
assert FeishuNotifyConfig in admin.site._registry assert FeishuNotifyConfig in admin.site._registry
assert WordTemplateMapping 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