使用GoJS构建项目管理流程图表的Vue组件

最终效果图:

在现代项目管理中,可视化工具是帮助团队理解任务依赖关系、关键路径和时间表的重要手段。本文将介绍如何使用GoJS库在Vue.js中构建一个项目管理图表组件,展示任务的早期开始时间、持续时间、早期完成时间、延迟开始时间、延迟完成时间以及任务的松弛时间。

1. 项目背景

GoJS是一个功能强大的JavaScript库,专门用于构建交互式图表和数据可视化。它支持多种图表类型,包括流程图、组织结构图、网络图等。在本文中,我们将使用GoJS来构建一个项目管理图表,展示任务之间的依赖关系以及每个任务的时间属性。

2. 代码分析
2.1 模板部分
<template>
  <div
    ref="myDiagramDiv"
    style="width:1400px; height:600px; background-color: #DAE4E4;"
  />
</template>

在Vue组件的模板部分,我们定义了一个div元素,用于承载GoJS图表。ref属性用于在Vue组件中引用这个DOM元素,以便在脚本部分对其进行操作。图表的宽度和高度分别设置为1400px和600px,背景颜色为#DAE4E4

2.2 脚本部分
<script>
import * as go from 'gojs'
let $ = go.GraphObject.make
export default {
  name: 'SupervisorControl',
  data() {
    return {
      myDiagram: null
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      var blue = '#0288D1'
      var pink = '#ccc'
      var pinkfill = '#ccc'
      var bluefill = '#B3E5FC'
      this.myDiagram =
      $(go.Diagram, this.$refs.myDiagramDiv,
        {
          initialAutoScale: go.Diagram.Uniform,
          layout: $(go.LayeredDigraphLayout)
        })
      this.myDiagram.nodeTemplate =
      $(go.Node, 'Auto',
        $(go.Shape, 'Rectangle',
          { fill: 'white', strokeWidth: 2 },
          new go.Binding('fill', 'critical', function(b) { return (b ? pinkfill : bluefill) }),
          new go.Binding('stroke', 'critical', function(b) { return (b ? pink : blue) })),
        $(go.Panel, 'Table',
          { padding: 0.5 },
          $(go.RowColumnDefinition, { column: 1, separatorStroke: 'black' }),
          $(go.RowColumnDefinition, { column: 2, separatorStroke: 'black' }),
          $(go.RowColumnDefinition, { row: 1, separatorStroke: 'black', background: 'white', coversSeparators: true }),
          $(go.RowColumnDefinition, { row: 2, separatorStroke: 'black' }),
          $(go.TextBlock, // earlyStart
            new go.Binding('text', 'earlyStart'),
            { row: 0, column: 0, margin: 5, textAlign: 'center' }),
          $(go.TextBlock, new go.Binding('text', 'length'),
            { row: 0, column: 1, margin: 5, textAlign: 'center' }),
          $(go.TextBlock, // earlyFinish
            new go.Binding('text', '',			 function(d) { return (d.earlyStart + d.length).toFixed(2) }),
            { row: 0, column: 2, margin: 5, textAlign: 'center' }),
          $(go.TextBlock,
            new go.Binding('text', 'text'),
            {
              row: 1, column: 0, columnSpan: 3, margin: 5,
              textAlign: 'center', font: 'bold 14px sans-serif'
            }),
          $(go.TextBlock, // lateStart
            new go.Binding('text', '',				 function(d) { return (d.lateFinish - d.length).toFixed(2) }),
            { row: 2, column: 0, margin: 5, textAlign: 'center' }),
          $(go.TextBlock, // slack
            new go.Binding('text', '',				 function(d) { return (d.lateFinish - (d.earlyStart + d.length)).toFixed(2) }),
            { row: 2, column: 1, margin: 5, textAlign: 'center' }),
          $(go.TextBlock, // lateFinish
            new go.Binding('text', 'lateFinish'),
            { row: 2, column: 2, margin: 5, textAlign: 'center' })
        )
      )
      function linkColorConverter(linkdata, elt) {
        var link = elt.part
        if (!link) return blue
        var f = link.fromNode
        if (!f || !f.data || !f.data.critical) return blue
        var t = link.toNode
        if (!t || !t.data || !t.data.critical) return blue
        return pink
      }

      this.myDiagram.linkTemplate =
      $(go.Link,
        { toShortLength: 6, toEndSegmentLength: 30 },
        $(go.Shape,
          { strokeWidth: 2 },
          new go.Binding('stroke', '', linkColorConverter)),
        $(go.Shape, // arrowhead
          { toArrow: 'Triangle', stroke: null, scale: 1 },
          new go.Binding('fill', '', linkColorConverter))
      )
      var nodeDataArray = [
        { key: 1, text: 'Start', length: 0, earlyStart: 0, lateFinish: 0, critical: true },
        { key: 2, text: 'a', length: 4, earlyStart: 0, lateFinish: 4, critical: true },
        { key: 3, text: 'b', length: 5.33, earlyStart: 0, lateFinish: 9.17, critical: false },
        { key: 4, text: 'c', length: 5.17, earlyStart: 4, lateFinish: 9.17, critical: true },
        { key: 5, text: 'd', length: 6.33, earlyStart: 4, lateFinish: 15.01, critical: false },
        { key: 6, text: 'e', length: 5.17, earlyStart: 9.17, lateFinish: 14.34, critical: true },
        { key: 7, text: 'f', length: 4.5, earlyStart: 10.33, lateFinish: 19.51, critical: false },
        { key: 8, text: 'g', length: 5.17, earlyStart: 14.34, lateFinish: 19.51, critical: true },
        { key: 9, text: 'Finish', length: 0, earlyStart: 19.51, lateFinish: 19.51, critical: true }
      ]
      var linkDataArray = [
        { from: 1, to: 2 },
        { from: 1, to: 3 },
        { from: 2, to: 4 },
        { from: 2, to: 5 },
        { from: 3, to: 6 },
        { from: 4, to: 6 },
        { from: 5, to: 7 },
        { from: 6, to: 8 },
        { from: 7, to: 9 },
        { from: 8, to: 9 }
      ]
      this.myDiagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray)
      this.myDiagram.add(
        $(go.Node, 'Auto',
          $(go.Shape, 'Rectangle', { fill: bluefill }),
          $(go.Panel, 'Table',
            $(go.RowColumnDefinition, { column: 1, separatorStroke: 'black' }),
            $(go.RowColumnDefinition, { column: 2, separatorStroke: 'black' }),
            $(go.RowColumnDefinition, { row: 1, separatorStroke: 'black', background: bluefill, coversSeparators: true }),
            $(go.RowColumnDefinition, { row: 2, separatorStroke: 'black' }),
            $(go.TextBlock, 'Early Start', { row: 0, column: 0, margin: 5, textAlign: 'center' }),
            $(go.TextBlock, 'Length', { row: 0, column: 1, margin: 5, textAlign: 'center' }),
            $(go.TextBlock, 'Early Finish', { row: 0, column: 2, margin: 5, textAlign: 'center' }),
            $(go.TextBlock, 'Activity Name', {
              row: 1, column: 0, columnSpan: 3, margin: 5,
              textAlign: 'center', font: 'bold 14px sans-serif'
            }),
            $(go.TextBlock, 'Late Start', { row: 2, column: 0, margin: 5, textAlign: 'center' }),
            $(go.TextBlock, 'Slack', { row: 2, column: 1, margin: 5, textAlign: 'center' }),
            $(go.TextBlock, 'Late Finish', { row: 2, column: 2, margin: 5, textAlign: 'center' })
          )
        ))
    }
  }
}
</script>

