递归查询多级菜单数据的算法

1.实体类

package com.atguigu.aclservice.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.util.Date;
import java.io.Serializable;
import java.util.List;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 权限
 * </p>
 *
 * @author testjava
 * @since 2020-01-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("acl_permission")
@ApiModel(value="Permission对象", description="权限")
public class Permission implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "编号")
    @TableId(value = "id", type = IdType.ID_WORKER_STR)
    private String id;

    @ApiModelProperty(value = "所属上级")
    private String pid;

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

    @ApiModelProperty(value = "类型(1:菜单,2:按钮)")
    private Integer type;

    @ApiModelProperty(value = "权限值")
    private String permissionValue;

    @ApiModelProperty(value = "访问路径")
    private String path;

    @ApiModelProperty(value = "组件路径")
    private String component;

    @ApiModelProperty(value = "图标")
    private String icon;

    @ApiModelProperty(value = "状态(0:禁止,1:正常)")
    private Integer status;

    @ApiModelProperty(value = "层级")
    @TableField(exist = false)
    //一级显示1,二级显示2
    private Integer level;

    @ApiModelProperty(value = "下级")
    @TableField(exist = false)
    //子菜单数据
    private List<Permission> children;

    @ApiModelProperty(value = "是否选中")
    @TableField(exist = false)
    private boolean isSelect;


    @ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
    private Boolean isDeleted;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private Date gmtCreate;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间")
    private Date gmtModified;


}

2.具体业务

1.查:

运用了递归算法

    public List<Permission> queryAllMenu() {
        //1.查询菜单表所有的数据
        QueryWrapper<Permission> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");
        List<Permission> permissionList = baseMapper.selectList(wrapper);
        //2.把查询所有菜单list集合按照要求进行封装
        List<Permission> result = bulid(permissionList);
        return result;
    }
    private static List<Permission> bulid(List<Permission> treeNodes) {
        List<Permission> trees = new ArrayList<>();
        for (Permission treeNode : treeNodes) {
            //先得到顶级菜单pid=0,然后设置level是1
            if ("0".equals(treeNode.getPid())) {
                treeNode.setLevel(1);
                //再获取顶级菜单下的分级菜单
                trees.add(findChildren(treeNode,treeNodes));
            }
        }
        return trees;
    }

2.删:

    public void removeChildById(String id) {
        List<String> idList = new ArrayList<>();
        //先获得到该级菜单下面的子菜单
        this.selectChildListById(id, idList);
        //上面已经获取到了该级下面的子菜单id但是自身还没有加进去
        idList.add(id);
        baseMapper.deleteBatchIds(idList);
    }
    private void selectChildListById(String id, List<String> idList) {
        List<Permission> childList = baseMapper.selectList(new QueryWrapper<Permission>().eq("pid", id).select("id"));
        childList.stream().forEach(item -> {
            idList.add(item.getId());
            //递归继续获取下一层级的菜单数据
            this.selectChildListById(item.getId(), idList);
        });
    }

猜你喜欢

转载自blog.csdn.net/weixin_46266624/article/details/130807341