递归生成一个权限树,可通过以下过程实现:
- 1.首先从权限数据表中获取所有根节点。
- 2.为根节点建立次级子树并拼接上。
- 3.通过递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。
每条权限有自己的id、父节点parentId、权限名称name、权限还拥有次级权限children。
权限表:
CREATE TABLE `module` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '模块ID',
`parent_id` int(10) DEFAULT '0' COMMENT '父模块id',
`parent_name` varchar(50) DEFAULT '' COMMENT '父模块名称',
`name` varchar(50) DEFAULT '' COMMENT '模块名称',
`remark` varchar(50) DEFAULT '' COMMENT '说明',
`module_code` varchar(50) DEFAULT '' COMMENT '模块权限代码',
`permission_type` int(2) DEFAULT '0' COMMENT '权限类型(0无 1浏览 2编辑 3审核)',
`delete_flag` int(2) DEFAULT '0' COMMENT '删除标识 0 不删 1删除',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`creator` varchar(20) DEFAULT NULL COMMENT '创建者',
`updated_at` datetime DEFAULT NULL COMMENT '跟新时间',
`modifier` varchar(20) DEFAULT NULL COMMENT '修改者',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='权限表';
实体类:
public class Module extends BaseEntity {
/** 父模块id */
private Long parentId;
/** 父模块名称 */
private String parentName;
/** 模块名称 */
private String name;
/** 说明 */
private String remark;
/** 模块权限代码 */
private String moduleCode;
/** 权限类型(0无 1浏览 2编辑 3审核) */
private Long permissionType;
/** 删除标识 0 不删 1删除 */
private Long deleteFlag;
/** 子节点 */
@Transient
private List<HwAdModule> children;
}
先查询所有权限数据list,将list作为参数传入getChildren方法。
方法getChildren获取所有根节点,将根节点汇总创建树形结构,getChildrens方法为节点建立次级树并拼接上当前树,递归调用getChildrens不断为当前树开枝散叶直至找不到新的子树。完成递归,获取树形结构。
// 查询模板列表
List<HwAdModule> moduleList = moduleService.getModuleList(param);
// 生成权限树
List<HwAdModule> treeGridList = getChildren(moduleList);
/**
* 获取跟节点
* @param list
* @return
*/
private List<HwAdModule> getChildren(List<HwAdModule> list) {
List<HwAdModule> result = new ArrayList<>();
for (HwAdModule adModule : list) {
// 根节点
if (Flag.FALSE.equals(adModule.getParentId())) {
result.add(getChildrens(adModule, list));
}
}
return result;
}
/**
* 递归获取子节点
* @param module
* @param list
* @return
*/
private HwAdModule getChildrens(HwAdModule module, List<HwAdModule> list) {
List<HwAdModule> childNodes = new ArrayList<>();
for (HwAdModule node : list) {
if (node.getParentId().equals(module.getId())) {
childNodes.add(getChildrens(node, list));
}
}
module.setChildren(childNodes);
return module;
}
这样就可以生成一个树形json返回前端解析了。