在脚本部分,我们首先导入了GoJS库,并定义了一个Vue组件。组件的data函数返回一个对象,其中包含一个myDiagram属性,用于存储GoJS图表的实例。

mounted生命周期钩子中,我们调用了init方法,该方法负责初始化GoJS图表。init方法中,我们定义了节点的模板和链接的模板,并设置了图表的布局和自动缩放选项。

节点的模板使用了go.Nodego.Shape来定义节点的外观,并使用go.Panelgo.TextBlock来显示任务的时间属性和名称。链接的模板使用了go.Linkgo.Shape来定义链接的外观,并根据任务的关键路径设置链接的颜色。

最后,我们定义了一个节点数据数组和一个链接数据数组,并将它们传递给go.GraphLinksModel来创建图表的数据模型。

3. 总结

通过本文的介绍,我们了解了如何使用GoJS库在Vue.js中构建一个项目管理图表组件。该组件能够展示任务的早期开始时间、持续时间、早期完成时间、延迟开始时间、延迟完成时间以及任务的松弛时间。通过这种方式,团队可以更直观地理解项目的进度和任务之间的依赖关系,从而更好地进行项目管理和决策。

GoJS的强大功能使得构建复杂的图表变得简单,而Vue.js的组件化开发方式则使得代码更加模块化和易于维护。希望本文能够帮助你在实际项目中应用这些技术,提升项目管理的效率和可视化效果。

 跨浏览器,可兼容IE7--IE10, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件。  多系统兼容性、可移植性:由于只包括前台UI,因此二次开发者可很方便将本插件用在任何一种需要流程图的B/S系统应用上,流程图的详细实现逻辑完全交于后台程序开发者自己实现;对于后台,只要能返回/接收能被本插件解析的JSON格式数据即可.所以本插件可用于不同的服务器语言建立的后台上.  跨领域:流程图设计器不止用在电信领域,在其它需要IT进行技术支持的领域中都有重大作用.  以下从纯技术实现层面具体描述:  页面顶部栏、左边侧边栏均可自定义;  当左边的侧边栏设为不显示时,为只读状态,此时的视图区可当作是一个查看器而非编辑器。  侧边工具栏除了基本和一些流程节点按钮外,还自定义新的节点按钮,自定义节点都可以有自有的图标、类型名称,定义后在使用可可在工作区内增加这些自定义节点。  顶部栏可显示流程图数据组的标题,也可提供一些常用操作按钮。  顶部栏的按钮,除了撤销、重做按钮外,其余按钮均可自定义点击事件。  可画直线、折线;折线还可以左右/上下移动其中段。  具有区域划分功能,能让用户更直观地了解哪些节点及其相互间的转换,是属于何种自定义区域内的。  具有标注功能,用橙红色标注某个结点或者转换线,一般用在展示流程进度时。  能直接双击结点、连线、分组区域中的文字进行编辑  在对结点、连线、分组区域的各种编辑操作,如新增/删除/修改名称/重设样式或大小/移动/标注时,均可捕捉到事件,并触发自定义事件,如果自定义事件执行的方法返回FALSE,则会阻止操作。  具有操作事务序列控制功能,在工作区内的各种有效操作都能记录到一个栈中,然后可以进行撤销(undo())或重做(redo()),像典型的C/S软件一样。  0.4版中,加入了只导出在初始载入后被编辑的流程图中,只作了增删改等变更的元素,这样可用于用户快速存储,只保存本次变更过的内容,不用重新保存整个流程。  0.5版中,结点的样式不再受到原有程序的限制,所有样式均默认为淡蓝色长方形;如果要指定为圆形,可在初始化时定义结点类型为”原有类型”+” round”;如果要指定为复合结点,则可在初始化时定义结点类型为”原有类型”+” mix”。”原有类型”+” myType”:myType可为自己写的一种特殊样式类.  0.6版中,修正了一些BUG,改善了用户操作体验,并增加在可编辑状态下时,能用键盘上DELETE按键对元素进行删除功能。  0.7版中,修正了一些BUG,增加了连线变更要连的起始结点或结束结点的功能。  0.8版,取消原来的拟物化页面,变成如今的扁平化页面,并且支持主要位置的颜色自定义功能(如果想沿用原来老版本中的拟物化页面,只需保留原来的GooFlow.css文件即可);修正0.7版中的画线BUG。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值