OpenProject 6.1.1 发布说明:工作包、时间线与搜索模块的关键缺陷修复解析
2026/9/17 1:19:07 网站建设 项目流程

OpenProject 6.1.1 发布说明:工作包、时间线与搜索模块的关键缺陷修复解析

【免费下载链接】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 仓库中的 6.1.1 官方发布说明(docs/release-notes/6/6-1-1/README.md),逐项解读该版本修复的核心缺陷及其背后的实现原理。通过对照当前仓库中的 Watcher、Spent time、关系页签、Textile 渲染、项目复制、全文搜索等模块的源码,你可以理解这些 Bug 的成因、修复思路以及对应功能在 OpenProject 中的底层实现方式,为排查同类问题或阅读源码提供参考。

版本概览

OpenProject 6.1.1 于 2016 年 11 月 29 日发布,是一个以Bug 修复和稳定性改进为主的补丁版本。与功能迭代版本不同,6.1.1 的核心价值在于:

  • 修复工作包(Work packages)模块中多处影响日常协作的关键问题;
  • 修复时间线(Timeline)聚合视图的加载缺陷;
  • 修复项目复制、搜索结果大小写与分页问题;
  • 消除传入邮件 cron 任务的弃用警告;
  • 集中修复一批界面设计问题。

工作包模块修复详解

6.1.1 中工作包模块的修复数量最多,下面按修复点逐一展开,并结合当前仓库源码说明对应功能的实现机制。

大量观察者(Watchers)场景下的选择问题

修复内容:在拥有过多潜在观察者的项目中,无法正常选择观察者。

在 OpenProject 中,观察者(Watcher)机制用于让用户订阅工作包等对象的动态。从源码看,该机制基于多态关联实现:Watcher模型通过belongs_to :watchable, polymorphic: true关联到工作包、Wiki 页面、消息、新闻、论坛等多种对象,并通过user_id的唯一性约束保证同一用户对同一对象只能关注一次(app/models/watcher.rb)。

class Watcher < ApplicationRecord belongs_to :watchable, polymorphic: true belongs_to :user validates :watchable, :user, presence: true validates :user_id, uniqueness: { scope: %i[watchable_type watchable_id] } # ... end

观察者的添加/移除由 app/controllers/watchers_controller.rb 中的watch/unwatch动作驱动,最终调用@watched.set_watcher(user, watching)完成写入。当项目成员(即潜在观察者)数量很大时,一次性加载全部候选用户的列表很容易造成渲染卡顿或选择器失效,这正是 6.1.1 修复的痛点。修复后,即便在成员众多的项目中,观察者选择器也能正常工作。

工作包“已花费时间”合计错误

