java如何返回树形结构

一、需求说明

在做项目的时候前台要显示一个树形目录,比如下面这样:

 二、添加数据库表

1、创建数据库表

 2、添加测试数据

 三、后端代码实现

PS:该测试类中的create_time和update_time写在BaseEntity中,可以忽略!!!

1、创建实体类

@TableName(value ="menu")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu extends BaseEntity implements Serializable {
    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 菜单名称
     */
    private String name;

    /**
     * 父id
     */
    private Integer parentId;

    /**
     * 子节点信息
     */
    @ApiModelProperty("子节点信息")
    public List<Menu> childList;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

2、添加实现类

(1)添加一个查询所有数据接口

    public List<Menu> searchAll() {
        return menuMapper.searchAll();
    }
    <select id="searchAll" resultType="com.atjava.mybatisx.pojo.Menu">
        select * from menu
    </select>

实现方法一:

    public List<Menu> searchTreeMenu() {
        List<Menu> menus = searchAll();
        List<Menu> TreeMenu = menus.stream().filter(m -> m.getParentId() == 1).map(
                (m) -> {
                    m.setChildList(getChildrens(m,menus));
                    return m;
                }
        ).collect(Collectors.toList());
        return TreeMenu;
    }


    private List<Menu> getChildrens(Menu root, List<Menu> all) {

        List<Menu> children = all.stream().filter(m -> {
            return Objects.equals(m.getParentId(), root.getId());
        }).map(
                (m) -> {
                    m.setChildList(getChildrens(m, all));
                    return m;
                }
        ).collect(Collectors.toList());
        return children;
    }

实现方法二:

public List<Menu> searchTreeMenu() {
        List<Menu> menus = searchAll();

        List<Menu> roots = new ArrayList<>();
        List<Menu> TreeMenu = new ArrayList<>();

        //获取最外层集合
        for (Menu menu : menus) {
            //0代表最高用户
            if (menu.getParentId() == 0) {
                roots.add(menu);
            }
        }
        //从最高级别用户开始遍历,递归找到该用户的下级用户,将带有下级的最高级用户放入返回结果中
        for (Menu root : roots) {
            root = buildUserTree(menus, root);
            TreeMenu.add(root);
        }
        return TreeMenu;
    }

 public Menu buildUserTree(List<Menu> allMenus, Menu menu) {
        List<Menu> children = new ArrayList<>();
        for (Menu menu1 : allMenus) {
            //0代表根节点,无需重复比较
            if (menu1.getParentId() == 0)
                continue;
            //当前用户的上级编号和传入的用户编号相等,表示该用户是传入用户的下级用户
            if (menu1.getParentId() == menu.getId()) {
                //递归调用,获取该用户的下级用户
                menu1 = buildUserTree(allMenus, menu1);
                children.add(menu1);
            }
        }
        //给该用户的children属性赋值,并返回该用户
        menu.setChildList(children);
        return menu;
    }

 3、添加请求接口

@Api(tags = "菜单管理")
@RestController
@RequestMapping("/menu")
public class MenuController {

    @Autowired
    MenuService menuService;

    @ApiOperation("获取树形菜单")
    @GetMapping("/searchTreeMenu")
    public ResponseResult<Menu> searchTreeMenu(){
        List<Menu> menus = menuService.searchTreeMenu();
        return ResponseResult.ok(menus);
    }

}

四、使用swagger测试

 

 

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值