资讯动态

RS School App 通知系统完全指南:通知类型、Telegram/Email 订阅渠道与底层实现解析

发布时间:2026/9/24 14:31:40 来源:尧图企业网站定制
RS School App 通知系统完全指南通知类型、Telegram/Email 订阅渠道与底层实现解析【免费下载链接】rsschool-appAn application for the RS School education process项目地址: https://gitcode.com/gh_mirrors/rs/rsschool-app本指南基于 RS School App 官方通知文档全面讲解 RS School App 中通知系统的两类核心通知导师审批通过、作业批改完成、Telegram 与 Email 两种推送渠道的订阅/退订操作并结合仓库源码剖析通知的底层实现从数据库模型、Handlebar 模板渲染到 AWS 通知网关的完整调用链。阅读完本文你将掌握在个人资料中正确配置并管理通知订阅的完整实战流程同时理解通知“无需订阅强制送达”与“按订阅投递”两类机制的实现区别。通知类型Notification typesRS School App 的通知系统目前主要面向导师Mentor与学员Student推送两类关键事件原文档明确列举如下1. 导师审批通过通知触发场景你被批准参加课程As a mentor, you are approved to take part in the course。内容包含审批通过的链接。重要特性不需要订阅does not require subscription——即使用户没有为某个渠道开启订阅这条消息也会强制送达。2. 作业批改完成通知触发场景你的作业已被导师或 Cross-Check交叉互评检查完毕Your task has been checked by mentor/cross-check。内容包含本次得分score、作业满分tasks maximum score以及作业权重weight of the task。从源码看通知在数据库中通过NotificationType枚举区分两类语义nestjs/src/models/notification.ts 定义了event事件与message消息两种类型并在Notification实体上通过type字段与enabled开关管理。NotificationId联合类型则完整列举了系统当前支持的通知标识通知 ID语义mentorRegistrationApproval导师注册/报名获批mentorRegistrationApproval:submit导师注册提交确认taskGrade作业评分对应文档中的批改完成通知courseCertificate课程证书courseScheduleChange课程日程变更taskDeadline作业截止日期提醒crossCheckDeadlineCross-Check 截止日期提醒interviewerAssigned面试官分配emailConfirmation邮箱确认mentor:assigned导师分配messages站内消息mentorsInvitation导师邀请可见mentorRegistrationApproval与taskGrade正是原文档描述的两类核心通知在后端的正式标识其余 ID 则为系统预留/其他模块使用的扩展类型。通知渠道Channels原文档说明通知支持两种投递渠道Telegram通知来自rsschool_bot机器人。Email通知发送到用户填写的邮箱。结合源码渠道由NotificationChannelId联合类型定义nestjs/src/models/notificationChannel.ts 中声明type NotificationChannelId telegram | email | discord即后端基础能力实际覆盖Telegram、Email、Discord三种渠道前端 notifications.ts 同样定义了NotificationChannel枚举email / telegram / discord。每种渠道都有对应的消息模板结构定义在 nestjs/src/models/notificationChannelSettings.tsEmailTemplate{ subject, body }—— 邮件包含主题与正文TelegramTemplate{ body }—— Telegram 仅有正文DiscordTemplate{ body }—— Discord 仅有正文。模板以simple-json类型存储并允许为每条通知按渠道分别配置。如何订阅与退订通知原文档给出了完整的订阅/退订流程核心要点是先建立“联系渠道”再在个人资料中勾选“同意Consents”。第一步填写联系信息在个人资料的Contacts联系信息卡片中填写email与Telegram字段。注意Telegram 字段填写时不要带前缀without只需填用户名本身注册时联系信息是互相关联的Contacts are interconnected when registered即注册阶段填写的联系方式会自动用于通知投递。前端Consents组件Consents.tsx会根据联系信息状态展示引导提示若未填写邮箱提示“请在个人资料页填写邮箱以设置邮件通知”若已填写邮箱但未验证展示邮箱确认组件EmailConfirmation并可点击触发发送确认链接调用UserService.sendEmailConfirmationLink()若未启用 Telegram提示打开rsschool_bot并点击Start按钮完成初始化机器人连接链接为https://t.me/rsschool_bot?startconnect若未授权 Discord提示先完成 Discord 授权discordIntegration.api.auth。第二步在个人资料中开启订阅进入个人资料的编辑edit模式https://app.rs.school/profile#edit在Consents同意卡片中在你希望订阅的渠道前面打勾set a checkmark即可完成订阅。前端对应的设置入口位于Notifications用户设置页UserNotificationsSettingsPage.tsx页面加载时通过NotificationsService.getUserNotificationSettings()拉取用户当前各渠道的连接状态connections与通知设置列表对于未建立连接的渠道如未绑定 Telegram该渠道会进入disabledChannels列表其对应的勾选会被禁用。用户完成勾选后点击Save前端会按notificationId channelId enabled的结构批量提交saveUserNotifications成功后提示“New notification settings saved.”。第三步Telegram 专有改变订阅状态需通过机器人操作原文档特别强调要改变 Telegram 订阅的开关状态必须在rsschool_bot中执行订阅/退订操作To change the state of Telegram subscription in the profile, it is necessary to subscribe/unsubscribe withrsschool_bot。也就是说对于 Telegram 渠道个人资料页的勾选与机器人的订阅状态需要保持一致你需要在 Telegram 中打开rsschool_bot点击Start完成订阅或在机器人对话中执行退订个人资料中的Consents勾选更多体现的是“允许通过该渠道接收通知”的意愿声明。底层实现通知如何从服务端送达用户理解上述操作背后的数据与调用链路有助于排查“为什么没收到通知”等问题。数据模型四张核心表实体文件职责Notificationnestjs/src/models/notification.ts通知定义ID、名称、类型event/message、是否启用enabled、关联渠道设置、可选的父通知parentNotificationChannelnestjs/src/models/notificationChannel.ts渠道定义telegram / email / discordNotificationChannelSettingsnestjs/src/models/notificationChannelSettings.ts“通知 × 渠道”模板配置以notificationIdchannelId为复合主键存对应渠道的模板 JSONNotificationUserSettingsnestjs/src/models/notificationUserSettings.ts用户订阅设置以notificationIduserIdchannelId为复合主键enabled布尔字段标记该用户是否订阅了该通知的该渠道其中NotificationUserSettings正是“Consents 勾选”在后端的落库位置用户每勾选一个“通知 × 渠道”组合就对应一行enabled true的记录。服务端发送链路notifications.service.ts后端核心发送逻辑分为三个方法sendMessage强制投递不检查订阅方法注释明确写道 “Messages to users regardless on user subscription status to specific channel”这正是原文档中“导师审批通知不需要订阅”的实现基础。调用方只需提供notificationId、userId、data、channelId与channelValue用户在该渠道的 ID即可直接构造消息并投递不查询NotificationUserSettings。buildChannelMessage模板渲染使用 Handlebars 的compile对渠道模板进行编译将data渲染进模板正文对 Email 渠道还会用全局编译的 HTML 邮件外壳email-template.ts中的compiledEmailTemplate编译参数为noEscape: true包裹正文并设置邮件subject。publishNotification投递到网关将渲染结果打包为NotificationPayload含notificationId、channelId[]、userId、data通过 HTTP POST 发送到 AWS 通知网关 REST API地址与密钥来自ConfigService的awsServices配置请求头携带x-api-key。注意当configService.isDev为真时开发环境不会真正发送避免开发环境骚扰真实用户。管理端维护notifications.controller.ts通知本身由管理员维护NotificationsController挂载在/notifications路由下使用DefaultGuard RoleGuard并强制Role.Admin权限提供GET /列出全部通知含渠道设置与父通知按名称排序PUT /更新通知支持设置parentId建立父子层级POST /创建通知ID 冲突时返回BadRequestExceptionDELETE /:id删除通知。前端管理页 AdminNotificationsSettingsPage.tsx 与 NotificationsService 中的getNotifications/saveNotification/createNotification/deleteNotification分别对应这些接口。常见问题与排查建议为什么勾选了 Consents 却收不到 Telegram 通知检查是否已在 Telegram 中打开rsschool_bot并点击StartTelegram 的订阅状态需通过机器人本身维护同时在Contacts卡片中确认 Telegram 用户名填写正确且不带前缀。邮件通知没收到确认邮箱已填写并完成验证Consents组件会提示发送确认链接并检查垃圾邮件箱邮件投递依赖 AWS 通知网关服务端在开发环境isDev下不会真实外发。哪些通知强制送达以mentorRegistrationApproval为代表的通知走sendMessage路径不依赖用户订阅状态以taskGrade为代表的通知则遵循用户在NotificationUserSettings中的订阅勾选。想关闭某类通知在个人资料编辑模式的Consents卡片取消对应渠道勾选或进入通知设置页Notifications用户设置页逐项调整并点击Save保存。如需进一步了解通知模板、渠道设置的完整字段定义可继续阅读 nestjs/src/models/notificationChannelSettings.ts 与 nestjs/src/notifications/notifications.service.spec.ts 中的测试用例它们完整覆盖了buildChannelMessage对 Telegram/Email/Discord 模板的渲染行为。【免费下载链接】rsschool-appAn application for the RS School education process项目地址: https://gitcode.com/gh_mirrors/rs/rsschool-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价