一、需求说明
在做项目的时候前台要显示一个树形目录,比如下面这样:
二、添加数据库表
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测试