OpenProject Agile Boards 实践指南看板类型、工作流与底层实现机制【免费下载链接】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 官方文档中的 Agile boards敏捷看板指南为核心系统讲解如何创建和配置 Basic board 与 KanbanStatus、Assignee、Version、Subproject、Parent-child 五类 Action board并基于modules/boards模块的源码实现深入剖析列表即查询、拖卡即改属性背后的技术机制。读完本文你将既能按步骤搭建团队可用的敏捷看板也能从源码层面理解看板的权限模型、列自动填充逻辑与卡片联动更新的原理。1. Boards 与 OpenProject 工作包体系的集成OpenProject 的 Boards 支持 Scrum、Kanban 等敏捷项目管理方法。看板由**列表lists即列和卡片cards即工作包**组成可以跟踪任务、缺陷、功能、风险等任意工作包类型。与 Gantt 图、工作包模块深度集成是 Boards 的核心特征卡片不是孤立的数据副本而是工作包work package本身在任意其他模块中对工作包做的修改都会实时反映在看板上。项目级入口进入项目后在左侧菜单选择Boards即可看到该项目下已创建的所有看板可点击看板名称或使用左侧搜索栏查找。实例级入口可通过全局模块菜单全局模块菜单以实例维度查看所有看板。前提条件使用该功能需要先在项目设置中激活 Boards 模块同时建议在实例管理后台核对角色与权限配置。从源码结构看这个前提条件是真实存在的硬性约束。引擎注册文件将 Boards 注册为项目模块board_view并声明它依赖work_package_tracking工作包跟踪模块# modules/boards/lib/open_project/boards/engine.rb project_module :board_view, dependencies: :work_package_tracking, order: 80 do permission :show_board_views, { boards/boards: %i[index show split_view], boards/menus: %i[show] }, permissible_on: :project, dependencies: :view_work_packages, contract_actions: { boards: %i[read] } permission :manage_board_views, { boards/boards: %i[index show new create destroy] }, permissible_on: :project, dependencies: %i[manage_public_queries save_queries], contract_actions: { boards: %i[create update destroy] } end这里定义了两个核心权限直接对应文档Manage boards一节的管理需求权限可执行的操作依赖的权限show_board_views查看看板列表、打开看板、分屏视图view_work_packages查看工作包manage_board_views新建、创建、删除看板manage_public_queries、save_queries同时该文件还注册了项目菜单项menu :project_menu, :boards和顶部/全局模块菜单项即文档中左侧菜单 Boards与全局模块菜单 Boards两个入口的出处。2. 创建新看板一个项目可以创建任意数量的 Agile board并按需配置。操作步骤进入项目的 Boards 菜单点击绿色的Board按钮弹出新建表单选择看板类型并填写标题可参考下两节保存后进入看板编辑界面。从源码看新建请求由 BoardsController的create动作处理它调用对应的创建服务service成功后重定向到新看板失败则以 422 状态重新渲染表单def create service_result service_call board_grid service_result.result if service_result.success? flash[:notice] I18n.t(:notice_successful_create) redirect_to project_work_package_board_path(project, board_grid) else render action: :new, status: :unprocessable_entity end end3. 看板类型选择Basic board 与 Action board3.1 类型定义free 与 action这是所有看板行为的分水岭Basic board基础看板可以自由创建列表、命名列表并自定义工作包排序。在列表之间移动工作包不会对工作包本身产生任何修改NO changes。适合任意需要灵活跟踪的活动例如创意管理。Action board行动看板每个列表代表所包含工作包某个属性的取值例如 Status 看板有 New、In Progress 等列表。将卡片移入某个列表会自动更新其对应属性添加列表后列表会自动填充符合该属性取值的工作包。源码对这一抽象的定义非常简洁。看板数据模型 Boards::Grid中def board_type options.with_indifferent_access[:type].to_sym || :free end def board_type_attribute return nil unless board_type :action options.with_indifferent_access[:attribute] end即看板本质上是一个带options的 Gridtype: free对应 Basic boardtype: action加attribute字段status / assignee / version 等对应各类 Action board。这个映射在创建服务 BaseCreateService中完成def options_for_grid(params) {}.tap do |options| if params[:attribute] basic options[:type] free else options[:type] action options[:attribute] params[:attribute] end end end3.2 Kanban board状态看板每个列表代表一个状态所有状态为 New 的工作包会自动显示在 New 列中。创建新的 Kanban board 时默认状态通常是 New下的所有工作包会自动生成为第一个列表其余列表需要手动添加限制并非任意两个状态之间都可以移动工作包——这取决于工作包类型的工作流workflow规则详见工作流规则与限制。源码印证了默认状态自动建列的行为。StatusBoardCreateService在创建看板时自动创建一个以默认状态为过滤条件的查询并把它作为第一列的 widgetdef query_name default_status.name end def query_filters [{ status_id: { operator: , values: [default_status.id.to_s] } }] end def default_status default_status || ::Status.default end3.3 Assignee board负责人看板每个列表代表一个负责人可选普通用户、占位用户或用户组group。把卡片从一个列表拖到另一个列表工作包的负责人会自动变更为目标列表所选的用户/组。3.4 Version board版本看板每个列表代表一个版本非常适合产品研发或软件发布的迭代规划创建新的 Version board 时当前项目所属的所有开放版本open versions会各生成一个列表其余版本需手动添加将卡片从一个列表移到另一个列表工作包的版本即自动变更为目标列表对应的版本。从源码看VersionBoardCreateService的自动填充逻辑与文档描述完全一致def versions(params) versions || Version.includes(:project) .where(projects: { id: params[:project].id }) .with_status_open end def query_filters(version) [{ version_id: { operator: , values: [version.id.to_s] } }] end即当前项目的、状态为开放open的每个版本各建一个按version_id过滤的查询列列名取版本名列数取max(4, 版本数)。3.5 Subproject board子项目看板每个列表代表一个子项目列表内即该子项目的工作包在列表内移动卡片 → 改变卡片顺序把卡片移到另一个列表 → 改变该工作包所属的子项目。3.6 Parent-child board父子工作包看板每个列表代表一个父工作包列表内显示其直接子工作包。注意两点只能选择当前项目中的工作包作为列表列表名该看板适合描绘工作分解结构WBS拖卡换列即把子工作包重新挂到另一个父工作包下只显示一层仅显示直接子工作包不显示孙子层。补充基于源码结构modules/boards/app/services/boards/目录下还存在一个SprintTaskBoardCreateService它会读取上一个 Sprint 看板的列顺序或从 Sprint 工作包所属类型的状态列表自动建列并将看板与Sprint对象关联service_result.result.linked params[:sprint]。可以推断这是为 Scrum 冲刺sprint任务板提供支撑的实现与文档正文描述的通用 Action board 类型同属一套创建服务体系。4. 为看板设置标题为看板选择一个有意义的标题让其他团队成员清楚看板的用途如2024 发布看板支持工单流。标题是强制字段——数据模型 Boards::Grid中声明了validates :name, presence: true且to_s会输出Boards 看板名形式用于菜单、附件等场景的展示。5. 添加与删除列表列表lists通常代表状态工作流、负责人、版本或你想跟踪的任何维度一个看板可以添加任意数量的列表Action board 的列表可用列表取决于所选看板类型。记住卡片在列表间移动时对应属性如状态会自动更新Basic board 的列表可任意创建并命名列表间移动卡片不会触发任何属性更新。操作方式点击 add list为看板添加列表。Basic board 的列表可赋予任意有意义的名称Action board 的列表名由类型决定例如 Status 看板的 New、In Progress 等。底层机制一个列表 一个查询 widget这是理解 OpenProject 看板的关键设计。GridRegistration注册了看板可用的 widget 类型work_package_query默认网格为1 行 × 4 列grid_class Boards::Grid to_scope :project_work_package_boards_path widgets work_package_query defaults - { { row_count: 1, column_count: 4, widgets: [] } }创建服务 BaseCreateService在保存前会先调用Queries::CreateService按看板类型生成过滤条件如status_id、version_id、manual_sort再为每个列表创建一个work_package_querywidgetoptions中保存queryId与filters。以 Basic board 为例BasicBoardCreateService其自动生成的唯一列表使用手动排序过滤条件def query_name Unnamed list end def query_filters [{ manual_sort: { operator: ow, values: [] } }] end这就解释了文档中的两个现象Basic board 第一列表默认名为 Unnamed list 且支持自由拖拽排序manual_sortAction board 的列表一旦创建即自动被相应工作包填满——因为列表背后是一个带属性过滤条件的查询。删除列表点击列表标题旁的三个点选择Delete list即可删除列表。6. 向列表添加卡片卡片代表 OpenProject 中的工作包可以是项目中的任何工作Task、Bug、Feature、Risk 等。点击列表标题下方的添加卡片两种方式Add new card输入标题后按 Enter创建一张新卡片新工作包Add existing输入现有工作包的标题或 ID 后按 Enter将其作为卡片加入该列表。还可以用工作包类型和状态来更快定位目标工作包。注意对于 Action board手动添加的卡片同样受列表属性约束——若该工作包的状态/负责人/版本与列表不符它并不属于该列表的查询结果这是列表即查询设计的直接推论。7. 更新卡片卡片支持以下更新方式拖拽移动在列表内或跨列表拖放卡片。记住在 Action board 中把卡片移到另一个列表会自动更新其属性如状态直接在卡片上改状态除 Status 看板外可直接在卡片下拉框中更新工作包的状态双击卡片打开工作包的全屏视图fullscreen view卡片顶部的箭头按钮可返回看板视图点击 Open details view蓝色 i打开工作包的分屏视图split screen view点击其右上角的x关闭。分屏视图在控制器层面有专门入口BoardsController的split_view动作在turbo_frame_request?时渲染work_packages/split_view否则渲染看板视图本身与文档描述的从卡片 i 图标进入分屏对应。8. 移除卡片Basic board将鼠标悬停在卡片上点击X即可移除Action board当工作包的对应属性如状态被改变后卡片会自动从该列表消失因为它不再匹配列表的查询条件重要移除卡片不会删除工作包。你可以随时重新把它添加到列表中或通过工作包work packages模块访问它。9. 看板管理与权限创建新看板 / 打开已有看板 / 删除看板都在 Boards 主菜单项中完成权限维护如需要在系统管理后台核对并更新看板的角色与权限即 1 节表格中的show_board_views/manage_board_views两个权限。删除看板还有一个源码层面的重要细节Boards::Grid声明了before_destroy :delete_queries——删除看板时会连带删除看板内各列表所绑定的查询widgets 中的queryId且仅删除当前用户有destroy权限的查询before_destroy :delete_queries, prepend: true ... def delete_queries policy QueryPolicy.new(User.current) contained_queries .select { |q| policy.allowed?(q, :destroy) } .each(:delete) end也就是说删除看板是清理看板及其列表查询不会删除卡片对应的工作包与 8 节移除卡片不删除工作包的原则一致。10. Agile boards 实战示例10.1 Basic board 示例在 OpenProject 中自由创建任意列表来组织团队为部门组织任务、规划团队活动、按主题收集反馈、协调不同地点的任务、头脑风暴创意等。每位成员都可以往看板里加任务看板随时间自然增长——无需 Excel 文件和单一协调人任何人都能在任何时间、任何地点获取最新信息。10.2 Action boards 示例Status board状态看板Status Action board 可能是使用最广泛的敏捷看板。可以从 new、in progress、closed 三个基础状态起步再根据工作方式增补所需状态。它实现了 KANBAN 原则——持续改进工作流。例如映射订单处理流程用状态看板让工单ticket依次经过收到订单new→ 处理中in progress→ 完成closed同时订单流程中的伴随工作包如新增一种支付选项也会显示在该看板中提供全局概览。不同部门的多人协作时无需反复询问即可掌握每个工作包所处的阶段。Assignee board负责人看板清晰知道谁在做什么。跨职能团队共同开发产品时需要掌握每个人的工作内容和进度。负责人看板提供责任概览、团队负载与任务分配情况让职责清晰化——例如市场团队知道财务团队在做产品成本测算但整体产品盈利性仍需自己核查。列表中的负责人既可以用组group也可以具体到单个成员。Version board版本看板版本看板支持跨多个迭代的产品研发规划每个迭代都能添加并完善功能。若某个功能在当前版本中过于复杂有其他更高优先级功能需要开发只需把它拖到下一个版本列系统会自动更新工作包的版本。该看板让你一眼看清接下来会发布什么并快速验证是否符合优先级——不符合时直接拖拽调整。10.3 复制看板作为模板自定义好的看板可以随项目整体复制作为新看板的起点。注意一个限制Subproject board 中的子项目不会被复制。小结OpenProject 的 Agile boards 以列表即查询、卡片即工作包为核心模型Basic board 提供完全自由的列表组织type: freeAction board 则把列表与状态、负责人、版本、子项目、父子关系等属性绑定type: actionattribute拖卡即完成属性更新。模块激活依赖工作包跟踪模块查看与创建删除分别由show_board_views与manage_board_views两个项目级权限控制创建与自动建列逻辑集中在modules/boards/app/services/boards/下的各*BoardCreateService中数据模型位于 Boards::Grid路由与控制器入口在 boards_controller.rb。掌握这些机制后你可以按团队的工作方式选择看板类型并从源码层面定位任何看板行为的实现出处。【免费下载链接】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),仅供参考