vue2中实现Antv g6 流程图 以及自定义节点

本案例 antv g6版本: "@antv/g6": "^3.4.8",

效果:

1.引入antv g6和echarts差不多

  <div class="line">
     <div id="mountNode"></div>
  </div>
<script>
import G6 from '@antv/g6';
export default {
    data(){
        return{
        
            // 拓扑数据结构
            // 定义数据源
         data:{
            "nodes": [
              {
                "id": "1",
                "name": "service-1",
                "type": "service",
                "statistics": {
                  "trace_num": 435,
                  "duration_avg": 2.312,
                  "alert_num": 21,
                  "situation_num": 3
                }
              },
              {
                "id": "2",
                "name": "service-2",
                "type": "service",
                "statistics": {
                  "trace_num": 435,
                  "duration_avg": 2.312,
                  "alert_num": 21,
                  "situation_num": 3
                }
              },
              {
                "id": "3",
                "name": "service-3",
                "type": "service",
                "statistics": {
                  "trace_num": 435,
                  "duration_avg": 2.312,
                  "alert_num": 21,
                  "situation_num": 3
                }
              }
            ],
            "edges": [
              {
                "source": "1",
                "target": "2",
                "edge_type": "deploy"
              },
              {
                "source": "1",
                "target": "3",
                "edge_type": "deploy"
              }

            ]
          },
        }
    },
    created(){
    
     
    },
    mounted(){
      this.initG6();
    },
    methods:{
     
    //  业务数据拓扑图
         initG6(){
               const that = this;
            G6.registerNode(
                "service", //第一个参数自定义节点的名字
                // 第二个参数是这个节点的图形分组
                {
                draw: function (cfg,group){
                //根据数据动态改变颜色或者图片
                    let colortext2=cfg.statistics.duration_avg>1 ?"red" :"#226DFF";
                  let img2=cfg.statistics.duration_avg>1 ?require('../../../../../assets/shouye备份1.png') :require('../../../../../assets/shouye备份.png');
                  let colortext3=cfg.statistics.alert_num>20 ?"red" :"#226DFF";
                  let img3=cfg.statistics.alert_num>20 ?require('../../../../../assets/a-fuwuqilan2.png') :require('../../../../../assets/fuwuqilan.png');

                    // 增加一个图像 最外边的虚线框
                   let keyShape=group.addShape('rect',{
                    //    代表矩形的一些属性
                       attrs:{
                        //    相对定位
                           x:0,
                           y:0,
                           width:200,
                           height:150,
                           stroke:"#B0C6E0",   //描边色
                           fill:"#EBE9E9",  //填充颜色
                           radius:3,
                           lineWidth:1,
                           lineDash:[2,2]  //设置虚线的样式
                           
                       },
                       name:"card-node-keyShape" //起个唯一名字便于识别
                    });
                  
                 
                    group.addShape("rect",{
                      attrs:{
                           x:10,
                           y:60,
                           width:180,
                           height:80,
                          //  stroke:"pink",   //描边色
                           fill:"#F3FAFF",
                           radius:3,   
                      },
                      name:"card-node-titleShape"
                    });
                    group.addShape("rect",{
                      attrs:{
                        x:100,
                        y:65,
                        width:1,
                        height:70,
                        fill:"#eee"
                      },
                      name:"card-node-line"
                    });
                    group.addShape("rect",{
                      attrs:{
                        x:20,
                        y:100,
                        width:160,
                        height:1,
                        stroke:"#eee",
                        fill:"#eee"
                      },
                      name:"card-node-heng"
                    });
                        group.addShape('rect',{
                      attrs:{
                        x:10,
                        y:8,
                        width:3,
                        height:20,
                        fill:"#226DFF", 
                      },
                      name:"card-node-border"
                    });
                    group.addShape('text',{
                      attrs:{
                        text:cfg.type,
                        x:20,
                        y:10,
                        fontSize:18,
                        fill:"block",
                        textBaseline:"top"
                      },
                      name:"card-node-serve"
                    });
                    group.addShape('text',{
                      attrs:{
                        text:cfg.name,
                        x:20,
                        y:40,
                        fontSize:18,
                        fill:"block",
                        textBaseline:"top"
                      },
                      name:"card-node-title"
                    });
                    // 业务模块
                    group.addShape("image",{
                      attrs:{
                        x:20,
                        y:70,
                        width:20,
                        height:20,
                        img:require('../../../../../assets/yewu1.png'),
                      },
                      name:"card-node-yewuico"
                    });
                        group.addShape("text",{
                      attrs:{
                        text:cfg.statistics.trace_num,
                        x:50,
                        y:90,
                        fill:"#226DFF"
                      },
                       name:"card-node-text1",
                    });
                    // 平均响应时长
                      group.addShape("image",{
                      attrs:{
                        x:110,
                        y:70,
                        width:20,
                        height:20,
                        img:img2,
                      },
                      name:"card-node-haoshiico"
                    });
                     group.addShape("text",{
                      attrs:{
                        text:cfg.statistics.duration_avg*1000+"ms",
                        x:135,
                        y:90,
                        fill:colortext2
                      },
                       name:"card-node-text2",
                    });
                    // 告警模块
                    group.addShape("image",{
                      attrs:{
                        x:20,
                        y:110,
                        width:20,
                        height:20,
                        // img: require('../assets/fuwuqilan.png'),
                        img:img3,

                      },
                      name:"card-node-fuwuqiico"
                    });
                      group.addShape("text",{
                      attrs:{
                        text:cfg.statistics.alert_num,
                        x:50,
                        y:130,
                        fill:colortext3
                      },
                       name:"card-node-text2",
                    });
                    // 故障模块
                     group.addShape("image",{
                      attrs:{
                        x:110,
                        y:110,
                        width:20,
                        height:20,
                        img:require('../../../../../assets/situation.png'),
                      },
                      name:"card-node-fuwuqiico"
                    });
                      group.addShape("text",{
                      attrs:{
                        text:cfg.statistics.situation_num,
                        x:140,
                        y:130,
                        fill:"#226DFF"
                      },
                       name:"card-node-text2",
                    });
                    return keyShape; 
                 },
                 
                },'rect'); //第三个参数,是如果没有设置样式,会默认继承rect的样式
              // 创建 G6 图实例
              
        const graph = new G6.Graph({
            container: 'mountNode', // 指定图画布的容器 id,与第 9 行的容器对应
            // 画布宽高
            width:1640,
            height:800,
             fitView: true, //自适应屏幕
             fitCenter: true, //屏幕中间
             modes:{
               default:['drag-canvas', 'zoom-canvas', 'drag-node']  //允许拖拽画布、缩放画布、拖拽节点
             },
        //设置默认节点
            defaultNode:{
            //这里直接使用上面自定义的节点
              type:"service"
            },
        //设置默认边的样式
            defaultEdge:{
              type:"polyline",
           
                style: {
                //按照官网的这样写报错,可能版本原因吧
                //  endArrow: {
                //     path: G6.Arrow.triangle(10, 20, 25),
                //     d: 25,
                //     },
                //这是网上找的一个写法,具体参数是如何实现我也不知道,自己可以都是试下
                 endArrow: {
                   path: 'M 0,0 L 20,10 L 20,-10 Z',
                    d: 0,
                   fill: '#226DFF',
                    // stroke: '#0f0',
                    // opacity: 0.5,
                    // lineWidth: 3,
                },
                  stroke:"#226DFF" , 
                
                },
            }
          });
          // 读取数据
          graph.data(this.data);
            //给节点添加点击事件
             graph.on('node:click', function(ev){
                        const shape = ev.name;
                        // const item = ev.item;
                            console.log("111",shape);
                            console.log("11111");
                            that.$router.push({
                                path:"/linkAnalysis/business/callChain",
                            })
                        });
          // 渲染图
          graph.render();
        }
    }
}
</script>

