03【若依框架解读】Tree树形结构的控制(菜单,部门)

您所在的位置:网站首页 CAESAT节点列表 03【若依框架解读】Tree树形结构的控制(菜单,部门)

03【若依框架解读】Tree树形结构的控制(菜单,部门)

2023-10-16 23:29| 来源: 网络整理| 查看: 265

背景

若依管理框架中包含了不少菜单树和权限树的控制,主要实现的方式是递归,比较容易阅读和理解。构建属性结构本身是开发中非常常见的场景。掌握后非常容易在工作中使用。

属性结构控制 后端返回列表,前端控制后端直接返回 处理方法 1. 根据角色获取部门

接口:/roleDeptTreeselect/{roleId}

查询角色具有的部门权限 deptCheckStrictly模式下只查询子菜单

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} 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}) order by d.parent_id, d.order_num 2. 获取部门下拉树

接口:/system/dept/treeselect

step1 : 获取部门列表

List depts = deptService.selectDeptList(dept);

step2: 构建树形结构(重点)

deptService.buildDeptTreeSelect(depts)

生成树形结构

获取传入部门列表中的顶级部门遍历顶级部门获取每个部门的子部门列表 获取子部门列表递归遍历子部门列表,获取每个子部门的子部门列表退出条件:当前部门没有子部门 /** * 构建前端所需要树结构 * * @param depts 部门列表 * @return 树结构列表 */ @Override public List buildDeptTree(List depts) { List returnList = new ArrayList(); //保存所有的dept_id List tempList = new ArrayList(); for (SysDept dept : depts) { tempList.add(dept.getDeptId()); } for (Iterator iterator = depts.iterator(); iterator.hasNext();) { SysDept dept = (SysDept) iterator.next(); // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(dept.getParentId())) { recursionFn(depts, dept); returnList.add(dept); } } if (returnList.isEmpty()) { returnList = depts; } return returnList; }

递归获取子部门列表树形结构

获取子部门列表递归遍历子部门列表,获取每个子部门的子部门列表退出条件:当前部门没有子部门 /** * 递归列表 */ private void recursionFn(List list, SysDept t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (SysDept tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } }

获取子部门

入参:部门列表+部门输出:查询部门的所有子部门列表 /** * 得到子节点列表 */ private List getChildList(List list, SysDept t) { List tlist = new ArrayList(); Iterator 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 list, SysDept t) { return getChildList(list, t).size() > 0 ? true : false; }

最终统一格式

/** * 构建前端所需要下拉树结构 * * @param depts 部门列表 * @return 下拉树结构列表 */ @Override public List buildDeptTreeSelect(List depts) { List deptTrees = buildDeptTree(depts); return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3