构造树形结构

CommonID 基本Domain类

public interface CommonID<ID, E> extends Serializable {

    ID getId();

    ID getParentId();

    void setParent(E parent);

    void setChildren(List<E> children);
}

TreeUtils 树形结构处理类


import com.google.common.collect.Lists;
import com.pingan.haofang.gov.sm.account.common.query.CommonID;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.SerializationUtils;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class TreeUtils<T extends CommonID<ID, T>, ID> {

    private List<T> sourceTree;
    private List<T> _back;

    public TreeUtils(List<T> _sourceTree) {
        this.sourceTree = _sourceTree;
    }

    /**
     * 获取当前节点的所有上级节点和所有子节点,拼装树形结构
     *
     * @param id 当前节点ID
     * @return 当前节点所有子节点和所有父节点的树
     */
    public T getTree(ID id) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        T current = this.getCurrent(id);
        if (Objects.isNull(current)) {
            return null;
        }
        this.buildUpChild(current);
        this.buildUpParents(current);
        return current;
    }

    private void rebuildBack() {
        if (CollectionUtils.isNotEmpty(_back)) {
            _back.clear();
        }
        this._back = ListUtils.deepCopyList(sourceTree);
    }

    /**
     * 获取当前节点的所有上级节点和所有子节点,放入同一个List中
     *
     * @param id 当前节点ID
     * @return 当前节点所有子节点和所有父节点的集合
     */
    public List<T> getFamily(ID id) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        List<T> family = Lists.newArrayList();
        T current = this.getCurrent(id);
        if (Objects.nonNull(current)) {
            this.getParentList(current, family);
            this.getChildrenList(current, family);
            family.add(current);
        }
        return family;
    }

    private void buildUpParents(T current) {
        T parent = getParentNode(current.getId());
        if (Objects.isNull(parent)) {
            return;
        }
        T p = SerializationUtils.clone(parent);
        current.setParent(p);
        buildUpParents(parent);
    }


    private void buildUpChildren(List<T> list) {
        if (CollectionUtils.isNotEmpty(list)) {
            list.forEach(this::buildUpChild);
        }
    }

    private void buildUpChild(T current) {
        List<T> children = getChildNode(current.getId());
        if (CollectionUtils.isEmpty(children)) {
            return;
        }
        List<T> ts = ListUtils.deepCopyList(children);
        current.setChildren(ts);
        buildUpChildren(children);
    }

    public T getParentNode(ID id) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        if (CollectionUtils.isNotEmpty(_back)) {
            T currentNode = this.getCurrent(id);
            if (Objects.nonNull(currentNode)) {
                List<T> collect = _back.stream().filter(node -> currentNode.getParentId().equals(node.getId())).distinct().collect(Collectors.toList());
                return CollectionUtils.isEmpty(collect) ? null : collect.get(0);
            }
        }
        return null;
    }

    public List<T> getChildNode(ID parentID) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        if (CollectionUtils.isNotEmpty(_back)) {
            return _back.stream().filter(node -> parentID.equals(node.getParentId())).distinct()
                    .collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

    public T getCurrent(ID id) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        if (CollectionUtils.isNotEmpty(_back)) {
            List<T> currentNodes = _back.stream().filter(node -> id.equals(node.getId())).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(currentNodes)) {
                T currentNode = currentNodes.get(0);
//                T instance = getInstance();
//                BeanUtils.copyProperties(currentNode, instance);
                return currentNode;
            }
        }
        return null;
    }

    public void getChildrenList(T current, List<T> family) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        if (Objects.isNull(current)) {
            return;
        }
        List<T> childNodes = this.getChildNode(current.getId());
        if (CollectionUtils.isEmpty(childNodes)) {
            return;
        }
        family.addAll(childNodes);
        childNodes.forEach(node -> getChildrenList(node, family));
    }

    public void getParentList(T current, List<T> family) {
        if (CollectionUtils.isEmpty(_back)){
            rebuildBack();
        }
        if (Objects.isNull(current)) {
            return;
        }
        T parentNode = this.getParentNode(current.getId());
        if (Objects.isNull(parentNode)) {
            return;
        }
        family.add(parentNode);
        getParentList(parentNode, family);
    }

    private T getInstance() {
        T instance;
        try {
            ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
            Class<T> tCls = (Class<T>) pt.getActualTypeArguments()[0];
            instance = tCls.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("TreeUtils==> 获取实例异常");
        }
        return instance;
    }
}


构造树形结构的业务方法

 @Override
    public List<PermissionDto> getPermissionTreeBySubsystemId(Long subsystemId) {
        // 查出表的List集合
        List<Permission> permissions = permissionService.findBySubsystemId(subsystemId);
        if (CollectionUtils.isNotEmpty(permissions)) {
            // 这只是一个转换 实体转换为DTO 不用管
            List<PermissionDto> dtos = permissions.stream().map(permissionSupportService::transfer2Dto).collect(Collectors.toList());
            // 构造树形结构
            TreeUtils<PermissionDto, Long> utils = new TreeUtils<>(dtos);
            return permissions.stream()
                    .filter(p -> NumberUtils.LONG_ZERO.equals(p.getParentId()))
                    .map(Permission::getId)
                    .map(utils::getTree)
                    .collect(Collectors.toList());
        }
        return Lists.newArrayListWithCapacity(NumberUtils.INTEGER_ZERO);
    }

权限实体DOMAIN

package com.pingan.haofang.gov.sm.account.entity.domain;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.envers.Audited;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.sql.Timestamp;

/**
 * 权限表
 */
@DynamicInsert
@DynamicUpdate
@Entity
@Table(name = "t_standard_permission")
@EntityListeners({AuditingEntityListener.class})
@Audited
public class Permission {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    /**
     * 权限名称
     */
    @Column(name = "name")
    private String name;

