OpenProject 站内通知中心(In-app Notifications)完整指南:收件箱、通知原因与偏好设置
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
OpenProject 的站内通知(In-app Notifications)将"与你相关的变更"实时汇聚到一个统一的通知中心:无论是有人 @提及你、工作包的状态/类型/日期发生变更,还是你被新指派了任务,都会在浏览器内即时提醒你,可与邮件通知并行或替代使用。本文以 docs/user-guide/notifications/README.md 为骨架,结合仓库源码(notifications_controller.rb、notification.rb、routes.rb)与配套的 通知设置文档,系统讲解通知中心的访问方式、筛选与管理、已读机制、通知原因模型以及通知偏好配置,读完即可完全掌握 OpenProject 站内通知的日常用法与底层实现。
站内通知是什么
站内通知用于在应用内及时告知与你相关的重要变更,典型场景包括:
- 有人在评论中@提及你(mentioned);
- 工作包的状态、类型或日期被修改;
- 你被指派(assignee)为某工作包的负责人或责任人;
- 你正在关注(watching)的工作包发生了活动;
- 你设置的工作包提醒(reminder)或日期预警(date alert)被触发。
站内通知默认启用("This feature is enabled by default"),并且可以与邮件通知并行使用,也可以作为邮件通知的替代方案。这意味着你可以完全在浏览器内处理所有需要关注的事项,而无需频繁查看邮箱。
从源码层面看,一条通知本质上是一条持久化记录。在 app/models/notification.rb 中,Notification模型通过belongs_to :recipient(接收者)、belongs_to :actor(触发变更的人)、belongs_to :journal(产生通知的活动日志)以及belongs_to :resource, polymorphic: true(多态关联到具体资源,如工作包)来组织通知数据,并定义了完整的通知原因枚举(详见下文"通知原因(Reasons)模型"一节)。
如何访问站内通知
顶部铃铛图标与未读徽章
当存在需要你关注的通知时,顶部页头(top header)右侧的通知铃铛图标上会显示一个红色徽章,数字表示未读通知总数。徽章最多显示到 99,超过后显示为99+。
点击右上角的铃铛图标,即可进入Notification center(通知中心)。
在路由层面,通知中心的入口定义在 config/routes.rb:
resources :notifications, only: :index do collection do concerns :with_split_view post :mark_all_read resource :menu, module: :notifications, only: %i[show], as: :notifications_menu end end scope :notifications do get "/", to: "notifications#index", as: :notifications_center end对应的控制器 app/controllers/notifications_controller.rb 由NotificationsController < ApplicationController实现,index动作渲染专用的notifications布局(页面渲染由前端 Angular 完成)。
通知中心的列表语义
通知中心里每一行代表一个"产生了通知的工作包"。同一个工作包可能生成多条通知——例如你先关注了某个工作包,一个人修改了它的日期,随后另一个人又修改了状态,这两次变更会分别生成两条通知。此时,行右侧的蓝色徽章显示与该工作包相关的未读通知数量。
工作包按新鲜度(freshness)排序:列表顶部的行拥有"最新"的通知。如果一个原本排在较下方的工作包有了新更新,它会因为成为最新通知而被移到列表顶部。
[!NOTE] 如果同一个工作包存在多条通知,工作包提醒 会优先展示:当存在提醒时,提醒内容显示在页面底部。
如果某工作包同时设置了提醒和日期预警通知,日期预警会与提醒合并显示在最后一行;其余通知原因(watcher、mentioned、assignee)则继续显示在通知的第一行。
管理通知:分屏视图与五种筛选区域
点击一条通知,会在分屏视图(split screen)中打开该工作包的Activity(活动)标签页;双击通知则打开工作包的完整视图。
[!TIP] 分屏视图左侧有拖动条(resizer),你可以拖动调整分屏宽度,调整结果会保存在本地,并应用于其他分屏布局。
打开 Activity 标签页后,页面会自动滚动到最后一次产生通知的事件位置。标签页旁边的徽章表示内容数量,例如Relations(关系)标签旁的数字 1 表示当前工作包与另一个工作包存在关系。
[!TIP] 并非所有工作包活动都会生成通知。例如,你因为被 @提及而收到通知,但那次提及之后该工作包可能还有其他活动——点击通知打开页面时,Activity 标签页会自动滚动并高亮那次 @提及(因为那是触发通知的原始事件),但后续活动并不会自动滚动到。
通知中心左侧菜单提供了两组预定义筛选以及若干视图控制(文档中标注为 Area 1–5):
- Area 1 – 按原因筛选:按你收到通知的原因过滤,包括被 @提及(@mention)、你是该工作包的指派对象(assignee)或责任人(accountable)、你关注的工作包、以及你设置了活动提醒或日期预警的工作包。
- Area 2 – 按项目筛选:按项目过滤,例如只看某个特定项目产生的通知。
- Area 3 – 视图控制:
- 选择查看Unread(仅未读)或All(全部),其中All会包含之前已标记为已读的通知;
- Mark all as read(全部标记为已读)按钮可以一键清空通知收件箱。
- Area 4 – 通知设置入口:点击Settings按钮可查看或修改当前通知偏好,也可以从右上角头像 >Account settings>Notification settings进入。
- Area 5 – 分屏视图:分屏不仅能查看工作包活动,还能切换到工作包的 Overview、Files、Relations、Watchers 等其他标签页。
[!TIP]Mark all as read只会清除当前页面上可见的通知行。如果未读通知数量非常多,最旧的通知可能不在当前页面上,此时可能需要多次点击该按钮才能完全清空收件箱。
后端筛选与"全部标记已读"的实现
筛选逻辑在控制器中由filtered_query私有方法实现(app/controllers/notifications_controller.rb)。它基于Queries::Notifications::NotificationQuery构建查询,默认限定read_ian = "f"(未读),并根据 URL 参数追加条件:
def filtered_query query = Queries::Notifications::NotificationQuery.new(user: current_user) query.where(:read_ian, "=", "f") case params[:filter] when "project" id = params[:name].to_i query.where(:project_id, "=", [id]) when "reason" query.where(:reason, "=", [params[:name]]) end @filtered_query = query end而mark_all_read动作(notifications_controller.rb)正是基于这个筛选后的查询,一次性把符合条件的通知批量更新为已读:
def mark_all_read if filtered_query.valid? filtered_query.results.update_all(read_ian: true, updated_at: Time.zone.now) else flash[:error] = filtered_query.errors.full_messages.join(", ") end redirect_back fallback_location: notifications_path endread_ian即 "read in-app notification"(站内通知已读)标记字段,可见"已读/未读"是通知记录上的持久化状态,而不是仅存在于前端内存中的临时状态。
通知原因(Reasons)模型
通知中心左侧按原因筛选的选项,与后端Notification模型中的REASONS枚举一一对应(app/models/notification.rb):
| 枚举值 | 含义 |
|---|---|
mentioned | 被 @提及 |
assigned | 被指派为负责人(assignee) |
watched | 关注的工作包发生活动 |
subscribed | 订阅的工作包发生活动 |
commented | 有新的评论 |
created | 有新工作包被创建 |
processed | 工作包状态被处理/变更 |
prioritized | 优先级被修改 |
scheduled | 日期被排定/修改 |
responsible | 你是责任人(accountable) |
date_alert_start_date | 开始日期临近预警 |
date_alert_due_date | 截止日期临近/逾期预警 |
shared | 工作包被共享给你 |
reminder | 你设置的个人提醒被触发 |
在前端,通知中心的原因筛选菜单定义于 in-app-notification-center.component.ts,包含 mentioned、accountable、watched、dateAlert、shared、reminder 等筛选项,并通过urlParams.get('name')与后端params[:name]对接,实现了前后端一致的筛选链路。
标记通知为已读
标记已读有三种入口:
- 通知行上的信封图标:点击行右侧的Mark as read(信封图标)按钮,会将该工作包对应的全部未读通知(即蓝色徽章上的数量)一次性标记为已读。
分屏视图底部的 Mark as Read 按钮:在分屏视图中打开工作包后,点击底部的Mark as Read按钮,效果与方式 1 相同。
工作包完整视图右上角的信封图标:在完整视图(full screen)中,点击详情视图右上角的信封图标即可标记已读。
通知中心之外的通知:工作包上的未读徽章
站内通知不仅存在于通知中心,还会直接显示在工作包上——无论是在完整视图还是分屏视图中。如果当前打开的工作包存在相关未读通知,Activity 标签页旁边会显示一个蓝色小徽章,并标注未读通知数量。
[!NOTE] 这个徽章上的数字不包含与日期预警(Date alerts)相关的通知。也就是说,日期预警类通知只出现在通知中心(收件箱 Inbox 与左侧独立的Date alerts分区)中,而不会叠加显示在工作包的 Activity 标签页徽章上。
通知偏好设置
通知中心 Area 4 的Settings按钮会带你进入通知设置页(也可通过 头像 >Account settings>Notification settings进入)。完整说明见 Notification settings,设置页分为四个区域:
Participating(参与中的工作包)
你通过以下方式"参与"一个工作包:被 @提及、关注它(出现在Watchers列表)、或被指定为 assignee 或 accountable。
默认情况下,你会收到所有参与中的工作包的全部活动通知。对于你作为 assignee 或 accountable 的工作包,可以通过勾选/取消勾选选项来调整。被 @提及的通知无法关闭,因为提及的目的就是引起你的注意;如果不想再收到某个关注工作包的通知,直接取消关注(unwatch)即可。
[!NOTE] 修改这些设置可能导致你错过与你相关的重要更新。除非非常确定后果,否则不建议更改默认值。
Date alerts(日期预警)
日期预警让你在参与中的工作包(assignee、accountable 或 watcher)的开始日期或截止日期临近时收到通知。对于开始日期和截止日期,你可以选择当天、提前 1 天、提前 3 天或提前 1 周收到预警。
[!NOTE]
- 这里的"天"指自然日而非工作日。例如一个周一开始的工作包,选择"提前 3 天"会在周五收到预警。
- 日期预警每天在本地时间凌晨 1 点生成一次。
- 启用日期预警时,那些到期时间比所选预警时长更近的工作包不会生成通知。例如你选择"截止日期前 3 天"提醒,而某个工作包此时只剩下 2 天到期,则不会触发预警。
对于逾期(overdue)日期,你还可以选择周期性提醒:每天、每 3 天或每周。
[!NOTE] 逾期预警的旧通知会被标记为已读,并替换为包含更新后截止日期的新通知。例如你选择每天提醒一个逾期工作包,但一周后才查看,你仍然只会看到该工作包的一条通知。要停止这些提醒,可以取消勾选该选项,或修改/移除工作包的日期。
日期预警通知会同时出现在通知中心的Inbox和左侧独立的Date alerts分区中(对应 访问站内通知)。
Non-participating(非参与的工作包)
你还可以选择接收所有项目中、你未参与的工作包的特定事件通知,包括:
- 新建工作包(New work packages)
- 状态变更(Status changes)
- 日期变更(Date changes)
- 优先级变更(Priority changes)
- 新评论(New comments)
[!NOTE] 这些选项作用于所有项目中所有你未参与的工作包。如果启用过多,你可能会收到大量无关通知,请谨慎使用。
Project-specific notifications(项目级通知设置)
当你在某些项目更活跃、或某些活动(如日期预警、新建工作包)对你更重要时,可以在项目级别精细调整通知设置:
- 点击+ Add project-specific notifications按钮;
- 在出现的浮层表单中选择一个项目并指定通知设置;
- 保存后,页面会列出所有已配置项目级通知的项目,之后可随时修改。
[!NOTE] 项目级设置会覆盖(override)上方的全局设置。当你觉得某个特定项目收到的通知过多或过少时,可以使用这些设置。
Email reminders(邮件提醒)
站内通知之外,你还可以通过邮件提醒补充通知,例如在每天的固定时间收到摘要,或在被 @提及的瞬间立即收到邮件。相关说明见 Email reminders 与 账号设置中的邮件提醒。
邮件提醒的默认配置为工作日(周一至周五)每天凌晨 2 点发送日报摘要;你也可以选择立即接收、仅在特定日期/时间接收、暂停提醒邮件或完全关闭。若选择了"被 @提及时立即通知",该提醒不会重复出现在日报摘要中。
与其他通知形态的关系
- 工作包提醒(Reminders):在工作包详情视图中点击Reminder(闹钟)图标,可选择明天、3 天后、一周后、一个月后或指定日期/时间。预定义选项的时间默认为所选日期的上午 9 点,可调整并可附带备注;到点后提醒会出现在通知中心,且当同一工作包存在多条通知时提醒优先展示(详见 Work package reminders)。
- 邮件通知:系统每天会通过邮件发送一次所有通知的汇总(once-a-day summary),也可以与站内通知并行使用。如果你倾向于完全不使用站内通知,可以关闭对应偏好并依赖邮件渠道。
小结
OpenProject 的站内通知体系由"通知记录 + 通知中心 + 偏好设置"三层构成:后端Notification模型持久化每条通知及其原因(app/models/notification.rb),NotificationsController负责收件箱渲染、筛选与批量已读(app/controllers/notifications_controller.rb),路由/notifications汇聚所有入口(config/routes.rb),前端 Angular 组件完成分屏、徽章与筛选交互。通过合理组合原因筛选、项目筛选、日期预警与项目级覆盖设置,你可以把通知中心打造成完全贴合个人工作流的变更中枢。
【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考