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

实现这个功能的一般步骤如下: 1. 定义菜单数据结构 菜单数据结构应该包含以下信息: - 菜单ID - 菜单名称 - 菜单URL - 父菜单ID - 子菜单列表 可以使用一个类来表示菜单,例如: ``` class Menu { private int id; private String name; private String url; private int parentId; private List<Menu> subMenus; // 省略getter和setter方法 } ``` 2. 定义角色权限数据结构 角色权限数据结构应该包含以下信息: - 角色ID - 角色名称 - 拥有的菜单ID列表 可以使用一个类来表示角色权限,例如: ``` class RolePermission { private int roleId; private String roleName; private List<Integer> menuIds; // 省略getter和setter方法 } ``` 3. 加载菜单和角色权限数据 菜单和角色权限数据可以从数据库中加载,也可以通过配置文件等其他方式加载。这里假设菜单数据已经加载到了一个列表中,角色权限数据已经加载到了一个Map中(key为角色ID,value为角色权限对象)。 4. 根据角色权限生成菜单 根据角色权限生成菜单的过程可以分为两步: - 根据角色权限过滤菜单列表,得到当前角色拥有的菜单列表。 - 根据拥有的菜单列表生成菜单。 第一步可以通过遍历菜单列表和角色权限对象的菜单ID列表来实现。例如: ``` List<Menu> filteredMenus = new ArrayList<>(); for (Menu menu : menuList) { if (rolePermission.getMenuIds().contains(menu.getId())) { filteredMenus.add(menu); } } ``` 第二步可以使用递归的方式生成菜单。例如: ``` public List<Menu> generateMenuTree(List<Menu> menuList, int parentId) { List<Menu> subMenus = new ArrayList<>(); for (Menu menu : menuList) { if (menu.getParentId() == parentId) { menu.setSubMenus(generateMenuTree(menuList, menu.getId())); subMenus.add(menu); } } return subMenus; } ``` 这个方法会递归生成菜单。如果某个菜单的父菜单ID等于给定的parentId,则将该菜单加入到父菜单的子菜单列表中,并递归生成该菜单的子菜单列表。 5. 显示菜单 最后,将生成的菜单显示在页面上即可。可以使用HTML和CSS来实现菜单的样式和交互效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值