一定记得给盒子设置宽高

  .line{
          width: 95%;
          height: 800px;
          margin-left: 20px;
          margin-top: 20px;
          background-color: #eee;
          #mountNode{
            width: 100%;
            height:100%;
            }
      }

初学者一个,以上如有问题或者错误,多谢指出

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vue是一种现代化的JavaScript框架,可以用于构建用户界面。要实现绘制流程图的功能,可以借助Vue的强大功能和生态系统。 首先,需要选择一个适合绘制流程图的第三方库。常用的有mxGraph、GoJS和JointJS等。这些库提供了丰富的绘图工具和API,可以帮助我们快速实现绘制流程图的功能。 在Vue项目,可以使用npm或yarn等包管理工具安装所选择的第三方库。然后,在组件引入相关库文件,并使用相应的API方法来创建流程图。 在Vue组件,可以定义一个Canvas或Div元素作为绘制流程图的容器。通过调用第三方库的方法,可以在容器内创建节点、连线等图形元素,然后通过事件监听来处理用户的交互操作。 为了能够让用户自由操作和修改流程图,可以使用Vue的双向绑定功能,将图形元素的位置、形状等属性与Vue组件的数据进行绑定。这样,当用户拖动节点或调整连线时,数据会自动更新,从而实现图形的即时更新。 此外,可以使用Vue的计算属性来处理复杂的图形逻辑,例如判断节点之间的连线是否符合某些条件,以及根据用户的选择动态生成节点等。 最后,为了提高用户体验,可以使用Vue的过渡效果和动画来实现平滑的节点拖动、连线过渡等效果,让用户能够更直观地理解和操作流程图。 总之,通过利用Vue提供的强大功能和第三方库的支持,我们能够相对轻松地实现绘制流程图的功能,从而为用户提供一个友好和灵活的图形化界面。 ### 回答2: Vue.js是一个流行的JavaScript框架,可用于构建用户界面。要实现绘制流程图的功能,我们可以使用Vue.js的一些核心概念和功能来实现。 首先,我们可以利用Vue.js的组件化开发方式来构建流程图的各个组件。每个组件可以包含特定的功能,例如一个节点组件、一个箭头组件等等。通过将这些组件组合起来,我们可以构建出一个完整的流程图。 其次,我们可以使用Vue.js的数据驱动视图的特性来将流程图数据与视图进行绑定。这意味着我们可以定义一个流程图数据对象,其包含节点的坐标、连接的关系等信息。然后,我们可以将这个数据对象传递给流程图组件,并通过Vue.js的数据绑定将数据与视图进行关联。这样,当我们修改流程图数据时,视图会自动更新。 此外,Vue.js还提供了一些生命周期钩子函数和观察者模式,可以帮助我们实现流程图的一些特定功能。例如,当一个节点被点击时,我们可以通过生命周期钩子函数来触发特定的事件处理逻辑。或者使用观察者模式来监听数据的变化,从而实现一些自定义的逻辑。 最后,我们还可以利用Vue.js的动态组件功能来实现流程图编辑功能。通过动态组件,我们可以根据用户的操作,动态地添加、删除或修改节点和连接关系。并且,我们可以使用Vue.js的动画功能来实现一些视觉效果,例如节点拖拽或连接箭头的绘制过程。 综上所述,通过利用Vue.js的组件化开发、数据驱动视图、生命周期钩子函数、观察者模式和动态组件等特性,我们可以实现一个功能完备的流程图绘制工具。 ### 回答3: Vue可以通过使用图形库(如D3.js、jsPlumb等)来实现绘制流程图的功能。下面是一个简单的示例: 1. 首先,在Vue组件引入所需的图形库,可以通过npm安装或者CDN引入。 2. 在Vue的data选项定义流程图的数据结构,包括节点、连接和样式等。 3. 在Vue的template使用HTML元素来展示流程图的容器。 4. 在Vue的mounted钩子,通过图形库的API来实现流程图的绘制。首先获取到流程图的容器元素,然后根据数据结构,循环创建节点和连接,并添加到容器。 5. 在Vue的methods定义操作流程图的方法,如添加节点、删除节点、修改节点样式等。 6. 在Vue的template使用事件绑定来调用方法,实现流程图的交互操作。 7. 最后,在Vue的样式定义流程图的样式,使其更加美观。 通过以上步骤,我们可以在Vue实现绘制流程图的功能。需要注意的是,具体的实现方式会依赖所选用的图形库,不同图形库的API和使用方式可能会有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值