最近一直在研究拓扑图,项目上推荐了jTopo,也就顺带研究了一番。根据官网描述,jTopo是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。本人也基于jTopo做了一个简单的交换机相关信息展示的拓扑图,要求能实时显示每个节点的流量信息,告警信息,连线通过不同颜色展示,同比环比趋势图等。
使用过程中,觉得jTopo方便的地方有:
1、只依赖jquery,很轻量,仅仅只有几十KB,性能上还不错。
2、自己简单写个样例就能上手,很容易,官方有覆盖比较全的demo,实现的样例也还过得去。
3、拓扑图常用的功能如连线、容器分组、动画效果、告警、鹰眼,能直接拿来使用,我比较喜欢。
样例就不在这里具体叙述,可以自行前往官网查看。这里,主要重点记录使用过程中花费我大量时间研究和定制的功能。
1、不支持界面自动布局。每个节点放置的位置都需要代码去设置横纵坐标,这就牵涉到我们需要自己去根据屏幕宽度、图片宽高等,采用动态算法去实现页面布局,这个是很需要耐心去研究,包括一个像素点都有可能导致整个图不居中。
比如,计算交换机图片位置,就需要根据不同情况,自己判断。
var offsetX = 0;
var switchNode1 = "";
if(1==switchnum){
offsetX = (inWidth-switchPicWidth)*0.5;
}else if(k==0){
offsetX = alarmWidth*0.5+5;
}else if(k==switchnum-1){
offsetX = k*((inWidth-switchnum*switchPicWidth)/(switchnum-1))+switchPicWidth*k-alarmWidth*0.5-5;
}else{
offsetX = k*((inWidth-switchnum*switchPicWidth-alarmWidth)/(switchnum-1))+switchPicWidth*k+alarmWidth*0.5; }
var switchNode1 = addNode(switchNodes[k].name,"router.png",offsetX,inHeight*(4/5));
2、不方便获取节点对象。因为使用的是html5的canvas,没有节点id,不能像平时界面直接获取id那样获取,定位元素调试不太方便。
var nodes = stage.find("node"); //把所有的node找到,包括根节点
if(nodes.length>0){
$.each(nodes,function(i,n){
if(n.image.getAttribute("src").indexOf("switch") !=-1) {
scene.remove(n);
}
});
}
3、我们是通过悬浮框来显示实时信息。但jTopo没有现成的悬浮框,需要自己定制实现,同时还要考虑显示换行、靠边翻转等,工作量不小。 具体样例就不写了,可以到网上找一些悬浮框的例子样式增加即可。
4、告警图片变色。这个功能我觉得是jTopo很不错的功能,可以解决增加常规告警图片切换。
var addAlarm = function(node,color,alarminfo) {
node.alarmColor = color;
node.alarm = alarminfo;
node.alarmAlpha = 0.9;
};
最后再吐槽一下,jTopo的文档真的不够详细,常见的Api都是通过demo来学习,如果案例中没有的话,那就有点盲人摸象的感觉,只能自己慢慢摸索,很让人痛苦。另外还需要注意一点,jTopo属于GPL协议,不能用于商业项目,所以我们还在考虑替代方法。