    /**
     * 权限编码
     */
    @Column(name = "code")
    private String code;

    /**
     * 权限key
     */
    @Column(name = "permission_key")
    private String permissionKey;

    /**
     * 排序字段
     */
    @Column(name = "order_no")
    private Integer orderNo;

    /**
     * 父级id
     */
    @Column(name = "parent_id")
    private Long parentId;

    /**
     * 权限描述
     */
    @Column(name = "permission_desc")
    private String permissionDesc;

    /**
     * 资源地址
     */
    @Column(name = "request_url")
    private String requestUrl;

    /**
     * http请求方式: GET, POST...
     */
    @Column(name = "request_method")
    private String requestMethod;

    /**
     * 系统来源, 0: ERP端, 1 C端,2 GM端
     */
    @Column(name = "source_type")
    private Integer sourceType;

    /**
     * 系统模块,用户模块, 房源模块等...
     */
    @Column(name = "module")
    private String module;

    /**
     * 权限类型,0:功能按钮,1:菜单,2 资源url
     */
    @Column(name = "permission_type")
    private Integer permissionType;

    /**
     * 子系统id
     */
    @Column(name = "subsystem_id")
    private Long subsystemId;


    /**
     * 创建人id
     */
    @Column(name = "create_by")
    private Long createBy;

    /**
     * 创建时间
     */
    @Column(name = "create_time")
    private Timestamp createTime;

    /**
     * 更新人id
     */
    @Column(name = "update_by")
    private Long updateBy;

    /**
     * 更新时间
     */
    @Column(name = "update_time")
    private Timestamp updateTime;

    /**
     * 是否删除 1是 0否
     */
    @Column(name = "is_deleted")
    private Integer isDeleted;

    /**
     * 启用状态:1正常,0禁用
     */
    @Column(name = "status")
    private Integer status;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getPermissionDesc() {
        return permissionDesc;
    }

    public void setPermissionDesc(String permissionDesc) {
        this.permissionDesc = permissionDesc;
    }

    public String getRequestUrl() {
        return requestUrl;
    }

    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    public String getRequestMethod() {
        return requestMethod;
    }

    public void setRequestMethod(String requestMethod) {
        this.requestMethod = requestMethod;
    }

    public Integer getSourceType() {
        return sourceType;
    }

    public void setSourceType(Integer sourceType) {
        this.sourceType = sourceType;
    }

    public String getModule() {
        return module;
    }

    public void setModule(String module) {
        this.module = module;
    }


    public Integer getPermissionType() {
        return permissionType;
    }

    public void setPermissionType(Integer permissionType) {
        this.permissionType = permissionType;
    }

    public Long getCreateBy() {
        return createBy;
    }

    public void setCreateBy(Long createBy) {
        this.createBy = createBy;
    }

    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public Long getUpdateBy() {
        return updateBy;
    }

    public void setUpdateBy(Long updateBy) {
        this.updateBy = updateBy;
    }

    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }

    public Integer getIsDeleted() {
        return isDeleted;
    }

    public void setIsDeleted(Integer isDeleted) {
        this.isDeleted = isDeleted;
    }

    public Long getSubsystemId() {
        return subsystemId;
    }

    public void setSubsystemId(Long subsystemId) {
        this.subsystemId = subsystemId;
    }

    public String getPermissionKey() {
        return permissionKey;
    }

    public void setPermissionKey(String permissionKey) {
        this.permissionKey = permissionKey;
    }

    public Integer getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(Integer orderNo) {
        this.orderNo = orderNo;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}


权限DTO PermissionDto

package com.pingan.haofang.gov.sm.account.entity.dto.role;

import java.sql.Timestamp;
import java.util.List;

import com.pingan.haofang.gov.sm.account.common.query.CommonID;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class PermissionDto implements CommonID<Long, PermissionDto> {
    @ApiModelProperty(value = "主键id")
    private Long id;
    @ApiModelProperty(value = "选中状态, 1:选择, 0:未选中.")
    private Boolean selected;
    @ApiModelProperty(value = "权限名称")
    private String name;
    @ApiModelProperty(value = "权限编码")
    private String code;
    @ApiModelProperty(value = "权限key")
    private String permissionKey;
    @ApiModelProperty(value = "排序")
    private Integer orderNo;
    @ApiModelProperty(value = "父权限id")
    private Long parentId;
    @ApiModelProperty(value = "权限描述")
    private String permissionDesc;
    @ApiModelProperty(value = "权限路径")
    private String requestUrl;
    @ApiModelProperty(value = "请求方式")
    private String requestMethod;
    @ApiModelProperty(value = "系统来源")
    private Integer sourceType;
    @ApiModelProperty(value = "模块")
    private String module;
    @ApiModelProperty(value = "子系统id")
    private Long subsystemId;
    @ApiModelProperty(value = "权限类型")
    private Integer permissionType;
    @ApiModelProperty(value = "创建人id")
    private Long createBy;
    @ApiModelProperty(value = "创建时间")
    private Timestamp createTime;
    @ApiModelProperty(value = "更新人id")
    private Long updateBy;
    @ApiModelProperty(value = "更新时间")
    private Timestamp updateTime;
    @ApiModelProperty(value = "是否删除 1 是, 0 否")
    private Integer isDeleted;
    @ApiModelProperty(value = "子权限列表")
    private List<PermissionDto> subList;
    @ApiModelProperty(value = "生效状态:1 有效,0 失效")
    private Integer status;

    private PermissionDto parent;

    private List<PermissionDto> children;
}


转载于:https://my.oschina.net/u/3718694/blog/3051715

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值