echars-all.js 2.2.7组织结构图及自定义右键菜单的实现思路及源码

2023-10-27

组织结构图一般是树图结构。echars是一个很好的开源数据工具,2.x版本也有对树图的定义;

要做组织结构图的需求拿到手里后,在网上也翻阅了很多echarts的官网资料及网友的实现思路。最终在网友及自身的努力下完成了这项任务。

以上!


先上最终结果图:


由于部门较多,图表加了滚动缩放及拖动。


具体实现:

1.了解echarts树图的数据结构。

    

data: [
                {
                    name: '手机',
                    value: 6,
                    symbolSize: [90, 70],
                    symbol: 'image://http://www.iconpng.com/png/ecommerce-business/iphone.png',
                    itemStyle: {
                        normal: {
                            label: {
                                show: false
                            }
                        }
                    },
                    children: [
                        {
                            name: '小米',
                            value: 4,
                            symbol: 'image://http://pic.58pic.com/58pic/12/36/51/66d58PICMUV.jpg',
                            itemStyle: {
                                normal: {
                                    label: {
                                        show: false
                                    }
                                }
                            },
                            symbolSize: [60, 60],
                            children: [
                                {
                                    name: '小米1',
                                    symbol: 'circle',
                                    symbolSize: 20,
                                    value: 4,
                                    itemStyle: {
                                        normal: {
                                            color: '#fa6900',
                                            label: {
                                                show: true,
                                                position: 'right'
                                            },
                                            
                                        },
                                        emphasis: {
                                            label: {
                                                show: false
                                            },
                                            borderWidth: 0
                                        }
                                    }
                                },
                                {
                                    name: '小米2',
                                    value: 4,
                                    symbol: 'circle',
                                    symbolSize: 20,
                                    itemStyle: {
                                        normal: {
                                            label: {
                                                show: true,
                                                position: 'right',
                                                formatter: "{b}"
                                            },
                                            color: '#fa6900',
                                            borderWidth: 2,
                                            borderColor: '#cc66ff'

                                        },
                                        emphasis: {
                                            borderWidth: 0
                                        }
                                    }
                                },
                                {
                                    name: '小米3',
                                    value: 2,
                                    symbol: 'circle',
                                    symbolSize: 20,
                                    itemStyle: {
                                        normal: {
                                            label: {
                                                position: 'right'
                                            },
                                            color: '#fa6900',
                                            brushType: 'stroke',
                                            borderWidth: 1,
                                            borderColor: '#999966',
                                        },
                                        emphasis: {
                                            borderWidth: 0
                                        }
                                    }
                                }
                            ]
                        },
                        {
                            name: '苹果',
                            symbol: 'image://http://www.viastreaming.com/images/apple_logo2.png',
                            symbolSize: [60, 60],
                            itemStyle: {
                                normal: {
                                    label: {
                                        show: false
                                    }
                                    
                                }
                            },
                            value: 4
                        },
                        {
                            name: '华为',
                            symbol: 'image://http://market.huawei.com/hwgg/logo_cn/download/logo.jpg',
                            symbolSize: [60, 60],
                            itemStyle: {
                                normal: {
                                    label: {
                                        show: false
                                    }
                                    
                                }
                            },
                            value: 2
                        },
                        {
                            name: '联想',
                            symbol: 'image://http://www.lenovo.com.cn/HomeUpload/Home001/6d94ee9a20140714.jpg',
                            symbolSize: [100, 40],
                            itemStyle: {
                                normal: {
                                    label: {
                                        show: false
                                    }
                                    
                                }
                            },
                            value: 2
                        }
                    ]

所有,可以理解为:
var zNodes=[{id:1,pId:0,name:"董事长"},
		{id:11,pId:1,name:"经理"},
		{id:12,pId:1,name:"副总"},
		{id:13,pId:1,name:"秘书"},
		{id:16,pId:11,name:"财务经理"},
		{id:27,pId:11,name:"人事经理"},
		{id:18,pId:12,name:"HR"},];
子节点的父节点id对应可以找到其父节点。

2.对数据的组装解析成echarts所需要的数据类型:

(这里修改了网友的方法)

function treeMenu(a) {
	// 列表map形式
	this.tree = a || [];
	this.groups = {};
	// 存放id与对应的name映射
	this.nameMap = {};
	// 得到每个点对应的层次,为了后期进行布局
	this.levelMap = {};
	// 样式设计
	this.style = {
		'symbolSize' : [ 75, 65, 55, 45, 35 ]
	/*,'value' : [ 8, 6, 4, 2, 1 ]*/
	};
	
	// 存放id与对应的status映射
	this.statusMap = {};
	// 存放id与对应的code映射
	this.codeMap = {};
};
treeMenu.prototype = {
	init : function(pid) {
		this.group();
		this.MapNamebyId();//id-name key对
		this.MapStatusbyId();//id-status key对
		this.MapCodebyId();//id-code key对
		this.setIdLevel(pid);
		return this.rescusive(pid);
	},
	group : function() {
		for ( var i = 0; i < this.tree.length; i++) {
			// 存在该grops则直接添加
			if (this.groups[this.tree[i].pId]) {
				this.groups[this.tree[i].pId].push(this.tree[i]);
			} else {
				this.groups[this.tree[i].pId] = [];
				this.groups[this.tree[i].pId].push(this.tree[i]);
			}
		}
	},
	// 得到每个点的层次
	setIdLevel : function(pid) {
		debugger;
		var level = 1;
		this.levelMap[pid] = level;
		var gs = this.groups[pid];
		// str=JSON.stringify(gs)
		// alert("json:"+str)
		var temp = [];
		while (gs) {
			level++;
			if (gs == null || gs == undefined || gs.length == 0)
				break;
			temp = [];
			for ( var i = 0; i < gs.length; i++) {
				var myid = gs[i]['id'];
				this.levelMap[myid] = level;
				subgs = this.groups[myid];
				if (subgs instanceof Array && subgs != null) {
					for ( var j = 0; j < subgs.length; j++) {
						temp.push(subgs[j]);
					}
				}
			}
			gs = temp;
		}

	},
	// 根据所在层次设计不同大小的样式
	getStyleById : function(id) {
		var level = this.levelMap[id];
		if (level >= 5)
			level = 5;
		var symbolize = 0;
		//var value = 0;
		symbolize = this.style['symbolSize'][level - 1];
		//value = this.style['value'][level - 1];
		var styleValue = {};
		styleValue['symbolSize'] = symbolize;
		//styleValue['value'] = value;
		return styleValue;
	},
	MapNamebyId : function() {//id对应的组织名
		for ( var i = 0; i < this.tree.length; i++) {
			map = this.tree[i];
			this.nameMap[map["id"]] = map["name"];
		}
	},
	MapStatusbyId : function() {//id对应的组织状态status
		for ( var i = 0; i < this.tree.length; i++) {
			map = this.tree[i];
			this.statusMap[map["id"]] = map["status"];
		}
	},
	MapCodebyId : function() {//id对应的组织名
		debugger;
		for ( var i = 0; i < this.tree.length; i++) {
			map = this.tree[i];
			this.codeMap[map["id"]] = map["code"];
		}
	},
	MapNamebyId : function() {//id对应的组织名
		for ( var i = 0; i < this.tree.length; i++) {
			map = this.tree[i];
			this.nameMap[map["id"]] = map["name"];
		}
	},
	// 设置节点属性
	setNode : function(node, name, symbolize, value, children,nodeStatus) {
		var font_bkcolor='#4883b4';
		if(nodeStatus!="1"){
			font_bkcolor="red";
		}
		if((name)&&name.length>4){
			var str = '';
			var strs = name.split(''); //字符串数组

			for(var i = 0, s; s = strs[i++];) { //遍历字符串数组
			str += s;
			if(!(i % 5)) str += '\n'; //按需要求余
			}
			if(str.substring(str.length-1,str.length)=='\n'){
				name=str.substring(0,str.length-1);
			}else{
				name=str;
			}
			//name=str.substring(0,str.length-1);
		}
		node['name'] = name;
		node['symbolSize'] = [symbolize,35];//宽,高
		node['value'] = value;
		node['nodeStatus'] = nodeStatus;
		node['children'] = children;
		node['symbol'] = 'rectangle';
		node['itemStyle'] ={normal: {label: {
					            show: true,
					            position: 'inside',
					            	textStyle: {
		                                color: '#FFFFFF'
		                            }
					        },
					        color: font_bkcolor/*,
					        borderWidth: 1,
					        borderColor: '#4883b4'*/
					        	}
							};
		return node;
	},
	rescusive : function(number) {
		var data = [];
		var node = {};
		var styleValue = {};
		// 某个节点下的子节点
		var a = this.groups[number];
		var nodeName = this.nameMap[number];
		var nodeStatus = this.statusMap[number];
		var nodeCode = this.codeMap[number];
		if (a == null || a == undefined) {
			styleValue = this.getStyleById(number);
			// 设置节点
			this.setNode(node, nodeName, styleValue['symbolSize'],
					nodeCode/*styleValue['value']*/, [],nodeStatus);
			return node;
		}
		for ( var i = 0; i < a.length; i++) {
			children = this.rescusive(a[i].id);
			data.push(children);
		}
		styleValue = this.getStyleById(number);
		this.setNode(node, nodeName, styleValue['symbolSize'],
				nodeCode/*styleValue['value']*/, data,nodeStatus);
		return node;
	},
	// 创建组织结构图
	createTreeVisual : function(myChart, title, data) {
		option = {
			    title : {
			        text: title
			    },
			    toolbox: {
			        show : true,
			        feature : {
			            mark : {show: true},
			            dataView : {show: true, readOnly: false},
			            restore : {show: true},
			            saveAsImage : {show: true}
			        }
			    },
			    tooltip: {
			    	show : false,
			        trigger: 'item',
			        triggerOn: 'mousemove',
			        formatter : '{b}: {c}'
			    },
			    series : [
			        {
			            name:'树图',
			            type:'tree',
			            orient: 'vertical',  // vertical horizontal
			            rootLocation: {x: 'center',y: 50}, // 根节点位置  {x: 100, y: 'center'}
			            nodePadding: 8,
			            layerPadding: 100,
			            hoverable: false,
			            roam: true,
			            symbolSize: 6,
			            itemStyle: {
			                normal: {
			                    color: '#4883b4',
			                    label: {
			                        show: true,
			                        position: 'right',
			                        formatter: "{b}",
			                        textStyle: {
			                            color: '#000',
			                            fontSize: 10
			                        }
			                    },
			                    lineStyle: {
			                        color: '#8A8A8A',//关系线的颜色
			                        type: 'broken' // 'curve'|'broken'|'solid'|'dotted'|'dashed'

			                    }
			                },
			                emphasis: {
			                    //color: '#4883b4',
			                    label: {
			                        show: false
			                    },
			                    borderWidth: 0
			                }
			            },
			            
			            data: data
			        }
			    ]
			};
		
		myChart.setOption(option);
	}
}
// 得到数据测试用
function getData(zNodes) {
	var mytree = new treeMenu(zNodes);
	var treeData = mytree.init(0);
	var data = [];
	data.push(treeData);
	return data;
	// str=JSON.stringify(menu);
	// alert("responsing json:"+str)
}
function createTreeV(myChart, title, znodes) {
	var mytree = new treeMenu(znodes);
	var treeData = mytree.init(62);//注意:是第一级节点id号
	var data = [];
	data.push(treeData);
	mytree.createTreeVisual(myChart, title, data);
}
// getData()

3.用过后台查询数据返回到前台,并创建树图

//初始化echarts
var myEchart = echarts.init(document.getElementById('echartDepId'));
/****
			显示数据
			***/
			me.viewData = function(rowSet){
				zNodes=[];
				debugger;
				for(var i=0,count = rowSet.getRowCount();i<count;i++){
					var row = rowSet.getRow(i);
					var jsonStr = "{";// json格式开始
					jsonStr += '"id":' + '"' + row.getItemValue("deptId") + '",'+
					'"pId":' + '"' + row.getItemValue("upperDeptId") + '",'+
					'"name":' + '"' + row.getItemValue("deptName") + '",'+
					'"status":' + '"' + row.getItemValue("status") + '",'+
					'"code":' + '"' + row.getItemValue("deptCode") + '",';
					jsonStr = jsonStr.replace(/,{1}$/gi, '');// 删除最后的逗号
					jsonStr += "}";// //json格式结束
                     
                     			var jsonObj = jQuery.parseJSON(jsonStr);//将每条数据逐个转换成json对象,并push到itemJsonArray中
                    				zNodes.push(jsonObj);
				}
				//alert("zNodes2222:"+JSON.stringify(zNodes));
				createTreeV(myEchart,"凯里公交公司组织结构图",zNodes);
			};
4.修改echarts-all.js源文件
项目需要自定义的鼠标右键菜单。但是低版本的echarts是没有开放右键菜单的。当然echarts3已经开放了鼠标右键。但是树图结构并不是我想要的展示方式。echarts树图如下


在其官方文档里点击打开链接并没有说明可以展示为直角图的例子及文档。
因项目需要,还是决定要修改2.2.7版本的echarts-all.js源文件。


如需要请查看本文档末的下载链接,包含修改后的echarts-all.js文件支持了自定义右键菜单和本人所建树图所有源码文件。


5.修改原文件后,就可以自定义右键菜单了

<style>
#menuuu {
	position: absolute;
	border: 1px outset #F6F6F6 !important;
	border-color: #FFFFFF;
	z-index: 10000;
	left: 300px;
	top: 200px;
	display: none;
	width: 100px;
	height: 35px;/*65*/
	background: #CCCCCC;
	filter: alpha(opacity : 80);
	/* opacity:0.8; */
	overflow: hidden;
}

#menuuu ul {
	padding-top: 5px;
	padding-left: 2px;
	margin: 0px;
	list-style-type: none;
	vertical-align: middle;
}

