java中后台权限树-工具类

285 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情
一、权限树是什么

在写项目的权限管理模块、用户系统的时候经常碰见类似的树结构我们一般习惯称之为权限树,权限树应用的地方有很多,比较常见的有:权限管理时候的树状图(如上图),页面左侧的一二三级的菜单,物品分类的树状菜单。

image.png

对象工具类:

package com.unisound.iot.smart.dao.model.saas;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

import lombok.Data;

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

/**

  • @author zhangtonghao

  • @create 2021-04-27 14:34

*/

@Data

@ApiModel(value ="Saas功能模块树节点", description ="Saas功能模块树节点")

public class TenantModuleTreeNode implements Comparable {

    @ApiModelProperty(value ="id唯一标识", position =1, required =true)

    @JsonSerialize(using =ToStringSerializer.class)

    private Long id;

    @ApiModelProperty(value ="模块名称", position =1, required =true)

    private String moduleName;

    @ApiModelProperty(value ="父模块id", position =1, required =false)

    private Long parentId;

    @ApiModelProperty(value ="模块路径", position =1, required =false)

    private String modulePath;

    @ApiModelProperty(value ="模块图标", position =1, required =false)

    private String moduleIcon;

    @ApiModelProperty(value ="http方法", position =1, required =false)

    private String httpMethod;

    @ApiModelProperty(value ="排序", position =1, required =false)

    private Integer sortNum;

    @ApiModelProperty(value ="模块代码", position =1, required =false)

    private String moduleCode;

    @ApiModelProperty(value ="是否可用", position =1, required =false)

    private Integer active;

    @ApiModelProperty(value ="版本:pro、lite", position =1, required =false)

    private String serviceVersion;

    @ApiModelProperty(value ="管理模式:1:标准模式 2:直客  3:非直客", position =1, required =false)

    private Integer custMode;

    @ApiModelProperty(value ="是否具备此模块", position =1, required =false)

    private Boolean isHas =false;

    @ApiModelProperty(value ="子菜单列表", position =1, required =false)

    private List children;

    public static List listToTree(List list) {

        //用递归找子。

        List treeList =new ArrayList();

        for (TenantModuleTreeNode tree :list) {

            if (tree.getParentId() == -1) {

                treeList.add(findChildren(tree, list));

            }

}

        return treeList;

    }

    public static TenantModuleTreeNode findChildren(TenantModuleTreeNode tree, List list) {

        for (TenantModuleTreeNode node :list) {

            if (node.getParentId().longValue() ==tree.getId()) {

                if (tree.getChildren() ==null) {

                    tree.setChildren(new ArrayList());

                }

                tree.getChildren().add(findChildren(node, list));

            }

}

        return tree;

    }

    /**

    * 转换为树

    *

    * @param moduleList

    * @return

    */

    public static List convertToTree(List moduleList) {

        if (moduleList ==null ||moduleList.size() ==0) {

            return null;

        }

        List list =new ArrayList<>();

        for (TenantModule module :moduleList) {

            TenantModuleTreeNode node =new TenantModuleTreeNode();

            BeanUtils.copyProperties(module, node);

            list.add(node);

        }

        return sort(listToTree(list));

    }

    /**

    * 转换为树并设置是否具备对应模块

    */

    public static List convertToTreeAndIsHas(List allModuleList, List idList) {

        if (allModuleList ==null ||allModuleList.size() ==0) {

            return null;

        }

        List list =new ArrayList<>();

        for (TenantModule module :allModuleList) {

            TenantModuleTreeNode node =new TenantModuleTreeNode();

            BeanUtils.copyProperties(module, node);

            if (idList !=null &&idList.size() >0) {

                for (Long um :idList) {

                    if (um ==module.getId().longValue()) {

                        node.setIsHas(true);

                        break;

                    }

}

}

            list.add(node);

        }

        return sort(listToTree(list));

    }

    @Override

    public int compareTo(TenantModuleTreeNode other) {

        if (other ==null) {

            return 1;

        }

        if (this.getSortNum() ==null ||other.getSortNum() ==null) {

            return 1;

        }

        return this.getSortNum() -other.getSortNum();

    }

    private static List sort(List adminModuleTreeNodeList) {

        if (adminModuleTreeNodeList ==null ||adminModuleTreeNodeList.size() ==0) {

            return adminModuleTreeNodeList;

        }

        for (TenantModuleTreeNode TenantModuleTreeNode :adminModuleTreeNodeList) {

            if (TenantModuleTreeNode.getChildren() !=null) {

                Collections.sort(TenantModuleTreeNode.getChildren());

                sort(TenantModuleTreeNode.getChildren());

            }

}

        return adminModuleTreeNodeList;

    }

}