小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
前言
树状列表数据太多的时候,一次查询出所有数据,组装成树状数据比较浪费性能,所以,采用懒加载的方式,用户每次点击一个节点,查询下该节点下的数据,提高性能。
controller层实现代码
@GetMapping("/lazy-list")
@ApiImplicitParams({
@ApiImplicitParam(name = "code", value = "菜单编号", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "name", value = "菜单名称", paramType = "query", dataType = "string")
})
@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
@ApiOperation(value = "懒加载列表", notes = "传入menu")
public R<List<MenuVO>> lazyList(Long parentId, @ApiIgnore @RequestParam Map<String, Object> menu) {
List<MenuVO> list = menuService.lazyList(parentId, menu);
return R.data(MenuWrapper.build().listNodeLazyVO(list));
}
菜单对象的MenuWrapper包装类
/**
* 包装类,返回视图层所需的字段
*
* @author Chill
*/
public class MenuWrapper extends BaseEntityWrapper<Menu, MenuVO> {
public static MenuWrapper build() {
return new MenuWrapper();
}
@Override
public MenuVO entityVO(Menu menu) {
MenuVO menuVO = Objects.requireNonNull(BeanUtil.copy(menu, MenuVO.class));
if (Func.equals(menu.getParentId(), BladeConstant.TOP_PARENT_ID)) {
menuVO.setParentName(BladeConstant.TOP_PARENT_NAME);
} else {
Menu parent = SysCache.getMenu(menu.getParentId());
menuVO.setParentName(parent.getName());
}
String category = DictCache.getValue(DictEnum.MENU_CATEGORY, Func.toInt(menuVO.getCategory()));
String action = DictCache.getValue(DictEnum.BUTTON_FUNC, Func.toInt(menuVO.getAction()));
String open = DictCache.getValue(DictEnum.YES_NO, Func.toInt(menuVO.getIsOpen()));
menuVO.setCategoryName(category);
menuVO.setActionName(action);
menuVO.setIsOpenName(open);
return menuVO;
}
public List<MenuVO> listNodeVO(List<Menu> list) {
List<MenuVO> collect = list.stream().map(menu -> BeanUtil.copy(menu, MenuVO.class)).collect(Collectors.toList());
return ForestNodeMerger.merge(collect);
}
public List<MenuVO> listNodeLazyVO(List<MenuVO> list) {
return ForestNodeMerger.merge(list);
}
}
菜单VO对象代码实现
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.hxtx.spacedata.bladex.domain.entity.system.Menu;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import java.util.ArrayList;
import java.util.List;
/**
* 视图实体类
*
* @author Chill
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "MenuVO对象", description = "MenuVO对象")
public class MenuVO extends Menu implements INode<MenuVO> {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 父节点ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
/**
* 子孙节点
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<MenuVO> children;
/**
* 是否有子孙节点
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Boolean hasChildren;
@Override
public List<MenuVO> getChildren() {
if (this.children == null) {
this.children = new ArrayList<>();
}
return this.children;
}
/**
* 上级菜单
*/
private String parentName;
/**
* 菜单类型
*/
private String categoryName;
/**
* 按钮功能
*/
private String actionName;
/**
* 是否新窗口打开
*/
private String isOpenName;
}