#menuuu ul li {
	padding: 0px;
	margin-top: 1px;
	border-top: 1px solid #F6F6F6 !important;
	border-bottom: 1px outset #F6F6F6 !important;
	border-color: #FFFFFF;
	font-family: "微软雅黑";
	width: 96px;
	font-size: 14px;
	vertical-align: middle;
	text-align: center;
}

#menuuu font {
	padding-left: 4px;
	vertical-align: top;
}
</style>
<script language="javascript">
	//禁用右键
	var tree = document.getElementById("echartDepId");
	tree.οncοntextmenu=function()  
            {  
               return false;  
            }  

		
	</script>
<div id="menuuu" onMouseLeave="this.style.display = 'none';">
		<div style="display:none"><span class="menuValue"></span></div>
		<ul>
			<!--右键弹出菜单-->
			<li id="menu_influence" onClick="rlzy_control_echartDepId.unUse();"
				onMouseOver="this.style.background = '#999999';"
				onMouseOut="this.style.background = '#CCCCCC';"><img
				src="<%=request.getContextPath()%>/modules/rlzy.control/component/echartsFile/sitemap.png" style="width: 16px;height: 16px"/><font>组织撤销</font></li>
			<%-- <li id="menu_blood" onClick="alert('组织撤销');"
				onMouseOver="this.style.background = '#999999';"
				onMouseOut="this.style.background = '#CCCCCC';"><img
				src="<%=request.getContextPath()%>/modules/rlzy.control/component/echartsFile/workflow.png" /><font>组织撤销</font></li> --%>

		</ul>
	</div>
