菜单模型中包含了层级关系,有父级id且父级的id=子集的parent_id。模型结构如下:
/**
* 菜单表
*
* @author wcyong
* @date 2019-04-19
*/
public class SysMenu implements Cloneable, Serializable {
/**
* @Author: Galen
* @Description: 浅克隆
* @Date: 2019/4/25-15:04
* @Param: []
* @return: java.lang.Object
**/
@Override
public Object clone() {
SysMenu sysMenu;
try {
sysMenu = (SysMenu) super.clone();
return sysMenu;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
/**
* 主键
*/
private Long id;
/**
* 菜单类型(1:左侧主菜单;2:页面中的按钮;3:页面中标签)
*/
private Integer menuType;
/**
* 父级菜单id
*/
private Long parentId;
/**
* 存储子集菜单集合
*/
private List<SysMenu> children;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getMenuType() {
return menuType;
}
public void setMenuType(Integer menuType) {
this.menuType = menuType;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public List<SysMenu> getChildren() {
return children;
}
public void setChildren(List<SysMenu> children) {
this.children = children;
}
}
从数据库取出数据后,做列表的转换,处理方法如下。
private List<SysMenu> sourceList;//使得遍历同一份数据源
/**
* @Author: Galen
* @Description: 获取系统菜单列表
* @Date: 2019/4/19-14:53
* @Param: []
* @return: com.apl.model.AplResponse
**/
public AplResponse getSysMenuList() {
Long userId = SecurityUserUtil.getCurrentUserId();
if (null == userId) {
return ResponseUtils.invalid();
}
sourceList = sysMenuMapper.getSysMenuList(userId);
return ResponseUtils.SUCCESS(arrangeToTree());
}
/**
* @Author: Galen
* @Description: 规整为树形结构
* @Date: 2019/4/25-9:58
* @Param: [list]
* @return: java.util.List<com.apl.tl.pojo.SysMenu>
**/
private List<SysMenu> arrangeToTree() {
Iterator<SysMenu> menuIterator = sourceList.iterator();
List<SysMenu> resultTreeList = new ArrayList<>();
SysMenu sysMenuStock;
while (menuIterator.hasNext()) {
SysMenu sysMenu = menuIterator.next();
//判断parent=0是根节点
if (sysMenu.getParentId().equals(0) || sysMenu.getParentId() == 0) {
sysMenuStock = (SysMenu) sysMenu.clone();
if (null == sysMenuStock.getChildren()) {
sysMenuStock.setChildren(new ArrayList<>());
}
resultTreeList.add(sysMenuStock);
//子集
getChildren(sysMenuStock);
}
}
return resultTreeList;
}
/**
* @Author: Galen
* @Description: 查子菜单(暂时不用递归)
* @Date: 2019/4/25-17:52
* @Param: [sysMenuStock]
* @return: void
**/
private void getChildren(SysMenu sysMenuStock) {
Iterator<SysMenu> menuIterator = sourceList.iterator();
while (menuIterator.hasNext()) {
SysMenu sysMenuSub = menuIterator.next();
//节点的id = 子集的父级id
if (sysMenuStock.getId().equals(sysMenuSub.getParentId())) {
SysMenu sysMenuStockChild = (SysMenu) sysMenuSub.clone();
if (null == sysMenuStockChild.getChildren()) {
sysMenuStockChild.setChildren(new ArrayList<>());
}
sysMenuStock.getChildren().add(sysMenuStockChild);
//子集
getChildren2(sysMenuStockChild);
}
}
}
/**
* @Author: Galen
* @Description: 查二级子菜单
* @Date: 2019/4/25-17:52
* @Param: [sysMenuStock]
* @return: void
**/
private void getChildren2(SysMenu sysMenuStock) {
Iterator<SysMenu> menuIterator = sourceList.iterator();
while (menuIterator.hasNext()) {
SysMenu sysMenuSub = menuIterator.next();
//节点的id = 子集的父级id
if (sysMenuStock.getId().equals(sysMenuSub.getParentId())) {
sysMenuStock.getChildren().add((SysMenu) sysMenuSub.clone());
}
}
}
处理结果太多不便一一展开