
OpenProject 9.0 新版本特性解读看板视图、工作包模板与源码实现剖析【免费下载链接】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/openprojectOpenProject 9.0发布于 2019-06-06是该版本系列的起点版本核心引入了三大能力面向 Scrum/Kanban 的看板视图BoardsEnterprise 附加模块、工作包模板Work Package Templates以及可个性化定制工作包视图的 My 页面。本文以 9.0.0 版本发布说明为主线逐一讲解各特性的功能定位与使用方式并结合当前仓库中modules/boards的源码实现剖析看板视图背后的数据模型、创建服务与权限体系帮助读者既会用功能也看得懂底层原理。一、OpenProject 9.0 发布总览9.0.0 是 OpenProject 9.x 系列的首个版本后续 9.x 维护版本9.0.1 ~ 9.0.4发布于 2019-06-07 至 2019-10-02见 9.x 版本发布说明索引。9.0.0 的新特性可概括为以下五点特性说明适用版本看板视图Boards以看板形式管理工作包支持 Scrum 与 Kanban 式敏捷管理Enterprise 云版 / Enterprise 本地版附加模块工作包模板为工作包类型定义模板新建同类型工作包时自动填充描述全部版本My 页面工作包小组件每个用户可在 My 页面添加并自定义工作包视图全部版本工作包表格更新负责人以头像直接显示工作包类型选择器更新全部版本易用性改进 大量 Bug 修复会议附件、全局工作包表筛选联动、过滤器自动补全等全部版本二、看板视图Enterprise 敏捷管理新模块2.1 功能定位与使用方式看板视图Board view是 9.0 引入的全新模块支持 Scrum 和 Kanban 风格的敏捷项目管理。根据发布说明看板视图支持以下组织方式按状态分列不同状态显示为看板列类似 Kanban 板可以直观、快速地更新工作包状态基础看板使用自定义名称定义列用于灵活搭建工作流按版本分列以版本作为列例如用于规划产品路线图。由于看板与工作包表格一样都是对工作包Work Packages的呈现方式因此可以方便地把传统项目管理和敏捷管理结合起来先在甘特图Gantt chart中排期任务再在看板视图中推进执行。需要特别注意的是版本边界9.0 时期使用看板功能必须使用 Enterprise 云版或 Enterprise 本地版Community 版用户当时需要通过申请 Enterprise 试用许可证来体验。更详细的使用文档参见用户指南中的 Agile Boards 章节。2.2 源码剖析看板即“网格 查询”当前仓库中的 boards 模块 保留了该功能的核心实现可以作为理解 9.0 看板架构的最佳依据。数据模型Boards::Grid 继承自 Grids::Grid。在 grid.rb 中可以看到看板在数据库层面并不是独立的“列 卡片”结构而是一个网格模型module Boards class Grid ::Grids::Grid belongs_to :project belongs_to :linked, polymorphic: true, optional: true, inverse_of: :task_boards validates :name, presence: true before_destroy :delete_queries, prepend: true set_acts_as_attachable_options view_permission: :show_board_views, delete_permission: :manage_board_views, add_permission: :manage_board_views这揭示了看板架构的三层结构Grid网格整个看板本身绑定到项目belongs_to :project可附带附件Widget组件/列每一列是一个Grids::Widget通过start_column等属性占据网格位置其options中携带一个queryId指向一个独立的工作包查询Query查询列内展示的工作包完全由查询定义决定——这正是发布说明中“看板与工作包表格一样都是工作包的呈现”的技术本质。同时源码明确了看板视图的权限三件套查看需show_board_views新增/删除需manage_board_views。common.yml 中的默认角色授权也印证了这一点非成员default_role_non_member与只读者default_role_reader仅获得show_board_views成员default_role_member额外获得manage_public_queries和manage_board_views。列的两种类型。看板列的类型由 Grid 的 options 决定board_type返回options[:type]取值为:free自由列基础看板或:action按某个工作包属性驱动如状态:action类型时再通过board_type_attribute记录具体属性名。这与发布说明中“状态列 / 自定义名称列 / 版本列”的划分一一对应。创建流程每种看板类型一个创建服务。在 boards_controller.rb 中service_class方法按前端传入的attribute参数分派到不同的创建服务def service_class { basic Boards::BasicBoardCreateService, status Boards::StatusBoardCreateService, assignee Boards::AssigneeBoardCreateService, version Boards::VersionBoardCreateService, subproject Boards::SubprojectBoardCreateService, subtasks Boards::SubtasksBoardCreateService }.fetch(board_grid_params[:attribute]) end以状态看板为例StatusBoardCreateService 会创建一个以默认状态过滤的公共查询并把它挂到唯一的工作包查询组件上def query_filters [{ status_id: { operator: , values: [default_status.id.to_s] } }] end def options_for_widgets(params) [ Grids::Widget.new( start_row: 1, start_column: 1, end_row: 2, end_column: 2, identifier: work_package_query, options: { queryId params[:query_id], filters query_filters } ) ] end而父类 BaseCreateService 封装了通用流程before_perform阶段先通过Queries::CreateService创建查询并回填query_id再构造Boards::Grid实例默认 1 行 × 4 列row_count_for_board返回 1、column_count_for_board返回 4。从源码结构看创建看板 “先建查询、再建网格、把查询挂到组件上”这与 2.1 节描述的“列即查询”模型完全吻合。此外当前仓库中还包含 SprintTaskBoardCreateService它通过多态关联linkedlinked_type: Sprint把看板与迭代Sprint绑定并为每个状态创建一个查询、按列排布组件——这属于 9.0 之后版本对 Boards 模块的扩展可作为理解该模块演进方向的参考。生命周期管理。Boards::Grid的before_destroy :delete_queries回调见 grid.rb会在删除看板时经 Policy 校验后级联清理其组件中关联的查询保证不残留孤儿查询数据。控制器层面同样有双重校验BoardsController在show/split_view之前执行authorize_work_package_permission即“拥有 boards 权限并不足以查看工作包”还需具备view_work_packages项目权限见 boards_controller.rb。三、工作包模板预定义结构快速创建工作包发布说明指出可以为工作包类型work package type定义模板。当创建一个定义了模板的新类型例如 Bug的工作包时模板会自动显示在工作包描述description中从而帮助用户以相似的信息快速创建工作包并减少出错。模板在工作包类型的配置中设置。从使用流程看该特性的价值在于管理员在工作包类型配置中为某一类型如“缺陷”填写模板文本用户新建该类型的工作包时描述框自动带出模板内容用户在模板基础上补充具体信息即可提交保证同类工作包信息结构一致、减少遗漏。这是“配置一次、处处生效”的典型场景模板与类型绑定而非与具体项目或工作包绑定因此所有使用该类型的项目均可受益。四、My 页面工作包小组件个人化的工作包视图9.0 允许每个用户在 My 页面个人首页添加工作包小组件work package widgets并自定义显示哪些工作包支持按工作包属性进行过滤和分组小组件内也可以直接展示甘特图。这一特性把“查询 视图”的能力下放到了个人层面用户在项目级视图之外拥有了跨项目、面向自己的定制化仪表盘。它与看板模块共享同一套查询驱动架构视图皆由查询定义是 OpenProject “一个查询模型支撑多种呈现”设计哲学的体现。五、更新的工作包表格头像化负责人与类型选择器9.0 对工作包页面做了两处直接的界面升级负责人Assignees直接以头像显示在工作包页面识别成本更低工作包类型选择器更新创建/切换类型时的交互更清晰。六、易用性改进9.0 还包含一组面向日常操作的细节改进发布说明列举了以下几项会议附件可以直接向会议议程 / 会议纪要添加附件例如图片全局工作包表创建流程优化在全局工作包表格创建新工作包时选定类型后项目菜单中只会列出该类型已启用的项目避免选择不可用的项目过滤器与工作包属性改进过滤器和属性选择支持自动补全auto-completion减少手动输入和拼写错误。这些改进的共同方向是缩短“选类型 → 选项目 → 填属性”操作链路上的每一步摩擦与工作包模板的特性形成互补。七、Bug 修复与升级指南9.0 包含大量 Bug 修复。发布说明未逐项列举而是指向了官方的特性清单与缺陷修复清单原文档中的外链为 2019 年时期的外部系统链接此处不再转载建议结合 9.x 版本发布说明 中的 9.0.1 ~ 9.0.4 维护版本说明获取后续小版本中针对 9.0 缺陷的持续修复记录。关于升级若使用 Enterprise 云版则始终运行在最新版本上对于本地安装升级前需完成若干小幅变更。具体的升级操作步骤请参见 安装与运维指南中的升级章节。八、小结OpenProject 9.0.0 通过“看板视图 工作包模板 My 页面小组件”三个特性把敏捷管理与个性化视图能力正式纳入产品主线。从当前仓库源码可以看到看板视图的实现是“Grid 承载、Widget 分列、Query 供数”的三层结构权限上以show_board_views/manage_board_views精细控制创建流程由一组按类型分派的 Service 完成见 modules/boards/app/services/boards 目录。理解这一架构既能帮助使用者正确配置看板与模板也能为开发者阅读 Boards/Grids 模块源码提供清晰的入口。【免费下载链接】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),仅供参考