需求:实现一级,二级,三级...多层级目录菜单展示
建表:
CREATE TABLE `ImageMenu` (
`menu_id` varchar(32) NOT NULL COMMENT '菜单id',
`title` varchar(64) NOT NULL COMMENT '菜单名称',
`parent_id` varchar(32) NOT NULL COMMENT '父类目录id',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`creator` varchar(32) DEFAULT NULL COMMENT '创建人',
`remark` varchar(64) DEFAULT NULL COMMENT '备注',
`children` varchar(100) DEFAULT NULL COMMENT '子级列表'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件目录表'
模拟数据:
INSERT INTO ImageMenu(menu_id,title,parent_id,create_time,creator,remark,children) VALUES
('001','一级父目录-1','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
('001001','二级目录-1-1','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('001002','二级目录-1-2','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('001003','二级目录-1-3','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('002','一级父目录-2','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
('003','一级父目录-3','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
('003001','二级目录-3-1','003','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('003002','二级目录-3-2','003','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('004','一级父目录-4 ','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
('004001','二级目录-4-1','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('004002','二级目录-4-2','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('004003','二级目录-4-3','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
('004001001',三级目录-4-1-1','004001','2021-03-16 00:00:00','lrj','3级目录',NULL),
('004001002','三级目录-4-1-2','004001','2021-03-16 00:00:00','lrj','3级目录',NULL);
创建实体类 menu.class,dao层mapper,不在赘述
逻辑实现:
public DetailResponse queryImageList() {
DetailResponse response = new DetailResponse();
List<ImageMenu> data = imageMapper.selectList();
List<ImageMenu> imageList = new ArrayList<>();
for (ImageMenu imageMenu : data) {
if (imageMenu.getParentId().equals("0")) {
imageList.add(imageMenu);
}
}
// 为一级菜单设置子菜单,getChild是递归调用的
for (ImageMenu imageMenu : imageList) {
imageMenu.setChildren(getChilde(imageMenu.getMenuId(), data));
}
response.setResult(GlobalResponseCode.SUCCESS);
response.setData(imageList);
return response;
}
private List<ImageMenu> getChilde(String fileSource, List<ImageMenu> rootList) {
List<ImageMenu> childeList = new ArrayList<>();
for (ImageMenu imageMenu : rootList) {
if (imageMenu.getParentId().equals(fileSource)) {
childeList.add(imageMenu);
}
}
for (ImageMenu imageMenu : childeList) {
imageMenu.setChildren(getChilde(imageMenu.getMenuId(), rootList));
}
if (childeList.size() == 0) {
return null;
}
return childeList;
}