背景

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

属性结构控制

  1. 后端返回列表,前端控制
  2. 后端直接返回

处理方法

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)

生成树形结构

  1. 获取传入部门列表中的顶级部门
  2. 遍历顶级部门获取每个部门的子部门列表
    1. 获取子部门列表
    2. 递归遍历子部门列表,获取每个子部门的子部门列表
    3. 退出条件:当前部门没有子部门
 /*** 构建前端所需要树结构* * @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;}

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

  1. 获取子部门列表
  2. 递归遍历子部门列表,获取每个子部门的子部门列表
  3. 退出条件:当前部门没有子部门
    /*** 递归列表*/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树形结构的控制(菜单,部门)相关推荐

  1. 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

    看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...

  2. 超多树形结构的JavaScript菜单实例

    超多树形结构的JavaScript菜单实例,树控菜单,有大家常用的展开折叠型,也就是节点树:还有的是多级的菜单,类似树型,右键菜单树,还有的是悬浮层树,都比较不错,希望大家喜欢. http://www ...

  3. java 树结构_Java通用tree树形结构

    前言 现在大部分都是后端封装树形结构,第一次做的时候想从网上找通用,发现大部分都是要用类的get/set方法,不一样就要改,毕竟懒,改就改改,后来发现部门要,地区要,分类要,于是想着就把之前的用注解和 ...

  4. 把数据转换为在内存中Tree(树形结构)。_备战秋招:一文搞定数据库常见面试题...

    点击上方"蓝字",关注了解更多 1.数据库范式 第一范式:列不可分,eg:[联系人](姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF: 第 ...

  5. 关于element tree树形结构设置默认展开第一级,第二级,第三级,以此类推

    官方default-expand-all是否默认展开所有节点,这个在这里已经不够用了. 第一步:设置node-key属性,每个树节点用来作为唯一标识的属性,整棵树应该是唯一的.例如:node-key= ...

  6. XML Tree(树形结构)

    xml文档(xml document)使用树形结构表达,以根结点root为开始,逐渐向下发散.它使用一种可自我描述的简单的语法. 一个xml文档分为文件序言(declaration)和文件主体两个大的 ...

  7. EasyUI之Tree树形结构(一)

    官网地址:www.jeasyui.net/plugins/186- 前端代码: $("#menuTreegrid").treegrid({url: SysResource.URL. ...

  8. python list转换成树形结构_python递归查询菜单并转换成json实例

    最近需要用python写一个菜单,折腾了两三天才搞定,现在记录在此,需要的朋友可以借鉴一下. 备注:文章引用非可执行完整代码,仅仅摘录了关键部分的代码 环境 数据库:mysql python:3.6 ...

  9. 把数据转换为在内存中Tree(树形结构)。_Linux的中断处理机制 [二] - 数据结构(2)...

    Linux的中断处理机制 [一] - 数据结构(1) 上文提到,每个IRQ同时有"irq"和"hwirq"两个编号.这里"hwirq"是硬件 ...

最新文章

  1. AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
  2. 快速建站的php开源程序
  3. go防止多次递交表单
  4. JAVA_OA管理系统(三):Spring参数注入
  5. 服务器系统玩dnf,win7系统玩dnf提示正在连接服务器的解决方法
  6. Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
  7. Node.js中的不安全跳转如何防御详解
  8. 惠普服务器G8系列做raid,hp g8服务器设置raid5
  9. webservice 实现通知支付结果到OA
  10. python之父北京尚学堂怎么样_尚学堂百战程序员:Python的元类
  11. 华为荣耀手机录制视频 华为手机如何录制视频
  12. FPGA Nios II学习笔记一
  13. 如何利用 composer 替换第三方包里的某个类(color-thief-php为例)
  14. 从打的看商业共赢模式
  15. 计算机网络安全叙述,计算机网络安全涉及
  16. 2023电工杯数学建模A题B题思路模型
  17. Stack Ball 堆栈球小游戏unity3d开发教程
  18. [PAT乙级]1025 反转链表 (思路+精简代码)
  19. Java 动态生成推广海报,带用户头像、昵称、二维码
  20. Win10安装程序无法正常启动怎么办【系统天地】

热门文章

  1. 凯文·凯利:流动、共享、颠覆,未来20年的 12大技术趋势
  2. 某招聘网站“数据分析”相关岗位招聘信息爬取并分析
  3. 计算机退回登录界面,win7开机怎么自动登录用户?Win进入桌面又返回登录界面故障解决...
  4. 支付宝积分兑换的扫地机器人好用_如何选购扫地机器人?
  5. 苹果手机打开浏览器显示无法连接服务器,苹果浏览器safari打不开网页因为无法连接服务器吗?...
  6. 7-4 sdust-Java-字符串集合求并集 (20分)
  7. WeChat楼梯导航
  8. mib文件导入mysql数据库_SNMP mib文件说明
  9. 程序设计天梯赛——T1(15分)java版
  10. 将现有android项目打包成aar包供第三方应用调用