Java多级菜单排序并返回树结构菜单列表

本文介绍了如何使用SpringBoot+MybatisPlus对菜单数据进行排序,并生成树形Json结构的菜单列表。通过Java实体类定义菜单属性,Service层利用递归方法获取所有子菜单并按排序序号排序,最终返回包含一级菜单及其子菜单的有序列表。

Java多级菜单排序并返回树结构菜单列表

前言

SpringBoot+MybatisPlus 对数据表中的菜单进行排序并返回树形Json格式的菜单列表


一、数据表

菜单表:t_menu
字段说明:name:菜单名称; status:1表示启用,表示停用; level:菜单级别说明; parent_id:父级菜单id,0表示一级菜单; sort_order:排序序号
在这里插入图片描述


二、Java实体

@Getter
@Setter
@Accessors(chain = true)
@TableName("t_menu")
public class Menu implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id")
    private String id; //菜单ID

    @JSONField(ordinal = 1)
    private String name;//菜单名称

    @JSONField(ordinal = 2)
    private Boolean status; //菜单状态 0表示禁用 1表示启用

    @JSONField(ordinal = 3)
    private String level;    //菜单级别 例如:一级菜单、二级菜单

    @JSONField(ordinal = 4)
    private String parentId; //父级ID 一级菜单

    @JSONField(ordinal = 5)
    private Integer sortOrder; //排序 0表示最前面

    //存放子菜单目录
    @JSONField(ordinal = 6)
    @TableField(exist = false)
    private List<Menu> children;

}



三、Service层

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    @Override
    public List<Menu> getMenu() {
        List<Menu> allMenu = baseMapper.selectList(null);//查出全部菜单
        return allMenu.stream()
                .filter(item -> Objects.equals(item.getParentId(), "0"))
                .map(item -> item.setChildren(getChild(item.getId(), allMenu)))
                .sorted(Comparator.comparingInt(menu -> (menu.getSortOrder() == null ? 0 : menu.getSortOrder())))
                .collect(Collectors.toList());
    }

    private List<Menu> getChild(String id, List<Menu> allMenu) {
        return allMenu.stream()
                .filter(item -> Objects.equals(item.getParentId(), id))
                .map(item -> item.setChildren(getChild(item.getId(), allMenu)))
                .sorted(Comparator.comparingInt(menu -> (menu.getSortOrder() == null ? 0 : menu.getSortOrder())))
                .collect(Collectors.toList());
    }

}



四、结果

{
  "code": 2000,
  "data": [
    {
      "id": "1402904218656530433",
      "name": "位置管理",
      "status": true,
      "level": "一级菜单",
      "parentId": "0",
      "sortOrder": 0,
      "children": []
    },
    {
      "id": "1402904118723043329",
      "name": "日志管理",
      "status": true,
      "level": "一级菜单",
      "parentId": "0",
      "sortOrder": 5,
      "children": [
        {
          "id": "1402905060906328066",
          "name": "查看日志",
          "status": true,
          "level": "二级菜单",
          "parentId": "1402904118723043329",
          "sortOrder": 0,
          "children": []
        }
      ]
    },
    {
      "id": "1402903753264885762",
      "name": "用户管理",
      "status": true,
      "level": "一级菜单",
      "parentId": "0",
      "sortOrder": 7,
      "children": [
        {
          "id": "1402904547628376065",
          "name": "账号管理",
          "status": true,
          "level": "二级菜单",
          "parentId": "1402903753264885762",
          "sortOrder": 5,
          "children": []
        },
        {
          "id": "1402904663936425985",
          "name": "权限管理",
          "status": true,
          "level": "二级菜单",
          "parentId": "1402903753264885762",
          "sortOrder": 12,
          "children": [
            {
              "id": "1402904949253955585",
              "name": "修改权限",
              "status": true,
              "level": "三级菜单",
              "parentId": "1402904663936425985",
              "sortOrder": 2,
              "children": []
            },
            {
              "id": "1402904920229371906",
              "name": "添加权限",
              "status": true,
              "level": "三级菜单",
              "parentId": "1402904663936425985",
              "sortOrder": 10,
              "children": [
                {
                  "id": "1402922502042918914",
                  "name": "测试一",
                  "status": true,
                  "level": "四级菜单",
                  "parentId": "1402904920229371906",
                  "sortOrder": 0,
                  "children": []
                },
                {
                  "id": "1402922463040086018",
                  "name": "测试二",
                  "status": true,
                  "level": "四级菜单",
                  "parentId": "1402904920229371906",
                  "sortOrder": 4,
                  "children": []
                }
              ]
            },
            {
              "id": "1402904973903880194",
              "name": "删除权限",
              "status": true,
              "level": "三级菜单",
              "parentId": "1402904663936425985",
              "sortOrder": 10,
              "children": []
            }
          ]
        },
        {
          "id": "1402904645955444738",
          "name": "角色管理",
          "status": true,
          "level": "二级菜单",
          "parentId": "1402903753264885762",
          "sortOrder": 14,
          "children": []
        },
        {
          "id": "1402904723365519361",
          "name": "菜单管理",
          "status": true,
          "level": "二级菜单",
          "parentId": "1402903753264885762",
          "sortOrder": 30,
          "children": []
        }
      ]
    }
  ],
  "date": 1623480149457,
  "msg": "success",
  "success": true
}



总结

如果这篇博客对你有帮助的话,记得给我点个赞,你的鼓励是对我最大的支持!谢谢。◕‿◕。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值