ECharts中From Left to Right Tree树形图后台数据构造与节点点击事件

十点数据 1年前 ⋅ 3048 阅读

最近在做一个项目中涉及到了百度ECharts中From Left to Right Tree树形图的使用,。虽然ECharts使用有些年头了,但是在后台数据构造时还是浪费了一点时间。 chart是-logo.png 现在记录一下,算是留做备份吧。同时也给需要的童鞋做个参考。

后端代码如下:

一:树节点对象:

class Node {
    public String id;
    public String name;
    public String value;
    public String parentId;
    public Node(String id, String name, String parentId, String value) {
        this.id = id;
        this.name = name;
        this.value = value;//可以用来保存节点记录的ID,以便后续操作;
        this.parentId = parentId;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getParentId() {
        return parentId;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
}

二:指定节点所有子节点获取方法:

    /**
     * 获取当前节点的所有子节点
     * 
     * @param nodeId 
     *				待获取子节点信息的节点ID
     * @param nodes 
     * 			所有节点集合;
     * @return
     */
    public static List<Node> getChildNodes(String nodeId,
            Map<String, Node> nodes) {
        List<Node> list = new ArrayList<Node>();
        for (String key : nodes.keySet()) {
            if (nodes.get(key).getParentId().equals(nodeId)) {
                list.add(nodes.get(key));
            }
        }
        return list;
    }
}

三:通过递归方式,构造树形图json数据;

/**
 * 
 * 递归处理 数据库树结构数据->树形json
 * 
 * @param nodeId
 * 
 * @param nodes
 * 
 * @return
 */
public static JSONArray getNodeJson(String nodeId, Map<String, Node> nodes) {
	// 当前层级当前node对象
	// 当前层级当前点下的所有子节点(实战中不要慢慢去查,一次加载到集合然后慢慢处理)
	List<Node> childList = getChildNodes(nodeId, nodes);
	JSONArray childTree = new JSONArray();
	for (Node node : childList) {
		JSONObject o = new JSONObject();
		o.put("name", node.getName());
		o.put("value", node.getValue());
		o.put("id", node.getId());
		JSONArray childs = getNodeJson(node.getId(), nodes); // 递归调用该方法
		if (!childs.isEmpty()) {
			o.put("children", childs);
		}
		childTree.fluentAdd(o);
	}
	return childTree;
}

四:使用示例:

@SuppressWarnings("unchecked")
@RequestMapping(value = "/getTreeData", method = { RequestMethod.POST,
        RequestMethod.GET })
public void getTreeData(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        Long id = Long.parseLong(request.getParameter("id"));
        Temple tem = templeService.getByProerties("id", id);

        Map<String, Node> nodes = new HashedMap();
        nodes.put("1", new Node("1", tem.getTempName(), "0", "0"));
        nodes.put("2", new Node("2", "活动", "1", "0"));
        nodes.put("3", new Node("3", "人员", "1", "0"));
        nodes.put("4", new Node("4", "场所", "1", "0"));
        nodes.put("5", new Node("5", "文物", "1", "0"));
        // 查询活动信息;
        List<Relic> relicList = relicService.queryByProerties("relicTempleId",
                id.intValue());
        for (Relic pl : relicList) {
            nodes.put("5_" + pl.getId(), new Node("5_" + pl.getId(), pl
                    .getRelicName(), "5", pl.getId() + ""));
        }
        // 查询活动信息;
        List<Action> actionList = actiionService.queryByProerties(
                "actionTempleId", id.intValue());
        for (Action pl : actionList) {
            nodes.put("2_" + pl.getId(), new Node("2_" + pl.getId(), pl
                    .getActionName(), "2", pl.getId() + ""));
        }

        // 查询场所信息;
        List<Place> pList = placeService.queryByProerties("placeTempleId", id
                .intValue());
        for (Place pl : pList) {
            nodes.put("4_" + pl.getId(), new Node("4_" + pl.getId(), pl
                    .getPlaceName(), "4", pl.getId() + ""));
        }

        // 人员信息;
        List<Monks> monksList = monksService.queryByProerties("monksTempleId",
                id.intValue());
        for (Monks pl : monksList) {
            nodes.put("3_" + pl.getId(), new Node("3_" + pl.getId(), pl
                    .getMonksLegalName(), "3", pl.getId() + ""));
        }
        writeJSON(response, JSON.toJSONString(getNodeJson("0", nodes)));
}

前端代码如下:

一:树形图

MainElement.search = function() {
	url = "http://127.0.0.1/sms/mainElement/getTreeData?id=" + nodeId;
	data = MainElement.getData(url)
	var myChart = echarts.init(document.getElementById('treeChart'));
	myChart.on("click", MainElement.clickFun);
	myChart.showLoading();
	myChart.hideLoading();
	myChart.setOption(option = {
		tooltip : {
			trigger : 'item',
			triggerOn : 'mousemove'
		},
		legend : {
			orient : 'vertical',
			data : [ {
				name : 'tree2',
				icon : 'rectangle'
			} ],
			borderColor : '#c23531'
		},
		series : [ {
			type : 'tree',
			data : data,
			top : '15%',
			left : '15%',
			bottom : '15%',
			right : '15%',
			symbolSize : 15,
			label : {
				position : 'left',
				verticalAlign : 'middle',
				align : 'right'
			},
			leaves : {
				label : {
					position : 'right',
					verticalAlign : 'middle',
					align : 'left'
				}
			},
			expandAndCollapse : true,
			animationDuration : 550,
			animationDurationUpdate : 750
		} ]
	});
};

二:节点点击事件处理

1:添加点击事件

	var myChart = echarts.init(document.getElementById('treeChart'));//初始化echarts对象;
	myChart.on("click", MainElement.clickFun);//给节点添加点击事件;

2:点击操作逻辑

// 关键点!
MainElement.clickFun = function(param) {
	if (typeof param.seriesIndex == 'undefined') {
		return;
	}
	console.log(param.data.id);
	if (param.type == 'click') {
		var nodeId = param.data.id;
		//添加自己的业务处理逻辑;
	}
}

全部评论: 0

    我有话说: