最近在做权限管理,前台使用的是基于bootstrap的ACE框架,前端的权限树使用的是ACE 改造过的treeview,需要的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"}}
}
}
}
}
前端的html源码就不贴了,找前端工程师很快搞定,这里主要贴后台的java代码
我的数据库设计:
CREATE TABLE `t_permission` (
`permission_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '权限编号',
`permission_name` varchar(255) NOT NULL COMMENT '权限名称,唯一',
`permission_key` varchar(255) NOT NULL COMMENT '权限字符串',
`url` varchar(255) DEFAULT NULL COMMENT 'URL链接',
`pid` bigint(20) DEFAULT NULL COMMENT '父级权限编号',
`type` int(1) NOT NULL DEFAULT '1' COMMENT '1表示菜单,2表示按钮',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`creation` datetime DEFAULT NULL COMMENT '创建时间',
`last_update` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`permission_id`)
)
根据json样式,我们需要创建两个javabean
public class Item
{
/**
* node name
*/
private String text;
/**
* node type:'folder' or 'item'
*/
private String type;
/**
* node parameters info and subnode info
*/
private AdditionalParameters additionalParameters;
public String getText( )
{
return text;
}
public void setText( String text )
{
this.text = text;
}
public String getType( )
{
return type;
}
public void setType( String type )
{
this.type = type;
}
public AdditionalParameters getAdditionalParameters( )
{
return additionalParameters;
}
public void setAdditionalParameters( AdditionalParameters additionalParameters )
{
this.additionalParameters = additionalParameters;
}
}
和
public class AdditionalParameters
{
/**
* node id
*/
private String id;
/**
* subnode ifno
*/
private Map<String,Item> children;
/**
* node chosen
*/
@JsonProperty(value="item-selected")
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;
}
}
一个常量类
public class ItemType {
public static final String NODE_FOLDER="folder";
public static final String NODE_ITEM="item";
}
public Result queryAllMenusAsTree( )
{
Map<String,Item> items = new LinkedHashMap<>( );
getChildNodes(items, "0" );
Result result=new Result( 200, "", items );
return result;
}
private void getChildNodes( Map<String,Item> items, String parentId )
{
List<Permission> permissions=getChildPermissions( parentId );
if(permissions.size( )>0){
for ( Permission permission : permissions )
{
//递归子节点
Item item=new Item( );
item.setText( permission.getPermissionName( ) );
item.setType( ItemType.NODE_FOLDER );
getChildItems(item,permission.getPermissionId( ).toString( ),permission.getPermissionName( ));
items.put( permission.getPermissionName( ), item );
}
}
}
private void getChildItems( Item item, String parentId,String parentName )
{
List<Permission> childPermissions = getChildPermissions( parentId );
if(childPermissions.size( )>0){
//父节点为“folder”
item.setText(parentName);
item.setType( ItemType.NODE_FOLDER );
AdditionalParameters additionalParameters=new AdditionalParameters( );
additionalParameters.setId( parentId );
Map<String, Item> children=new LinkedHashMap<>( );
for ( Permission childPermission : childPermissions )
{
Item item2=new Item( );
getChildItems( item2, childPermission.getPermissionId( ).toString( ),childPermission.getPermissionName( ) );
children.put( childPermission.getPermissionName( ), item2 );
}
additionalParameters.setChildren( children );
item.setAdditionalParameters( additionalParameters );
}else{
//父节点为“item”,获取当前
item.setText(parentName);
item.setType( ItemType.NODE_ITEM );
AdditionalParameters additionalParameters=new AdditionalParameters( );
additionalParameters.setId( parentId );
item.setAdditionalParameters( additionalParameters );
}
}
private List<Permission> getChildPermissions( String parentId )
{
Example example = new Example( Permission.class );
example.createCriteria( ).andEqualTo( "pid", parentId );
List<Permission> permissions = permissionMapper.selectByExample( example );
return permissions;
}
花了不少时间,主要是树结构的递归遍历
大概的写写,做一下记录,以备以后思考
参考了以下文章:
http://blog.csdn.net/a786132874/article/details/43019287