
MiniDocs 知识库
MiniDocs 是一款专为 Halo 开源建站平台打造的轻量化、高性能知识库插件,主打多知识库独立管理、树形文档架构、原生 Markdown 创作、精细化分类标签与权限管控能力。无需复杂部署,即可快速为个人博主、小型团队、工作室搭建专属结构化知识库,完美适配笔记归档、项目文档、教程手册、团队协作资料等各类内容场景,丰富 Halo 平台知识库文档管理相关插件库。
plugin-minidocs 知识库插件以轻量、简约的设计,可满足日常个人知识沉淀、笔记归档及团队项目文档、协作手册搭建需求,并将知识库内容通过公开接口与 Finder 暴露给第三方主题,方便开发用户侧文档站点。
插件同时提供 Console 管理界面、minidocsFinder Finder API 和匿名公共 REST API,适用于传统 Thymeleaf 主题和前端框架渲染的文档页。
目标平台:Halo
>= 2.26.0
控制台演示界面


主题演示界面
功能特性
- 知识库管理:支持多知识库创建、编辑、删除,公开 / 私有切换、成员授权与排序。
- 文档管理:支持文档树层级、Markdown 编辑、slug 别名、发布 / 草稿状态、标签与封面。
- 分类标签:知识库与文档均支持标签,便于按主题归类与检索。
- 权限控制:内置「知识库查看」「知识库管理」角色模板;私有知识库可指定成员(可访问者)列表,服务端按「创建者 / 成员 / 管理员」做资源级访问校验;可开关「允许未登录用户阅读公开知识库」控制匿名访问。
- 文档发布:支持单篇文档发布,发布后内容通过公开接口与 Finder 对外可见。
- 文档导入导出:支持批量导入(同名知识库安全覆盖、失败自动回滚保留原数据),以及将文档导出为 Markdown(受导出开关约束)。
- 外链分享:知识库卡片可一键开启外链分享,生成
/docs/share/{token}对外链接,支持可选访问密码与有效期,分享页与阅读页同布局且无需登录。 - 主题适配:提供
minidocsFinderFinder API 与匿名公共 REST API,便于主题渲染知识库列表、文档树与文档详情。
安装使用
- 下载插件 JAR:
- GitHub Releases:访问本项目 Releases 下载 Assets 中的 JAR 文件。
- Halo 应用市场:在 Halo 后台「应用市场」搜索 MiniDocs 安装。
- 在 Halo Console 的插件管理中上传并安装插件,安装和更新方式可参考:https://docs.halo.run/user-guide/plugins
- 安装完成后,访问 Console 左侧的知识库菜单管理知识库与文档。
- 如需游客直接访问公开知识库,请在插件设置中开启允许未登录用户阅读公开知识库;如需提供文档下载,请确认允许导出文档已开启。
- 主题侧接入方式见下方「主题适配」。
知识库导出与导入
导入知识库仅支持本插件导出的 ZIP 包。插件导出与导入使用固定的包结构:
{知识库名称}/
├── config.json # 知识库元数据配置 + 文档清单(导入依据)
└── docs/
├── {slug}.md # 文档 Markdown 原文
└── ...
其中 config.json 记录了知识库的名称、描述、封面、标签、公开性,以及每个文档的 slug、标题、父子关系、作者与时间信息。导入时会通过每个知识库目录下的 config.json 识别并还原知识库;没有 config.json 的目录会被忽略。
使用与注意事项:
- 本地修订后导回:你可以在本地用任意编辑器修订
docs/*.md的正文内容后重新导回;请务必保留 ZIP 包根目录下的config.json配置文件,不要删除。它还原了文档清单、slug 与父子层级,删除后该知识库将无法被正确识别与还原。 - 跨站迁移:在旧网站用本插件导出知识库为 ZIP,再在新网站用本插件「导入知识库」导入即可完成迁移;同名知识库默认采用「安全覆盖」策略(先建新 → 验证 → 删旧 → 恢复 slug),失败自动回滚、原数据不受影响。
- 导入的文档默认处于草稿状态,可在知识库内一键发布后对外可见。
权限控制与知识库可见性
MiniDocs 的权限模型分为两层,叠加生效:Halo 角色模板决定「谁能在 Console 操作知识库」,资源级访问控制决定「谁能读取某个具体的知识库 / 文档」。同一套可见性规则在 Console 管理端、公共 REST API 与主题 Finder 中保持一致。
角色模板
插件安装时注册以下角色模板(在 Halo 后台「用户与权限 → 角色」中可分配给用户):
| 角色模板 | 展示名 | 权限 |
|---|---|---|
role-template-minidocs-view |
知识库查看 | 知识库与文档的 get、list(读取) |
role-template-minidocs-manage |
知识库管理 | 知识库与文档的 create、patch、update、delete、deletecollection(写操作),自动依赖「知识库查看」 |
role-template-minidocs-anonymous |
(隐藏,自动聚合到匿名角色) | 匿名访问公开 REST API 的 get、list |
「知识库查看」决定用户能否在 Console 看到知识库菜单并读取内容;「知识库管理」决定能否创建 / 编辑 / 删除知识库与文档、发布 / 取消发布、移动文档。
知识库可见性(公开 / 私有)
每个知识库都有 publicVisible 开关:
- 公开知识库(
publicVisible=true):所有人可见,包括未登录访客(具体还受下方「匿名阅读开关」约束)。 - 私有知识库(
publicVisible=false,默认):仅以下三类人可见——- 知识库创建者(
spec.creatorName,创建时自动写入); - 成员列表中的用户(
spec.members,在知识库编辑中维护); - 具备知识库管理权限的用户(见「管理豁免」)。
- 知识库创建者(
其余请求一律拒绝:Console 接口返回 403,公共接口 / Finder 返回空或 404,避免通过「猜 URL / 传入私有知识库标识」越权读取私有内容。
管理豁免
以下两种身份视为知识库管理员,对所有知识库(含私有)拥有完全访问与管理权限:
- 超级管理员:拥有
role_super-前缀角色的用户(Halo 超级管理员实际权限为ROLE_super-role); - 知识库管理者:拥有
plugin:halo-plugin-minidocs:knowledgebase:*前缀权限的用户(即分配了「知识库管理」角色模板)。
判定严格限定在上述两种来源,不会把仅拥有其它模块(附件、文章、评论等)
xxx-manage权限的普通用户当作知识库管理员,防止越权读取全部私有知识库。
匿名阅读开关
插件设置「基础设置 → 允许未登录用户阅读公开知识库」(allowAnonymousRead,默认关闭):
- 开启:未登录访客可浏览公开知识库及其已发布文档;
- 关闭:未登录访客一律被拒(公共 API 返回 403,Finder 返回空),登录用户不受影响。
该开关只影响匿名访问公开知识库;私有知识库的创建者 / 成员 / 管理判定始终生效,不受此开关影响。
各入口的可见性边界
| 入口 | 可见内容 | 说明 |
|---|---|---|
Console 管理端(console.api.minidocs.halo.run) |
当前用户可访问的知识库(公开 + 自己创建 / 是成员的私有 + 管理可见全部) | 所有端点经 requireAccessByName() 统一校验,无权限返回 403;创建 / 更新 / 删除 / 发布 / 导入 / 导出等操作均需先通过校验 |
公共 REST API(api.minidocs.halo.run) |
详情 / 列表 / 文档树 / 文档列表 / 单篇与全局文档读取:未登录仅公开已发布;已登录且有权限时可访问私有库内容(含草稿) | 匿名访问受「匿名阅读开关」约束;对无权限的私有库一律返回 404 |
主题 Finder(minidocsFinder) |
按当前访问者返回:登录用户 = 公开 + 自己创建 / 是成员的私有库;未登录 = 仅公开库 | 与公共 API 一致的可见性边界;文档仅返回已发布 |
| 列表 / 分页 | listAccessible 先做资源级过滤,再排序、分页 |
分页 total 为「过滤后的全量」,避免分页数据失真 |
| 统计面板(stats) | 仅统计当前用户可访问的资源 | 不向普通用户泄露全站私有知识库 / 文档的聚合数量 |
文档级可见性
- 文档有
draft(草稿)与published(发布)两种状态(历史数据中的archived兼容显示为「已归档」)。 - 对外(公共 API 的列表 / 文档树 / 全局读取、Finder、主题阅读页)只暴露
published的文档;草稿不会出现在文档树与阅读页中,仅知识库的创建者 / 成员 / 管理者可在 Console 中查看与编辑。 - 例外:公共 API 的读取端点(详情 / 文档树 / 文档列表 / 单篇与全局文档读取)在已登录且对该库有权限时,可读取私有库的草稿文档(文档标识支持
metadata.name与spec.slug);未登录或无权访问时这些端点仅返回「公开知识库 + 已发布文档」。详见 REST API 文档 的「可见性语义」。
导出控制
插件设置「允许导出文档(Markdown)」(allowDocExport,默认开启):
- 开启:可导出单篇文档为 Markdown,也可批量导出知识库 ZIP;
- 关闭:两者均返回 403;且批量导出只会包含当前用户有权访问的知识库(私有非成员不可导出)。
外链分享
MiniDocs 支持为知识库开启「外链分享」,把知识库内容通过一条对外链接分享给任意访客。分享访问走独立的分享链路,不依赖知识库的公开 / 私有权限:只要持有有效外链,即便是不公开的私有知识库,也无需登录即可查看(此时仅受分享自身的「开启状态、有效期、访问密码」约束)。
开启与管理
- 进入 Console 的知识库列表,点击某张知识库卡片右下角的分享图标(绿色,网络节点样式;已开启分享时图标高亮并带绿色小圆点)。
- 在弹出的「分享知识库」弹窗中配置:
- 开启外链分享:总开关;
- 访问密码:留空表示无密码访问,任何持有外链的人均可直接进入;填写后需输入密码才能查看;
- 外链有效期:永久 / 7 天 / 30 天 / 90 天,到期后外链自动失效;
- 复制外链:保存后复制生成的
https://你的域名/docs/share/{token}链接分发给访客。
- 每次保存后弹窗保持打开,可直接复制更新后的外链;再次点击某知识库的分享图标即可重新查看、修改或关闭它的外链。
分享机制
- 每个知识库对应一条固定外链(
shareToken在开启时生成)。外链不设访问次数与人数上限,只要未关闭、未过期即持续有效。 - 关闭再开启时外链保持不变(token 不重新生成),因此链接地址不会变化;只有设置新有效期才会改变到期时间。
- 访问密码校验通过后,服务端下发 HttpOnly Cookie 保持该浏览器的访问状态,有效期内无需重复输入。
主题适配
此插件为主题端提供了:
- Finder API
minidocsFinder:支持listKnowledgeBases(page, size)、getKnowledgeBase(kbSlug)、listDocs(kbSlug, page, size)、getDoc(kbSlug, docSlug)、getDocTree(kbSlug)和getDocBySlug(docSlug),用于在 Thymeleaf / FreeMarker 模板中渲染知识库与文档。 - 公共 REST API:提供匿名知识库 / 文档查询接口(含文档树、按 slug 获取),可用于前端框架、小程序或服务端集成。
- 数据可见性:公开 API 的详情 / 列表 / 文档树 / 文档列表 / 单篇与全局文档读取——未登录仅返回
publicVisible=true的知识库及其phase=published文档;已登录且有权限时可额外访问私有库内容(含草稿,文档标识兼容metadata.name与spec.slug)。Finder 则按当前访问者返回其可访问内容——未登录仅公开库,登录用户额外包含自己创建 / 是成员的私有库;Finder 中所有文档仅phase=published。匿名访问受插件「允许未登录用户阅读」设置约束。
详细文档请参考:
- 主题 API 文档 — 路由、Finder API、Markdown 渲染与类型定义。
- REST API 文档 — 公共 API、Console API 和标准 CRUD 端点。
开发文档
本地开发、构建与调试说明请参考 开发文档。
环境要求:JDK 21、pnpm、Docker(DevTools 运行 Halo 服务)。
./gradlew haloServer # 启动 Halo 开发服务(http://localhost:8090/console,admin/admin)
./gradlew reload # 代码变更后热重载插件
./gradlew watch # 监听变更自动重载
./gradlew build # 构建插件 JAR(含 UI 产物)




