最新基于jsplumb开发厂区设备分布图,rocketmq教程教程

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

相关代码

$(“#flowBox”).droppable({

scope: ‘ss’,

drop: function (event, ui) {

var $chart = $(ui.draggable[0]);

var node = {};

node.id = “node” + Math.random().toString(36).substr(3, 10);

node.name = $chart.attr(“data-name”);

node.data_id = $chart.attr(“id”);

node.data_code = $chart.attr(“data-code”);

node.data_type = $chart.attr(“data-type”);

node.type = ‘chart’;

node.groupId = null;

node.width = 150;

node.height = 130;

node.left = miniview_position.left * miniview_percent + (ui.position.left - 100);

node.top = miniview_position.top * miniview_percent + (ui.position.top - 50);

node.EndpointList = getEndpointList(node);

addNode(node);

}

})

function drawNode(node) {

if(node.type == ‘chart’){

var nodeDiv = [‘

’,

’,

’ + node.name + ‘
’,

‘’].join(‘’);

$(“#flowBox”).append(nodeDiv);

// 拖拽改变大小

$(“#”+node.id).resizable({

autoHide: true ,

minHeight: 50,

minWidth:50,

aspectRatio:15/13,

containment: “parent”,

resize: function (event, ui) {

changeNodeSize(node.id,ui.size.width,ui.size.height)

//拖拽时点位跟着变动

jsPlumb.repaint(ui.helper);

jsPlumb.repaintEverything();

}

})

jsPlumb.draggable(node.id);

if(node.groupId !=null){

var el = eval(‘(’ + node.id + ‘)’);

var groupNode = dataNodeList.filter(function (itemNode) {

return itemNode.id == node.groupId;

})[0];

$(“#”+node.id).css(‘left’,(groupNode.left + node.left)+“px”);

$(“#”+node.id).css(‘top’,(groupNode.top + node.top)+“px”);

jsPlumb.addToGroup(node.groupId, el);

}

}

if(node.EndpointList !=null && node.EndpointList.length >0){

for (var i = 0; i < node.EndpointList.length; i++) {

jsPlumb.addEndpoint(node.id, {uuid:node.EndpointList[i].id,anchors:locationToAnchors(node.EndpointList[i].location,node)}, GetEndpointOptions(node.EndpointList[i]));

}

}

}

设备组管理

多个设备可以拉进一个设备组中一起管理,组㐓展开折叠。

jsPlumb通过事件控制组元素的新增和删除

//添加到组

jsPlumb.bind(“group:addMember”,function(evt) {

var nodeId = evt.el.id;

var groupId = evt.group.id;

var pos = evt.pos;

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].groupId = groupId;

dataNodeList[i].left = pos.left;

dataNodeList[i].top = pos.top;

break;

}

}

});

//从组中删除

jsPlumb.bind(“group:removeMember”,function(evt) {

console.log(1)

var nodeId = evt.el.id;

var groupId = evt.group.id;

var pos = evt.pos;

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].groupId = null;

dataNodeList[i].left = pos.left;

dataNodeList[i].top = pos.top;

break;

}

}

});

其他功能

其中还有放大缩小整个画布、导入导出,返回上一步等其他功能。下面附上所有的JavaScript代码,感兴趣的同学可以学习参考一下。

var miniview_position ={ top: 0, left: 0 };

var miniview_percent = 8;

var workflowInfo = {};

var dataNodeList = [];

var dataLineList = [];

var loadEasyFlowFinish = true;

var jsplumbSetting = {

// 动态锚点、位置自适应

//Anchors: [‘Top’, ‘TopCenter’, ‘TopRight’, ‘TopLeft’, ‘Right’, ‘RightMiddle’, ‘Bottom’, ‘BottomCenter’, ‘BottomRight’, ‘BottomLeft’, ‘Left’, ‘LeftMiddle’],

Container: ‘flowBox’,

// 连线的样式 StateMachine、Flowchart

Connector: ‘Flowchart’,

// 鼠标不能拖动删除线

ConnectionsDetachable: false,

// 删除线的时候节点不删除

DeleteEndpointsOnDetach: false,

// 连线的端点

Endpoint: [ “Dot”, { radius:2.5 } ],

// 线端点的样式

//EndpointStyle: { fill: ‘rgba(255,0,5,1)’, outlineWidth: 1},

LogEnabled: true,//是否打开jsPlumb的内部日志记录

// 绘制线

PaintStyle: { stroke: ‘black’, strokeWidth: 3 },

// 绘制箭头

//Overlays: [[‘Arrow’, {width: 12, length: 12, location: 1}]],

RenderMode: “svg”,

};

// jsplumb连接参数

var jsplumbConnectOptions = {

isSource: true,

isTarget: true,

// 动态锚点、提供了4个方向 Continuous、AutoDefault

anchor: “Continuous”

};

