知识库
本页是一篇完整方案指南:以 doc-knowledge 插件(com.auraboot.doc-knowledge,命名空间 dk)为例,从用户场景一路讲到它如何成为 Aura Bot 的知识来源、开发实施与典型错误。它是 config 型插件——5 个 model、18 条命令、15 个页面 + 1 个看板全部是 DSL JSON 声明,没有一行后端 Java。下面每个标识符你都能在插件目录 plugins/doc-knowledge/config/ 里 grep 到、对运行实例调得通。
这个插件依赖
com.auraboot.template.project-management(项目管理模板)——文档可以关联到项目,所以导入前要先有项目管理插件。
1. 用户场景
一家制造企业要把分散在网盘和邮件里的图纸、规范、报告、会议纪要、合同统一管起来,同时沉淀一套可检索的知识文章。日常:
- 工程师新建文档(草稿)→ 填标题、类型、所属项目、访问级别、正文 → 发布后全员可见;
- 文档需要改动时修订退回草稿,改完再发布;过期的文档归档,从活跃列表移走但保留可查;
- 每次重要改动留一条版本记录,带变更说明和内容快照,后面能对照看历史;
- 文档按分类树归置(产品文档 / 政策制度 / 培训资料 / 故障排查);
- 文档按访问级别(公开 / 内部 / 机密 / 受限)控制可见范围;
- 文档可以关联到项目,从项目视角追溯相关的规范、设计稿、合规证书;
- 另有一套知识文章,比文档更短、更聚焦主题,同样有草稿 → 发布 → 归档的编辑生命周期。
文档管理员、文档编辑、文档查看者看到的内容和能做的操作各不相同。
2. 需求痛点
- 没有生命周期:网盘里的文件没有「草稿 / 已发布 / 已归档」状态,谁都不知道哪份是定稿、哪份还在改。
- 版本断链:覆盖式上传把旧版本冲掉,想回溯「上一版改了什么、谁改的」查不到。
- 操作无授权无审计:谁发布了、谁归档了、什么时候,没有记录;发布只能靠口头通知。
- 访问控制靠人盯:机密图纸混在公开目录里,靠命名约定防泄露,不可靠。
- 与项目脱节:项目相关的文档散落各处,无法从项目一键看到它的全部规范和合规材料。
这些都不是「再建一个文件夹」能解决的,而是受控状态变更 + 结构化关联的问题。
3. 产品方案
在 AuraBoot 里,每一个文档动作都是一条命令,走统一的 命令管道:
- 「发布」按钮调用
dk:publish_document,而不是裸写PUT /api/dk_document;命令在管道里统一鉴权 → 状态机校验 → 执行 → 审计 → 发事件。 - 文档生命周期由状态字段
dk_doc_status+ 三条state_transition命令(dk:publish_document/dk:archive_document/dk:revise_document)守护,非法跳转(比如对一份草稿直接归档)会被状态机拒绝。 - 版本历史是一个真实模型
dk_doc_version,通过parentModel: dk_document挂在文档下,在文档详情页以子表形式出现——它继承列表、详情、搜索、导出、审计,和其他业务实体共享同一套机制,不用另建「版本管理控制台」。 - 同一条命令既是 UI 按钮的目标,也能被自动化规则、BPM 审核流调用——比如「自动归档 18 个月未触达的文档」直接发
dk:archive_document,不需要人工二次操作。
4. 功能设计
4.1 数据模型(5 个)
| Model | 类型 | 用途 | 关键状态值 |
|---|---|---|---|
dk_document | entity | 文档主实体,承载正文、摘要、标签、类型、版本号、所属分类/项目、访问级别 | dk_doc_status:draft / published / archived |
dk_doc_category | master | 文档分类树(自引用父级 dk_cat_parent_id),用于逻辑归置 | 无状态机 |
dk_doc_version | entity | 文档版本记录,parentModel: dk_document、parentField: dk_ver_document_id,带变更说明和内容快照 | 跟随父文档 |
dk_knowledge_article | entity | 知识文章,比文档更短更聚焦的编辑型内容 | dk_article_status:draft / published / archived |
dk_project_document | reference | 文档与项目的多对多关联桥表 | 无状态机 |
文档关键字段(config/fields.json):dk_doc_title(标题)、dk_doc_type(类型 enum)、dk_doc_project_id / dk_doc_category_id(reference)、dk_doc_abstract / dk_doc_content(text 正文)、dk_doc_access_level(访问级别 enum)、dk_doc_author / dk_doc_owner_id(创建时由 current_username 自动填)。
4.2 命令与状态机
18 条命令,命名 dk:<动词>_<名词>(冒号分隔,不是点号)。按类型分:
| 类型 | 命令 |
|---|---|
create(5) | dk:create_document · dk:create_category · dk:create_version · dk:create_article · dk:link_document |
update(3) | dk:update_document · dk:update_category · dk:update_article |
delete(5) | dk:delete_document · dk:delete_category · dk:delete_version · dk:delete_article · dk:unlink_document |
state_transition(5) | dk:publish_document · dk:archive_document · dk:revise_document · dk:publish_article · dk:archive_article |
文档的状态机:dk:publish_document(draft → published)→ dk:revise_document(published → draft,退回再编辑)→ dk:archive_document(published → archived)。知识文章同构。
每条命令都是一段声明。例如 dk:publish_document(config/commands.json)的真实定义:
{
"code": "dk:publish_document",
"displayName:zh-CN": "发布文档",
"displayName:en": "Publish Document",
"description": "Publish a draft document",
"type": "state_transition",
"modelCode": "dk_document",
"stateField": "dk_doc_status",
"fromStates": ["draft"],
"toState": "published",
"permissions": ["dk.document.publish"],
"extension": {
"confirmMessage:zh-CN": "确认发布此文档?",
"confirmMessage:en": "Confirm publish this document?"
}
}读出来的设计信息:这是一条 state_transition,只能从 draft 走到 published(fromStates 不含别的状态,对已发布或已归档文档点发布会被拒);要求 dk.document.publish 权限(注意:这条权限和 dk.document.manage 是分开的——能编辑不等于能发布);点击时弹确认框。create 型命令(如 dk:create_document)则带 inputFields 列出可填字段、autoSetFields 声明 dk_doc_no 用 DOC-{yyyyMMdd}-{seq} 自动生成、dk_doc_status 固定为 draft、作者取 current_username。
4.3 权限与角色
9 个权限码,命名 dk.<资源>.<动作>(点号分隔,注意权限码用点号、命令码用冒号,二者不同):
dk.document.manage dk.document.read dk.document.publish
dk.category.manage dk.version.manage
dk.article.manage dk.article.read dk.article.publish
dk.link.manage
manage 覆盖增改删归档,publish 单独拆出来(发布是更高权限),read 是数据型权限(resourceType: data),用于列表/详情的数据可见性。
3 个角色(config/roles.json):
dk_manager(文档管理员)—— 全部 9 个权限,含发布;dk_editor(文档编辑)—— 能增改、管版本和关联,但没有dk.document.publish/dk.article.publish;dk_viewer(文档查看者)—— 只有dk.document.read+dk.article.read。
4.4 页面
15 个 DSL 页面(config/pages.json):每个 model 的 list / form,以及 dk_document / dk_knowledge_article / dk_doc_category / dk_doc_version / dk_project_document 的 detail。另有 1 个看板(config/dashboards/dk_dashboard.json),由 6 条命名查询(dk_dashboard_kpi / dk_docs_by_type / dk_docs_by_status / dk_articles_by_status / dk_recent_documents / dk_recent_articles)喂数据。菜单(config/menus.json)挂在 /doc-knowledge 下:看板、文档、分类、版本、文章、项目文档。
4.5 作为 Aura Bot 的知识来源
这个插件本身是纯文档/知识库 CRUD,没有内建向量检索或 RAG 管道——它不声明 embedding 模型、答案溯源模型,也没有自带的检索打分逻辑。它在 AI 体系里的位置是:已发布的文档与知识文章,就是 Aura Bot 可以回答的知识来源。
衔接是平台 Agent System 默认就有的能力,而不是这个插件额外写的代码:
- 读工具自动生成:DSL Tool Provider 会为每个模型自动挂上
list:<modelCode>与get:<modelCode>读工具,命名查询则成为nq:<queryCode>。把list:dk_knowledge_article/get:dk_document/nq:dk_recent_documents放进某个 Agent 的tools白名单,它就能在回合里查文档库回答用户问题。 - 权限即检索边界:Agent 以调用用户的身份运行(见 Aura Bot §权限)。用户没有
dk.document.read的文档,Agent 同样看不到;dk_doc_access_level(public / internal / confidential / restricted)配合 ABAC 策略进一步收窄可见范围。换句话说,Bot 永远不会读到调用者本人读不到的内容。 - 写命令按需暴露给 Agent:这套命令默认不带
agent_hint/cmd_risk_level,也就是默认不开放给 Agent 自动执行。要让 Agent 能起草文章或发起归档,在对应命令上补agent_hint(说明何时用)和cmd_risk_level(发布/归档这类用 L2+ 走 Approval Gate),让人工先确认——契约见 Agent Builder。
所以:文档与知识沉淀在这里,检索、权限、审计、暴露策略都复用平台同一套机制;它不是再造一个「AI 知识库控制台」,而是让 AI 顺着既有的模型、命令、权限说话。
5. 具体开发与实施
先掌握基础。本插件没有任何后端 Java,全靠平台的几个核心契约。动手前请先读:Model 与 Field · Command · 命令管道 · Permission · 插件清单 · 纯配置 Plugin · Page Designer。
落地一个像 doc-knowledge 这样的 config 插件,步骤是:
- 写清单 ——
plugin.json声明pluginId/namespace(dk)/pluginType: config/dependencies(本插件依赖项目管理模板),并在resourceDirs里把每个配置文件登记进去(models/commands/permissions/modelFieldBindings…)。详见 插件清单。 - 定义 model 与字段 ——
config/models.json(5 个 model,版本模型用parentModel+parentField声明父子关系)+config/fields.json,字段类型用平台dataType(string/enum/reference/text…)。详见 Model 与 Field。 - 声明命令 ——
config/commands.json,状态流转用type: state_transition+fromStates/toState,增删改用create/update/delete,并在permissions绑权限码。详见 Command。 - 配 model-field binding ——
config/bindings.json,并在resourceDirs.modelFieldBindings注册(见「典型错误」)。 - 权限、角色、字典、菜单、页面 ——
config/permissions.json/roles.json/dicts.json/menus.json/pages.json/dashboards/。 - 打包导入 —— 用
auraCLI 的import-directory-sync(参数是目录 path)或平台导入接口;校验返回success:true才算导入成功。导入前确保依赖的project-management已先导入。
6. 常见配置
- 文档生命周期:状态字段
dk_doc_status(字典dk_doc_status:draft / published / archived),三条state_transition命令守护;要支持「下架重编」就配dk:revise_document(published → draft)。 - 访问级别:字段
dk_doc_access_level选字典dk_access_level的public/internal/confidential/restricted,配合 ABAC 策略控制文档可见范围。 - 分类树:
dk_doc_category用dk_cat_parent_id自引用构成多级分类;文档通过dk_doc_category_id(reference)挂分类。 - 版本快照:每次重要改动调
dk:create_version写一条dk_doc_version,带dk_ver_change_summary(变更说明)和dk_ver_content_snapshot(内容快照);版本以子表出现在文档详情页。 - 项目关联:
dk:link_document写dk_project_document桥表,把文档挂到项目;dk:unlink_document解除。 - 自动归档:配自动化规则,对长期未触达的已发布文档发
dk:archive_document,无需人工。
7. 典型错误
- 命令码用点号:写成
dk.document.publish跑不通——命令码是冒号 + 动词_名词:dk:publish_document。而权限码才用点号:dk.document.publish。同名不同分隔符,别混。 - 绕过命令直接改文档表:直接 UPDATE
dk_document的状态会跳过状态机校验、handler 和审计/事件投递。一切文档变更都走命令。 - 对已归档文档点发布:
dk:publish_document的fromStates只含draft,对 published / archived 文档调用会被状态机拒绝——这是设计,不是 bug。 - 编辑权限当成发布权限:
dk.document.manage不含dk.document.publish(dk_editor角色就没有发布权);要让某角色能发布,得单独授dk.document.publish。 - 导入时缺依赖:本插件
dependencies声明依赖com.auraboot.template.project-management,先导入它再导本插件,否则dk_doc_project_id/dk_project_document的 project 引用解析不了。 - bindingRules 写进 commands.json 内联:不会被导入;必须独立
bindings.json并在resourceDirs.modelFieldBindings注册,否则报[S-EXT-HANDLER] references unregistered handler。详见 纯配置 Plugin。 - 命令执行 payload 结构:字段放在
{ "payload": { ... }, "operationType": ... },目标记录用targetRecordId(不是recordId)——放错位会出现「执行成功却字段为空」的迷惑性报错。