OpenProject 站内通知中心(In-app Notifications)完整指南:收件箱、通知原因与偏好设置
2026/9/17 15:30:55 网站建设 项目流程

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):

  1. Area 1 – 按原因筛选:按你收到通知的原因过滤,包括被 @提及(@mention)、你是该工作包的指派对象(assignee)或责任人(accountable)、你关注的工作包、以及你设置了活动提醒或日期预警的工作包。
  2. Area 2 – 按项目筛选:按项目过滤,例如只看某个特定项目产生的通知。
  3. Area 3 – 视图控制
    • 选择查看Unread(仅未读)All(全部),其中All会包含之前已标记为已读的通知;
    • Mark all as read(全部标记为已读)按钮可以一键清空通知收件箱。
  4. Area 4 – 通知设置入口:点击Settings按钮可查看或修改当前通知偏好,也可以从右上角头像 >Account settings>Notification settings进入。
  5. 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 end

read_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]对接,实现了前后端一致的筛选链路。

标记通知为已读

标记已读有三种入口:

  1. 通知行上的信封图标:点击行右侧的Mark as read(信封图标)按钮,会将该工作包对应的全部未读通知(即蓝色徽章上的数量)一次性标记为已读。

  1. 分屏视图底部的 Mark as Read 按钮:在分屏视图中打开工作包后,点击底部的Mark as Read按钮,效果与方式 1 相同。

  2. 工作包完整视图右上角的信封图标:在完整视图(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(项目级通知设置)

当你在某些项目更活跃、或某些活动(如日期预警、新建工作包)对你更重要时,可以在项目级别精细调整通知设置:

  1. 点击+ Add project-specific notifications按钮;
  2. 在出现的浮层表单中选择一个项目并指定通知设置;
  3. 保存后,页面会列出所有已配置项目级通知的项目,之后可随时修改。

[!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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询