【曹操】【js-sequence-diagrams】前端js绘制时序图

背景说明:

    因为最近在开发一个新的项目,代号曹操,后续可能会更新许多曹操项目相关的开发技术博文,见证曹操项目的从0到上线到最终的产品,也见证自己从java后台到前端全栈到最后全战的开发dog。。。
曹操项目:
前端:angularjs
后台:java

1、需求描述

最近有个功能需要画出某个组件的服务器与上下游服务器的交互情况,画出交互的时序图,并注明交互信息、时间等内容,类似wireshark的Graph Analysis功能:

2、需求解决

在网上找了很久没有画图的js,百度的echart和蚂蚁的G2都翻遍了,确实功能很强大,但是没有实现时序图的方法,甚至期间还去改了echart的关系图,尝试做个二维的时序图,很可惜,效果很差。。直到遇见了js-sequence-diagrams,这不就是最完美的解决方案吗?我天,天造一双啊!

以下是官方给出的例子:
官网地址:https://bramp.github.io/js-sequence-diagrams/

左边为效果图,右边为文本控制。

3、实现方法

3.1、官方文档中给出以下js引用方法:

首先在页面中引用相关js:

<script src="webfont.js"></script>
<script src="snap.svg-min.js"></script>
<script src="underscore-min.js"></script>
<script src="sequence-diagram-min.js"></script>

在html文档中手动添加解析文本:

<div id="diagram"></div>
<script>
  var diagram = Diagram.parse("A->B: Message");
  diagram.drawSVG("diagram", {theme: 'hand'});
</script>

或者使用jQuery引用:

<div class="diagram">A->B: Message</div>
<script>
$(".diagram").sequenceDiagram({theme: 'hand'});
</script>

3.2、结合需求

该需求是从数据库中查出很多交互信息,每画一条线需要一个list数据,后台在查询数据库后会以json格式返回所有数据,该json数据的result为一个大的array,array中又有很多map,其中每个map的key是一样的,value不同,所有的map根据时间排序。

前端拿到数据后,在angular的controller js中按照顺序将每条map数据拼接成js-sequence-diagrams形式的文本画出对应的线条,由此生成一个完整的时序图。具体代码如下:

js引用方法:

sipTraceService.getSipTraceList($scope.sipTrace.connid).then(function(data){
       if( null != data && data != undefined && data.result.length != 0){

           var result = data.result;
           var htmlTexts = '';
           //对数据进行迭代
           result.forEach(function(ele,index){
               //格式化时间
               formatTime = $filter('date')( ele.time,'yyyy-MM-dd HH:mm:ss:sss');
               var htmlText = '';
               var inbound = ele.inbound;
               var ip = ele.ip;
               newIp = ip.split(':')[0];
               //根据inbound的值,判断箭头方向
               if(inbound == 0){
                  htmlText   = newIp+'->'+ele.hostip+':'+'\\n'+'cseq:'+ele.cseq+'\\n'+'Request:'+ele.name+'\\n'+'时间:'+formatTime;
               }else if(inbound == 1){
                   htmlText   = ele.hostip+'->'+newIp+':'+'\\n'+'cseq:'+ele.cseq+'\\n'+'Status:'+ele.name+'\\n'+'时间:'+formatTime;
               }
               htmlTexts+=htmlText+'\n';
           })
       //画图
           var diagram = Diagram.parse(htmlTexts);
           diagram.drawSVG("diagram", {theme: 'simple'});
       }else {
           alert('connid不存在!');
       }

       });

在html上引用js文件,然后通过在controller里使用js方法处理后台数据,按照js-sequence-diagrams的格式输出文本,最后使用其方法完成画图。

4、效果展示

时间: 2024-09-03 05:26:14

【曹操】【js-sequence-diagrams】前端js绘制时序图的相关文章

【曹操】js绘制时序图语法报错(sql如何去除回车符)