//新加上鼠标右击事件
		   myEchart.on('contextmenu', function (params) {
		 		//console.log("右键事件");
			    //console.log(params);
			    showMenu(params);
			    param=params;
			    window.document.onclick = function(){//点击其他位置时隐藏已打开的右键菜单
		        	hideMenu()
		        }
		  	});
		    var showMenu = function(params){
		    	var menu = document.getElementById("menuuu");  
			    var event = params.event;  
			    var pageX = event.pageX;  
			    var pageY = event.pageY;  
			    menu.style.left = pageX-238 + 'px';  
			    menu.style.top = pageY-118 + 'px';  
			    menu.style.display = "block"; 
			    为右键菜单准备信息块的信息;
			    menu.getElementsByClassName("menuValue")[0].innerHTML = params.data.value+","+params.data.nodeStatus;
			}
		    var hideMenu = function(){
		    	if(document.getElementById("menuuu")){
		    		
					document.getElementById("menuuu").style.display = "none";
		    	}
			}

源文件下载链接:http://download.csdn.net/download/xieedeni/10175200

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

echars-all.js 2.2.7组织结构图及自定义右键菜单的实现思路及源码 的相关文章

随机推荐

  • 读取.ini文件乱码的解决办法

    void CGetConfigInfo GetValueByKey QSettings seting const QString key QString value if seting nullptr value seting gt val
  • Memory write error at 0x100000. MMU section translation fault

    在使用vitis2020 2 JTAG调试MZ702P板子的时候会报下面的错误 原因都是启动模式没有设置到JTAG启动或SD启动 记得之前用SDK的时候好像没有这个问题 记录一下 备忘 Downloading Program F FPGA
  • ONVIF对讲功能漫谈

    ONVIF对讲功能漫谈 前言 一 onvif对讲功能和onvif协议关系大吗 二 如何上报设备支持onvif对讲功能呢 三 onvif协议中哪个接口上报音频解码配置 四 献上抓包报文 前言 本篇文章尝试使用提问的方式来分享onvif对讲功能
  • java类型信息与反射

    初步理解 https www cnblogs com xuanlin666 p 10826809 html
  • 使用Electron开发过程中不能使用remote模块解决

    在 electron 渲染进程中引入BrowserWindow报错 const BrowserWindow require electron remote BrowserWindow 报错 Cannot read properties of
  • c++ADO编程-connection对象

    Connection对象的属性有如下几个 1 ConnectionString属性 是连接字符串 通过传递包含一系列由分号分隔的 argument value 语句的详细连接字符串 可指定用于建立连接数据源的信息 连接串格式根据数据源的不同
  • 3.2面向对象

    面向对象与面向过程的区别 面向过程指的是工作过程如何执行 而面向对象指的是工作该让谁来完成 面向对象三大思想 OOA 面向对象分析 Object Oriented Analysis OOD 面向对象设计 Object Oriented De
  • 剑指 Offer 15. 二进制中1的个数(java+python)

    编写一个函数 输入是一个无符号整数 以二进制串的形式 返回其二进制表达式中数字位数为 1 的个数 也被称为 汉明重量 提示 请注意 在某些语言 如 Java 中 没有无符号整数类型 在这种情况下 输入和输出都将被指定为有符号整数类型 并且不
  • 一万字关于java数据结构堆的讲解,让你从入门到精通

    目录 java类和接口总览 队列 Queue 1 概念 2 队列的使用 以下是一些常用的队列操作 1 入队操作 2 出队操作 3 判断队列是否为空 4 获取队列大小 5 其它 优先级队列 堆 1 优先级队列概念 Java中的Priority
  • uvicorn启动fastapi项目实现热部署

    一 创建在不同的文件中 通过import引入 将app对象定义在一个模块中 如app py 在主模块 如main py 中导入app并运行 app py from fastapi import FastAPI app FastAPI mai
  • 真题详解(关系模型)-软件设计(六十六)

    真题详解 ICMP 软件设计 六十五 https blog csdn net ke1ying article details 130475620 2017年下半年 内存按字节编址 若存储容量为32K 8bit的存储芯片构成地址从A0000H
  • C++基础知识 - 子类的析构函数

    子类的析构函数 注意 为了防止内存泄露 最好是在基类析构函数上添加virtual关键字 使基类析构函数为虚函数 目的在于 当使用delete释放基类指针时 会实现动态的析构 如果基类指针指向的是基类对象 那么只调用基类的析构函数 如果基类指
  • 【DSP】TMS320F28335的ADC模块

    一 功能说明 12位内建采样保持的模数转换器 模拟输入电平 0 3V 16个转换通道 最快转换时钟频率12 5MHz 奈奎斯特定则 25MHz最高能采样12 5MHz的信号 多触发源 软件 ePWM和GPIO 两种采样模式 级联和双通道模式
  • 张大哥笔记-从零开始自己创建一个网站的操作指南

    随着互联网时代的发展 无论是个人还是企业 都想拥有一个自己的网站 通过网站快速展示自己的商品信息 有很多人不了解一个网站是如何形成的 制作一个网站需要多少时间 具体由哪些细节都是全然不知 他们甚至感觉搭建一个网站是一件非常复杂的事情 其实
  • C语言经典100例题(37)--给10个数排序(选择排序和冒泡排序)

    目录 题目 问题分析 选择排序法 冒泡排序法 代码 选择排序法 冒泡排序法 运行结果 题目 给10个数排序 问题分析 选择排序法 从后9个比较过程中 选择一个最小的与第一个元素交换 下次类推 即用第二个元素与后8个进行比较 并进行交换 每一
  • Appium + IOS 自动化环境搭建教程(实践+总结+踩坑)

    文章目录 前言 IOS 自动化相关框架介绍 自动化测试类工具 内测发布工具 Appium驱动IOS测试原理 关于 WebDriverAgent 基础环境搭建 基础环境 安装内容 前提环境 通用环境 iOS 环境 iOS 真机调试环境配置 I
  • Pandas学习之to_csv()

    用法 df to csv 输出路径 参数1 参数2 参数3 sep 以逗号 作为数据的分隔符 如果分隔符不为逗号 则包含符双引号 就会消失 分隔符为Tab时 写法如下 df to csv new csv sep t na rep NA 确实
  • if-else常见的优化方案

    前言 代码中如果if else比较多 阅读起来比较困难 维护起来也比较困难 很容易出bug 接下来 本文将介绍优化if else代码的八种方案 优化方案一 提前return 去除不必要的else 如果if else代码块包含return语句
  • HBase 比较过滤器

    一 行过滤器 RowFilter 测试RowFilter过滤器 Test public void testRowFilter throws IOException Configuration conf HBaseConfiguration
  • echars-all.js 2.2.7组织结构图及自定义右键菜单的实现思路及源码

    组织结构图一般是树图结构 echars是一个很好的开源数据工具 2 x版本也有对树图的定义 要做组织结构图的需求拿到手里后 在网上也翻阅了很多echarts的官网资料及网友的实现思路 最终在网友及自身的努力下完成了这项任务 以上 先上最终结