AI智能
改变未来

jsPlumb开发流程设计器

前言

jsPlumb是一款开源软件,但jsPlumb toolkit是收费的。

本文主要使用jsPlumb实现一些简单的流程设计功能。

基础学习

首先引入jsplumb.min.js。

<script src=\"https://cdn.jsdelivr.net/npm/jsplumb@2.8.0/dist/js/jsplumb.min.js\"></script>

然后编写代码如下:

<html lang=\"en\">​<head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Document</title><style>#diagramContainer {padding: 20px;width: 80%;height: 200px;border: 1px solid gray;}​.item {height: 80px;width: 80px;border: 1px solid blue;float: left;}</style></head>​<body><div id=\"diagramContainer\"><div id=\"item_left\" class=\"item\"></div><div id=\"item_right\" class=\"item\" style=\"margin-left:50px;\"></div></div><script src=\"https://cdn.jsdelivr.net/npm/jsplumb@2.8.0/dist/js/jsplumb.min.js\"></script>​<script>/* global jsPlumb */jsPlumb.ready(function () {jsPlumb.connect({source: \'item_left\',target: \'item_right\',endpoint: \'Dot\'})})</script></body>​</html>

效果图如下:

可以看到,我们定义了一个容器diagramContainer,和两个div块元素,然后通过jsPlumb的connect连接函数,将两个正方形,连接到了一起。

基础学习参考网站:https://github.com/wangduanduan/jsplumb-chinese-tutorial

流程设计器开发

首先设计Html元素,设计一个左侧功能列表区域,一个右侧流程设计区域。

然后再设计三个节点拖进设计区域后释放时的样式。

代码如下:

<div id=\"app\"><div class=\"container-fluid\"><div class=\"row\"><div id=\"side-buttons\" class=\"col-md-1 bg-info min-height \"><div style=\"text-align:center;\"><h2 class=\"mt20 \">节点列表</h2><hr /><a class=\"btn btn-success btn-controler btnw\" href=\"#\" data-template=\"tpl-Normal\" role=\"button\"><i class=\"fa fa-square\" aria-hidden=\"true\"></i>节点</a><hr /><a id=\"export\" class=\"btn btn-success mt10 btnw\" href=\"#\" role=\"button\"><i class=\"fa fa-file-text-o\" arad0ia-hidden=\"true\"></i>导出</a></div></div><div class=\"min-height\"><div class=\"title\"><p>提示:双击连接线可删除连接。</p></div><div id=\"drop-bg\" class=\"col-md-11 bg-success min-height\">​</div></div></div></div></div>​<script id=\"tpl-Normal\" type=\"text/html\"><div class=\'pa\' id=\'{{id}}\' style=\'top:{{top}}px;left:{{left}}px; opacity: 0.6;\'>​<a class=\'btn btn-default\' href=\'#\' role=\'button\'><div><input type=\"text\" value=\"{{comment}}\" tag=\"{{id}}\" class=\"nodeText\" />​<span class=\"delete-node pull-right\" data-type=\"deleteNode\" data-id=\"{{id}}\" style=\"font-size:10px;margin:0 -10px 0 0\">X</span>@*<span class=\"add-node pull-right\" data-type=\"addDragNode\" data-id=\"{{id}}\" style=\"font-size:10px;margin:0 5px 0 0\">+</span>*@</div></a></div></script>​<script id=\"tpl-Root\" type=\"text/html\"><div class=\'pa\' id=\'{{id}}\' style=\'top:{{top}}px;left:{{left}}px;opacity: 0.6;\'><a class=\'btn btn-success\' href=\'#\' role=\'button\'><div style=\"width:80px;height:30px;line-height:35px\">{{comment}}@*<span class=\"delete-node pull-right\" data-type=\"deleteNode\" data-id=\"{{id}}\">X</span>*@</div></a></div></script>​<script id=\"tpl-Exit\" type=\"text/html\"><div class=\'pa\' id=\'{{id}}\' style=\'top:{{top}}px;left:{{left}}px\'><a class=\'btn btn-danger\' href=\'#\' role=\'button\'><div style=\"width:80px;height:30px;line-height:35px\">{{comment}}@*<span class=\"delete-node pull-right\" data-type=\"deleteNode\" data-id=\"{{id}}\">X</span>*@</div></a></div></script>

页面效果如下:

然后编写代码实现拖拽和释放的功能。

核心代码如下:


