03【若依框架解读】Tree树形结构的控制(菜单,部门)
背景
若依管理框架中包含了不少菜单树和权限树的控制,主要实现的方式是递归,比较容易阅读和理解。构建属性结构本身是开发中非常常见的场景。掌握后非常容易在工作中使用。
属性结构控制
- 后端返回列表,前端控制
- 后端直接返回
处理方法
1. 根据角色获取部门
接口:/roleDeptTreeselect/{roleId}
查询角色具有的部门权限
deptCheckStrictly模式下只查询子菜单
<select id="selectDeptListByRoleId" resultType="Integer">select d.dept_idfrom sys_dept dleft join sys_role_dept rd on d.dept_id = rd.dept_idwhere 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 树结构列表*/@Overridepublic List<SysDept> buildDeptTree(List<SysDept> depts){List<SysDept> returnList = new ArrayList<SysDept>();//保存所有的dept_idList<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 下拉树结构列表*/@Overridepublic List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts){List<SysDept> deptTrees = buildDeptTree(depts);return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());}
03【若依框架解读】Tree树形结构的控制(菜单,部门)相关推荐
- 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件
看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...
- 超多树形结构的JavaScript菜单实例
超多树形结构的JavaScript菜单实例,树控菜单,有大家常用的展开折叠型,也就是节点树:还有的是多级的菜单,类似树型,右键菜单树,还有的是悬浮层树,都比较不错,希望大家喜欢. http://www ...
- java 树结构_Java通用tree树形结构
前言 现在大部分都是后端封装树形结构,第一次做的时候想从网上找通用,发现大部分都是要用类的get/set方法,不一样就要改,毕竟懒,改就改改,后来发现部门要,地区要,分类要,于是想着就把之前的用注解和 ...
- 把数据转换为在内存中Tree(树形结构)。_备战秋招:一文搞定数据库常见面试题...
点击上方"蓝字",关注了解更多 1.数据库范式 第一范式:列不可分,eg:[联系人](姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF: 第 ...
- 关于element tree树形结构设置默认展开第一级,第二级,第三级,以此类推
官方default-expand-all是否默认展开所有节点,这个在这里已经不够用了. 第一步:设置node-key属性,每个树节点用来作为唯一标识的属性,整棵树应该是唯一的.例如:node-key= ...
- XML Tree(树形结构)
xml文档(xml document)使用树形结构表达,以根结点root为开始,逐渐向下发散.它使用一种可自我描述的简单的语法. 一个xml文档分为文件序言(declaration)和文件主体两个大的 ...
- EasyUI之Tree树形结构(一)
官网地址:www.jeasyui.net/plugins/186- 前端代码: $("#menuTreegrid").treegrid({url: SysResource.URL. ...
- python list转换成树形结构_python递归查询菜单并转换成json实例
最近需要用python写一个菜单,折腾了两三天才搞定,现在记录在此,需要的朋友可以借鉴一下. 备注:文章引用非可执行完整代码,仅仅摘录了关键部分的代码 环境 数据库:mysql python:3.6 ...
- 把数据转换为在内存中Tree(树形结构)。_Linux的中断处理机制 [二] - 数据结构(2)...
Linux的中断处理机制 [一] - 数据结构(1) 上文提到,每个IRQ同时有"irq"和"hwirq"两个编号.这里"hwirq"是硬件 ...
最新文章
- AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
- 快速建站的php开源程序
- go防止多次递交表单
- JAVA_OA管理系统(三):Spring参数注入
- 服务器系统玩dnf,win7系统玩dnf提示正在连接服务器的解决方法
- Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
- Node.js中的不安全跳转如何防御详解
- 惠普服务器G8系列做raid,hp g8服务器设置raid5
- webservice 实现通知支付结果到OA
- python之父北京尚学堂怎么样_尚学堂百战程序员:Python的元类
- 华为荣耀手机录制视频 华为手机如何录制视频
- FPGA Nios II学习笔记一
- 如何利用 composer 替换第三方包里的某个类(color-thief-php为例)
- 从打的看商业共赢模式
- 计算机网络安全叙述,计算机网络安全涉及
- 2023电工杯数学建模A题B题思路模型
- Stack Ball 堆栈球小游戏unity3d开发教程
- [PAT乙级]1025 反转链表 (思路+精简代码)
- Java 动态生成推广海报,带用户头像、昵称、二维码
- Win10安装程序无法正常启动怎么办【系统天地】
热门文章
- 凯文·凯利:流动、共享、颠覆,未来20年的 12大技术趋势
- 某招聘网站“数据分析”相关岗位招聘信息爬取并分析
- 计算机退回登录界面,win7开机怎么自动登录用户?Win进入桌面又返回登录界面故障解决...
- 支付宝积分兑换的扫地机器人好用_如何选购扫地机器人?
- 苹果手机打开浏览器显示无法连接服务器,苹果浏览器safari打不开网页因为无法连接服务器吗?...
- 7-4 sdust-Java-字符串集合求并集 (20分)
- WeChat楼梯导航
- mib文件导入mysql数据库_SNMP mib文件说明
- 程序设计天梯赛——T1(15分)java版
- 将现有android项目打包成aar包供第三方应用调用