使用bootstrap 和 gooflow 完成demo

参考 Jquery版API文档

用到最主要的两个数据结构定义

1、描述单个节点信息的Json结构体。

NodeItem 类型:Json Object

描述单个节点信息的Json结构体。

属性 类型 默认值 描述
name String ('node_'+序列号) 节点的显示名称。
left Number 0 节点相对于工作区的左边距,单位像素。
top Number 0 节点相对于工作区的顶距,单位像素。
width Number 104 节点宽度,单位像素;仅非圆形节点时有效。
height Number 26 节点高度,单位像素;仅非圆形节点时有效。
type String '' 必填项:节点类型名称,可用户自定义;其对应的图标样式为'ico_'+节点类型; 
类型名中如果有' round',则为圆形节点,如果有' mix',则为复合节点(变换背景色)。
marked Boolean (undefined) 节点是否已被标注。
alt Boolean (undefined) 在编辑模式下节点是否被用户编辑过。
areaId String (undefined) 该节点所属分组泳道的id,当为undefined时表示不属于任何分组。
color String (undefined) 选填项。该节点对象特有的背景颜色,优先级高于GooFlow.color.node
fontColor String (undefined) 选填项。该节点对象特有的文字颜色,优先级高于GooFlow.color.font
…… Object (undefined) 任意类型、任意数量的自定义属性,由用户根据需要自行添加。

2、描述单条连线信息的Json结构体。

LineItem 类型:Json Object

描述单条连线信息的Json结构体。

属性 类型 默认值 描述
name String (undefiend) 连线的显示名称,未定义时连线上无文字。
from String (undefiend) 必填项,连线的起始节点id。
to String (undefiend) 必填项,连线的目标节点id。
type String sl 连线类型,取值有三种:'sl'直线;'lr'中段可左右移动的折线';'tb'中段可上下移动的折线。
M Number (undefiend) 一种抽象值,单位为像素。
type='lr'时为必填项,表示中段线相对于工作区的X坐标值;
type='tb'时为必填项,表示中段线相对于工作区的Y坐标值。
type='sl'时无任何意义。
marked Boolean (undefined) 连线是否已被标注。
alt Boolean (undefined) 在编辑模式下连线是否被用户编辑过。
dashed Boolean (undefined) 是否为虚线样式,当为undefined时表示默认实线。
noArrow Boolean (undefined) 是否有箭头,当为undefined时表示默认为有向线,反之则为无向线段。
color String (undefined) 选填项。该连线对象特有的线条颜色,优先级高于GooFlow.color.line
fontColor String (undefined) 选填项。该连线对象特有的文字颜色,优先级高于GooFlow.color.lineFont
…… Object (undefined) 任意类型、任意数量的自定义属性,由用户根据需要自行添加。

一、创建两个div 布局

1、引入 js 和 css 文件 参考 GooFlow入门使用

2、一个 div 初始化 GooFlow 实例,另一个一个显示信息

    <div class="col-md-8" ><div id="flowsuperviseTemp" style="width:750px;min-height:700px;margin:5px;float:left"></div></div><div class="col-md-4" ><form id="flowsuperviseItemForm"><div class="form-group"><table class="table table-hover table-bordered table-condensed" style="width: 99%" id="configtable"><tr><th colspan="2" >节点属性</th></tr><tr><th>节点ID:</th><td><input type="text" class="form-control form-group-sm" id="ele_id" name="compid" readonly="readonly"/></td></tr><tr><th>名称:</th><td><input type="text" class="form-control form-group-sm"  id="ele_name" name="name" /></td></tr><tr><th>类型:</th><td><input type="text" class="form-control form-group-sm"  id="ele_type" name="type" /></td></tr><tr><th>属性:</th><td><input type="text" class="form-control form-group-sm"  id="ele_model" name="model"/></td></tr><tr><th>左边距:</th><td><input type="text" class="form-control form-group-sm"  id="ele_left" name="left" comptype="node" /></td></tr><tr><th>上边距:</th><td><input type="text" class="form-control form-group-sm"  id="ele_top" name="top" comptype="node"/></td></tr><tr><th>宽度:</th><td><input type="text" class="form-control form-group-sm"  id="ele_width" name="width" comptype="node" /></td></tr><tr><th>高度:</th><td><input type="text" class="form-control form-group-sm"  id="ele_height" name="height" comptype="node" /></td></tr><tr><th colspan="2">连接属性</th></tr><tr><th>起始节点:</th><td><input type="text" class="form-control form-group-sm"  id="ele_from" name="from" comptype="line" /></td></tr><tr><th>结束节点:</th><td><input type="text" class="form-control form-group-sm"  id="ele_to" name="to" comptype="line" /></td></tr><tr><th>是否虚线:</th><td><input type="text" class="form-control form-group-sm"  id="ele_dash" name="dash" comptype="line" /></td></tr><tr id="sxsx"><th colspan="2"> 自定义配置属性<a href="javascript:showDialog('url')"><div style="float: right;cursor:pointer;" title="配置"><i class="icon-settings"></i>&nbsp; </div></a></th></tr><tr><th>姓名</th><td><input type="text" class="form-control" placeholder="姓名"/></td></tr><tr><th>性别</th><td><input type="text" class="form-control" placeholder="性别"/></td></tr><tr><th colspan="2"><input type="reset" class="btn-default" value="重置"/><input type="button" class="btn-primary" value="确定" onclick="editflowsuperviseItem()"/></th></tr></table></div></form></div>

