【java】树形菜单的实现
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private Long catId;
private String name;
private Long parentCid;
private Integer catLevel;
@TableLogic(value = "1", delval = "0")
private Integer showStatus;
private Integer sort;
private String icon;
private String productUnit;
private Integer productCount;
@JsonInclude(value = JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private List children;
}
@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl implements CategoryService {
@Override
public PageUtils queryPage(Map params) {
IPage page = this.page(
new Query().getPage(params),
new QueryWrapper()
);
return new PageUtils(page);
}
@Override
public List listWithTree() {
List categoryEntities = baseMapper.selectList(null);
List treeMenus = categoryEntities.stream().filter((categoryEntity) -> {
return categoryEntity.getParentCid() == 0;
}).sorted((menu1, menu2) -> {
return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
}).map((menu) -> {
menu.setChildren(getChildren(menu, categoryEntities));
return menu;
}).collect(Collectors.toList());
return treeMenus;
}
private List getChildren(CategoryEntity rootMenu, List allMenus) {
List childrenList = allMenus.stream().filter(categoryEntity -> {
return categoryEntity.getParentCid().equals(rootMenu.getCatId());
}).map(menu -> {
menu.setChildren(getChildren(menu, allMenus));
return menu;
}).sorted((m1, m2) -> {
return (m1.getSort() == null ? 0 : m1.getSort()) - (m2.getSort() == null ? 0 : m2.getSort());
}).collect(Collectors.toList());
return childrenList;
}
@Override
public void removeMenus(List asList) {
System.out.println("删除的数据为: ++ ++++" + asList);
// 逻辑删除
int result = baseMapper.deleteBatchIds(asList);
if (result < 0) {
throw new RRException("删除失败");
}
}
@Override
public Long[] findCategoryPath(Long catelogId) {
List path = new ArrayList<>();
List parentPath = findParentPath(catelogId, path);
Collections.reverse(parentPath);
return parentPath.toArray(new Long[parentPath.size()]);
}
private List findParentPath(Long catelogId, List path) {
path.add(catelogId);
CategoryEntity categoryEntity = baseMapper.selectById(catelogId);
if (categoryEntity.getParentCid() != 0) {
findParentPath(categoryEntity.getParentCid(), path);
}
return path;
}
}