jsPlumb.ready(function () {console.log(\"main-start\")jsPlumb.setContainer(\'diagramContainer\')$(\'.btn-controler\').draggable({helper: \'clone\',scope: \'ss\'})​$(areaId).droppable({scope: \'ss\',drop: function (event, ui) {dropNode(ui.draggable[0].dataset.template, ui.position)}})​$(\'#app\').on(\'click\', function (event) {event.stopPropagation()event.preventDefault()var item = event.target.datasetif (item.type === \'deleteNode\') {var index = -1;data.nodeList.forEach(function (node, i) {if (node.id == item.id) {index = i;}})data.nodeList.splice(index, 1);console.log(data.nodeList)jsPlumb.remove(item.id)}ad8})// 单点击了连接线上的X号jsPlumb.bind(\'dblclick\', function (conn, originalEvent) {DataDraw.deleteLine(conn)})// 当链接建立jsPlumb.bind(\'beforeDrop\', function (info) {console.log(\"beforeDrop\")console.log(info)var isSame = false;data.nodeList.forEach(function (node) {if (info.sourceId == node.id) {if (!node.data) {node.data = []var nextNode = {\"nextNode\": info.targetId}node.data.push(nextNode)}else {node.data.forEach(function (dItem){if (dItem.nextNode == info.targetId) {isSame = true;return;}})if (!isSame) {var nextNode = {\"nextNode\": info.targetId}node.data.push(nextNode)}}}​})if (!isSame) {console.log(data.nodeList)return connectionBeforeDropCheck(info)}else {console.log(\"节点相同\")return}})console.log(\"main-DataDraw.draw\")DataDraw.draw(data.nodeList)console.log(\"初始化节点文本事件\")initNodeTextEvent();})

jsPlumb函数:

setContainer:设置容器。

droppable:指定该区域支持拖拽的控件。

draggable:指定该按钮可以被拖拽。

自定义函数:

DataDraw.draw初始化节点。

initNodeTextEvent设计图中的节点中的节点名称变化,同步到节点列表数23a4组对象中,实现数据同步。

页面初始化时读取了data.js文件中的起始配置节点的数据。

data.js文件如下:

var data = {\'nodeList\': [{ \"id\": \"Start\", \"type\": \"Root\", \"comment\": \"开始\", \"top\": 50, \"left\": 150, \"data\": [{ \"nextNode\": \"81422cf0-00ae-11ec-b359-c13e24702355\" }, { \"nextNode\": \"779c8300-00b1-11ec-923c-fbdaa48876a6\" }] }, { \"id\": \"e1a3de30-0096-11ec-b888-ddd94967488d\", \"comment\": \"22\", \"top\": 198, \"left\": 566, \"type\": \"Normal\", \"data\": [{ \"nextNode\": \"Exit\" }] }, { \"id\": \"81422cf0-00ae-11ec-b359-c13e24702355\", \"comment\": \"1\", \"top\": 634, \"left\": 432, \"type\": \"Normal\", \"data\": [{ \"nextNode\": \"Exit\" }] }, { \"id\": \"84689a40-00ae-11ec-b359-c13e24702355\", \"comment\": \"2\", \"top\": 628, \"left\": 198, \"type\": \"Normal\", \"data\": [{ \"nextNode\": \"Exit\" }] }, { \"id\": \"779c8300-00b1-11ec-923c-fbdaa48876a6\", \"comment\": \"\", \"top\": 891, \"left\": 617, \"type\": \"Normal\" }, { \"id\": \"Exit\", \"type\": \"Exit\", \"comment\": \"结束\", \"top\": 818, \"left\": 929 }, { \"id\": \"a57fe0d0-00b3-11ec-99d4-39fb5d424f70\", \"comment\": \"\", \"top\": 316, \"left\": 1130, \"type\": \"Normal\" }]}

这样我们就实现了基础的流程设计器了,下面我们看一下功能。

删除

点击链接线可以删除链接,如下图:

拖拽

拖拽节点按钮到设计器区域,如下图:

导出

点击导出按钮将当前流程的节点信息导出成json字符串,如下图

可以看到,设计器是支持一个节点发射出多个链接线的。

在导出时,我们再设计器中修改的节点名,也被同步的导出到json字符串中了。

—————————————————————————————————-

到此,jsPlumb开发流程设计器就已经介绍完了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/KibaWorkFlowDesigner_JS

—————————————————————————————————-

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/15293054.html

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » jsPlumb开发流程设计器