修复内容:修复了工作包“Spent time”合计值显示错误的问题(#24349)。

“Spent time”(已花费时间)是 OpenProject 中统计工作包工时投入的核心指标。其计算逻辑封装在 app/models/work_packages/spent_time.rb 中:spent_hours返回该工作包及其所有子工作包的总工时,并且会遵循当前用户的权限(缺少view_time_entriesview_work_packages权限时,结果可能是实际工时的子集):

def spent_hours(user = User.current) if respond_to?(:hours) hours.to_f else compute_spent_hours(user) end || 0.0 end def compute_spent_hours(user) WorkPackage.include_spent_time(user, self) .pluck(Arel.sql("SUM(hours)")) .first end

6.1.1 修复的合计错误,通常源于列表视图/聚合查询中对工时列求和时的边界条件(如空值处理、权限过滤后的子集求和)处理不当。当前版本中,列表与查询的合计计算由 app/models/query/results/sums.rb 的all_total_sums/all_group_sums统一负责,通过SUM(...)聚合 SQL 生成总计与分组小计,这一套合计框架正是为规避此类合计偏差而演进的实现。

关系页签链接触发整页刷新

修复内容:关系页签(relation tab)中的链接会导致硬刷新(hard reload),而不是直接在页内展示关联工作包(#24265)。

关系页签用于展示工作包之间如“前置/后续”“阻塞/被阻塞”“重复/被重复”等关联关系。在 6.1.1 中,点击关系页签内的链接会触发整页重新加载,破坏单页应用的浏览体验。修复方向是让链接仅切换当前展示的工作包,而无需重载整个页面。

从当前源码看,该交互已经演进为由专门的控制器与 Turbo 流驱动:WorkPackageRelationsController负责创建/更新关系,并通过respond_with_relations_tab_update局部刷新关系页签(app/controllers/work_package_relations_controller.rb);前端交互组件则集中在 app/components/work_package_relations_tab/ 目录,例如index_component.rbrelation_component.rbwork_package_relation_dialog_component.rb,实现关系的新建、编辑对话框与页内更新。

Textile 代码块未阻止代码执行

修复内容:工作包描述中,Textile 的<pre>@语法未能阻止代码执行。

这是 6.1.1 修复中值得重视的安全类缺陷。OpenProject 的工作包描述使用 Textile 轻量标记语言渲染,其中<pre>@(行内代码)本应作为“纯文本代码块”原样输出、转义内部 HTML;若转义失效,用户提交的描述中嵌入的 HTML/脚本代码可能在渲染时被当作真实标签执行,构成 XSS(跨站脚本)风险。6.1.1 修复了 Textile 渲染管线中代码块/行内代码的转义遗漏,确保代码内容以文本形式安全展示。

“Spent time”链接在子目录部署下 404

修复内容:工作包表格上的“Spent time”链接在子目录(subfolder)部署方式下返回 404(#24427)。

OpenProject 支持部署在域名子路径下(如https://example.com/openproject/)。该 Bug 的成因是工作包表格中的“Spent time”链接按绝对路径拼接,未考虑应用挂载的子目录前缀,导致跳转到错误路径。6.1.1 修正了该链接的路径生成逻辑,使其在子目录部署下同样可用。当前仓库中,此类链接生成统一通过url_for/link_to等 Rails 路由辅助方法并配合relative_url_root处理,从机制上避免了硬编码绝对路径带来的部署迁移问题。

工作包描述中换行符未显示

修复内容:工作包描述中的换行(line breaks)无法正确显示(#24428)。

该问题与 Textile 渲染规则相关:纯文本中的换行在部分标记语言中需要特定的换行指令才能渲染为可见换行。6.1.1 修复后,工作包描述中用户输入的换行能够按预期显示,不再被折叠为单行文本。

时间线(Timeline)聚合视图加载修复

修复内容:以聚合(aggregation)方式显示的时间线,在初始加载时无法展示。

时间线是 OpenProject 甘特图功能的基础视图,支持将多个项目/工作包的日程汇总展示。6.1.1 修复了聚合时间线在页面初始加载阶段不渲染的问题——此前该视图需要依赖额外的交互或刷新才会出现,修复后加载即正确呈现。

项目复制缺陷修复

修复内容:项目无法被复制(#24323)。

项目复制是 OpenProject 中基于已有项目快速创建新项目的重要能力,涉及工作包、Wiki、成员、自定义字段等大量关联数据的级联复制。6.1.1 修复了复制流程中的故障,使项目复制操作恢复正常。当前仓库中该能力的服务实现位于 app/services/projects/ 目录(如copy_service.rb等),其核心思路是将源项目各模块的关联数据逐一迁移到新项目,任何一步的异常都会导致整体复制失败,这也解释了为何此类缺陷会以“项目无法复制”的整体表象出现。

搜索模块修复详解

6.1.1 对全局搜索做了两处针对性修复。

搜索结果仅返回大小写敏感匹配

修复内容:搜索仅显示大小写敏感的匹配结果(#24282)。

正常的全文搜索应同时命中大小写不同的写法(如搜索openproject应同时匹配OpenProject)。6.1.1 之前,搜索行为退化为仅匹配完全同大小写的结果,大幅降低搜索召回率。修复后搜索重新按大小写不敏感方式匹配。

搜索结果分页失效

修复内容:搜索结果的分页功能损坏(#24345)。

当搜索结果超过单页容量时,分页链接无法正确跳转到后续页。6.1.1 修复了搜索结果的翻页逻辑,保证大量结果可正常浏览。当前仓库中,搜索控制器为 app/controllers/search_controller.rb,分页展示统一由 app/helpers/pagination_helper.rb 辅助方法渲染,页面参数与结果集范围的一致性正是分页正确性的关键。

其他修复与改进

传入邮件 cron 任务的弃用警告

修复内容:每当调用接收传入邮件(incoming emails)的 cron 任务时,都会显示一条弃用警告(#24306)。

OpenProject 支持通过邮件创建/更新工作包(即“传入邮件”功能),通常以 cron 定时任务调用 Rake 任务抓取邮箱实现。6.1.1 修复了该任务触发时输出弃用警告的问题,消除运维日志中的噪音,让真实的异常信息更易被识别。

设计问题集中修复

修复内容:一批界面设计缺陷被集中修复,涉及编号 #24263、#24274、#24286、#24289、#24297、#24301、#24334、#24335、#24339、#24372、#24373 等多个工作包。

这些修复覆盖了不同页面上的样式与交互细节问题,虽然单点影响较小,但集中修复有效提升了 6.1.1 整体界面的完成度与一致性。

社区贡献与后续信息

6.1.1 的修复成果离不开社区反馈。官方发布说明特别感谢了 Marc Vollmer、Markus Hillenbrand、Nicolai Daniel 与 Christophe Mornet 等社区成员提交缺陷报告。OpenProject 的缺陷报告流程记录在 docs/development/report-a-bug/README.md 中,核心步骤如下:

  1. 登录或注册 OpenProject 社区平台;
  2. 先用搜索栏确认是否已有相同缺陷报告,有则补充评论;
  3. 若无,打开缺陷表单创建新报告;
  4. 填写精确的主题与详细描述(含复现前置条件、复现步骤、期望与实际行为);
  5. 可选附上截图或日志文件(自托管用户可在复现时运行sudo openproject logs收集日志);
  6. 点击Create提交。

如需了解更完整的修复清单,可查阅仓库根目录的 CHANGELOG.md,其中记录了各版本的详细变更;6.1.1 及其后续版本的时间线与其他发布说明则位于 docs/release-notes/ 目录下,按主版本号分目录组织,便于按版本追溯功能演进与缺陷修复历史。

【免费下载链接】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),仅供参考

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

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

立即咨询