## 前言 最近在折腾自己论坛([bbs.eeclub.top](https://bbs.eeclub.top/))的时候,需要一个"回帖可见"的功能:会员必须回复主题后才能看到帖子里隐藏的资源链接、下载地址等内容,一方面可以刺激论坛活跃度,另一方面也能防止内容被白嫖。 Discourse 本身只有一个 `[hide]` 标签(对匿名用户隐藏),完全满足不了"回帖解锁"的需求。网上找了一圈没有现成的插件,干脆自己写了一个,取名为 **discourse-reply-to-view**。整个项目由 AI(GLM)辅助开发,我负责提需求、测试和验收,前后端加测试一共两千多行代码,开发体验相当丝滑。 各家AI大模型API平台推荐与简介:[https://blog.zeruns.com/archives/947.html](https://blog.zeruns.com/archives/947.html) ## 插件介绍 discourse-reply-to-view 是一个 Discourse 内容保护插件,提供三种 BBCode 标记: | 标记 | 作用 | | --- | --- | | `[reply-visible]内容[/reply-visible]` | 回帖可见:在本主题回复后才能看到 | | `[login-visible]内容[/login-visible]` | 登录可见:注册/登录后就能看到 | | `[reply-visible=N]内容[/reply-visible]` | 回复计数:在本主题发至少 N 条回复后可见(可选开关) | 标记里面可以正常嵌套 Markdown,代码块、图片、链接、列表都不受影响;两种标记写在一行里(`[reply-visible]xxx[/reply-visible]`)也是支持的。 ## 插件效果图 编辑器页面插件效果图:  文章页效果图,支持多国语言:  ## 主要特性 - **服务端权限判定**:隐藏内容的可见性判定 100% 在服务端完成,数据库里的 cooked 字段不保存任何隐藏原文,搜索索引、通知邮件、每日摘要、Onebox 预览、话题列表摘要、RSS、raw 导出接口全部做了防泄露处理,不是前端 CSS 假隐藏 - **三种解锁模式**:`any_reply`(回复任意一次全解锁,默认)、`exact_post`(必须回复内容所在楼层)、计数模式 `[reply-visible=N]` - **信任等级豁免**:可以设置 TL 几以上的用户免回复直接看(默认关闭) - **使用权限控制**:可以限制只有某个信任等级以上的用户才能使用隐藏标记 - **编辑器集成**:编辑器「+」菜单里有两个插入按钮,桌面端和移动端都有,点一下自动包裹选中的文字 - **作者所见即所得**:作者自己看自己的帖子,隐藏内容会带虚线边框和提示条,方便确认标记位置 - **回复后自动解锁**:用户回复成功后,页面自动局部刷新,不用手动刷新整个页面 - **防错位注入**:每个隐藏块带指纹校验,cook 和序列化两个阶段对不上就整帖降级为占位符,宁可隐藏也不会错位注入 - **全语言支持**:内置 Discourse 支持的全部 49 种语言,前台文案和后台设置都翻译好了(简体中文、英文、日文、韩文等) - **多语言内容防泄露**:开启了内容本地化(自动翻译帖子)的站点也做了处理,防止翻译版本绕过权限把隐藏内容泄露出去 ## 使用方法 在编辑器里通过「+」菜单插入,或者直接手写 BBCode: ```text [reply-visible] 这里写回帖后才能看到的内容,比如下载链接 [/reply-visible] [login-visible] 这里写登录后就能看到的内容 [/login-visible] [reply-visible=5] 发满 5 条回复才能看到的内容(需要在后台开启计数语法) [/reply-visible] ``` 前台效果:未满足条件的用户会看到一个占位框(回帖可见是蓝色主题、登录可见是绿色主题),点按钮直接跳回复框或登录页,满足条件后自动显示完整内容。 ## 安全设计 这个插件我最看重的就是安全性,毕竟"假隐藏"(前端藏起来但数据都在)形同虚设。它的安全架构是这么设计的: 1. **存储层零原文**:Markdown 渲染阶段就把标记内的原文丢弃,数据库里只存一个带指纹的占位容器 ``; 2. **序列化期注入**:原文只在接口序列化时按当前用户权限动态注入,没解锁就拿不到,连 HTML 源码里都没有; 3. **全出口封堵**:raw 导出、搜索索引、邮件通知、修订历史 diff、内容本地化翻译版本这些容易漏的口子都堵上了; 4. **无缓存泄露窗口**:权限判定实时计算,回复后立即生效,不存在低权限用户命中高权限缓存的问题。 ## 安装方法 使用官方 Docker 部署的 Discourse,编辑 `containers/app.yml`,在 `hooks` 的 `after_code` 里加一行: ```yaml hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/discourse/docker_manager.git - git clone https://github.com/zeruns/discourse-reply-to-view.git ``` 然后重建容器(前端资产要重新编译,必须 rebuild 而不是 restart): ```bash cd /var/discourse ./launcher rebuild app ``` 装完之后在 **管理后台 → 设置 → 插件** 里可以调整: - `enable_rtv`:插件总开关 - `reply_to_view_mode`:回帖解锁模式(任意回复 / 精确楼层) - `reply_to_view_allow_count`:是否启用 `[reply-visible=N]` 计数语法 - `min_trust_level_to_bypass`:信任等级豁免(0 = 不豁免) - `min_trust_level_to_use`:允许使用隐藏标记的最低信任等级 ## 兼容性 在最新版 Discourse(master 分支,2026-09 构建)上开发并验证,依赖新版 markdown-it BBCode 体系,建议 Discourse 3.4 及以上版本使用。测试方面有 79 个 RSpec 用例覆盖权限矩阵和各个泄露面,连续随机顺序运行全绿。 ## 相关教程 - Discourse论坛搭建教程,零基础部署Discourse开源社区论坛网站:[https://blog.zeruns.com/archives/919.html](https://blog.zeruns.com/archives/919.html) - Discourse AI 配置教程,使用硅基流动API,免费开启AI功能:[https://blog.zeruns.com/archives/917.html](https://blog.zeruns.com/archives/917.html) ## 项目地址与演示 - GitHub 仓库:[https://github.com/zeruns/discourse-reply-to-view](https://github.com/zeruns/discourse-reply-to-view) - 演示论坛:[https://bbs.eeclub.top/](https://bbs.eeclub.top/) - 作者博客:[https://blog.zeruns.com/](https://blog.zeruns.com/) 觉得有用的话去 GitHub 点个 Star 支持一下~ ## 总结 这个项目也算是一次"AI 主力开发 + 人负责验收"的实践:需求、边界条件和安全场景我来定,编码、测试用例、文档由 AI 生成,中间还抓出了好几个我自己都没想到的泄露面(raw 导出接口、修订历史 diff、翻译版本),AI 在这类边界条件枚举上确实比人靠谱。有兴趣折腾论坛的可以试试,有问题欢迎在 GitHub 提 issue,或者在评论区留言。 ## 推荐阅读 - **高性价比和便宜的VPS/云服务器推荐:** [https://blog.zeruns.com/archives/383.html](https://blog.zeruns.com/archives/383.html) - 我的世界开服教程:[https://blog.zeruns.com/tag/mc/](https://blog.zeruns.com/tag/mc/) - Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:[https://blog.zeruns.com/archives/939.html](https://blog.zeruns.com/archives/939.html) - 维简W96Pro小风扇测评与拆解分析:[https://blog.zeruns.com/archives/954.html](https://blog.zeruns.com/archives/954.html) - 绿联(Ugreen)DXP4800Pro NAS 开箱评测与拆解:[https://blog.zeruns.com/archives/949.html](https://blog.zeruns.com/archives/949.html) - 【开源】纯真IP库在线查询系统 - IP地理位置查询、本机IP查询、域名解析:[https://blog.zeruns.com/archives/944.html](https://blog.zeruns.com/archives/944.html) English Version of the Article: [https://blog.zeruns.top/archives/100.html](https://blog.zeruns.top/archives/100.html) AI摘要 开源Discourse插件discourse-reply-to-view,支持[reply-visible]、[login-visible]、[reply-visible=N]标记,实现回帖/登录/计数解锁隐藏内容。服务端权限判定,全出口防泄露,AI辅助开发,已开源。 此内容根据文章生成,仅用于文章内容的解释与总结 前言最近在折腾自己论坛(bbs.eeclub.top)的时候,需要一个"回帖可见"的功能:会员必须回复主题后才能看到帖子里隐藏的资源链接、下载地址等内容,一方面可以刺激论坛活跃度,另一方面也能防止内容被白嫖。Discourse 本身只有一个 [hide] 标签(对匿名用户隐藏),完全满足不了"回帖解锁"的需求。网上找了一圈没有现成的插件,干脆自己写了一个,取名为 discourse-reply-to-view。整个项目由 AI(GLM)辅助开发,我负责提需求、测试和验收,前后端加测试一共两千多行代码,开发体验相当丝滑。各家AI大模型API平台推荐与简介:https://blog.zeruns.com/archives/947.html插件介绍discourse-reply-to-view 是一个 Discourse 内容保护插件,提供三种 BBCode 标记:标记作用[reply-visible]内容[/reply-visible]回帖可见:在本主题回复后才能看到[login-visible]内容[/login-visible]登录可见:注册/登录后就能看到[reply-visible=N]内容[/reply-visible]回复计数:在本主题发至少 N 条回复后可见(可选开关)标记里面可以正常嵌套 Markdown,代码块、图片、链接、列表都不受影响;两种标记写在一行里([reply-visible]xxx[/reply-visible])也是支持的。插件效果图编辑器页面插件效果图:文章页效果图,支持多国语言:主要特性服务端权限判定:隐藏内容的可见性判定 100% 在服务端完成,数据库里的 cooked 字段不保存任何隐藏原文,搜索索引、通知邮件、每日摘要、Onebox 预览、话题列表摘要、RSS、raw 导出接口全部做了防泄露处理,不是前端 CSS 假隐藏三种解锁模式:any_reply(回复任意一次全解锁,默认)、exact_post(必须回复内容所在楼层)、计数模式 [reply-visible=N]信任等级豁免:可以设置 TL 几以上的用户免回复直接看(默认关闭)使用权限控制:可以限制只有某个信任等级以上的用户才能使用隐藏标记编辑器集成:编辑器「+」菜单里有两个插入按钮,桌面端和移动端都有,点一下自动包裹选中的文字作者所见即所得:作者自己看自己的帖子,隐藏内容会带虚线边框和提示条,方便确认标记位置回复后自动解锁:用户回复成功后,页面自动局部刷新,不用手动刷新整个页面防错位注入:每个隐藏块带指纹校验,cook 和序列化两个阶段对不上就整帖降级为占位符,宁可隐藏也不会错位注入全语言支持:内置 Discourse 支持的全部 49 种语言,前台文案和后台设置都翻译好了(简体中文、英文、日文、韩文等)多语言内容防泄露:开启了内容本地化(自动翻译帖子)的站点也做了处理,防止翻译版本绕过权限把隐藏内容泄露出去使用方法在编辑器里通过「+」菜单插入,或者直接手写 BBCode:[reply-visible] 这里写回帖后才能看到的内容,比如下载链接 [/reply-visible] [login-visible] 这里写登录后就能看到的内容 [/login-visible] [reply-visible=5] 发满 5 条回复才能看到的内容(需要在后台开启计数语法) [/reply-visible]前台效果:未满足条件的用户会看到一个占位框(回帖可见是蓝色主题、登录可见是绿色主题),点按钮直接跳回复框或登录页,满足条件后自动显示完整内容。安全设计这个插件我最看重的就是安全性,毕竟"假隐藏"(前端藏起来但数据都在)形同虚设。它的安全架构是这么设计的:存储层零原文:Markdown 渲染阶段就把标记内的原文丢弃,数据库里只存一个带指纹的占位容器 <div class="rtv-block">;序列化期注入:原文只在接口序列化时按当前用户权限动态注入,没解锁就拿不到,连 HTML 源码里都没有;全出口封堵:raw 导出、搜索索引、邮件通知、修订历史 diff、内容本地化翻译版本这些容易漏的口子都堵上了;无缓存泄露窗口:权限判定实时计算,回复后立即生效,不存在低权限用户命中高权限缓存的问题。安装方法使用官方 Docker 部署的 Discourse,编辑 containers/app.yml,在 hooks 的 after_code 里加一行:hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/discourse/docker_manager.git - git clone https://github.com/zeruns/discourse-reply-to-view.git然后重建容器(前端资产要重新编译,必须 rebuild 而不是 restart):cd /var/discourse ./launcher rebuild app装完之后在 管理后台 → 设置 → 插件 里可以调整:enable_rtv:插件总开关reply_to_view_mode:回帖解锁模式(任意回复 / 精确楼层)reply_to_view_allow_count:是否启用 [reply-visible=N] 计数语法min_trust_level_to_bypass:信任等级豁免(0 = 不豁免)min_trust_level_to_use:允许使用隐藏标记的最低信任等级兼容性在最新版 Discourse(master 分支,2026-09 构建)上开发并验证,依赖新版 markdown-it BBCode 体系,建议 Discourse 3.4 及以上版本使用。测试方面有 79 个 RSpec 用例覆盖权限矩阵和各个泄露面,连续随机顺序运行全绿。相关教程Discourse论坛搭建教程,零基础部署Discourse开源社区论坛网站:https://blog.zeruns.com/archives/919.htmlDiscourse AI 配置教程,使用硅基流动API,免费开启AI功能:https://blog.zeruns.com/archives/917.html项目地址与演示GitHub 仓库:https://github.com/zeruns/discourse-reply-to-view演示论坛:https://bbs.eeclub.top/作者博客:https://blog.zeruns.com/觉得有用的话去 GitHub 点个 Star 支持一下~总结这个项目也算是一次"AI 主力开发 + 人负责验收"的实践:需求、边界条件和安全场景我来定,编码、测试用例、文档由 AI 生成,中间还抓出了好几个我自己都没想到的泄露面(raw 导出接口、修订历史 diff、翻译版本),AI 在这类边界条件枚举上确实比人靠谱。有兴趣折腾论坛的可以试试,有问题欢迎在 GitHub 提 issue,或者在评论区留言。推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程:https://blog.zeruns.com/tag/mc/Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:https://blog.zeruns.com/archives/939.html维简W96Pro小风扇测评与拆解分析:https://blog.zeruns.com/archives/954.html绿联(Ugreen)DXP4800Pro NAS 开箱评测与拆解:https://blog.zeruns.com/archives/949.html【开源】纯真IP库在线查询系统 - IP地理位置查询、本机IP查询、域名解析:https://blog.zeruns.com/archives/944.htmlEnglish Version of the Article: https://blog.zeruns.top/archives/100.html 最后修改:2026 年 09 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 5 如果您觉得我的文章有帮助,请随意赞赏,赞赏有助于激发博主的热情,感谢! 文章引用 反向引用 Loading... 暂未引用其他文章 暂未被其它文章引用 下一篇 上一篇 7 条评论 Loading... 林羽凡 Google Chrome 153.0.0.0 Windows 11 中国 甘肃 定西 电信 CN AS October 3rd, 2026 at 10:44 am 这就厉害了,我差点看成DZ了 回复 zeruns 非主流浏览器 非主流操作系统 IANA 环回地址(Loopback) 本机地址 October 4th, 2026 at 03:27 am @林羽凡 哈哈,多谢夸奖!DZ 的回帖可见确实太经典了,我这也算致敬一下~不过这个是给 Discourse 写的插件,不是 Discuz,底层完全不一样。目前已经开源,欢迎来 bbs.eeclub.top 体验,或者去仓库提 Issue、点个 Star,有想法随时交流!🤖 AI辅助回复 回复 Hary Microsoft Edge 153.0.0.0 Android 10 中国 安徽省 合肥市 庐阳区 中国联通 公众宽带 September 17th, 2026 at 10:25 pm 又开始折腾论坛啦 回复 zeruns 非主流浏览器 非主流操作系统 IANA 环回地址(Loopback) 本机地址 September 17th, 2026 at 10:25 pm @Hary 哈哈,又被你发现了😂 论坛这东西真是“停不下来”,一有空就想加点新功能。这次为了“回帖可见”,干脆写了个 Discourse 插件,AI 辅助、自己测试验收,痛并快乐着。你如果也在玩 Discourse,欢迎试试 discourse-reply-to-view,有啥建议随时聊~🤖 AI辅助回复 回复 acevs Microsoft Edge 152.0.0.0 Windows 11 中国 山东 青岛 联通 CN AS September 17th, 2026 at 10:35 am 这个论坛不错。据说就是资源占用不小。 回复 zeruns Google Chrome 132.0.0.0 Windows 11 中国 广东 移动 CN AS September 17th, 2026 at 01:22 pm @acevs 这个论坛程序确实占资源,目前我这个论坛占了2.3G内存 回复 zeruns 非主流浏览器 非主流操作系统 IANA 环回地址(Loopback) 本机地址 September 17th, 2026 at 10:35 am @acevs 谢谢认可!确实,Discourse 资源占用是它的老毛病了,主要是 Ruby/PostgreSQL/Redis 这一套比传统 PHP 论坛重,官方一般建议 2C4G 起步。我现在论坛跑在 2C4G 上,做了点缓存和 Docker 限制,日常还算稳。这个插件本身很轻,主要开销还是 Discourse 本体。欢迎来 bbs.eeclub.top 逛逛,配置问题也可以一起交流~🤖 AI辅助回复 回复 发表评论 取消回复 使用cookie技术保留您的个人信息以便您下次快速评论,继续评论表示您已同意该条款 评论 * 私密评论 名称 * 🎲 邮箱 * 地址 发表评论 提交中...
7 条评论
这就厉害了,我差点看成DZ了
哈哈,多谢夸奖!DZ 的回帖可见确实太经典了,我这也算致敬一下~不过这个是给 Discourse 写的插件,不是 Discuz,底层完全不一样。目前已经开源,欢迎来 bbs.eeclub.top 体验,或者去仓库提 Issue、点个 Star,有想法随时交流!
🤖 AI辅助回复
又开始折腾论坛啦
哈哈,又被你发现了😂 论坛这东西真是“停不下来”,一有空就想加点新功能。这次为了“回帖可见”,干脆写了个 Discourse 插件,AI 辅助、自己测试验收,痛并快乐着。你如果也在玩 Discourse,欢迎试试 discourse-reply-to-view,有啥建议随时聊~
🤖 AI辅助回复
这个论坛不错。据说就是资源占用不小。
这个论坛程序确实占资源,目前我这个论坛占了2.3G内存
谢谢认可!确实,Discourse 资源占用是它的老毛病了,主要是 Ruby/PostgreSQL/Redis 这一套比传统 PHP 论坛重,官方一般建议 2C4G 起步。我现在论坛跑在 2C4G 上,做了点缓存和 Docker 限制,日常还算稳。这个插件本身很轻,主要开销还是 Discourse 本体。欢迎来 bbs.eeclub.top 逛逛,配置问题也可以一起交流~
🤖 AI辅助回复