BBS 社区(plugin-bbs)
Halo 2.x 插件:讨论 + 问答 + 公告 + 两级分类,适合博客站旁的隔离社区。
在线演示:https://blog.timxs.com/bbs(星港社区)

功能特性
- 帖子类型:讨论(POST)、问答(QUESTION)、公告(ANNOUNCEMENT,仅管理端可发)。三类帖必须归属分类,与置顶正交
- 问答:作者与版主可标记「已解决」;改出问答类型时服务端清掉已解决残留
- 锁定:版主操作——禁评论、禁作者编辑 / 删除。锁定帖不渲染评论组件,历史评论走只读接口(只看不赞)
- 置顶:独立开关 + 权重。分类页第 1 页浮顶(只在本分类页浮顶,不向父分类传染);所属一级分类开启「置顶帖上首页」时同时出现在首页第 1 页顶部。徽标看
pinnedInView(本视图是否真浮顶),不是pinned - 分类:两级。Iconify 图标(保存时存下选择器输出的离线 SVG,选色已烤进
fill,未选色随文字色)+ 独立分类色(新建按名称预填实色;清空不上色)+ slug + 封面。板块级配置(pinToHome、moderatorRoles)仅一级可设,调和器抹掉子分类上的值 - 分区版主:一级分类可指定角色;持有该角色者管辖本分类树。全站版主(直接绑定
bbs-moderate/bbs-manage/ 超管)不受限。管辖判定不展开角色依赖链 - 状态:草稿 / 待审核 / 已发布 / 已驳回;软删除进回收站,彻底删除仅管理角色
- 审核(可选):用户发帖须审核;可配置「编辑已发布是否重新审核」。驳回后重提永远重审。审核中保存只更新内容、不改审核状态(WordPress 式);作者可显式「取消提交」退回草稿;已驳回的帖子既可由作者修改重提,也可由版主直接通过。无需重审时对齐官方文章:标题 / 分类等设置保存即生效,正文仍需显式发布。提交审核可附可选补充说明,审核人在「审核记录」查看(与驳回原因对称)
- 评论:接入 Halo 官方评论体系。详情页由「评论组件」插件渲染;锁定帖改只读渲染
- 全文搜索:接入 Halo 搜索,已发布帖子可被站点全局搜索
- RSS:经 plugin-feed 输出全站
/feed/bbs/posts.xml与一级分类/feed/bbs/categories/{slug}.xml(未安装则无 RSS,其余照常) - 前台:Flarum 两栏——白顶栏 + 品牌色 Hero、左栏分类树、紧凑列表。圆标(公告 / 置顶 / 未解决问答)+ 线框(已解决 / 锁)。默认按最后活跃排序
- 作者入口:无独立
/bbs/u作者页。作者名按「作者链接模板」跳转(默认/authors/{name});可选接入 interaction-plus(装扮 + 用户卡链接优先) - 面向主题:Finder(
${bbs})+ 公开 REST API;主题可覆盖bbs.html/bbs_post.html - 安全:正文 HTML 服务端白名单净化;SVG 图标零 URL / 零事件属性;锁帖写入在安全链前拦截
环境要求
- Halo
>= 2.25.0 - 构建:JDK 21、Node 18+、pnpm
- 可选:
interaction-plus>= 1.0.0(装扮与用户卡链接;未安装时 BBS 照常运行) - 可选:
PluginFeed>= 1.4.0(RSS;未安装时无订阅源,其余照常)
快速上手
从安装到可用的五步;各项的详细行为见 使用说明。
1. 安装插件
在应用市场搜索「BBS 社区」安装;或从 GitHub Releases 下载 jar,在 Console「插件」页上传安装(自行构建见 构建)。
2. 创建分类(必须先行)
帖子必须归属分类——一个分类都没建时,用户发不了帖。 由「BBS 社区 → 帖子列表」页的「分类」进入分类管理:
- 两级树,可拖拽排序;封面、Iconify 图标、分类色、slug 均可后续完善
- 板块级配置(「置顶帖上首页」与「版主角色」)仅一级分类可设
3. 分配角色
- 普通用户无需配置:发帖权(
bbs-uc-post)已聚合给所有登录用户,前台浏览自动公开 - 版主:手动分配「BBS 社区版主」(
bbs-moderate) - 全功能:分配「BBS 社区管理」(
bbs-manage);超管天然拥有 - 分区版主:自建一个角色(依赖建议勾上
bbs-moderate,已连带后台查看),授予目标用户,再把它写进一级分类的「版主角色」——持有者即管辖该分类树 - ⚠️ 别把「后台查看」(
bbs-view)授给普通用户,否则对方能进管理后台看到草稿 / 待审核 / 回收站
各角色能力见下方 权限模型。
4. 安装评论组件与可选插件
| 插件 | 定位 | 不装的后果 |
|---|---|---|
| 评论组件(plugin-comment-widget) | 评论区必需 | 详情页评论区为空(不影响页面其余部分) |
interaction-plus >= 1.0.0 |
可选 | 无装扮与用户卡链接,其余照常 |
PluginFeed >= 1.4.0 |
可选 | 无 RSS 订阅源,其余照常 |
评论的登录 / 审核策略由「系统设置 → 评论」统一控制,评论管理复用 Halo 后台「评论」页。
5. 外观与审核设置
插件设置:
- 外观 → 品牌:社区标题、Logo、顶栏菜单、主题色;Hero 区与页脚声明也可在此开关
- 内容 → 审核:是否「用户发帖需审核」(默认提交即发布);开启后再定「编辑已发布是否重新审核」
完成后访问前台 /bbs 验证。
使用说明
Console(后台)
「BBS 社区」菜单(内容分组):
- 帖子列表:按状态 / 类型 / 分类 / 作者 / 关键词筛选;行内编辑、设置、置顶、锁定、回收,以及发布 / 通过 / 驳回 / 取消提交(纯草稿走「发布」,进过审核的走「通过」;已驳回帖可由作者修改重提,也可版主直接通过;待审核帖可撤回提交;设置弹窗可保存并直接「发布 / 通过」)。分区版主只看见自己管辖的分类
- 写帖子 / 公告:全屏富文本编辑器;设置里选类型、分类(必选)、置顶与权重、别名、摘要。预览先静默保存再弹窗(桌面 / 平板 / 手机三档视口切换),读工作副本(含未提交修改),未发布也能预览(对齐官方;仅作者本人可见)
- 分类管理:由帖子列表页「分类」进入。两级树、拖拽排序、封面、板块版主角色
用户中心(UC)
「我的帖子」:登录用户发讨论 / 问答、编辑、删除自己的帖子(发帖必须登录)。用户不能发公告、不能置顶、不能锁定。编辑器首次手动保存、自动保存或 Ctrl/Cmd+S 会创建服务端草稿与 Halo 核心 Snapshot;编辑已发布帖子时,静默保存写入独立 headSnapshot,前台仍读取 releaseSnapshot。只有显式提交才进入审核或发布;已发布修改需审核时,旧发布版本在审核期间继续公开。提交入口三处:编辑器顶部、列表行菜单与设置弹窗(草稿 / 已驳回直接「提交」;已发布帖有未提交修改时「提交修改」;缺分类先弹设置补齐后可就地提交)。待审核期间保存只更新内容、不退出审核队列;想撤回须显式「取消提交」(列表行菜单),退回草稿后可继续编辑重提。编辑器「历史」可查看完整版本、并排对照、恢复、删除及对应审核时间线;「预览」先静默保存再弹窗(三档视口切换),读工作副本,未发布也能看。默认提交即发布;开启「用户发帖需审核」后进入待审核。锁定帖作者不可再编辑或删除。
前台
| 路径 | 说明 |
|---|---|
/bbs |
列表。查询参数:category(分类 slug)、q(标题关键词)、page、sort(active | latest | hot,默认 active)、type(post | question | announcement) |
/bbs/post/{slug} |
详情:楼主流 + 评论区 + 相关推荐;桌面右栏目录(正文 h2/h3 ≥ 3) |
/feed/bbs/posts.xml |
全站 RSS 2.0(需 plugin-feed) |
/feed/bbs/categories/{slug}.xml |
一级分类树 RSS(需 plugin-feed) |
分页:桌面显示页码窗口(首页 / 末页 + 当前页 ±2,空档省略号);窄屏为 n / 总页数 计数,点一下展开同款页码窗口下拉跳页。页码链接完整携带分类 / 搜索 / 排序 / 类型参数。
顶栏可选挂站点菜单:插件设置「外观 → 品牌 → 顶栏菜单」选已有菜单组,留空则顶栏不显示导航。多级菜单一律点击展开(不做悬停展开):桌面点箭头出下拉(子项缩进平铺),窄屏进汉堡、点箭头逐层展开;带链接的父项文字跳转、箭头开合,不带链接的父项整项即开关。兼容 Halo 2.25(menuItems + children)与 2.26(menuName + parent)两种菜单存法及两者混存。
作者名链接(无独立 BBS 作者页):
- 插件设置「作者链接模板」(默认
/authors/{name},{name}= 用户名;留空 = 作者名不跳转) - 若开启「接入互动增强」,且 interaction-plus 的「用户卡跳转链接」非空 → 优先用对方的模板
- 互动增强未安装 / 未就绪 / 模板为空 → 静默回退 BBS 模板,不报错
主题作者页若要展示该用户的 BBS 帖子,使用 Finder:listPostsByOwner / getAuthor(见 主题开发指南)。
评论
- 前台需安装官方 评论组件(plugin-comment-widget);未安装时评论区为空、不影响页面
- 登录 / 审核策略由「系统设置 → 评论」统一控制
- 评论管理复用 Halo 后台「评论」页
- 锁定帖:模板不渲染
<halo:comment>,历史评论由前台走GET /posts/{name}/comments只读渲染。写入被服务端拦截
互动增强(可选)
插件设置 → 集成:
| 项 | 说明 |
|---|---|
| 接入互动增强 | 需已安装并启用 interaction-plus。开启后:① 前台装扮(头像框 / 称号 / 勋章 / 悬浮名片);② 作者名链接优先用其「用户卡跳转链接」。关闭则不加载装扮,作者名仅用下方模板 |
| 列表页用户装扮 | 需已开启上方开关。在 /bbs 列表显示头像框、昵称样式与身份标识;关闭则列表纯净显示且不加载装扮脚本,详情页与评论区装扮不受影响。默认关闭 |
| 作者链接模板 | 兜底跳转,默认 /authors/{name};留空表示作者名不可点 |
列表页昵称不渲染完整身份行(密度),仅昵称样式 + 最高优先级身份标识;详情楼主仍可用完整身份行。发帖数可通过扩展点贡献到 interaction-plus 名片统计(插件在 classpath 时自动注册)。
插件设置
| 分组 | 内容 |
|---|---|
| 外观 | 品牌(标题 / Logo / 顶栏菜单 / 副标题 / 标题分隔符 / 主题色)、Hero(显示开关 / 纯色 / Banner)、页脚声明 |
| 浏览 | 每页条数、列表摘要、时间格式(默认相对)、相关推荐、目录、RSS 条目数 |
| 内容 | 标题最大长度、用户发帖需审核、编辑已发布是否重新审核 |
| 集成 | 接入互动增强、列表页用户装扮、作者链接模板 |
审核通过 / 驳回走 Halo 官方通知中心:作者在 UC 通知列表收到站内消息(可按偏好开邮件)。作者审核自己的帖子不发。事件类型「我的帖子通过审核 / 未通过审核」会出现在用户通知偏好里。
页脚:声明文案(可清空隐藏)+ © {年} {站点名}(站点名来自 Halo 系统设置,链到博客首页)+ Powered by bbs(GitHub)。
权限模型(角色模板)
| 角色模板 | 说明 | 默认授予 |
|---|---|---|
BBS 社区后台查看 (bbs-view) |
Console 只读(列表已按管辖过滤)。不是前台浏览权 | 需手动分配 |
BBS 社区版主 (bbs-moderate) |
帖子审核(通过 / 驳回 / 撤回提交)/ 锁定 / 置顶 / 已解决 / 回收;不含彻底删除、分类管理、插件设置 | 需手动分配;也可只作分区版主角色的依赖 |
BBS 社区管理 (bbs-manage) |
版主能力 + 分类 + 彻底删除 + 全部管理接口 | 需手动分配(超管天然拥有) |
BBS 社区发帖 (bbs-uc-post) |
用户中心管理自己的帖子 | 聚合到所有登录用户 |
公开读 (bbs-public-read) |
前台读取已发布内容与只读评论 | 聚合到匿名 + 登录用户(隐藏) |
前台浏览由 bbs-public-read 自动聚合,不必把 bbs-view 授给普通用户——否则对方能进管理后台看到草稿 / 待审核 / 回收站。
如不希望所有注册用户都能发帖,删除 roleTemplate.yaml 中 bbs-uc-post 的
rbac.authorization.halo.run/aggregate-to-authenticated 标签后重新构建,再手动分配该角色。
面向主题开发者
主题可覆盖 bbs.html / bbs_post.html,经 Finder(${bbs})与匿名公开 REST API 聚合社区数据;约定「忽略未知字段、接口只增不改」。模板覆盖、Finder 方法全表、REST 端点与数据模型见 主题开发指南。
构建
./gradlew build
产物在 build/libs/plugin-bbs-*.jar,在 Console「插件」页上传安装即可。
前端单独调试:
cd ui
pnpm install
pnpm dev # watch 构建
pnpm type-check # vue-tsc 类型检查
发布自动发帖(可选)
面向在 GitHub 上托管本项目、以 GitHub Releases 发版的维护者;不在此场景可忽略本节。
仓库自带工作流 .github/workflows/bbs-post.yaml:发布 release 时,自动把发布说明发到你自己的 BBS 社区(调 Console API 建帖,正文由 release notes 转 HTML),版本公告不用再手工发一遍。未配置时它不会做任何事;确定不需要可直接删除该文件,不影响插件本身。
配置
仓库 Settings → Secrets and variables → Actions:
| 配置项 | 类型 | 说明 |
|---|---|---|
BBS_POST_PAT |
Secret | 本插件所在站点的个人访问令牌,持牌账号需有「BBS 社区版主」(bbs-moderate)及以上角色。与官方 CD 上传应用市场用的 halo-pat(halo.run 官方站凭据)是两回事,勿混用 |
HALO_BASE_URL |
Variable | 站点地址(如 https://example.com),须可被 GitHub 公网访问 |
BBS_CATEGORY_NAME |
Variable | 目标分类的 metadata.name(形如 category-xxxxxxxx) |
BBS_PROJECT_NAME |
Variable(可选) | 标题前缀,按原样拼接(格式自己写,如 [BBS 社区]、`BBS 社区 |
metadata.name 是分类的资源主键,既不是中文名也不是 slug——中文名是 displayName,前台链接别名是 slug。分类查询接口匿名可读,浏览器直接打开即可:
https://你的站点/apis/api.bbs.timxs.com/v1alpha1/categories
返回为 JSON 数组(无 items 包裹),仅含启用中的分类,priority 升序;其中 name 即分类的 metadata.name,displayName / slug 为其中文名与链接别名。
发帖行为:
- 状态:正式 release → 直接发布;预发布(prerelease)→ 存草稿;手动运行(Actions → 同步 BBS 公告 → Run workflow)可覆盖
- 不重复发帖:帖子别名固定为
release-<tag>(如v1.2.3→release-v123)。删了 release 重发、手动重跑都只更新已有帖;回收站内的帖视为不存在,会新建 - 内容:标题默认
<tag> 发布说明(tag来自 git tag,不是 GitHub Release 标题);配了BBS_PROJECT_NAME则按原样作为前缀拼成{前缀} {tag} 发布说明。正文前后自动拼 release 页面链接与附件下载列表(会等待 CD 上传完 jar,超时则降级为不带下载链接)
鸣谢
- 感谢 Jevon 提供的 token 支持
交流反馈

License
GPL-3.0














