Java樹形結構數據處理(遞歸處理)-隨業務更換實體-TreeUitls工具類詳解

需求:獲取權限樹狀菜單,如圖:

需求圖

數據結構

public class PermissionVO{
	/** 主鍵 */
    private Integer id;
    /** 父ID */
    private String parentId;
    /** 名稱 */
    private String name;
    /** 權限URL */
    @JSONField(serialize = false)
    private String url;
    /** 圖標 */
    @JSONField(serialize = false)
    private String icon;
    /** 是否菜單 */
    private String isMenu;
    /** 排序 */
    private Integer sort;
	/**  子集合 */
    private List<PermissionVO> children;

    public Integer getId() {
        return id;
    }

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

    public String getParentId() {
        return parentId;
    }

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

    public String getName() {
        return name;
    }

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getMenu() {
        return isMenu;
    }

    public void setMenu(String menu) {
        isMenu = menu;
    }

    public Integer getSort() {
        return sort;
    }

    public void setSort(Integer sort) {
        this.sort = sort;
    }

    public List<PermissionVO> getList() {
        return children;
    }

    public void setList(List<PermissionVO> childrenList) {
        this.children = childrenList;
    }

    @Override
    public String toString() {
        return "PermissionVO{" +
                "id=" + id +
                ", parentId=" + parentId +
                ", name='" + name + '\'' +
                ", url='" + url + '\'' +
                ", icon='" + icon + '\'' +
                ", isMenu=" + isMenu +
                ", sort=" + sort +
                '}';
    }
}

數據庫查詢出的數據

data

mapper.xml

	<resultMap id="BaseResultMap" type="com.smart.sso.server.model.PermissionVO">
		<id column="id" jdbcType="INTEGER" property="id" />
		<result column="parentId" jdbcType="VARCHAR" property="parentId" />
		<result column="name" jdbcType="VARCHAR" property="name" />
		<result column="url" jdbcType="VARCHAR" property="url" />
		<result column="icon" jdbcType="VARCHAR" property="icon" />
		<result column="isMenu" jdbcType="VARCHAR" property="isMenu" />
		<result column="sort" jdbcType="INTEGER" property="sort" />
		<collection property="children" ofType="com.smart.sso.server.model.PermissionVO" column="id" select="com.smart.sso.server.dao.PermissionDao.getListById"/>
	</resultMap>
	<select id="getListById" parameterType="map" resultMap="BaseResultMap">
		<!--sql語句省略-->
	</select>

工具類

public class TreeUtil {

    /*
     * 存放所有樹狀數據
     */
    private List<PermissionVO> menuList;

    /*
     * 存放返回樹狀數據
     */
    public List<Object> list = new ArrayList<>();

    /**
     * 獲取結構樹
     *
     * @param allMenuList 所有數據
     * @return 結構樹數據
     */
    public List<Object> treeMenu(List<PermissionVO> allMenuList) {
        this.menuList = allMenuList;
        allMenuList.forEach(treeNode -> {
            Map<String, Object> mapArray = new LinkedHashMap<>();
            //根節點默認是"",根據業務改變
            if (null == treeNode.getParentId() || "".equals(treeNode.getParentId())) {
                setTreeMap(mapArray, treeNode);
                list.add(mapArray);
            }
        });
        return list;
    }

    /**
     * 構造樹狀結構
     *
     * @param mapArray 節點對象
     * @param treeNode 節點
     * 根據業務改爲接受樹狀數據的類的結構
     */
    private void setTreeMap(Map<String, Object> mapArray, PermissionVO treeNode) {
        mapArray.put("id", treeNode.getId());
        mapArray.put("parentId", treeNode.getParentId());
        mapArray.put("name", treeNode.getName());
        mapArray.put("url", treeNode.getUrl());
        mapArray.put("icon", treeNode.getIcon());
        mapArray.put("isMenu", treeNode.getMenu());
        mapArray.put("sort", treeNode.getSort());
        //獲取子節點
        mapArray.put("children", menuChild(treeNode.getId().toString()));
    }

    /**
     * 根據父節點id獲取子節點
     *
     * @param parentId 父節點id
     * @return 子節點集合
     */
    private List<?> menuChild(String parentId) {
        List<Object> lists = new ArrayList<>();
        menuList.forEach(treeNode -> {
            Map<String, Object> childArray = new LinkedHashMap<>();
            if (null != treeNode.getParentId() && !"".equals(treeNode.getParentId())) {
                //這裏根據業務替換下父id
                if (treeNode.getParentId().equals(parentId)) {
                    setTreeMap(childArray, treeNode);
                    lists.add(childArray);
                }
            }
        });
        return lists;
    }
}

調用工具類

List<PermissionVO> permissionVOList = permissionService.getListById(appCode, user.getId());
if (0 < permissionVOList.size()) {
	TreeUtil treeUtil = new TreeUtil();
    List<Object> objects = treeUtil.treeMenu(permissionVOList);
    JSONArray treeData = new JSONArray(objects);
}

返回數據

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章