菜单列表:有父级框和子级框,需要将两者关系从数据库这两者是多对多的关系。所以需要从数据库将两者关系获取并封装成List。
1、controller层
直接调用service层方法
@ApiOperation("获取菜单")
@GetMapping("findNodes")
public Result findNodes() {
List<SysMenu> list = sysMenuService.findNodes();
return Result.ok(list);
}
2、service层
需要实现的功能:将列表的父级子级关系从数据库中拿出来进行封装成要求的List形式。
service接口
public interface SysMenuService extends IService<SysMenu> {
List<SysMenu> findNodes();
}
service实现类
调用mapper层数据接口查询到所有的数据。
取封装类的方法将数据封装成树形结构。
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
@Override
public List<SysMenu> findNodes() {
// 查询数据
List<SysMenu> SysMenuList = baseMapper.selectList(null);
// 构建树形结构
List<SysMenu> resultList = MenuHelper.buildTree(SysMenuList);
return resultList;
}
}
封装类代码:使用递归实现;
递归入口:循环找到最顶层父级id进入到递归过程中 ,找到属于它的子级目录进行封装
注意判空初始化
public class MenuHelper {
public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
List<SysMenu> trees = new ArrayList<>();
for (SysMenu sysMenu : sysMenuList) {
// 递归入口
if(sysMenu.getParentId().longValue() == 0) {
trees.add(getChildren(sysMenu, sysMenuList));
}
}
return trees;
}
public static SysMenu getChildren(SysMenu sysMenu, List<SysMenu> sysMenuList) {
sysMenu.setChildren(new ArrayList<SysMenu>());
for (SysMenu item : sysMenuList) {
// 找到该父级所对应的自己列表进行加入
if(sysMenu.getId() == item.getParentId()) {
if (sysMenu.getChildren() == null) {
sysMenu.setChildren(new ArrayList<>());
}
sysMenu.getChildren().add(getChildren(item, sysMenuList));
}
}
return sysMenu;
}
}
运行结果
使用swargger进行测试 有父子级关系,成功!
"children": [
{
"id": 3,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:47",
"isDeleted": 0,
"param": {},
"parentId": 2,
"name": "用户管理",
"type": 1,
"path": "sysUser",
"component": "system/sysUser/list",
"perms": "",
"icon": "el-icon-s-custom",
"sortValue": 1,
"status": 1,
"children": [
{
"id": 6,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 3,
"name": "查看",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysUser.list",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},
{
"id": 7,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 3,
"name": "添加",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysUser.add",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},
{
"id": 8,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 3,
"name": "修改",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysUser.update",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},
{
"id": 9,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 3,
"name": "删除",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysUser.remove",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},
{
"id": 18,
"createTime": "2022-05-23 17:14:32",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 3,
"name": "分配角色",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysUser.assignRole",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
}
],
"select": false
},
{
"id": 4,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:37:18",
"isDeleted": 0,
"param": {},
"parentId": 2,
"name": "角色管理",
"type": 1,
"path": "sysRole",
"component": "system/sysRole/list",
"perms": "",
"icon": "el-icon-user-solid",
"sortValue": 2,
"status": 1,
"children": [
{
"id": 10,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 4,
"name": "查看",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysRole.list",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},
{
"id": 11,
"createTime": "2021-05-31 18:05:37",
"updateTime": "2022-06-09 09:22:38",
"isDeleted": 0,
"param": {},
"parentId": 4,
"name": "添加",
"type": 2,
"path": null,
"component": null,
"perms": "bnt.sysRole.add",
"icon": null,
"sortValue": 1,
"status": 1,
"children": [],
"select": false
},