構造樹形結構

CommonID 基本Domain類java

public interface CommonID<ID, E> extends Serializable {

    ID getId();

    ID getParentId();

    void setParent(E parent);

    void setChildren(List<E> children);
}

TreeUtils 樹形結構處理類node

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;
    }
}

構造樹形結構的業務方法spring

@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);
    }

權限實體DOMAINsql

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 PermissionDtoapache

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;
}
相關文章
相關標籤/搜索