前提:为了时序图展示更多信息,数据库name字段摘取了更多字段入库,但是字段内容更新后,发现报错前端语法错误,后端看了日志,数据查询输出没问题. 1.刚开始以为是name字段里含有特殊字符:@.\等这种导致js-sequence-diagrams不支持,在ibatis里修改了sql,使用replace函数替换了所有的特殊字符,但是还是报错语法错误: 2.直接打印出前端拼接好的diagrams文本,发现文本打印出来没什么问题,但是将一条完整的数据输入UE的时候,会从中间"时间"换行到下一

web前端 js 点击添加

问题描述 web前端 js 点击添加 想实现点击"+"按钮,就添加一行上图一样的三个框在该按钮下方对应位置,拜托各位帮忙解决一下. 解决方案 <div id=""dvList""> <div id=""dvAdd""><input type=""text"" style=""width:60px""

前端js文件合并三种方式

最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式. 三个方式如下: 1. 一个大文件,所有js合并成一个大文件,所有页面都引用它. 2. 各个页面大文件,各自页面合并生成自己所需js的大文件. 3. 合并多个共用大文件,根据实践情况合并出多个共用js文件,每个页面引用多个共用大文件. 另外在我看来,合并有两个目的: 1. 为了减少请求数. 2. 代码安全考虑(文件分得越多,越容易被人看清). PS:注意我说的不是压缩混淆,只是合并 1. 一

前端js给后台cs 传值 问题

问题描述 前端js给后台cs 传值 问题 我想通过js给后台C#程序传值 但是值取不到啊 源代码如下: 前台:aspx <asp:HiddenField runat="server" id="hell"/> <asp:Label ID="Label1" runat="server"></asp:Label> <script type="text/javascript"

YUICompressor+ANT压缩Java Web工程前端js/css文件

最近team里有个jsp工程想要做一些性能上的优化, 需要对工程里的前端部分(主要是js和css)做一些压缩(这是一个老旧重的工程,重构的成本非常大,也没有人力,只能一步一步去优化).想到与传统ANT工具结合的比较好的yuicompressor. yuicompressor下载 下载地址: http://maven.aliyun.com/nexus/service/local/repositories/central/content/com/yahoo/platform/yui/yuicompr

很容易被忘记的前端JS面试题

此题是综合之前的开发经验以及遇到的JS各种坑汇集而成.此题涉及的知识点众多,包括变量定义提升.this指针指向.运算符优先级.原型.继承.全局变量污染.对象属性及原型属性优先级等等. 用来考核面试者的 JavaScript的综合能力 /**  * 一道常被人轻视的前端JS面试题  *  * 此题是综合之前的开发经验以及遇到的JS各种坑汇集而成.此题涉及的知识点众多,包括变量定义提升.this指针指向.运算符优先级.原型.继承.全局变量污染.对象属性及原型属性优先级等等.  * 用来考核面试者的

javascript-Web前端JS计数器代码修改问题

问题描述 Web前端JS计数器代码修改问题 这是一个js计时器的代码,目前只能向上滚动数字,我想改成向下滚动的应该怎么办呢,跪谢各位大神~ function DigitRoll(a){if(this.container=document.querySelector(a.container),this.width=a.width||2,!this.container)throw Error("no container");this.container.style.overflow=&qu

前端js文件合并的三种方式推荐_基础知识

最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式. 三个方式如下: 1. 一个大文件,所有js合并成一个大文件,所有页面都引用它. 2. 各个页面大文件,各自页面合并生成自己所需js的大文件. 3. 合并多个共用大文件,根据实践情况合并出多个共用js文件,每个页面引用多个共用大文件. 另外在我看来,合并有两个目的: 1. 为了减少请求数. 2. 代码安全考虑(文件分得越多,越容易被人看清). PS:注意我说的不是压缩混淆,只是合并 1. 一

Android的WebView与H5前端JS代码交互的实例代码

前段时间项目有深度和前端对接过,也是碰了一些坑,现在有时间就拿出来分享下 JS调用原生不外乎就两种,一种是传假的url,也就是url拦截的方式,类似于下面这种: //js代码 function sendCommand(param){ var url="js-call://"+param; document.location = url; } sendCommand("PlaySnake"); //Java代码 mWebView.setWebViewClient(ne