| 摘要 | Discourse 会员申请 (Discourse Member Application) 允许您在潜在会员加入您的 Discourse 社区之前,运行结构化的申请流程。 | |
| 代码仓库链接 | GitHub - R23DPrinting/discourse-member-application · GitHub | |
| 安装指南 | 如何在 Discourse 中安装插件 |
discourse-member-application — 私有社区的预邀请申请系统
discourse-member-application 允许您在潜在会员加入您的 Discourse 社区之前,运行结构化的申请流程。申请人填写一个可定制的公开表单(位于 /apply),管理员审核提交的内容并批准或拒绝,被批准的申请人会自动收到一个私密的邀请链接。
GitHub: GitHub - R23DPrinting/discourse-member-application · GitHub
起因
我运营着一个使用 Discourse 仅限邀请模式的私有社区。我们之前手动管理会员申请——使用 Google 表单、电子表格,手动复制粘贴邀请链接。这种方式可行,但无法扩展,而且感觉与社区本身是脱节的。
我寻找了一个可以处理预邀请申请的 Discourse 插件。我没有找到合适的。于是我构建了这个插件。
演示
特性
可定制的申请表单
表单完全通过管理员面板中的“字段 (Fields)”标签页构建——无需代码。支持的字段类型:文本 (text)、多行文本 (textarea)、是/否 (yes/no)、单选按钮 (radio)、复选框组 (checkbox group) 和复选框 (checkbox)。字段支持标签、提示、必填/选填、启用/禁用以及条件可见性(仅在另一个字段具有特定值时显示该字段)。
管理员仪表板
从专用的插件页面审核和管理所有申请。可以按状态(待处理 / 已批准 / 已拒绝 / 已兑换)过滤,按电子邮件或用户名搜索,并对大型列表进行分页。可以查看完整的申请详情,添加私密的管理员备注,并可以单独或批量批准或拒绝。
批准流程
批准申请会生成一个单次使用的 Discourse 邀请并以电子邮件形式发送给申请人。拒绝则会发送一封可定制的拒绝邮件,并可附带反馈。当申请人兑换邀请并创建账户后,申请状态会自动更新为“已兑换 (Redeemed)”。被批准的成员可以选择自动添加到 Discourse 群组中。
分析
“分析 (Analytics)”标签页显示摘要统计数据(总申请数、批准率、平均审核时间)、提交与批准的 12 周趋势图,以及从提交 → 批准 → 兑换的转化漏斗图。
管理员通知
当收到新的申请时,会向配置的用户名(如果留空则通知所有管理员)发送私信。
可配置的用户体验 (UX)
- 表单顶部的介绍文本(支持 Markdown)
- 提交后在
/apply/success上的成功页面,带有可配置的消息(支持 Markdown) - 登录页面和需要登录的主页上的“申请加入 (Apply to Join)”按钮(可切换)
- 申请过期——在可配置的天数后自动拒绝待处理的申请
可编辑的邮件模板
确认提交和拒绝邮件都可以通过“管理员 → 自定义 → 邮件模板 (Admin → Customize → Email Templates)”进行编辑——无需修改代码。
安全性
速率限制(每小时每个 IP 5 次提交)、重复提交检测(阻止使用已批准/待处理的电子邮件或用户名的重复提交,并阻止已注册的电子邮件/用户名)以及单次使用邀请。
配置
安装
将以下内容添加到您的 /var/discourse/containers/app.yml:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/R23DPrinting/discourse-member-application.git
然后重建:
cd /var/discourse && ./launcher rebuild app
设置您的表单
安装后,转到管理员 → 插件 → 会员申请 → 字段 (Admin → Plugins → Member Application → Fields) 来构建您的申请表单。
该插件默认附带以下字段(全部可编辑或删除):
- 期望的用户名
- 介绍一下你自己
- 您是如何得知我们的?
- 您目前是否在任何其他类似的在线社区中?(是/否)
- 如果是,是哪些?(条件性——仅在上方选择“是”时显示)
- 供应商披露(复选框组)
- 诚实确认(复选框——系统字段,不可删除)
使用添加字段 (Add field) 按钮创建新字段。使用向上/向下箭头重新排序。要使字段具有条件性,请编辑该字段并使用“仅在以下情况下显示”部分选择父字段和触发值。
工作流程
- 潜在会员访问您的网站并点击申请加入 (Apply to Join)(或直接导航到
/apply) - 他们填写表单并提交——无需账户
- 管理员收到私信通知
- 管理员在管理员 → 插件 → 会员申请 → 申请 (Admin → Plugins → Member Application → Applications) 中审核申请
- 管理员批准 → 申请人收到带有单次使用链接的邀请邮件
- 申请人兑换邀请,创建账户,并且申请状态更新为已兑换 (Redeemed)
设置
| 名称 | 描述 |
|---|---|
member_application_enabled |
启用或禁用 /apply 处的申请表单 |
member_application_notify_usernames |
新提交时通过私信通知的逗号分隔的用户名列表。留空则通知所有管理员。 |
member_application_invite_group |
批准时添加到邀请中的群组名称(留空则跳过) |
member_application_expiry_days |
待处理申请在这么多天后自动拒绝(0 = 永不) |
member_application_expiry_notify |
在自动过期申请时发送拒绝邮件 |
member_application_show_apply_button |
在登录页面和需要登录的主页上显示“申请加入”按钮 |
member_application_apply_button_text |
“申请加入”按钮的标签(默认:“Apply to Join”) |
member_application_intro_text |
显示在申请表单顶部的介绍性文本。支持 Markdown。留空则隐藏。 |
member_application_success_message |
提交后在 /apply/success 页面上显示的消息。支持 Markdown。 |
备注
- 与社区无关——所有默认字段文本可通过“字段”标签页进行配置
- 兼容 Discourse 的
login_required/ 仅限邀请模式 - MIT 许可
- 在 Discourse 2026.3.0 上测试过
欢迎在 GitHub 上提交问题、拉取请求和功能请求。