實體類
/**
* 科目類別菜單實體類
*/
@Entity
@Data
public class TypeMenu {
@Id
private String id;
private String companyId;//所屬公司id
private String name;//類別名稱
private String parentId;//父類id
private String url;//菜單url
private int type;//菜單類型 0:預算費用 1:報銷費用
@Transient
private List<TypeMenu> children;//子菜單
}
方法體
public List<TypeMenu> findTree(String companyId, int type){
List<TypeMenu> allMenus = tmr.findByCompanyIdAndType(companyId, type);
List<TypeMenu> rootMenu = new ArrayList<>();
for(TypeMenu tm : allMenus){
if("0".equals(tm.getParentId())){
rootMenu.add(tm);
}
}
for(TypeMenu tm : rootMenu){
/* 獲取根節點下的所有子節點 使用getChild方法*/
List<TypeMenu> childList = getChild(tm.getId(), allMenus);
tm.setChildren(childList);//給根節點設置子節點
}
return rootMenu;
}
獲取子節點方法
/**
* 獲取子節點
* @param id 父節點id
* @param allMenu 所有菜單列表
* @return 每個根節點下,所有子菜單列表
*/
public List<TypeMenu> getChild(String id, List<TypeMenu> allMenu){
//子菜單
List<TypeMenu> childList = new ArrayList<>();
for (TypeMenu tm : allMenu) {
// 遍歷所有節點,將所有菜單的父id與傳過來的根節點的id比較
//相等說明:爲該根節點的子節點。
if(tm.getParentId().equals(id)){
childList.add(tm);
}
}
//遞歸
for (TypeMenu nav : childList) {
nav.setChildren(getChild(nav.getId(), allMenu));
}
//如果節點下沒有子節點,返回一個空List(遞歸退出)
if(childList.size() == 0){
return null;//return new ArrayList<>()
}
return childList;
}