JavaWeb - 多级菜单、分组嵌套“递归”写法

简介: JavaWeb - 多级菜单、分组嵌套“递归”写法


设计思路:最简单的查询全部分组数据,然后通过 Java 程序控制分层问题,借用临时 Map 来快速定位父子分组关系噢~

  • SQL
DROPTABLEIFEXISTS`t_ac_api_group`;
CREATETABLE`t_ac_api_group` (
`group_id`varchar(32) NOTNULLCOMMENT'分组Id',
`group_name`varchar(30) NOTNULLCOMMENT'分组名称',
`group_pid`varchar(32) NOTNULLCOMMENT'分组父Id',
`group_type`tinyint(1) NOTNULLCOMMENT'分组类型',
`group_del`tinyint(1) NOTNULL,
`group_createtime`datetimeNOTNULL,
`group_updatetime`datetimeNOTNULL,
PRIMARYKEY (`group_id`) USINGBTREE) ENGINE=InnoDBDEFAULTCHARSET=utf8;

image.png

  • 伪代码
importcom.baomidou.mybatisplus.annotation.*;
importcom.fasterxml.jackson.annotation.JsonInclude;
importlombok.AllArgsConstructor;
importlombok.Builder;
importlombok.Data;
importlombok.NoArgsConstructor;
importjava.time.LocalDateTime;
importjava.util.List;
/*** @author Lux Sun* @date 2020/6/5*/@Data@Builder@NoArgsConstructor@AllArgsConstructor@TableName("t_ac_api_group")
publicclassApiGroupPO {
@TableId(type=IdType.ASSIGN_UUID)
privateStringgroupId;
privateStringgroupName;
privateStringgroupPid;
privateIntegergroupType;
@TableField(exist=false)
privateList<ApiGroupPO>groupList;
@TableLogic@TableField(fill=FieldFill.INSERT, select=false)
privateIntegergroupDel;
@TableField(fill=FieldFill.INSERT)
privateLocalDateTimegroupCreatetime;
@TableField(fill=FieldFill.INSERT_UPDATE)
privateLocalDateTimegroupUpdatetime;
}
/*** [OK]* 获取根分组集* @return*/@OverridepublicList<ApiGroupPO>getGroupListByType() {
QueryWrapper<ApiGroupPO>qw=newQueryWrapper<>();
qw.orderByDesc(Const.Group.COLUMN_GROUPUPDATETIME);
List<ApiGroupPO>apiGroupPoList=groupDao.selectList(qw);
apiGroupPoList=dealApiGroupLayer(apiGroupPoList);
returnapiGroupPoList;
}
/*** [OK]* 处理分组层级* @param apiGroupList*/privateList<ApiGroupPO>dealApiGroupLayer(List<ApiGroupPO>apiGroupList) {
Map<String, ApiGroupPO>id2GroupMap=apiGroupList.stream().collect(Collectors.toMap(ApiGroupPO::getGroupId, apiGroupPO->apiGroupPO));
List<ApiGroupPO>finalApiGroupPoList=Lists.newArrayList();
for (ApiGroupPOapiGroupPo : apiGroupList) {
StringgroupPid=apiGroupPo.getGroupPid();
if (Const.Group.VAL_GROUPPIDROOT.equals(groupPid)) {
finalApiGroupPoList.add(apiGroupPo);
continue;
        }
ApiGroupPOapiParentGroupPo=id2GroupMap.get(groupPid);
// 如果为空, new List 赋值过去; 不为空也不影响, 大不了自己 set 自己一下apiParentGroupPo.setGroupList(Optional.ofNullable(apiParentGroupPo.getGroupList()).orElse(Lists.newArrayList()));
apiParentGroupPo.getGroupList().add(apiGroupPo);
    }
returnfinalApiGroupPoList;
}
目录
相关文章
|
4月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
503 37
|
4月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
36 1
java基础(11)函数重载以及函数递归求和
|
3月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
39 2
|
3月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
89 5
|
4月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
4月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
132 2
|
4月前
|
Java Go PHP
Java分组匹配
Java分组匹配
32 5
|
4月前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
5月前
|
算法 Java
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
ConcurrentHashMap通过分段锁(Segment)实现高效并发访问,get操作无需加锁,而put操作首先判断是否需要扩容,然后通过两次hash定位并尝试使用CAS和锁机制安全地添加元素。
|
5月前
|
JSON Java 数据格式
Java系列之:如何取出嵌套JSON中的数据值
这篇文章介绍了如何在Java中取出嵌套JSON数据值的方法,通过使用`JSONObject`类及其`getJSONObject`和`get`方法来逐步解析和提取所需的数据。
Java系列之:如何取出嵌套JSON中的数据值