實體類如下:
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;}