From 7e7f901b2172281dc294dfbc67e6ad00625f09f4 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期一, 04 三月 2024 10:11:21 +0800 Subject: [PATCH] 合并代码 --- cloud-server-management/src/main/java/com/dsh/course/model/node/MenuNode.java | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 258 insertions(+), 0 deletions(-) diff --git a/cloud-server-management/src/main/java/com/dsh/course/model/node/MenuNode.java b/cloud-server-management/src/main/java/com/dsh/course/model/node/MenuNode.java new file mode 100644 index 0000000..da46459 --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/course/model/node/MenuNode.java @@ -0,0 +1,258 @@ +package com.dsh.course.model.node; + + +import com.dsh.constant.IsMenu; + +import java.util.*; + +/** + * @author fengshuonan + * @Description 菜单的节点 + * @date 2016年12月6日 上午11:34:17 + */ +public class MenuNode implements Comparable { + + /** + * 节点id + */ + private Long id; + + /** + * 父节点 + */ + private Long parentId; + + /** + * 节点名称 + */ + private String name; + + /** + * 按钮级别 + */ + private Integer levels; + + /** + * 按钮级别 + */ + private Integer ismenu; + + /** + * 按钮的排序 + */ + private Integer num; + + /** + * 节点的url + */ + private String url; + + /** + * 节点图标 + */ + private String icon; + + private String ename; + private String bname; + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getBname() { + return bname; + } + + public void setBname(String bname) { + this.bname = bname; + } + + /** + * 子节点的集合 + */ + private List<MenuNode> children; + + /** + * 查询子节点时候的临时集合 + */ + private List<MenuNode> linkedList = new ArrayList<MenuNode>(); + + public MenuNode() { + super(); + } + + public MenuNode(Long id, Long parentId) { + super(); + this.id = id; + this.parentId = parentId; + } + + public Integer getLevels() { + return levels; + } + + public void setLevels(Integer levels) { + this.levels = levels; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public static MenuNode createRoot() { + return new MenuNode(0L, -1L); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long 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 List<MenuNode> getChildren() { + return children; + } + + public void setChildren(List<MenuNode> children) { + this.children = children; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } + + public Integer getIsmenu() { + return ismenu; + } + + public void setIsmenu(Integer ismenu) { + this.ismenu = ismenu; + } + + @Override + public String toString() { + return "MenuNode{" + + "id=" + id + + ", parentId=" + parentId + + ", name='" + name + '\'' + + ", levels=" + levels + + ", num=" + num + + ", url='" + url + '\'' + + ", icon='" + icon + '\'' + + ", children=" + children + + ", linkedList=" + linkedList + + '}'; + } + + /** + * 重写排序比较接口,首先根据等级排序,然后更具排序字段排序 + * + * @param o + * @return + */ + @Override + public int compareTo(Object o) { + MenuNode menuNode = (MenuNode) o; + Integer num = menuNode.getNum(); + Integer levels = menuNode.getLevels(); + if (num == null) { + num = 0; + } + if (levels == null) { + levels = 0; + } + if (this.levels.compareTo(levels) == 0) { + return this.num.compareTo(num); + } else { + return this.levels.compareTo(levels); + } + + } + + /** + * 构建页面菜单列表 + */ + public static List<MenuNode> buildTitle(List<MenuNode> nodes) { + if (nodes.size() <= 0) { + return nodes; + } + //剔除非菜单 + nodes.removeIf(node -> node.getIsmenu() != IsMenu.YES.getCode()); + //对菜单排序,返回列表按菜单等级,序号的排序方式排列 + Collections.sort(nodes); + return mergeList(nodes, nodes.get(nodes.size() - 1).getLevels(), null); + } + + /** + * 递归合并数组为子数组,最后返回第一层 + * + * @param menuList + * @param listMap + * @return + */ + private static List<MenuNode> mergeList(List<MenuNode> menuList, int rank, Map<Long, List<MenuNode>> listMap) { + //保存当次调用总共合并了多少元素 + int n; + //保存当次调用总共合并出来的list + Map<Long, List<MenuNode>> currentMap = new HashMap<>(); + //由于按等级从小到大排序,需要从后往前排序 + //判断该节点是否属于当前循环的等级,不等于则跳出循环 + for (n = menuList.size() - 1; n >=0&&menuList.get(n).getLevels() == rank; n--) { + //判断之前的调用是否有返回以该节点的id为key的map,有则设置为children列表。 + if (listMap != null && listMap.get(menuList.get(n).getId()) != null) { + menuList.get(n).setChildren(listMap.get(menuList.get(n).getId())); + } + if (menuList.get(n).getParentId()!=null&&menuList.get(n).getParentId()!=0) { + //判断当前节点所属的pid是否已经创建了以该pid为key的键值对,没有则创建新的链表 + currentMap.computeIfAbsent(menuList.get(n).getParentId(), k -> new LinkedList<>()); + //将该节点插入到对应的list的头部 + currentMap.get(menuList.get(n).getParentId()).add(0, menuList.get(n)); + } + } + if (n <0) { + return menuList; + } else { + return mergeList(menuList.subList(0, n+1), menuList.get(n).getLevels(), currentMap); + } + } + + +} -- Gitblit v1.7.1