Java实现多级菜单(基于Springboot+Mybatis-plus)

今天的项目需求中,需要根据原型实现类别的多级分类,具体的原型如下:
在这里插入图片描述

1、用到的相关参数类型

1、StoragePropertyCategoryVo.java

public class StoragePropertyCategoryVo implements Serializable {
    
    

    private static final long serialVersionUID = 1L;

    /** id */
    @ApiModelProperty(value = "id")
    private String id;

    /**
     * 父级id
     */
    @ApiModelProperty(value = "父级id")
    private String parentId;

    /**
     * 祖级id
     */
    @ApiModelProperty(value = "祖级id")
    private String ancestorsId;

    /**
     * 名称
     */
    @ApiModelProperty(value = "名称")
    private String name;

    /**
     * 排序
     */
    @ApiModelProperty(value = "排序")
    private Integer sort;

    /**
     * 是否启用,0正常,1停用
     */
    @ApiModelProperty(value = "是否启用,0正常,1停用")
    private Boolean enableStatus;

    /**
     * 删除状态,0正常,1删除
     */
    @ApiModelProperty(value = "删除状态,0正常,1删除")
    private String deleteStatus;

    /**
     * 创建人id
     */
    @ApiModelProperty(value = "创建人id")
    private Long createBy;

    /**
     * 创建时间
     */
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;

    /**
     * 修改人id
     */
    @ApiModelProperty(value = "修改人id")
    private Long updateBy;

    /**
     * 修改时间
     */
    @ApiModelProperty(value = "修改时间")
    private LocalDateTime updateTime;

    /**
     * 用户id
     */
    @ApiModelProperty(value = "用户id")
    private Long userId;

    /**
     * 部门id
     */
    @ApiModelProperty(value = "部门id")
    private Long deptId;

    @ApiModelProperty(value = "子列表")
    private List<StoragePropertyCategoryVo> children = new ArrayList<>();

    public StoragePropertyCategoryVo() {
    
    }
}

2、CategoryListVo.java

public class CategoryListVo {
    
    

    /** id */
    @ApiModelProperty(value = "id")
    private String id;

    /**
     * 名称
     */
    @ApiModelProperty(value = "名称")
    private String name;

    /**
     * 排序
     */
    @ApiModelProperty(value = "排序")
    private Integer sort;

    /**
     * 是否启用,0正常,1停用
     */
    @ApiModelProperty(value = "是否启用,0正常,1停用")
    private Boolean enableStatus;

    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @ApiModelProperty(value = "子类列表")
    private List<CategoryListVo> children = new ArrayList<>();

    public CategoryListVo(StoragePropertyCategoryVo category)
    {
    
    
        this.id = category.getId();
        this.name = category.getName();
        this.sort = category.getSort();
        this.enableStatus = category.getEnableStatus();
        this.createTime = category.getCreateTime();
        this.children = category.getChildren().stream().map(CategoryListVo::new).collect(Collectors.toList());
    }
}

3、FindCategoryListDto.java

public class FindCategoryListDto {
    
    

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "状态,0正常,1停用")
    private Boolean enableStatus;

    /**
     * 开始时间
     */
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
}

2、controller层

@GetMapping("/pageList")
    @ApiOperation(value = "查询资产-分类列表")
    public List<CategoryListVo> list(FindCategoryListDto dto)
    {
    
    
        List<CategoryListVo> list = storagePropertyCategoryService.selectCategoryList(dto);
        return list;
    }

3、service业务层

我们利用递归的实现

public List<CategoryListVo> selectCategoryList(FindCategoryListDto dto) {
    
    
        //1.查出全部类别
        List<StoragePropertyCategoryVo> listVos = storagePropertyCategoryMapper.selectCategoryList(dto);
        //2.调用构建树形列表方法
        List<StoragePropertyCategoryVo> resList = buildCategoryTree(listVos);
        //3.将返回的结果resList转换
        return resList.stream().map(CategoryListVo::new).collect(Collectors.toList());
    }

    /**
     * 构建前端所需要树结构
     * @param categorys 分类列表
     * @return 树结构列表
     */
    public List<StoragePropertyCategoryVo> buildCategoryTree(List<StoragePropertyCategoryVo> categorys)
    {
    
    
        List<StoragePropertyCategoryVo> returnList = new ArrayList<>();
        List<String> tempList = new ArrayList<>();

        for (StoragePropertyCategoryVo category : categorys)
        {
    
    
            tempList.add(category.getId());
        }

        for (Iterator<StoragePropertyCategoryVo> iterator = categorys.iterator(); iterator.hasNext();)
        {
    
    
            StoragePropertyCategoryVo category = iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            if (!tempList.contains(category.getParentId()))
            {
    
    
                recursionFn(categorys, category);
                returnList.add(category);
            }
        }
        if (returnList.isEmpty())
        {
    
    
            returnList = categorys;
        }
        return returnList;
    }

    /**
     * 递归列表
     */
    private void recursionFn(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
    {
    
    
        // 得到子节点列表
        List<StoragePropertyCategoryVo> childList = getChildList(list, t);
        t.setChildren(childList);
        for (StoragePropertyCategoryVo tChild : childList)
        {
    
    
            if (hasChild(list, tChild))
            {
    
    
                recursionFn(list, tChild);
            }
        }
    }

    /**
     * 得到子节点列表
     */
    private List<StoragePropertyCategoryVo> getChildList(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
    {
    
    
        List<StoragePropertyCategoryVo> tlist = new ArrayList<>();
        Iterator<StoragePropertyCategoryVo> it = list.iterator();
        while (it.hasNext())
        {
    
    
            StoragePropertyCategoryVo n = it.next();
            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().equals(t.getId()))
            {
    
    
                tlist.add(n);
            }
        }
        return tlist;
    }
    /**
     * 判断是否有子节点
     */
    private boolean hasChild(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
    {
    
    
        return getChildList(list, t).size() > 0 ? true : false;
    }

4、结果展现

我们利用swagger进行测试,能够得到分级的数据结果
在这里插入图片描述
通过以上代码的编写,我们可以实现多级分类。

猜你喜欢

转载自blog.csdn.net/qq_45780016/article/details/126736015