input 中的 name 名和数据结构定义的属性名保持一致(需要什么显示什么),也可以自定义 name 名 。例如 节点id 和 属性等

input  也可以自定义属性(用于业务处理),例如 comtype 属性等

二、js 初始化 GooFlow 实例

 1、需要用到 事件钩子 和 内部属性等,举两个,其他参考文档

1.1 组件获得焦点事件

this.onItemFocus() 返回值:boolean

当操作某个元素(节点/连线)被由不选中变成选中时,触发的方法。

传参:( id, type )

名称 类型/格式 描述
id String 元素的id,唯一标识。
type String 元素的种类,有'node'节点、'line'连线两种

1.2  组件失去焦点事件

this.onItemBlur() 返回值:boolean

当操作某个元素(节点/连线)被由选中变成不选中时,触发的方法。

传参:( id, type )

名称 类型/格式 描述
id String 元素的id,唯一标识。
type String 元素的种类,有'node'节点、'line'连线两种。

 2、在获取失去焦点时,回显和删除 form 表单的信息

<script type="text/javascript">var options = {//width:800,//height:500,//initLabelText: "流程图",toolBtns: ["start round mix", "end round mix", "task", "node", "chat", "state", "plug", "join", "fork", "complex mix"],haveHead: true,headLabel: true,headBtns: ["new", "save", "undo", "redo", "reload", "print", "exportImg"],//如果haveHead=true,则定义HEAD区的按钮haveTool: true,haveDashed: true,haveGroup: true,useOperStack: true};//设定左侧工具栏中每一种节点或按钮的说明文字GooFlow.prototype.remarks.toolBtns = {cursor: "选择指针",direct: "连接线",dashed: "连接线(虚线)",start: "开始节点","end": "结束节点","task": "事项节点",group: "区块编辑开关"};//设定顶部栏中每个按钮的说明文字GooFlow.prototype.remarks.headBtns = {"new": "新建流程",open: "打开流程",save: "保存结果",undo: "撤销",redo: "重做",reload: "重置流程",print: "打印流程图",exportImg: "导出流程图"};GooFlow.prototype.remarks.extendRight = "工作区向右扩展";GooFlow.prototype.remarks.extendBottom = "工作区向下扩展";var superviseDataStr;   //全局模板初始流程图数据字符串var flowsuperviseTemp;    //GooFlow实例本身//模拟数据//superviseDataStr = "";$(document).ready(function () {flowsuperviseTemp = $.createGooFlow($("#flowsuperviseTemp"), options); //用jquery扩展方法初始化GooFlow//flowsuperviseTemp = GooFlow.init("#flowsuperviseTemp",options);;     //用jquery扩展方法初始化GooFlowflowsuperviseTemp.setTitle("事项流程图");//flowsuperviseTemp.loadData($.parseJSON(superviseDataStr));          //初始流程图数据//组件获得焦点事件flowsuperviseTemp.onItemFocus = function(id, type){var $form = $("#flowsuperviseItemForm");$form[0].reset();$form.find("input[name='compid']").val(id);$form.find("input[name='model']").val(type);var obj;if(type == "line"){obj = this.$lineData[id];}else if(type == "node"){obj=this.$nodeData[id];}$.each(obj, function (i, n) {$form.find("input[name='"+i+"']").val(n);});//alert(id + ":" + type);return true;}//组件失去焦点事件flowsuperviseTemp.onItemBlur=function(id, type){var $form = $("#flowsuperviseItemForm");$form[0].reset();return true;};//保存按钮事件flowsuperviseTemp.onBtnSaveClick = function () {saveflowsupervise();}//组件删除事件(默认是取消的)flowsuperviseTemp.onItemDel=function(id,type){this.blurItem();    //取消所选节点/连线被选定的状态。return true;}//重置按钮事件flowsuperviseTemp.onFreshClick = function () {flowsuperviseTemp.clearData();//flowsuperviseTemp.loadData($.parseJSON(superviseDataStr));}//打印事件flowsuperviseTemp.onPrintClick = function () {flowsuperviseTemp.print(1);}//导出图片事件var exportName = "事项流程图";//flowsuperviseTemp.setNodeRemarks(GooFlow.prototype.remarks.toolBtns);flowsuperviseTemp.onExportImgClick = function () {flowsuperviseTemp.exportDiagram(exportName);}});
</script>

三、保存节点信息

<script type="text/javascript">function saveflowsupervise() {var nodeCount = flowsuperviseTemp.$nodeCount; //节点数(包含开始结束节点数)if(nodeCount > 0){var flowchart = JSON.stringify(flowsuperviseTemp.exportData());console.log(flowchart);alert(flowchart);}else{alert("请先绘制流程图");}}function editflowsuperviseItem(){var $form = $("#flowsuperviseItemForm");//获取节点ID 和 属性(node/line)var comp_id = $form.find("input[name='compid']").val();var comp_model = $form.find("input[name='model']").val();if(comp_id){var flowchartdata = flowsuperviseTemp.exportData();if(comp_model && comp_model == "node"){$.each(flowchartdata.nodes, function (i, n) {if(i == comp_id){//将form表单信息更新到node节点事项各个属性中$form.find("input").each(function(){if($(this).prop('name') && $(this).prop('name') != 'compid'){//组件ID 不相等就不修改了if(!($(this).attr('comptype')) || $(this).attr('comptype')=='node'){n[$(this).prop('name')] = $(this).val();// name 名 和 节点属性对应,把值放进去,跟回显信息相反// alert($(this).prop('name') + ":" + $(this).val());}}});//n['name'] = $form.find("input[name='name']").val();flowchartdata.nodes[i]=n;}});}if(comp_model && comp_model=='line'){$.each(flowchartdata.lines, function (i, n) {if(i == comp_id){//将form表单信息更新到line节点事项各个属性中$form.find("input").each(function(){if($(this).prop('name') && $(this).prop('name') != 'compid'){//组件ID就不修改了if(!($(this).attr('comptype')) || $(this).attr('comptype')=='line'){if($(this).prop('name') == "dash"){if($(this).val() == "false"){n[$(this).prop('name')]=false;}if($(this).val() == "true"){n[$(this).prop('name')]=true;}}else{n[$(this).prop('name')]=$(this).val();}}}});// n['name']=$form.find("input[name='name']").val();flowchartdata.lines[i]=n;}});}flowsuperviseTemp.clearData();flowsuperviseTemp.loadData(flowchartdata);}else{alert('请先选择节点!');}}
</script>

1、 确定按钮 保存单个节点的信息到节点实例中

 2、流程图保存按钮 

获取 json 结构的流程数据, ajax 请求 交互后台

3、用到一些 GooFlow de 内部属性

{"title":"事项流程图","nodes":{"1553438226938":{"name":"开始","left":267,"top":88,"type":"start round mix","width":28,"height":28,"alt":true},"1553438229007":{"name":"结束","left":277,"top":412,"type":"end round mix","width":28,"height":28,"alt":true},"1553438231623":{"name":"节点1","left":"237","top":"169","type":"task","width":"104","height":"28","alt":true,"model":"node","xm":"张三","xb":"男"},"1553438232544":{"name":"节点2左","left":"107","top":"251","type":"task","width":"104","height":"28","alt":true,"model":"node","xm":"李四","xb":"女"},"1553438233100":{"name":"节点2右","left":"382","top":"251","type":"task","width":"104","height":"28","alt":true,"model":"node","xm":"王五","xb":"男"},"1553438235571":{"name":"节点3","left":"242","top":"333","type":"task","width":"104","height":"28","alt":true,"model":"node","xm":"赵柳","xb":"不详"}},"lines":{"1553438237966":{"type":"sl","from":"1553438226938","to":"1553438231623","name":"","dash":false},"1553438238928":{"type":"sl","from":"1553438231623","to":"1553438233100","name":"","dash":false},"1553438240303":{"type":"sl","from":"1553438231623","to":"1553438232544","name":"","dash":false},"1553438241365":{"type":"sl","from":"1553438232544","to":"1553438235571","name":"","dash":false},"1553438243677":{"type":"sl","from":"1553438233100","to":"1553438235571","name":"","dash":false},"1553438245066":{"type":"sl","from":"1553438235571","to":"1553438229007","name":"","dash":false}},"areas":{},"initNum":13
}

大体 GooFlow 的一个 节点信息 与 自定义字段的 回显/保存 有了一点了解,

多查看文档 end ~

GooFlow获取节点/线信息和自定义节点属性相关推荐

  1. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )

    文章目录 一.继承 BuilderSupport 抽象类 二.在 createNode 方法中获取节点名称.节点属性.节点值信息 三.完整代码示例 1.MyBuilderSupport 生成器代码 2 ...

  2. 13、Kanzi插件——通过Kanzi Engine插件创建自定义节点+代码解析

    一.通过插件创建自定义类型的节点 在类Plugindemo 中添加一行 static kanzi::PropertyTypeEditorInfoSharedPtr makeEditorInfo(); ...

  3. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——内置节点总览

    G6 的内置节点包括 circle,rect,ellipse,diamond,triangle,star,image,modelRect.这些内置节点的默认样式分别如下图所示. 本文将概述 G6 中的 ...

  4. 【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )

    文章目录 一.nodeCompleted 方法获取节点闭合信息 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...

  5. ZooKeeper使用get命令无法获取节点版本信息

    问题描述:在项目运行时需要给节点赋值,代码如下: Stat status = zkServer.getZookeeper().setData("/testnode", " ...

  6. G6可视化编排自定义节点样式和自定义线条

    先上图: 自定义节点样式 自定义边 在this.graph = new G6.Graph内的defaultEdge内引用自定义线条type:"hvh" defaultEdge: { ...

  7. mfc 制作不同的文档模板mdi不同的子窗体_制作ACK集群自定义节点镜像的正确姿势...

    随着云原生时代的到来,用户应用.业务上云的需求也越来越多,不同的业务场景对容器平台的需求也不尽相同,其中一个非常重要的需求就是使用自定义镜像创建ACK集群. ACK支持用户使用自定义镜像创建Kuber ...

  8. 高级指引——自定义节点

    title: 自定义节点 order: 1 G6 提供了一系列内置节点,包括 circle.rect.diamond.triangle.star.image.modelRect.若内置节点无法满足需求 ...

  9. echarts tree (树图) 实现自定义节点图标 自定义样式 点击节点后线条变色 自适应高度 搜索后节点关键字标红 写的很详细,建议收藏!

    前言 网上找了好久资料,没有一个完整实例,所以研究出来立马发布,共享下,希望能帮助到大家. 一.实现效果 方式1:提供视频方式大家看下符不符合要求 方式2:Demo演示地址 点击此处,可查看演示地址  ...

  10. networkx画图(番外)——(1)自定义节点布局

    networkx画图(番外)--(1)自定义节点布局 networkx虽然非常方便,但在一些超大规模的图数据上,依然显得吃力.所以大多数时候,它仅仅是被用来做一些实例性的分析和可视化展示的,这需要学会 ...

最新文章

  1. pgadmin使用教程
  2. 【Linux】一步一步学Linux——gpasswd命令(90)
  3. HDU - 4784 Dinner Coming Soon(bfs+动态规划+优先队列)
  4. JAVA synchronized关键字锁机制(中)
  5. Thread.sleep还是TimeUnit.SECONDS.sleep
  6. 【OS学习笔记】三十四 保护模式十:中断和异常区别
  7. 【POJ - 3616】Milking Time (贪心+dp)
  8. 嵌入式面试中常见的编程题目
  9. 一个测试工程师面试官的真实分享!个人超赞同!
  10. matlab三角函数化简命令,matlab - Matlab - 类似产品的三角函数简化 - 堆栈内存溢出...
  11. java 基础之图片的多线程处理和大文件的多线程拷贝
  12. android tv 蓝牙服务_Android TV Remote Service
  13. PowerBI为企业整体业务流程系统(CRM)提供完整解决方案模板
  14. mongos魔兽世界模拟器
  15. 向量组/矩阵/秩的理解
  16. 计算机网络-数据交换技术
  17. Kubeadm 部署企业级高可用Kubernetes(适用于ECS)
  18. Python中使用遍历在列表中添加字典的坑
  19. 21世纪新媒体CTO韩磊:移动新媒介融合之道
  20. Ubuntu加载移动硬盘报错: Unable to access “磁盘名”

热门文章

  1. 【Python成长之路】共享平台
  2. 下载文件变成php文档,关于文件下载后变成PHP格式的解决办法
  3. 使用Mediacoder压制带有图片的ass字幕
  4. c语言 截止频率6低通滤波器,用Verilog在FPGA上实现低通滤波器
  5. easyUI之新增,下架以及上架
  6. 从零开始一起学习SLAM | 学习SLAM到底需要学什么?
  7. 程序员的mysql经典pdf_程序员的SQL金典 杨中科著 中文 PDF版
  8. 微软windows10易升_Win10 如何摆脱易升这个流氓软件,如何拒绝每半年一次的大更...
  9. 通信协议(二)——SPI协议
  10. 字体变换大小的html代码,JQuery 实时改变网页字体大小的代码