因项目需要使用到TreeView的数据结构,前端框架使用bootstrap ACE 需要返回固定格式的JSON 数据,在java后台递归处理返回的json。。。如下:
{
"刑侦":
{
"text":"刑侦",
"type":"folder",
"additionalParameters":
{
"id":"1",
"children":
{
"痕迹检验":
{
"text":"痕迹检验",
"type":"item",
"additionalParameters":{"id":"10"}},
"刑侦光源":
{
"text":"刑侦光源",
"type":"item",
"additionalParameters":{"id":"11"}},
"现场勘察":
{
"text":"现场勘察",
"type":"item",
"additionalParameters":{"id":"12"}},
"反恐处突":
{
"text":"反恐处突",
"type":"item",
"additionalParameters":{"id":"13"}},
"声像技术":
{
"text":"声像技术",
"type":"item",
"additionalParameters":{
"id":"9",
"children":{
"三级菜单":{
"text":"声像技术",
"type":"item",
"additionalParameters":{"id":"33"}
}
}
}
}
}
}
},
"交警":
{
"text":"交警",
"type":"folder",
"additionalParameters":
{
"id":"32",
"children":
{
"交通事故":{"text":"交通事故","type":"item","additionalParameters":{"id":"33"}},
"交通道理管理":{"text":"交通道理管理","type":"item","additionalParameters":{"id":"34"}}
}
}
}
}
数据库结构如下:(是递归表即可)
创建对应POJO实体类如下:
package com.lkk.po;
/**
* @author 作者 DCT:
* @version 创建时间:2018年11月5日 下午5:00:13
* 类说明
*/
public class TblKnowledgeTemplate {
/**
* ID
*/
private String intKnowledgeTemplateID;
/**
* 父节点
*/
private String intParentID;
/**
* 模板名称
*/
private String name;
/**
* 检查所见
*/
private String nodeValue;
/**
* 检查结论
*/
private String nonce;
/**
* 类型
*/
private String strType;
public String getIntParentID() {
return intParentID;
}
public void setIntParentID(String intParentID) {
this.intParentID = intParentID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNodeValue() {
return nodeValue;
}
public void setNodeValue(String nodeValue) {
this.nodeValue = nodeValue;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getStrType() {
return strType;
}
public void setStrType(String strType) {
this.strType = strType;
}
public String getIntKnowledgeTemplateID() {
return intKnowledgeTemplateID;
}
public void setIntKnowledgeTemplateID(String intKnowledgeTemplateID) {
this.intKnowledgeTemplateID = intKnowledgeTemplateID;
}
}
根据json样式,我们需要创建两个javabean
package com.lkk.po.tree;
import java.util.Map;
/**
* @author 作者 DCT:
* @version 创建时间:2018年11月7日 上午9:40:47
* 类说明
*/
public class AdditionalParameters {
/**
* node id
*/
private String id;
/**
* subnode ifno
*/
private Map<String,Item> children;
/**
* node chosen
*/
private boolean itemSelected ;
public String getId( )
{
return id;
}
public void setId( String id )
{
this.id = id;
}
public Map<String, Item> getChildren( )
{
return children;
}
public void setChildren( Map<String, Item> children )
{
this.children = children;
}
public boolean isItemSelected( )
{
return itemSelected;
}
public void setItemSelected( boolean itemSelected )
{
this.itemSelected = itemSelected;
}
}
package com.lkk.po.tree;
/**
* @author 作者 DCT:
* @version 创建时间:2018年11月7日 上午9:32:44
* 类说明
*/
public class Item {
/**
* name
*/
private String name;
/**
* type
*/
private String type;
private String nodeValue;
private String nonce;
/**
* node parameters info and subnode info
*/
private AdditionalParameters additionalParameters;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getNodeValue() {
return nodeValue;
}
public void setNodeValue(String nodeValue) {
this.nodeValue = nodeValue;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public AdditionalParameters getAdditionalParameters() {
return additionalParameters;
}
public void setAdditionalParameters(AdditionalParameters additionalParameters) {
this.additionalParameters = additionalParameters;
}
}
controller 中的业务代码如下:
private void getChildNodes( Map<String,Item> items, String parentId,String type )
{
List<TblKnowledgeTemplate> permissions=getChildPermissions( parentId,type );
if(permissions.size()>0){
for ( TblKnowledgeTemplate permission : permissions )
{
//递归子节点
Item item=new Item( );
item.setName(permission.getName());
item.setType("folder");
getChildItems(item,permission.getIntKnowledgeTemplateID().toString(),permission.getName(),type);
items.put(permission.getName(),item);
}
}
}
/**
* 获取子项
* @param item 当前节点
* @param parentId 当前节点的父ID
* @param parentName 节点名称
* @param type 节点类型
*/
private void getChildItems( Item item, String parentId,String parentName,String type )
{
List<TblKnowledgeTemplate> childPermissions = getChildPermissions( parentId,type );
if(childPermissions.size( )>0){
//父节点为“folder”
item.setName(parentName);
item.setType( "folder" );
AdditionalParameters additionalParameters=new AdditionalParameters( );
additionalParameters.setId( parentId );
Map<String, Item> children=new LinkedHashMap<>( );
for ( TblKnowledgeTemplate childPermission : childPermissions )
{
Item item2=new Item( );
getChildItems( item2, childPermission.getIntKnowledgeTemplateID().toString( ),childPermission.getName(),type);
children.put( childPermission.getName( ), item2 );
}
additionalParameters.setChildren( children );
item.setAdditionalParameters( additionalParameters );
}else{
//父节点为“item”,获取当前
item.setName(parentName);
item.setType("item" );
AdditionalParameters additionalParameters=new AdditionalParameters( );
additionalParameters.setId( parentId );
item.setAdditionalParameters( additionalParameters );
}
}
/**
* 根据节点parentId和类型查询子节点
* @param parentId 当前节点的父ID
* @param type 节点类型
* @return
*/
private List<TblKnowledgeTemplate> getChildPermissions( String parentId ,String type)
{
List<TblKnowledgeTemplate> permissions = tblKnowledgeTemplateService.queryChildById( parentId ,type);
return permissions;
}
效果图如下:
感谢这位博主
参考了以下文章: