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测试

 

扫描二维码关注公众号,回复: 15062599 查看本文章

猜你喜欢

转载自blog.csdn.net/yy12345_6_/article/details/127551229