资讯专栏INFORMATION COLUMN

项目中用到的树形数据

douzifly / 390人阅读

摘要:经过分析和思考,我决定不采用递归的方式来编写树形数据的处理,最终选用来维护树节点之间的关系。以权限树为例,做一个树形数据工具类的设计。

1.简介

​ 在一些管理系统中一般都会用到,会用到一些树形数据,例如部门组织以及权限等数据,都得生成树形数据,需要写一些树形数据生成工具,一般使用递归的方式,性能低下还可能会导致爆栈。经过分析和思考,我决定不采用递归的方式来编写树形数据的处理,最终选用hasMap来维护树节点之间的关系。以权限树为例,做一个树形数据工具类的设计。

2.数据库表设计
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for permission
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "权限id",
  `name` varchar(32) NOT NULL COMMENT "权限名称",
  `url` varchar(64) DEFAULT NULL COMMENT "资源url",
  `type` int(11) NOT NULL COMMENT "权限类型,1:模块,2:菜单,3:url资源",
  `parent_id` int(11) NOT NULL DEFAULT "0" COMMENT "上级资源id",
  `icon` varchar(64) DEFAULT NULL COMMENT "菜单图标",
  `sort` int(11) DEFAULT NULL COMMENT "排序",
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "更新时间",
  `operator` varchar(32) DEFAULT NULL COMMENT "操作者",
  `level` int(11) NOT NULL DEFAULT "0",
  `code` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
3.java Bean设计

java bean的设计依据数据库的表来进行设计,构造方法以及get、set方式使用lombok注解。

package com.lk.permission.common.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

//@SuppressWarnings("serail")
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)
public class Permission {

    /** 权限ID */
    private Integer id;

    /** 权限名称 */
    private String name;

    /** 权限编码 */
    private String code;

    /** 菜单图标 */
    private String icon;

    /** 资源类型 */
    private Integer type;

    /** 资源地址 */
    private String url;

    /** 层级 */
    private Integer level;

    /** 上层ID */
    private Integer parentId;

    /** 排序 */
    private Integer sort;

    /** 创建时间 */
    private Date createTime;

    /** 更新时间 */
    private Date updateTime;

    /** 操作人员 */
    private String operator;

    /** 下级权限 */
    private List subPermissions = new ArrayList<>();
}
4. 树形工具类设计

我只提供一个实现思路,具体可根据自己业务实现,通过hasMap方式,一个是性能有了较大的提升,另一个不用担心爆栈的风险。下面维护关系已经给出,可进行适当的改造来实现自己具体业务需求。

package com.lk.permission.system.service.impl;

import com.lk.permission.common.pojo.Permission;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TreeService {

    private Map map;

    private List permissions;

    /**
     * 初始化多叉树
     * @param permissions
     */
    TreeService(List permissions){

        this.permissions = permissions;
        this.map = new HashMap<>();

        for (Permission permission : permissions){
            this.map.put(permission.getId(),permission);
        }
        createTree();
    }

    /**
     * 创建多叉树
     */
    private void createTree(){
        for (Permission permission : this.permissions){
            if (this.map.containsKey(permission.getParentId())){
                this.map.get(permission.getParentId()).getSubPermissions().add(permission);
                System.out.println(permission.toString());
            }
        }
    }

    /**
     * 根据层级获取多叉树
     * @param level
     * @return
     */
    List getPermissionsByLevel(Integer level){
        return this.permissions.parallelStream().filter(permission -> permission.getLevel() == level).collect(Collectors.toList());
    }

    /**
     * 根据树的id获取多叉树
     * @param id
     * @return
     */
    Permission getPermissionById(Integer id){
        return this.map.get(id);
    }

    /**
     * 向多叉树添加子节点
     * @param permission
     */
    public void addChild(Permission permission){
        if (this.map.containsKey(permission.getParentId())){
            ((Permission)this.map.get(permission.getParentId())).getSubPermissions().add(permission);
        }
        this.map.put(permission.getId(),permission);
    }


}
5.实现的一些测试效果

权限选择

树形表格

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75682.html

相关文章

  • javascript中的递归

    摘要:二项目中用到的几个经典的递归求的和分析假设递归函数已经写好为,即,就是求的和。递归函数实现每天凌晨定时启动定时器执行代码分析假设递归函数已经写好了。 一、递归的概念 在程序中函数直接或者间接调用自身的一种方法,就叫做递归。它通常把一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程中所需要的多次重复计算,大大减少了程序的代码了。 二、...

    acrazing 评论0 收藏0
  • 推荐几款好用的Chrome插件

    摘要:今天就来跟大家分享一下工作中用到的几款插件。是一款功能强大的网页调试与发送网页请求的插件。俗称油猴子,是一款功能非常强大的插件,他包含方便的脚本管理脚本概览设置多样性脚本自动更新安全兼容性同步编辑器语法检查快速开发卸载等功能。 ‘工欲善其事,必先利其器’。优秀的开发者不仅体现在其在技术方面的精通,还体现在其对各种开发工具的充分了解与使用,这会让其开发效率事半功倍。作为一个前端开发者,平...

    fox_soyoung 评论0 收藏0
  • 推荐几款好用的Chrome插件

    摘要:今天就来跟大家分享一下工作中用到的几款插件。是一款功能强大的网页调试与发送网页请求的插件。俗称油猴子,是一款功能非常强大的插件,他包含方便的脚本管理脚本概览设置多样性脚本自动更新安全兼容性同步编辑器语法检查快速开发卸载等功能。 ‘工欲善其事,必先利其器’。优秀的开发者不仅体现在其在技术方面的精通,还体现在其对各种开发工具的充分了解与使用,这会让其开发效率事半功倍。作为一个前端开发者,平...

    lpjustdoit 评论0 收藏0
  • 推荐几款好用的Chrome插件

    摘要:今天就来跟大家分享一下工作中用到的几款插件。是一款功能强大的网页调试与发送网页请求的插件。俗称油猴子,是一款功能非常强大的插件,他包含方便的脚本管理脚本概览设置多样性脚本自动更新安全兼容性同步编辑器语法检查快速开发卸载等功能。 ‘工欲善其事,必先利其器’。优秀的开发者不仅体现在其在技术方面的精通,还体现在其对各种开发工具的充分了解与使用,这会让其开发效率事半功倍。作为一个前端开发者,平...

    wums 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<