03【若依框架解读】Tree树形结构的控制(菜单,部门)
背景
若依管理框架中包含了不少菜单树和权限树的控制,主要实现的方式是递归,比较容易阅读和理解。构建属性结构本身是开发中非常常见的场景。掌握后非常容易在工作中使用。
属性结构控制
- 后端返回列表,前端控制
- 后端直接返回
处理方法
1. 根据角色获取部门
接口:/roleDeptTreeselect/{roleId}
查询角色具有的部门权限
deptCheckStrictly模式下只查询子菜单
<select id="selectDeptListByRoleId" resultType="Integer">
select d.dept_id
from sys_dept d
left join sys_role_dept rd on d.dept_id = rd.dept_id
where rd.role_id = #{roleId}
<if test="deptCheckStrictly">
and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
</if>
order by d.parent_id, d.order_num
</select>
2. 获取部门下拉树
接口:/system/dept/treeselect
step1 : 获取部门列表
List<SysDept> depts = deptService.selectDeptList(dept);
step2: 构建树形结构(重点)
deptService.buildDeptTreeSelect(depts)
生成树形结构
- 获取传入部门列表中的顶级部门
遍历顶级部门获取每个部门的子部门列表
- 获取子部门列表
- 递归遍历子部门列表,获取每个子部门的子部门列表
- 退出条件:当前部门没有子部门
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<SysDept> buildDeptTree(List<SysDept> depts)
{
List<SysDept> returnList = new ArrayList<SysDept>();
//保存所有的dept_id
List<Long> tempList = new ArrayList<Long>();
for (SysDept dept : depts)
{
tempList.add(dept.getDeptId());
}
for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
{
SysDept dept = (SysDept) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
<!--// 如果一个部门的父节点不在templist中,说明这个部门在当前数据集中是顶级部门,否则说明该部门是子部门-->
<!--注:不是所有的树都是从root部门,也可能是某个叶子节点遍历的树形结构-->
if (!tempList.contains(dept.getParentId()))
{
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty())
{
returnList = depts;
}
return returnList;
}
递归获取子部门列表树形结构
- 获取子部门列表
- 递归遍历子部门列表,获取每个子部门的子部门列表
退出条件:当前部门没有子部门
/**
* 递归列表
*/
private void recursionFn(List<SysDept> list, SysDept t)
{
// 得到子节点列表
List<SysDept> childList = getChildList(list, t);
t.setChildren(childList);
for (SysDept tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
获取子部门
- 入参:部门列表+部门
输出:查询部门的所有子部门列表
/**
* 得到子节点列表
*/
private List<SysDept> getChildList(List<SysDept> list, SysDept t)
{
List<SysDept> tlist = new ArrayList<SysDept>();
Iterator<SysDept> it = list.iterator();
while (it.hasNext())
{
SysDept n = (SysDept) it.next();
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
{
tlist.add(n);
}
}
return tlist;
}
每个函数只做一件简单的事情
/**
* 判断是否有子节点
*/
private boolean hasChild(List<SysDept> list, SysDept t)
{
return getChildList(list, t).size() > 0 ? true : false;
}
最终统一格式
/**
* 构建前端所需要下拉树结构
*
* @param depts 部门列表
* @return 下拉树结构列表
*/
@Override
public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
{
List<SysDept> deptTrees = buildDeptTree(depts);
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
还没有评论,来说两句吧...