var jsplumbSourceOptions = {

/“span"表示标签,”.className"表示类,"#id"表示元素id/

filter: “.flow-node-drag”,

filterExclude: false,

anchor: “Continuous”,

allowLoopback: false

};

var jsplumbTargetOptions = {

/“span"表示标签,”.className"表示类,"#id"表示元素id/

filter: “.flow-node-drag”,

filterExclude: false,

anchor: “Continuous”,

allowLoopback: false

};

function BtnAddGroup() {

var node = {};

node.id = “Group”+ Math.random().toString(36).substr(3, 10);

node.name = ‘组’;

node.type = ‘group’;

node.groupId = node.id;

node.width = 300;

node.height = 300;

node.left = miniview_position.left * miniview_percent + (0);

node.top = miniview_position.top * miniview_percent + (0);

addNode(node);

}

var jsPlumbZoom = 1;

function BtnWorkflowSmall() {

jsPlumbZoom -= 0.05;

setZoom(jsPlumbZoom);

}

function BtnWorkflowBig() {

jsPlumbZoom += 0.05;

setZoom(jsPlumbZoom);

}

window.setZoom = function(zoom, instance, transformOrigin, el) {

transformOrigin = transformOrigin || [ 0, 0 ];

instance = instance || jsPlumb;

el = el || instance.getContainer();

var p = [ “webkit”, “moz”, “ms”, “o” ],

s = “scale(” + zoom + “)”,

oString = (transformOrigin[0] * 100) + "% " + (transformOrigin[1] * 100) + “%”;

for (var i = 0; i < p.length; i++) {

el.style[p[i] + “Transform”] = s;

el.style[p[i] + “TransformOrigin”] = oString;

}

el.style[“transform”] = s;

el.style[“transformOrigin”] = oString;

instance.setZoom(zoom);

};

/修改/

function BtnALLCancelSelection(){

$(“.nodeBox”).each(function(){

if($(this).hasClass(‘active’)){

$(this).removeClass(‘active’);

jsPlumb.removeFromDragSelection($(this));

}

})

}

$(function () {

$(“#flow-btns”).children().draggable({

helper: ‘clone’,

scope: ‘ss’

})

/修改/

$(“#flowBox”).droppable({

scope: ‘ss’,

drop: function (event, ui) {

var $chart = $(ui.draggable[0]);

var node = {};

node.id = “node” + Math.random().toString(36).substr(3, 10);

node.name = $chart.attr(“data-name”);

node.data_id = $chart.attr(“id”);

node.data_code = $chart.attr(“data-code”);

node.data_type = $chart.attr(“data-type”);

node.type = ‘chart’;

node.groupId = null;

node.width = 150;

node.height = 130;

node.left = miniview_position.left * miniview_percent + (ui.position.left - 100);

node.top = miniview_position.top * miniview_percent + (ui.position.top - 50);

node.EndpointList = getEndpointList(node);

addNode(node);

}

})

jsPlumb.ready(main);

function main() {

jsPlumb.importDefaults(jsplumbSetting);

jsPlumb.setContainer(‘flowBox’);

jsPlumb.setSuspendDrawing(false, true);

if (!!GetQuery(‘id’)) {

loadEasyFlowFinish =false;

var id = GetQuery(‘id’);

getAjax(“/WorkflowModule/Design/GetWorkflowInfo?id=” + id, {}, function (rs) {

var rs = eval(“(” + rs + “)”);

if (rs.status == “ok”) {

workflowInfo = rs.data;

dataNodeList = rs.data.WrokflowNodeList;

dataLineList = rs.data.WrokflowLinesList;

loadEasyFlow();

}

});

jsPlumbEvent();

}

}

setInterval(function(){

HistoryData();

},1000);

})

function jsPlumbEvent(){

// 单点击了连接线,

jsPlumb.bind(‘click’, function (conn, originalEvent) {

if(conn.id.substr(0,3)==‘con’){

lineClick(conn, originalEvent);

}

});

// 连线

jsPlumb.bind(“connection”, function (evt) {

var sourceId = evt.source.id;

var targetId = evt.target.id;

var sourceEndpointId = undefined;

var targetEndpointId = undefined;

var sourceNodeList = dataNodeList.filter(function (items) {

if (items.id == sourceId) {

return true;

}

return false;

});

var targetNodeList = dataNodeList.filter(function (items) {

if (items.id == targetId) {

return true;

}

return false;

});

if(sourceNodeList.length != 0){

sourceEndpointId = evt.sourceEndpoint._jsPlumb.uuid;

}

if(targetNodeList.length != 0){

targetEndpointId = evt.targetEndpoint._jsPlumb.uuid;

}

if (loadEasyFlowFinish) {

dataLineList.push({ sourceId: sourceId, targetId: targetId,sourceEndpointId:sourceEndpointId,targetEndpointId:targetEndpointId });

}

});

// 删除连线回调

jsPlumb.bind(“connectionDetached”, function (evt) {

var sourceEndpointId = evt.sourceEndpoint._jsPlumb.uuid;

var targetEndpointId = evt.targetEndpoint._jsPlumb.uuid;

deleteLine(sourceEndpointId, targetEndpointId);

})

//添加到组

jsPlumb.bind(“group:addMember”,function(evt) {

var nodeId = evt.el.id;

var groupId = evt.group.id;

var pos = evt.pos;

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].groupId = groupId;

dataNodeList[i].left = pos.left;

dataNodeList[i].top = pos.top;

break;

}

}

});

