zoukankan      html  css  js  c++  java
  • Java工具类 (2)------>TreeUtils------>树形结构生成类

    一、生成树形结构

    1、TreeUtil

      传入一个list集合,根据父ID(pid)来判断是否有子节点,返回一个List类型

    public class TreeUtil {
    
        private List<PermissionVo> menuCommon;
    
        /**
         * service层调用的方法,并将数据以list的形式返回
         *
         * @param menu 菜单集合
         * @return list
         */
        public List<Object> menuList(List<PermissionVo> menu) {
            this.menuCommon = menu;
            List<Object> list = new ArrayList<>();
            for (PermissionVo ps : menu) {
                Map<String, Object> map = new LinkedHashMap<>();
                //判断根节点是否是0
                if (ps.getPid().equals(0)) {
                    setTreeData(map, ps);
                    list.add(map);
                }
            }
            return list;
        }
    
        /**
         * 不判断根节点遍历
         *
         * @param pList
         * @return
         */
        public List<Object> userMenuList(List<PermissionVo> pList) {
            this.menuCommon = pList;
            List<Object> list = new ArrayList<>();
            for (PermissionVo ps : pList) {
                Map<String, Object> map = new LinkedHashMap<>();
                setTreeData(map, ps);
                list.add(map);
            }
            return list;
        }
    
        /**
         * 子集查找遍历
         * 递归遍历,直到没有子节点为止
         *
         * @param id 父id
         * @return list
         */
        private List<Object> menuChild(Integer id) {
            List<Object> list = new ArrayList<>();
            for (PermissionVo ps : menuCommon) {
                Map<String, Object> map = new LinkedHashMap<>();
                if (ps.getPid().equals(id)) {
                    setTreeData(map, ps);
                    list.add(map);
                }
            }
            return list;
        }
    
        /**
         * 赋值
         * id  当前id
         * title 标题
         * field 权限值
         * href 跳转路径
         * children 子节点数据
         */
        private void setTreeData(Map<String, Object> map, PermissionVo ps) {
            map.put("id", ps.getId());
            map.put("title", ps.getName());
            map.put("field", ps.getValue());
            map.put("href", ps.getUri());
            map.put("children", menuChild(ps.getId()));
        }
    
    }

    2、service层调用

      从数据库查询一个list集合,调用TreeUtil工具类

      @Override
        public Map<String, Object> findMenuTree(Integer type) {
            Map<String, Object> map = new HashMap<>();
            //查询所有菜单
            List<Permission> lists = new LambdaQueryChainWrapper<>(permissionMapper)
                    .eq(Permission::getType, 0)
                    .or()
                    .eq(Permission::getType, type)
                    .list();
            TreeUtil menuTree = new TreeUtil();
            List<PermissionVo> pList = new ArrayList<>();
            //遍历赋值,拷贝
            setPmsData(lists, pList);
            List<Object> menuList = menuTree.menuList(pList);
            map.put("list", menuList);
            return map;
        }
       /**
         * 赋值
         * @param list
         * @param pList
         */
        private void setPmsData(List<Permission> list, List<PermissionVo> pList) {
            for (Permission p : list) {
                PermissionVo t = new PermissionVo();
                t.setId(p.getId());
                t.setName(p.getName());
                t.setValue(p.getValue());
                t.setUri(p.getUri());
                t.setPid(p.getPid());
                pList.add(t);
            }
        }

    3、controller层返回

        /**
         * 菜单生成树
         */
        @PreAuthorize("hasAuthority('method:pms:read')")
        @GetMapping("/findMenuTree")
        public CommonResult findMenuTree(Integer type) {
            Map<String, Object> map = permissionService.findMenuTree(type);
            return CommonResult.success(map);
        }

    4、permission

      permissionVo和permission字段差不多

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode(callSuper = false)
    public class Permission implements GrantedAuthority {
    
        private static final long serialVersionUID = 1L;
    
        /**
         * id
         */
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
    
        /**
         * 权限编号
         */
        private String code;
    
        /**
         * 父id  0根节点
         */
        private Integer pid;
    
        /**
         * 权限名
         */
        private String name;
    
        /**
         * 权限值
         */
        private String value;
    
        /**
         * 类型 1菜单 2方法
         */
        private Integer type;
    
        /**
         * 方法路径
         */
        private String uri;
    
        /**
         * 创建时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date createTime;
    
        /**
         * 是否可用
         */
        private String dataEnable;
    
        @Override
        public String getAuthority() {
            return this.value;
        }

    二、解析树形结构

    1、TreeVo

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TreeVo implements Serializable {
        /**
         * id
         */
        private Integer id;
        /**
         * 标题
         */
        private String title;
        /**
         * 权限值
         */
        private String field;
        /**
         * 跳转路径
         */
        private String href;
        /**
         * 子节点
         */
        private List<TreeVo> children;
    
    }

    2、controller接收数据

       /**
         * 分配菜单权限
         */
        @PreAuthorize("hasAuthority('method:pms:create')")
        @PostMapping("/getMenuTreeData")
        public CommonResult getMenuTreeData(@RequestBody List<TreeVo> treeVo,
                                            @RequestParam String roleCode,
                                            @RequestParam Integer type) {
            return permissionService.getMenuTreeData(treeVo, roleCode, type);
        }

    3、service层解析树形结构数据

     @Override
        public CommonResult getMenuTreeData(List<TreeVo> treeVo, String roleCode, Integer type) {
            //获取树节点Id
            List<Integer> pmsIds = new ArrayList<>();
            for (TreeVo t : treeVo) {
                 pmsIds.add(t.getId());
                 getChildrenId(t, pmsIds);
            }
    
    }            
    
       /**
         * 递归遍历 直到没有子节点为止
         *
         * @param t      TreeVo
         * @param pmsIds list
         */
        private void getChildrenId(TreeVo t, List<Integer> pmsIds) {
            for (TreeVo tr : t.getChildren()) {
                pmsIds.add(tr.getId());
                getChildrenId(tr, pmsIds);
            }
        }
    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    .NET互操作技术杂谈
    VS2008 Remote Debug HOW TO
    Entity Framework一对多关系或一对一关系删除子对象的方法
    Associations in EF Code First: Part 1 – Introduction and Basic Concepts
    如何管理Entity Framework中得事务
    在asp.net mvc3中编译视图文件
    entity framework中对关系使用默认规则与配置
    使用Entity Framework时动态生成lamda表达式
    asp.net mvc 身份验证中返回绝对路径的ReturnUrl
    Entity Framework 事务处理SaveChanges(false)
  • 原文地址:https://www.cnblogs.com/donleo123/p/14241967.html
Copyright © 2011-2022 走看看