实体类如下:
package com.ssdl.baize.po;import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import java.util.Date;import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE;@Data
@TableName("baize_sys_menu_entity")
@ApiModel(value = "MenuEntity")
public class MenuEntity {@TableId(value = "id", type = IdType.AUTO)private Long id;private String path;private String name;private String redirect;private String icon;private String title;private Integer rankRank;private String component;private Boolean keepAlive;private String frameSrc;private Long menuPid;@TableField(value = "update_time", fill = INSERT_UPDATE)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;@TableField(value = "create_time", fill = FieldFill.INSERT)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;@TableField(fill = FieldFill.INSERT)@JsonIgnoreprivate String createUser;@TableField(fill = FieldFill.INSERT_UPDATE)@JsonIgnoreprivate String updateUser;@TableLogic@TableField(fill = FieldFill.INSERT)@JsonIgnoreprivate Integer isDeleted;}
VO:
package com.ssdl.baize.entity.vo;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "MenuPONewVo")
public class MenuPONewVo {private Long id;private String path;private String redirect;private String name;private String component;private MetaVo meta;private List<MenuPONewVo> children;private Long menuPid;}
package com.ssdl.baize.entity.vo;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "MetaVo")
public class MetaVo {private String icon;private Integer rank;private String title;private Boolean keepAlive;private String frameSrc;
}
获取树状的菜单结构:
public Response<List<MenuPONewVo>> getMenu(){// //先获取你想要在哪些菜单范围内搜索List<MenuEntity> list = this.list();// 父id (顶层菜单)为 0 List<MenuEntity> collect = list.stream().filter(a -> 0==a.getMenuPid()).collect(Collectors.toList());// 排序collect = collect.stream().sorted(Comparator.comparing(MenuEntity::getRankRank)).collect(Collectors.toList()); List<MenuPONewVo> result = new ArrayList<>();for (MenuEntity a : collect) {MenuPONewVo menuPONewVo = new MenuPONewVo();// 把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到(目前是三层,由于是递归调用多少层都没有关系)List<MenuPONewVo> child = getChild(a.getId(), list);menuPONewVo.setId(a.getId()).setPath(a.getPath()).setRedirect(a.getRedirect()).setComponent(a.getComponent()).setName(a.getName()).setMeta(new MetaVo().setFrameSrc(a.getFrameSrc()).setKeepAlive(a.getKeepAlive()).setTitle(a.getTitle()).setRank(a.getRankRank()).setIcon(a.getIcon())).setMenuPid(a.getMenuPid()).setChildren(child);result.add(menuPONewVo);}return Response.success(ServerCode.SUCCESS.getCode(), "查询成功!!!",result);}
获取子菜单方法:
/***通过传入当前菜单id,获取当前id的子菜单 且子菜单里也有子菜单及其信息,直到子菜单没有子菜单了,递归结束* @param id 当前菜单的id* @param menus 要查询的菜单范围* @return 该id的子菜单*/
private List<MenuPONewVo> getChild(Long id,List<MenuEntity> list){List<MenuPONewVo> childList = new ArrayList<>();for (MenuEntity a : list) {if(a.getMenuPid()!=null && a.getMenuPid().equals(id)){MenuPONewVo menuPONewVo = new MenuPONewVo();menuPONewVo.setId(a.getId()).setPath(a.getPath()).setRedirect(a.getRedirect()).setComponent(a.getComponent()).setName(a.getName()).setMeta(new MetaVo().setFrameSrc(a.getFrameSrc()).setKeepAlive(a.getKeepAlive()).setTitle(a.getTitle()).setRank(a.getRankRank()).setIcon(a.getIcon())).setMenuPid(a.getMenuPid());// 当菜单范围内的父id等于传入的id,获取该id的所有子列表childList.add(menuPONewVo);}}for (MenuPONewVo menu : childList) {// 当上面循环语句查询不到子菜单,长度为0,自然也就不会递归调用了// 将该id的子菜单便利,通过递归调用,给每一个子菜单赋值子菜单List<MenuPONewVo> child = getChild(menu.getId(), list);menu.setChildren(child);}if(childList.size()==0){//子菜单的长度为0,返回nullreturn null;}return childList;}