因为业务要求做一个组织架构,就是理论上可以无限级的tree。第一次自己尝试写一棵树,分享一下过程。
解决这类不清楚有多少级节点的问题,用递归是最清爽的一个办法。
页面上最后展现的形式
<ul>
<li><div>一级节点</div>
<ul>
<li><div>二级节点</div>
<ul>
<li><div>三级节点</div></li>
</ul>
</li>
<li><div>二级节点</div></li>
</ul>
整理一下逻辑:前台需要的是一个List<HashMap>,list里每一个对象应该有一个key = "children" 对应的value 是List<HashMap>(子级节点数组),同理每一个子集节点还要有key="children"对应List<HashMap>,这样就形成了递归;
java后台:
首先根据我的一张组织架构的表如下
我们只需要关心 department_id 和 department_parent_id。
先把所有的department查询出来组成一个List<HashMap>,
下面我写了一个递归把没有层级结构的的List<HashMap>转化成前台需要的List<HashMap>
package com.asclepius.slhdt.uim.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
public class TreeUtil {
/**
* @param dataSource list数据源
* @param id 层级结构id
* @param parentId 父级节点id
* @return
*/
public static LinkedHashMap<String,HashMap> getTreeData(List<HashMap> dataSource,String id,String parentId)
{
LinkedHashMap returnMap = new LinkedHashMap();
HashMap<String,String> root = new HashMap<String,String>();
root.put(id, "");
assembleTree(dataSource,root,id,parentId,1);
returnMap.put("root",root);
return returnMap;
}
public static void assembleTree(List<HashMap> dataSource,HashMap node ,String id,String parentId,Integer level)
{
List childList = getChildList(dataSource,node,id,parentId);
node.put("children", childList);
if(childList.size() > 0)
{
for(int i = 0 ; i<childList.size(); i++ )
{
HashMap child = (HashMap)childList.get(i);
child.put("level", level);
assembleTree(dataSource,child,id,parentId,level+1);
}
}
}
/**
* 得到子节点列表
*/
private static List getChildList(List<HashMap> dataSource,HashMap node,String id, String parentId )
{
List childList = new ArrayList();
for (int i = 0; i < dataSource.size() ; i++)
{
HashMap child = (HashMap)dataSource.get(i);
String dictId = node.get(id).toString();
String dictParentId = child.get(parentId).toString();
if (dictId.equals(dictParentId))
{
childList.add(child);
dataSource.remove(i);
i--;
}
}
return childList;
}
}
返回给页面
LinkedHashMap<String,HashMap> hierarchyList = TreeUtil.getTreeData(departmentList,"departmentId","departmentParentId");
List tree = (List)(hierarchyList.get("root").get("children"));
return tree;
//组织架构树
$.ajax({
url:"/department/getdepartmentTree",
type:"get",
data:{hospitalId:hospital_id},
success:function(data)
{
$(".subdivision").append(assembleTopTree(data));
}
});
/**
* 组装一级节点
*/
function assembleTopTree(deptList)
{
var $ul = $("<ul class='department-stair' id='deptTree' style='display:none' />");
for(var i = 0; i<deptList.length; i++)
{
var $li=$("<li data-dept-id=" + deptList[i].departmentId + " >" +
"<div class='department-name stair' >" +
imgClick(deptList[i],true) +
"</div>"+
"<div class='subdivision-operate clearfix'>" +
"<a href='javascript:void(0)' class='adddept' data-dept-id="+deptList[i].departmentId + ">添加子部门</a>" +
"<a href='javascript:void(0)' class='editdept' data-dept-id="+ deptList[i].departmentId + " >编辑</a><span>|</span>"+
"<img class='delete' src='../../images/department/delete.png' data-dept-id="+ deptList[i].departmentId + " alt='删除' title='删除'/>" +
mouseUpClass(i,deptList) + mouseDownClass(i,deptList) +
"</div>" + assembleChildrenTree(deptList[i].children , deptList[i].departmentId)+"</li>");
$ul.append($li);
}
return $ul;
}
/**
* 组装子级节点
*/
function assembleChildrenTree(deptList,departmentId)
{
var $ul = $("<ul class='department-stair' style='display:none' id="+ departmentId +"/>");
for(var i = 0; i<deptList.length; i++)
{
var $li=$("<li data-dept-id=" + deptList[i].departmentId + " >" +
"<div class='department-name stair' >" +
imgClick(deptList[i],false) +
"</div>"+
"<div class='subdivision-operate clearfix'>" +
"<a href='javascript:void(0)' class='adddept' data-dept-id="+deptList[i].departmentId + ">添加子部门</a>" +
"<a href='javascript:void(0)' class='editdept' data-dept-id="+ deptList[i].departmentId + " >编辑</a><span>|</span>"+
"<img class='delete' src='../../images/department/delete.png' data-dept-id="+ deptList[i].departmentId + " alt='删除' title='删除'/>" +
mouseUpClass(i,deptList) + mouseDownClass(i,deptList) +
"</div>" + assembleChildrenTree(deptList[i].children,deptList[i].departmentId) + "</li>");
$ul.append($li);
}
return $ul[0].outerHTML;
}
/**
* 是否有鼠标经过class
*/
function mouseUpClass(index , list)
{
if(index == 0)
return "<img class='move-up' style='opacity:0.4' src='../../images/department/move_up.png' alt=''/>";
else
return "<img class='move-up' src='../../images/department/move_up.png' alt=''/>";
}
/**
* 是否有鼠标经过class
*/
function mouseDownClass(index , list)
{
if(index == list.length - 1)
return "<img class='move-down' style='opacity:0.4' src='../../images/department/move_down.png' alt=''/>";
else
return "<img class='move-down' src='../../images/department/move_down.png' alt=''/>";
}
/**
* 是否有展开按钮图标
*/
function imgClick(item , topOrChild)
{
if(topOrChild)
if(item.children.length > 0)
return "<img src='../../images/department/arrow_right.png' data-dept-id="+item.departmentId +" style='margin-left:"+ item.level*10 +"px' /><span>"+ item.departmentProp.departmentNameAlias +"</span>"+
(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
else
return "<span style='margin-left:"+ (14 + item.level*10) +"px' >"+ item.departmentProp.departmentNameAlias +"</span>"+
(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
else
if(item.children.length > 0)
return "<img src='../../images/department/arrow_right.png' data-dept-id="+item.departmentId +" style='margin-left:"+ item.level*10 +"px' /><span>"+ item.departmentProp.departmentNameAlias+"</span>"
+(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
else
return "<span style='margin-left:"+ (14 + item.level*10) +"px' >"+ item.departmentProp.departmentNameAlias +"</span>" +
(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
}
assembleChildrenTree中判断如果children长度不为0,再次调用assembleChildrenTree传入chidlren对应的List。最后的成果(css不在这里给出)
- 大小: 32.9 KB
- 大小: 41.6 KB
分享到:
相关推荐
树结构递归是Java后台常用的数据结构,通过递归函数来实现。树结构的用法实例包括树目录的总结、函数的参数说明、dtree.js文件的默认图片路径、页面中的书写规则、样式表的使用和页面代码书写的位置等。树结构可以...
`Tree.js`是自定义的JavaScript文件,负责解析XML数据,构建和管理树型菜单。这个文件中可能包含了前面提到的非递归算法实现,以及与`jquery.js`的交互逻辑。 至于`TreeImages`文件夹,它很可能包含了树型菜单的...
可以使用第三方库如jstree、treeview等,或者自定义渲染逻辑,实现拖拽排序、搜索功能等增强交互性。 7. **测试与调试**: - 对于开发的每个环节,都需要进行单元测试和集成测试,确保功能的正确性和稳定性。同时...
此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!
Java 动态树形结构(Tree)是一种在用户界面中常用的数据展示方式,它能够以层级结构呈现数据,便于用户浏览和操作。在本实例中,我们主要关注如何使用Java和JSP技术来构建这样的动态树形视图,并结合SqlServer...
在实际项目中,"javaTree"可能是一个包含实现无限递归树所需类和方法的Java文件或者模块,可能包括了树节点类、树构建算法以及与Struts2、Hibernate、Spring的交互逻辑。 总之,这个项目涉及到使用Struts2作为前端...
在Java中,虽然没有直接使用递归,但`addChildren`方法的循环逻辑实现了类似的效果,因为它不断地为每个父节点添加子节点,直到所有子节点都被处理完毕。 在实际应用中,这种无限层级的树形结构可以用于实现如文件...
在这个场景下,`Java`作为后端语言负责处理业务逻辑和数据解析,`XML`作为数据交换格式存储菜单信息,而`JavaScript`则用于在前端实现交互效果,如菜单的展开、收缩和全选功能。接下来,我们将详细探讨如何利用这些...
使用递归删除树形结构的所有子节点(java和mysql实现) 在树形结构中删除某个父节点时,需要递归删除其所有子节点,以避免遗留冗余数据。下面将为大家介绍使用 Java 和 MySQL 实现递归删除树形结构的所有子节点的...
通过JavaScript实现,它能够无缝集成到Node.js环境中,为Web开发者提供了一种在浏览器环境中解析Java代码的能力。 使用tree-sitter-java,你可以: 1. **实时语法检查**:在编辑器插件中集成tree-sitter-java,...
JavaScript,简称JS,是Web开发中的主要脚本语言,广泛应用于网页和浏览器端,而Java则是一种独立的面向对象的编程语言,常用于服务器端开发。 在描述中提到,这个开源树的Demo对学习Tree非常有帮助,这意味着它...
本示例是一个基于Java实现的JSP动态树形菜单功能,旨在提供一个简单而全面的解决方案,覆盖了从数据获取到页面渲染的全过程。 首先,我们要理解树形菜单的基本概念。树形菜单是由节点(通常代表菜单项)构成的层级...
JavaScript Tree 是一种在Web应用程序中实现可交互树形结构的技术,它主要依赖于JavaScript和HTML来构建。在本文中,我们将深入探讨如何使用JavaScript(尤其是jQuery库)来创建动态的菜单树,以及与之相关的web开发...
本教程将介绍如何利用Java来实现这种功能,并结合MySQL数据库进行数据存储,同时通过AJAX技术实现页面的异步刷新。 首先,我们需要建立一个Java实体类来表示树形结构中的节点。这个类通常包含ID(主键)、名称、父...
本文将详细讲解如何使用Java来实现ZTree的异步加载功能。 首先,我们需要理解ZTree异步加载的基本原理。ZTree通过Ajax请求向服务器获取数据,服务器端(这里为Java)处理请求并返回JSON格式的节点数据。ZTree接收到...
2. 实现一个递归函数,用于将数据库中的树结构转换为符合jsTree要求的JSON格式。 3. 在前端使用jsTree库,通过Ajax请求获取并解析JSON数据,展示树形视图。 通过这样的方式,我们可以有效地将后台无限级的树结构...
本文将详细讨论如何使用Java语言和JavaScript(JS)来实现这一功能,基于提供的标题"tree12-30.rar_目录树_目录树 java语言_目录树 js"和描述"自己修改成功的java代码+js动态生成目录树结构"。 首先,让我们深入...
本文将详细讲解如何实现一个带有复选框(Checkbox)的树形列表(TREE LIST)的级联选择功能,以及相关的Java标签形式实现。这种功能常见于权限管理、组织结构选择等场景,让用户能够方便地进行多层级的勾选操作。 ...
本例"JSP实现树型结构TREE"提供了一个使用JSP(JavaServer Pages)、EXTJS(一个前端JavaScript框架)、JSON(JavaScript Object Notation)以及MySQL数据库来创建树形结构的示例,这对于初学者或开发者来说,是一个...
现在有一个数据,需要你渲染出对应的列表出来: var data = [ {"id":1}, {"id":2}, {"id":3}, {"id":4}, ]; var str="<ul>";...data.forEach(function(v,i){ str+="<li><span>"+v.id+"</span></li>" ...