基于 jsPlumb 的流程图编辑器的实现 (四,按钮的操作)

1.清空画布

清空画布,简单粗暴的方法就是清空html

$('#delete').click(function(){
    $('#flow-main').html('')
})

2.保存流程图

保存流程图是将流程图中的节点信息,连线信息和 label 信息序列化之后,利用 Ajax 传递到后台。节点和 label 可以利用 jQuery 直接获取 dom 信息,jsPlumb 提供了 jsPlumb.getAllConnections() 方法,可以获取连线信息。

            $('#save').click(function () {        
                var connects = [];
                $.each(jsPlumb.getAllConnections(), function (idx, connection) {
                    connects.push({
                      connectionId: connection.id,
                      pageSourceId: connection.sourceId,
                      pageTargetId: connection.targetId,
                      sourcePoint: connection.endpoints[0].anchor.type,
                      targetPoint: connection.endpoints[1].anchor.type,
                    });
                });
                var blocks = [];
                $("#flow-main .node-common").each(function (idx, elem) {
                    var $elem = $(elem);
                    console.log($elem);
                    var blockId = $elem.attr('id');
                    var blockContent = $elem.children('.node-text').html();
                    blocks.push({
                        blockId: blockId,
                        blockContent: blockContent,
                        type: $elem.data("type"),
                        blockX: parseInt($elem.css("left"), 10),
                        blockY: parseInt($elem.css("top"), 10),
                        width: parseInt($elem.width(), 10) + 24,
                        height: parseInt($elem.height(), 10) + 16,
                    });
                });
                var lineDescs = [];
                $("#flow-main .line-label").each(function (idx, elem) {
                     var $elem = $(elem);
                     var lineContent = $elem.children('.label-text').html();
                     lineDescs.push({
                         lineId: $elem.attr('id'),
                         lineContent: lineContent,
                         lineX: parseInt($elem.css("left"), 10),
                         lineY: parseInt($elem.css("top"), 10),
                         width: parseInt($elem.width(), 10) + 24,
                         height: parseInt($elem.height(), 10) + 16,
                         pathId: $elem.data("path")
                     });
                });
                var serliza = {
                    connects:connects,
                    blocks:blocks,
                    lineDescs:lineDescs
                }
                $.ajax({
                    type: "POST",
                    url: "test.json",
                    data: serliza,
                    success: function(data){
                         //保存成功之后的回调函数
                    }
                });              
            })

3.编辑

流程图可以分为可编辑和不可编辑两种状态,利用变量 isNew 区分,true 为可编辑, false 为不可编辑。默认的流程图是只可以查看,如果想要修改流程图,除了节点 label 的信息可以修改以外,还需要支持可以修改连线信息。

            $('#update').click(function(){
                isNew = true;
                $("#flow-main .node-common").each(function (idx, elem) {
                    var $elem = $(elem);
                    var id = $elem.attr('id')
                    jsPlumb.addEndpoint(id, { anchors: "BottomCenter" }, endpointStyle);
                    jsPlumb.addEndpoint(id, { anchors: "TopCenter" }, endpointStyle);
                    jsPlumb.addEndpoint(id, { anchors: "RightMiddle" }, endpointStyle);
                    jsPlumb.addEndpoint(id, { anchors: "LeftMiddle" }, endpointStyle);
                    jsPlumb.draggable(id);
                    $("#" + id).draggable({ containment: "parent",grid: [10, 10] });
                    that.nodeClick(id);
                });
                $("#flow-main .line-label").each(function (idx, elem) {
                    var $elem = $(elem);
                    var id = $elem.attr('id')
                    jsPlumb.draggable(id);
                    $elem.draggable({ containment: "parent" });  
                    that.labelClick(id);
                });
            })

编辑的时候,因为页面中已经有了一部分节点,而 _index 变量的值,并没有变化。如果继续添加节点的时候,会出现 id 冲突的情况,所以,再添加节点之前,需要判断 id 是否存在。

判断节点是否存在的方法:

        /**
         * 防止节点id重复
         * @params type Srting 节点类型
         * @params num Number 当前顺序号
         * @return id String 不重复的id
         */
        judgeId: function(type,num){
            var id = type + num;
            var doms = $('#'+id)
            if(doms.length != 0){
                _index = num + 1;
                return judgeId(type,_index);     
            }
            return type + num;
        },

4.根据数据画流程图

除了保存编辑功能外,还需要支持根据已有的数据绘制流程图的功能。

        /**
         * 根据数据画流程图
         * @params data Object 流程图数据
         */
        draw:function(data){
            var blockDoms = data.blocks;
            blockDoms.forEach(function(item,index){
                var dom = $('<div class="node-common" id="' + item.blockId + '" data-type="'+ item.type +'"><span class="node-text">'+ item.blockContent +'</span></div>')
                dom.css("left", item.blockX).css("top",item.blockY);
                dom.css("width", item.width).css("height",item.height);
                var type = item.type;
                switch (type) {
                        case "base":
                            dom.addClass('node-base');
                            break;
                        case "flow":
                            dom.addClass('node-flow');
                            break;
                        case "node":
                            dom.addClass('node-node');
                            break;
                        case "judge":
                            dom.addClass('node-judge'); 
                            break;
                    }
                $('#flow-main').append(dom);               
            })
            var connect = data.connects;
            connect.forEach(function(item,index){
                jsPlumb.ready(function(){
                    jsPlumb.connect({
                    source: item.pageSourceId,
                    target: item.pageTargetId,
                    anchor: [item.sourcePoint, item.targetPoint],
                    endpoint: ["Dot", { radius: 8 }], 
                    connectorStyle: connectorPaintStyle,//连接线的颜色,大小样式
                    connectorHoverStyle: connectorHoverStyle,
                    paintStyle: { strokeStyle: "#000000",
                                    fillStyle: "transparent",
                                    radius: 2,
                                    lineWidth: 2},
                    connector: ["Flowchart", { stub: [20, 30], gap: 5, cornerRadius: 3, alwaysRespectStubs: true }],
                    overlays: [["Arrow", { width: 10, length: 10, location: 1 }]],                
                    endpointStyle: { fillStyle: 'transparent', strokeStyle: "#000000", lineWidth: 1 ,radius: 2,},
                    isSource: false,
                    isTarget: false
                })
                })
                
            })
            var lineDescs = data.lineDescs;
            lineDescs.forEach(function(item,index){
                var dom = $('<div class="line-label label-blur" id="' + item.lineId + '" data-path="'+ item.pathId +'"><span class="label-text">'+ item.lineContent +'</span></div>')
                dom.css("left", item.lineX).css("top",item.lineY);
                dom.css("width", item.width).css("height",item.height);
                $('#flow-main').append(dom);
            })
        },

 

 

至此,流程图的基本功能已全部完成。

 

第一次写,基本功能实现,但是测试并不是十分充分,如果有问题,欢迎大家反馈,一起讨论。

 

 

项目地址:https://github.com/smile1828/demo-jsPlumb

基于 jsPlumb 的流程图编辑器的实现 (一,节点的操作)

基于 jsPlumb 的流程图编辑器的实现 (二,连接线的操作)

基于 jsPlumb 的流程图编辑器的实现 (三,document的操作)

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
JSPlumb是一个流程图库,可以帮助实现各种流程图的绘制和交互。下面我将以一个简单的例子来说明如何使用JSPlumb实现流程图。 首先,需要引入JSPlumb的库文件: ```html <script src="jsplumb.min.js"></script> ``` 接下来,创建一个容器来放置流程图的元素,例如: ```html <div id="flowchart"></div> ``` 然后,初始化JSPlumb: ```javascript jsPlumb.ready(function() { // 创建一个连接实例 var instance = jsPlumb.getInstance(); // 设置连接线的样式 var connectorStyle = { strokeWidth: 2, stroke: '#4178be', joinstyle: 'round', outlineStroke: 'white', outlineWidth: 2 }; // 设置端点的样式 var endpointStyle = { endpoint: 'Dot', paintStyle: { fill: '#4178be', radius: 4 }, isSource: true, connectorStyle: connectorStyle, isTarget: true, connectorHoverStyle: connectorStyle, hoverPaintStyle: { stroke: '#1e8151', strokeWidth: 3 } }; // 在容器中添加节点 var node1 = instance.addEndpoint('flowchart', { anchor: 'Right', endpoint: endpointStyle }); var node2 = instance.addEndpoint('flowchart', { anchor: 'Left', endpoint: endpointStyle }); // 连接两个节点 instance.connect({ source: node1, target: node2, paintStyle: connectorStyle }); }); ``` 在上面的代码中,首先创建了一个连接实例,然后设置了连接线和端点的样式。接下来,在容器中添加了两个节点,并使用`addEndpoint`方法来设置节点的锚点和端点的样式。最后,使用`connect`方法来连接两个节点。 通过以上的步骤,就可以使用JSPlumb实现一个简单的流程图。当然,JSPlumb还有更多的功能和选项可以进行配置,可以根据实际需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值