//从组中删除

jsPlumb.bind(“group:removeMember”,function(evt) {

console.log(1)

var nodeId = evt.el.id;

var groupId = evt.group.id;

var pos = evt.pos;

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].groupId = null;

dataNodeList[i].left = pos.left;

dataNodeList[i].top = pos.top;

break;

}

}

});

}

//单点击了连接线

function lineClick(conn, originalEvent){

var _layer = Getlayer();

_layer.open({

btn: [‘保存’, ‘删除’], //按钮

yes: function (index, layero) {

var lineText = parent.$(“#layui-layer” + index).find(“#lineText”).val();

conn.setLabel({

label: lineText,

cssClass: ‘labelClass’

});

for (var i = 0; i < dataLineList.length; i++) {

if (dataLineList[i].conn_id == conn.id) {

dataLineList[i].labelName = lineText;

dataLineList[i].labelCss = ‘labelClass’;

break;

}

};

_layer.close(index);

}, btn2: function (index, layero) {

jsPlumb.deleteConnection(conn)

_layer.close(index);

},

type: 1,

title: ‘连线信息’,

area: [‘420px’, ‘310px’], //宽高

content: ‘’

});

}

// 删除线

function deleteLine(sourceEndpointId,targetEndpointId) {

dataLineList = dataLineList.filter(function (line) {

if (line.sourceEndpointId == sourceEndpointId && line.targetEndpointId == targetEndpointId) {

return false

}

return true

})

}

/修改/

//加载流程图

function loadEasyFlow() {

$(“#flowBox”).empty();

//不在组里节点初始化

var dataNodeList1 = dataNodeList.filter(function (node) {

return node.groupId == null || node.type == ‘group’;

})

for (var i = 0; i < dataNodeList1.length; i++) {

var node = dataNodeList1[i];

drawNode(node);

}

//不在组里节点初始化

var dataNodeList2 = dataNodeList.filter(function (node) {

return node.groupId != null && node.type != ‘group’;

})

for (var i = 0; i < dataNodeList2.length; i++) {

var node = dataNodeList2[i];

drawNode(node);

}

loadLineList(dataLineList);

//折叠的组折叠

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].isCollapse == true && dataNodeList[i].type == ‘group’) {

jsPlumb.collapseGroup(dataNodeList[i].id);

}

}

