JAVA递归生成权限树

递归生成一个权限树,可通过以下过程实现:

  • 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返回前端解析了。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值