通知类型体系
P0覆盖:评论回复、帖子回复、@提及、投票里程碑(如「你的帖子获得 100 赞」)、关注、版主动作、举报结果、社区公告、私信。
实现要点:每类通知有独立模板与开关。里程碑类通知只在跨过阈值时触发一次,避免每票都通知。
This page is not translated yet
The interface, navigation and community content are bilingual. The long-form body of this page is still in Chinese. The translation work is tracked as task I18N-10.
Module 08 · V1.0 · Notifications & Messaging
把用户拉回来,但不要把他烦走
构建事件驱动的通知系统,支持站内、邮件、推送、Web Push 多渠道投递,并提供聚合、免打扰与精细的订阅控制。
通知是留存的核心杠杆,但也是最容易被滥用的功能。设计目标不是「多发」,而是「发得准」。
共 8 个功能点,每个功能点给出实现要点,可直接作为开发任务的描述。
覆盖:评论回复、帖子回复、@提及、投票里程碑(如「你的帖子获得 100 赞」)、关注、版主动作、举报结果、社区公告、私信。
实现要点:每类通知有独立模板与开关。里程碑类通知只在跨过阈值时触发一次,避免每票都通知。
同一目标的多条通知自动合并,如「Alice 等 12 人赞了你的帖子」。
实现要点:聚合键为 (user_id, type, target_id),在时间窗口(1 小时)内累加;聚合后的通知仍可展开查看明细。
站内信(默认)、邮件、浏览器 Web Push、移动端推送、可选的 Webhook。
实现要点:用户可按类型分别配置渠道。邮件支持「全部即时 / 每日摘要 / 每周摘要 / 关闭」四档。
免打扰时段、每类通知的每日上限、通知合并窗口。
实现要点:免打扰期间的通知进入队列,在时段结束后合并为一条摘要投递。
统一的收件箱页面,按「全部 / 未读 / 提及 / 回复 / 系统」分组,支持标记已读与批量操作。
实现要点:未读数实时更新(SSE),点开即标记已读;支持按时间倒序与分组视图切换。
通过 SSE / WebSocket 推送新通知,浏览器标签页标题显示未读数(如「(3) Ruyi Community」)。
实现要点:长连接断线自动重连(指数退避);无长连接能力时降级为 30 秒轮询。
对单个帖子可设置「关注此帖」,有新评论即通知;对社区可设置「仅精选内容」或「全部内容」。
实现要点:评论后会默认订阅该帖(可取消),并给出「取消订阅」显式入口。
通知事件通过消息队列投递,保证至少一次,消费端按幂等键去重。
实现要点:幂等键 = (user_id, type, target_id, aggregate_window),重复消费直接丢弃,避免用户收到重复通知。
2 条关键交互的分步流程,按用户体验顺序描述,可直接作为前端开发与可用性测试脚本。
顶部铃铛图标显示未读数角标,超过 99 显示 99+。
点击展开通知抽屉,按时间倒序展示最近 20 条,已读项自动变淡。
点击某条通知跳转到对应内容并高亮定位,抽屉自动关闭。
抽屉底部提供「查看全部」,进入完整消息中心。
进入设置 → 通知,按类型列出开关矩阵(行=事件类型,列=渠道)。
每行提供「全部 / 仅站内 / 关闭」快捷预设,也支持逐格勾选。
设置免打扰时段(起止时间与星期),保存后立即生效。
6 条硬性约束。这些规则应当在服务层强校验,而非仅在前端提示。
同一目标同一类型通知在 1 小时窗口内聚合为一条。
单用户每日邮件通知上限 20 封,超出自动转为摘要。
免打扰时段内不投递邮件与推送,仅记录站内信。
举报结果通知默认匿名(不暴露举报人身份)。
关闭某类型通知不影响其在消息中心的历史记录,只影响未来投递。
被屏蔽用户的互动不产生通知。
本模块涉及的 7 张表。完整字段、索引与说明见「数据表设计」页。
本模块的设计参照了哪些产品,具体参照了什么。
通知分组清晰(回复/提及/里程碑/社区活动)。
Discourse
通知粒度极细,可按话题级别订阅。
V2EX
评论后自动订阅帖子并给显式取消入口,符合直觉。
掘金
里程碑式激励通知对创作者留存效果显著。
本模块交付时应当达到的量化目标。未达标即视为该模块未完成。
竞品踩过的坑,以及本模块在实现时最容易犯的错误。
不做聚合会在热门帖下瞬间产生海量通知,用户会直接关掉通知。
邮件若无频控会触发投诉与域名信誉下降,严重影响后续投递率。
通知投递若无幂等,消息队列重试会造成重复骚扰。
「关注此帖」若不提供显式取消入口,用户会困惑于为何持续收到通知。