1、表数据

2、实体类
@Data
@TableName("sys_menu")
@ApiModel(value = "Menu对象", description = "菜单表")
public class Menu implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
private Long id;
@ApiModelProperty("父级ID,一级菜单为0")
private Long pid;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单URL")
private String url;
@ApiModelProperty("授权(多个用逗号隔开,如:sys:user:save)")
private String permissions;
@ApiModelProperty("类型(0-菜单,1-按钮)")
private Boolean type;
@ApiModelProperty("图标")
private String icon;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createDate;
@ApiModelProperty("子菜单列表")
@TableField(exist = false)
private List<Menu> children = new ArrayList<>();
}
3、controller层
@GetMapping("getMenuListTree")
public Result getMenuListTree() {
return memuService.getMenuListTree();
}
4、service层
Result getMenuListTree();
5、service实现类
@Override
public Result getMenuListTree() {
List<Menu> menuList = baseMapper.selectList(null);
List<Menu> menuListTree = buildTree(menuList);
return Result.success(menuListTree);
}
private List<Menu> buildTree(List<Menu> treeNodes) {
List<Menu> listTree = new ArrayList<>();
Long pid = 0L;
for (Menu treeNode : treeNodes) {
if (pid.equals(treeNode.getPid())) {
Menu menu = findChildren(treeNodes, treeNode);
listTree.add(menu);
}
}
return listTree;
}
private Menu findChildren(List<Menu> treeNodes, Menu rootNode) {
for (Menu treeNode : treeNodes) {
if (rootNode.getId().equals(treeNode.getPid())) {
rootNode.getChildren().add(findChildren(treeNodes, treeNode));
}
}
return rootNode;
}
6、测试

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义