jsPlumb.repaint($(“#flowBox”));

jsPlumb.repaintEverything();

setInterval(function () {

loadEasyFlowFinish = true;

}, 500);

}

/修改/

function loadLineList(_dataLineList){

// 初始化连线

for (var i = 0; i < _dataLineList.length; i++) {

var line = _dataLineList[i];

var sourceEndpoint = null;

if(line.sourceEndpointId != undefined){

var sourceEndpoints = jsPlumb.getEndpoints(line.sourceId);

var sourceEndpoint = sourceEndpoints.filter(function (itemEndpoint) {

return itemEndpoint._jsPlumb.uuid == line.sourceEndpointId

})[0];

}else{

sourceEndpoint = line.sourceId;

}

var targetEndpoint = null;

if(line.targetEndpointId != undefined){

var targetEndpoints = jsPlumb.getEndpoints(line.targetId);

var targetEndpoint = targetEndpoints.filter(function (itemEndpoint) {

return itemEndpoint._jsPlumb.uuid == line.targetEndpointId

})[0];

}else{

targetEndpoint = line.targetId;

}

// console.log(sourceEndpoint);

// console.log(targetEndpoint);

var curline = jsPlumb.connect({

source: sourceEndpoint,

target: targetEndpoint

}, jsplumbConnectOptions);

if(curline !=undefined){

_dataLineList[i].conn_id = curline.id;

if (line.labelName != “”) {

curline.setLabel({

label: line.labelName,

cssClass: line.labelCss

})

}

}

}

}

function changeNodeSite(e) {

var data = {};

data.nodeId = $(e).attr(“id”);

var position =$(e).position();

data.left = position.left;

data.top = position.top;

for (var i = 0; i < dataNodeList.length; i++) {

var node = dataNodeList[i];

if (node.id == data.nodeId) {

node.left = data.left;

node.top = data.top;

}

}

}

function onmouseoverNode(e) {

$(e).find(“.flow-node-operate”).show();

}

function onmouseoutNode(e) {

$(e).find(“.flow-node-operate”).hide();

}

var currentNode = null;

function onclickNode(e){

currentNode = e;

if($(currentNode).hasClass(‘active’)){

$(currentNode).removeClass(‘active’);

jsPlumb.removeFromDragSelection($(currentNode));

}

$(“#hide_input”).focus();

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

}

function hide_input_onkeydown(e) {

var event = window.event;

//删除

if(event.keyCode8 || event.keyCode46){ //8–backspace;46–delete

deleteNode(currentNode);

}

//选中

if(event.keyCode==13 && !$(currentNode).hasClass(‘nodeBox_group’)){ //13–回车

if($(currentNode).hasClass(‘active’)){

$(currentNode).removeClass(‘active’);

jsPlumb.removeFromDragSelection($(currentNode));

}else{

$(currentNode).addClass(‘active’);

jsPlumb.addToDragSelection($(currentNode), {

containment: ‘parent’

});

}

}

}

function ondblclickNode(e){

var nodeId = $(e).attr(“id”);

var _layer = Getlayer();

_layer.open({

btn: [‘确认’, ‘折叠’,‘展开’], //按钮

yes: function (index, layero) {

var data = {};

data.name = parent.$(“#layui-layer” + index).find(“#nodeInfoName”).val();

data.EndpointList = $nodeInfoTable.bootstrapTable(‘getData’)

var node ={};

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].name = data.name;

dataNodeList[i].EndpointList = data.EndpointList;

node = dataNodeList[i];

break;

}

}

var tmp_dataLineList = dataLineList.filter(function (items) {

if (items.targetId == nodeId || items.sourceId == nodeId) {

return true;

}

return false;

});

jsPlumb.removeAllEndpoints(nodeId);

for (var i = 0; i < data.EndpointList.length; i++) {

jsPlumb.addEndpoint(node.id, {uuid:data.EndpointList[i].id,anchors:locationToAnchors(data.EndpointList[i].location,node)}, GetEndpointOptions(data.EndpointList[i]));

}

loadLineList(tmp_dataLineList);

_layer.close(index);

}, btn2: function (index, layero) {

var node ={};

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].isCollapse = true;

node = dataNodeList[i];

break;

}

}

if(node.type==‘group’){

jsPlumb.collapseGroup(node.id);

}

_layer.close(index);

}, btn3: function (index, layero) {

var node ={};

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

dataNodeList[i].isCollapse = false;

node = dataNodeList[i];

break;

}

}

if(node.type==‘group’){

jsPlumb.expandGroup(node.id);

}

_layer.close(index);

},

type: 1,

title: ‘设备信息’,

area: [‘650px’, ‘540px’],

shadeClose: true, //开启遮罩关闭

content: nodeInfoView(),

success: function (layero, index) {

var data = {};

for (var i = 0; i < dataNodeList.length; i++) {

if (dataNodeList[i].id == nodeId) {

data = dataNodeList[i]

break;

}

}

parent.$(“#layui-layer” + index).find(“#nodeInfoName”).val(data.name);

n o d e I n f o T a b l e = p a r e n t . nodeInfoTable = parent. nodeInfoTable=parent.(“#layui-layer” + index).find(“#nodeInfoTable”);

parent.$(“#layui-layer” + index).find(“#btn_nodeInfo_add”).click(function(){btn_nodeInfo_add()});

parent.$(“#layui-layer” + index).find(“#btn_nodeInfo_delete”).click(function(){btn_nodeInfo_delete()});

nodeInfoSetData(data);

}

});

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

}

function nodeInfoSetData(data) {

//SetWebControls(data);

if(data.EndpointList ==undefined){data.EndpointList=[]}

nodeInfoConditionTable(data.EndpointList);

}

var $nodeInfoTable = null

function nodeInfoConditionTable(data) {

$nodeInfoTable.bootstrapTable({

data: data,

//toolbar: ‘#nodeInfoToolbar’, //工具按钮用哪个容器

striped: false, //是否显示行间隔色

cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

ta);

if(data.EndpointList ==undefined){data.EndpointList=[]}

nodeInfoConditionTable(data.EndpointList);

}

var $nodeInfoTable = null

function nodeInfoConditionTable(data) {

$nodeInfoTable.bootstrapTable({

data: data,

//toolbar: ‘#nodeInfoToolbar’, //工具按钮用哪个容器

striped: false, //是否显示行间隔色

cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

[外链图片转存中…(img-fU0YTlpl-1715666669617)]

[外链图片转存中…(img-ao5POj80-1715666669618)]

[外链图片转存中…(img-fWsW1oAs-1715666669618)]

[外链图片转存中…(img-S7vp95Fv-1715666669618)]

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值