From 9e706b01af838aba6d45f97b123f9ee4d0d777e5 Mon Sep 17 00:00:00 2001 From: "jun.shao" Date: Fri, 5 Jul 2019 15:48:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1=E3=80=81=E5=B7=A6=E4=BE=A7key=E6=A0=91?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=AD=97=E6=AF=8D=E6=8E=92=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?1000pagesize=202=E3=80=81=E9=BB=98=E8=AE=A4=E6=94=B9=E4=B8=BAed?= =?UTF-8?q?it=E7=BC=96=E8=BE=91=E9=A1=B5=EF=BC=8C=E5=B9=B6=E8=83=BD?= =?UTF-8?q?=E5=A4=9F=E8=87=AA=E5=8A=A8=E8=AF=86=E5=88=ABjson=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E4=BF=9D=E5=AD=98=E6=A0=A1=E9=AA=8C=203=E3=80=81?= =?UTF-8?q?=E9=9B=86=E7=BE=A4=E6=A8=A1=E5=BC=8F=EF=BC=9A=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E4=BC=9A=E5=8F=98=E4=B8=A4=E4=B8=AAkey=E7=9A=84bug?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=8C=E5=88=A0=E9=99=A4=E8=80=81key?= =?UTF-8?q?=EF=BC=8C=E8=AE=BE=E7=BD=AE=E6=96=B0key=E7=9A=84=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=EF=BC=88=3Doldkey=EF=BC=89=204?= =?UTF-8?q?=E3=80=81=E9=9B=86=E7=BE=A4=E6=A8=A1=E5=BC=8F=E3=80=81=E5=8D=95?= =?UTF-8?q?=E6=9C=BA=E6=A8=A1=E5=BC=8F=EF=BC=9A=E7=AE=80=E5=8D=95=E5=88=86?= =?UTF-8?q?=E7=BB=84=205=E3=80=81keytree=E8=8A=82=E7=82=B9=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E5=B7=B2=E7=BB=8F=E6=90=BA=E5=B8=A6=E5=AD=90=E8=8A=82?= =?UTF-8?q?=E7=82=B9=EF=BC=88=E5=88=86=E7=BB=84=E8=8A=82=E7=82=B9=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E5=88=99=E5=B1=8F=E8=94=BD=E4=B8=8D=E5=86=8D=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=90=8E=E5=8F=B0=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/maxbill/base/bean/ZTreeBean.java | 4 + .../controller/DataClusterController.java | 89 ++++++++++++++----- .../java/com/maxbill/tool/ClusterUtil.java | 7 ++ src/main/java/com/maxbill/tool/RedisUtil.java | 86 +++++++++++++----- src/main/resources/page/data-cluster.html | 24 ++--- src/main/resources/page/data-singles.html | 24 ++--- src/main/resources/script/data-cluster.js | 33 ++++++- src/main/resources/script/data-singles.js | 34 ++++++- 8 files changed, 224 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/maxbill/base/bean/ZTreeBean.java b/src/main/java/com/maxbill/base/bean/ZTreeBean.java index f394800..2a3fc17 100644 --- a/src/main/java/com/maxbill/base/bean/ZTreeBean.java +++ b/src/main/java/com/maxbill/base/bean/ZTreeBean.java @@ -3,6 +3,8 @@ package com.maxbill.base.bean; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; +import java.util.List; + @Data public class ZTreeBean { @@ -28,6 +30,8 @@ public class ZTreeBean { @JSONField(name = "isParent") private boolean isParent; + private List children; + public ZTreeBean() { } diff --git a/src/main/java/com/maxbill/base/controller/DataClusterController.java b/src/main/java/com/maxbill/base/controller/DataClusterController.java index 055e5fb..fd6bb84 100644 --- a/src/main/java/com/maxbill/base/controller/DataClusterController.java +++ b/src/main/java/com/maxbill/base/controller/DataClusterController.java @@ -14,10 +14,7 @@ import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.maxbill.base.bean.ResultInfo.*; @@ -54,7 +51,7 @@ public class DataClusterController { } ZTreeBean ztreeBean = new ZTreeBean(); ztreeBean.setId(KeyUtil.getUUIDKey()); - ztreeBean.setName("全部集群节点的KEY" + "(" + total + ")"); + ztreeBean.setName("全部集群节点的KEY" + " (" + total + ")"); ztreeBean.setPattern(""); ztreeBean.setParent(true); ztreeBean.setCount(total); @@ -90,7 +87,7 @@ public class DataClusterController { } ZTreeBean ztreeBean = new ZTreeBean(); ztreeBean.setId(KeyUtil.getUUIDKey()); - ztreeBean.setName("全部集群节点的KEY" + "(" + total + ")"); + ztreeBean.setName("全部集群节点的KEY" + " (" + total + ")"); ztreeBean.setPattern(pattern); ztreeBean.setParent(true); ztreeBean.setCount(total); @@ -106,7 +103,7 @@ public class DataClusterController { } - public String treeData(String id, int page, String pattern) { + public String treeData(String pid, int page, String pattern) { try { JedisCluster cluster = DataUtil.getJedisClusterObject(); if (null != cluster) { @@ -117,38 +114,82 @@ public class DataClusterController { Map masterNode = ClusterUtil.getMasterNode(nodeList); Map clusterNodes = cluster.getClusterNodes(); List treeList = new ArrayList<>(); - List keyList = new ArrayList<>(); - long count = 0L; + List keyList = new LinkedList<>(); for (String nk : clusterNodes.keySet()) { if (masterNode.keySet().contains(nk)) { Jedis jedis = clusterNodes.get(nk).getResource(); keyList.addAll(jedis.keys(pattern)); - count = count + jedis.keys(pattern).size(); RedisUtil.closeJedis(jedis); } } - int startIndex = (page - 1) * 50; - int endIndex = page * 50; - if (endIndex > count) { - endIndex = (int) count; + // 按字母排序 + Collections.sort(keyList); + + // 组织分组 + String GROUP_KEY = "!分组特殊KEY正常情况不会用这种吧!"; + Map> groupMap = new LinkedHashMap<>(); + List filterKeys = new LinkedList(); + for (String key : keyList) { + String[] datas = key.split(":"); + if (datas.length == 1) { + filterKeys.add(key); + continue; + } + + // 组织分组数据节点 + List childrenKeys = groupMap.get(datas[0]); + if (childrenKeys == null) { + groupMap.put(datas[0], childrenKeys = new LinkedList<>()); + } + childrenKeys.add(key); + if (!filterKeys.contains(GROUP_KEY + datas[0])) { + filterKeys.add(GROUP_KEY + datas[0]); + } + } + + // 分页返回 + int startIndex = (page - 1) * 1000; + int endIndex = page * 1000; + if (endIndex > filterKeys.size()) { + endIndex = filterKeys.size(); } - keyList = keyList.subList(startIndex, endIndex); - if (!keyList.isEmpty()) { - for (String key : keyList) { - ZTreeBean zTreeBean = new ZTreeBean(); - zTreeBean.setId(KeyUtil.getUUIDKey()); - zTreeBean.setPId(id); - zTreeBean.setName(key); - zTreeBean.setParent(false); - zTreeBean.setIcon("../image/data-01.png"); - treeList.add(zTreeBean); + for (String key : filterKeys.subList(startIndex, endIndex)) { + // 分组节点 + if (StringUtils.startsWithIgnoreCase(key, GROUP_KEY)) { + String groupKey = key.replace(GROUP_KEY, ""); + ZTreeBean group = new ZTreeBean(); + group.setId(KeyUtil.getUUIDKey()); + group.setName(groupKey + " (" + groupMap.get(groupKey).size() + ")"); + group.setParent(true); + group.setChildren(new LinkedList(){{ + // 分组子节点 + for (String childKey : groupMap.get(groupKey)) { + ZTreeBean childNode = new ZTreeBean(); + childNode.setId(KeyUtil.getUUIDKey()); + childNode.setPId(group.getId()); + childNode.setName(childKey); + childNode.setParent(false); + this.add(childNode); + } + }}); + treeList.add(group); + continue; } + // 普通节点 + ZTreeBean zTreeBean = new ZTreeBean(); + zTreeBean.setId(KeyUtil.getUUIDKey()); + zTreeBean.setPId(pid); + zTreeBean.setName(key); + zTreeBean.setParent(false); + zTreeBean.setIcon("../image/data-01.png"); + treeList.add(zTreeBean); } return getOkByJson(treeList); } else { return disconnect(); } } catch (Exception e) { + e.printStackTrace(); return exception(e); } } diff --git a/src/main/java/com/maxbill/tool/ClusterUtil.java b/src/main/java/com/maxbill/tool/ClusterUtil.java index 3bbf37e..00e5b92 100644 --- a/src/main/java/com/maxbill/tool/ClusterUtil.java +++ b/src/main/java/com/maxbill/tool/ClusterUtil.java @@ -221,6 +221,13 @@ public class ClusterUtil { jedisCluster.set(newKey, strs); break; } + + // 设置过期时间 + Long ttl = jedisCluster.ttl(oldKey); + if (ttl > -1) { + jedisCluster.expire(newKey, ttl.intValue()); + } + jedisCluster.del(oldKey); } /** diff --git a/src/main/java/com/maxbill/tool/RedisUtil.java b/src/main/java/com/maxbill/tool/RedisUtil.java index e5b9234..79eaea5 100644 --- a/src/main/java/com/maxbill/tool/RedisUtil.java +++ b/src/main/java/com/maxbill/tool/RedisUtil.java @@ -370,27 +370,71 @@ public class RedisUtil { Set keySet = jedis.keys(pattern); long endTime = System.currentTimeMillis(); log.info("getKeyTree查询耗时:" + (endTime - startTime)); - ZTreeBean zTreeBean = null; - if (null != keySet) { - for (String key : keySet) { - zTreeBean = new ZTreeBean(); - zTreeBean.setId(KeyUtil.getUUIDKey()); - zTreeBean.setPId(pid); - zTreeBean.setName(key); - zTreeBean.setParent(false); - zTreeBean.setIndex(index); - zTreeBean.setIcon("../image/data-01.png"); - treeList.add(zTreeBean); + + // 排序 + List keyList = new LinkedList<>(keySet); + Collections.sort(keyList); + + // 组织分组 + String GROUP_KEY = "!分组特殊KEY正常情况不会用这种吧!"; + Map> groupMap = new LinkedHashMap<>(); + List filterKeys = new LinkedList(); + for (String key : keyList) { + String[] datas = key.split(":"); + if (datas.length == 1) { + filterKeys.add(key); + continue; + } + + // 组织分组数据节点 + List childrenKeys = groupMap.get(datas[0]); + if (childrenKeys == null) { + groupMap.put(datas[0], childrenKeys = new LinkedList<>()); + } + childrenKeys.add(key); + if (!filterKeys.contains(GROUP_KEY + datas[0])) { + filterKeys.add(GROUP_KEY + datas[0]); } } - //封装返回数据 - int startIndex = (page - 1) * 50; - int endIndex = page * 50; - long count = RedisUtil.getKeysCount(jedis, index, pattern); - if (endIndex > count) { - endIndex = (int) count; + + // 分页返回 + int startIndex = (page - 1) * 1000; + int endIndex = page * 1000; + if (endIndex > filterKeys.size()) { + endIndex = filterKeys.size(); + } + for (String key : filterKeys.subList(startIndex, endIndex)) { + // 分组节点 + if (StringUtils.startsWithIgnoreCase(key, GROUP_KEY)) { + String groupKey = key.replace(GROUP_KEY, ""); + ZTreeBean parent = new ZTreeBean(); + parent.setId(KeyUtil.getUUIDKey()); + parent.setPId(pid); + parent.setName(groupKey + " (" + groupMap.get(groupKey).size() + ")"); + parent.setParent(true); + parent.setChildren(new LinkedList(){{ + // 分组子节点 + for (String childKey : groupMap.get(groupKey)) { + ZTreeBean childNode = new ZTreeBean(); + childNode.setId(KeyUtil.getUUIDKey()); + childNode.setPId(parent.getId()); + childNode.setName(childKey); + childNode.setParent(false); + this.add(childNode); + } + }}); + treeList.add(parent); + continue; + } + // 普通节点 + ZTreeBean zTreeBean = new ZTreeBean(); + zTreeBean.setId(KeyUtil.getUUIDKey()); + zTreeBean.setPId(pid); + zTreeBean.setName(key); + zTreeBean.setParent(false); + zTreeBean.setIcon("../image/data-01.png"); + treeList.add(zTreeBean); } - treeList = treeList.subList(startIndex, endIndex); return treeList; } @@ -406,13 +450,13 @@ public class RedisUtil { } //计算获取的数据量 long pageSize; - long currSize = page * 50; - long currScan = (page - 1) * 50; + long currSize = page * 1000; + long currScan = (page - 1) * 1000; long keysSize = getKeysCount(jedis, index, pattern); if (keysSize - currSize < 0) { pageSize = currSize - keysSize; } else { - pageSize = 50; + pageSize = 1000; } //scan数据查询 ScanParams scanParams = new ScanParams(); diff --git a/src/main/resources/page/data-cluster.html b/src/main/resources/page/data-cluster.html index 7f786c1..2631fa7 100644 --- a/src/main/resources/page/data-cluster.html +++ b/src/main/resources/page/data-cluster.html @@ -99,36 +99,36 @@
-
-
+
+ +
+
-
- -
- +
-
+
diff --git a/src/main/resources/page/data-singles.html b/src/main/resources/page/data-singles.html index 20573de..269f2f0 100644 --- a/src/main/resources/page/data-singles.html +++ b/src/main/resources/page/data-singles.html @@ -99,36 +99,36 @@
-
- +
+
+
-
+ +
-
- -
- +
-
+
diff --git a/src/main/resources/script/data-cluster.js b/src/main/resources/script/data-cluster.js index 9a8d82b..e5728d0 100644 --- a/src/main/resources/script/data-cluster.js +++ b/src/main/resources/script/data-cluster.js @@ -141,7 +141,9 @@ function ztreeOnClick(event, treeId, treeNode) { function ztreeOnExpand(event, treeId, treeNode) { if (treeNode.isParent) { currNode0 = treeNode; - loadDbData(treeNode, treeNode.pattern); + // 如果tree节点携带子节点,则不再请求后台获取 + if (!treeNode.children || treeNode.children == null || treeNode.children.length == 0) + loadDbData(treeNode, treeNode.pattern); } } @@ -268,7 +270,7 @@ function loadDbData(node, pattern) { var zTree = $.fn.zTree.getZTreeObj('keyTree'); zTree.removeChildNodes(node); zTree.addNodes(node, 0, data.data); - zTree.expandAll(true); + // zTree.expandAll(true); } else { layer.alert(data.msgs, { skin: 'layui-layer-lan', @@ -598,7 +600,16 @@ function getEditView(type, data) { view += ''; break; case "string": - view += ''; + var isjson = false; + var result = ""; + try { + result = JSON.stringify(JSON.parse(data), null, 2); + layer.msg("检测数据为JSON格式"); + isjson = true; + } catch (e) { + result = data; + } + view += ''; view += ''; break; @@ -612,9 +623,23 @@ function updateStr() { layer.msg("请选择要操作的KEY!"); return false; } + + var str = null; + try { + var data = JSON.parse($("#currVal").val()); + str = JSON.stringify(data); + } catch (err) { + if ($("#currVal").attr("isjson") == 'true') { + layer.msg("修改失败!不符合JSON格式请检查..."); + return; + } + str = $("#currVal").val() + } + layer.load(2); - var json = dataClusterRouter.updateStr(currNode1.name, $("#currVal").val()); + var json = dataClusterRouter.updateStr(currNode1.name, str); var data = JSON.parse(json); + layer.closeAll('loading'); if (data.code === 200) { getKeysInfo(""); diff --git a/src/main/resources/script/data-singles.js b/src/main/resources/script/data-singles.js index 60f7f3c..61d224c 100644 --- a/src/main/resources/script/data-singles.js +++ b/src/main/resources/script/data-singles.js @@ -155,7 +155,10 @@ function ztreeOnExpand(event, treeId, treeNode) { } }); currNode0 = treeNode; - loadDbData(treeNode, treeNode.pattern); + + // 如果tree节点携带子节点,则不再请求后台获取 + if (!treeNode.children || treeNode.children == null || treeNode.children.length == 0) + loadDbData(treeNode, treeNode.pattern); checkedOnTree(treeNode.index); } @@ -308,7 +311,7 @@ function loadDbData(node, pattern) { var zTree = $.fn.zTree.getZTreeObj('keyTree' + node.index); zTree.removeChildNodes(node); zTree.addNodes(node, 0, data.data); - zTree.expandAll(true); + // zTree.expandAll(true); } else { layer.alert(data.msgs, { skin: 'layui-layer-lan', @@ -637,7 +640,17 @@ function getEditView(type, data) { view += ''; break; case "string": - view += ''; + var isjson = false; + var result = ""; + try { + result = JSON.stringify(JSON.parse(data), null, 2); + layer.msg("检测数据为JSON格式"); + isjson = true; + } catch (e) { + result = data; + } + + view += ''; view += ''; break; @@ -651,8 +664,21 @@ function updateStr() { layer.msg("请选择要操作的KEY!"); return false; } + + var str = null; + try { + var data = JSON.parse($("#currVal").val()); + str = JSON.stringify(data); + } catch (err) { + if ($("#currVal").attr("isjson") == "true") { + layer.msg("修改失败!不符合JSON格式请检查..."); + return; + } + str = $("#currVal").val() + } + layer.load(2); - var json = dataSinglesRouter.updateStr(currNode0.index, currNode1.name, $("#currVal").val()); + var json = dataSinglesRouter.updateStr(currNode0.index, currNode1.name, str); var data = JSON.parse(json); layer.closeAll('loading'); if (data.code === 200) { -- Gitee From 87b4dad28eb04b8b109b14a010bebae754b3933f Mon Sep 17 00:00:00 2001 From: "jun.shao" Date: Sat, 6 Jul 2019 09:21:23 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=80=92=E5=BD=92=E5=88=86=E7=BB=84?= =?UTF-8?q?=EF=BC=9A=E9=9B=86=E7=BE=A4=E6=A8=A1=E5=BC=8F=E3=80=81=E5=8D=95?= =?UTF-8?q?=E6=9C=BA=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/maxbill/base/bean/ZTreeBean.java | 9 +- .../controller/DataClusterController.java | 61 +--------- src/main/java/com/maxbill/tool/RedisUtil.java | 115 +++++++++--------- 3 files changed, 70 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/maxbill/base/bean/ZTreeBean.java b/src/main/java/com/maxbill/base/bean/ZTreeBean.java index 2a3fc17..85a78b8 100644 --- a/src/main/java/com/maxbill/base/bean/ZTreeBean.java +++ b/src/main/java/com/maxbill/base/bean/ZTreeBean.java @@ -1,11 +1,17 @@ package com.maxbill.base.bean; import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class ZTreeBean { private String id; @@ -32,9 +38,6 @@ public class ZTreeBean { private List children; - public ZTreeBean() { - } - public ZTreeBean(String id, String name) { this.id = id; this.name = name; diff --git a/src/main/java/com/maxbill/base/controller/DataClusterController.java b/src/main/java/com/maxbill/base/controller/DataClusterController.java index fd6bb84..32f89c3 100644 --- a/src/main/java/com/maxbill/base/controller/DataClusterController.java +++ b/src/main/java/com/maxbill/base/controller/DataClusterController.java @@ -113,7 +113,6 @@ public class DataClusterController { List nodeList = ClusterUtil.getClusterNode(DataUtil.getCurrentOpenConnect()); Map masterNode = ClusterUtil.getMasterNode(nodeList); Map clusterNodes = cluster.getClusterNodes(); - List treeList = new ArrayList<>(); List keyList = new LinkedList<>(); for (String nk : clusterNodes.keySet()) { if (masterNode.keySet().contains(nk)) { @@ -125,64 +124,15 @@ public class DataClusterController { // 按字母排序 Collections.sort(keyList); - // 组织分组 - String GROUP_KEY = "!分组特殊KEY正常情况不会用这种吧!"; - Map> groupMap = new LinkedHashMap<>(); - List filterKeys = new LinkedList(); - for (String key : keyList) { - String[] datas = key.split(":"); - if (datas.length == 1) { - filterKeys.add(key); - continue; - } - - // 组织分组数据节点 - List childrenKeys = groupMap.get(datas[0]); - if (childrenKeys == null) { - groupMap.put(datas[0], childrenKeys = new LinkedList<>()); - } - childrenKeys.add(key); - if (!filterKeys.contains(GROUP_KEY + datas[0])) { - filterKeys.add(GROUP_KEY + datas[0]); - } - } - // 分页返回 int startIndex = (page - 1) * 1000; int endIndex = page * 1000; - if (endIndex > filterKeys.size()) { - endIndex = filterKeys.size(); + if (endIndex > keyList.size()) { + endIndex = keyList.size(); } - for (String key : filterKeys.subList(startIndex, endIndex)) { - // 分组节点 - if (StringUtils.startsWithIgnoreCase(key, GROUP_KEY)) { - String groupKey = key.replace(GROUP_KEY, ""); - ZTreeBean group = new ZTreeBean(); - group.setId(KeyUtil.getUUIDKey()); - group.setName(groupKey + " (" + groupMap.get(groupKey).size() + ")"); - group.setParent(true); - group.setChildren(new LinkedList(){{ - // 分组子节点 - for (String childKey : groupMap.get(groupKey)) { - ZTreeBean childNode = new ZTreeBean(); - childNode.setId(KeyUtil.getUUIDKey()); - childNode.setPId(group.getId()); - childNode.setName(childKey); - childNode.setParent(false); - this.add(childNode); - } - }}); - treeList.add(group); - continue; - } - // 普通节点 - ZTreeBean zTreeBean = new ZTreeBean(); - zTreeBean.setId(KeyUtil.getUUIDKey()); - zTreeBean.setPId(pid); - zTreeBean.setName(key); - zTreeBean.setParent(false); - zTreeBean.setIcon("../image/data-01.png"); - treeList.add(zTreeBean); + List treeList = new LinkedList<>(); + for (String key : keyList.subList(startIndex, endIndex)) { + RedisUtil.groupRecursiveLoad(treeList, key, null, pid); } return getOkByJson(treeList); } else { @@ -194,7 +144,6 @@ public class DataClusterController { } } - public String keysData(String key, String order) { try { JedisCluster cluster = DataUtil.getJedisClusterObject(); diff --git a/src/main/java/com/maxbill/tool/RedisUtil.java b/src/main/java/com/maxbill/tool/RedisUtil.java index 79eaea5..237d934 100644 --- a/src/main/java/com/maxbill/tool/RedisUtil.java +++ b/src/main/java/com/maxbill/tool/RedisUtil.java @@ -361,7 +361,6 @@ public class RedisUtil { * 按条件获取分页数据 */ public static List getKeyTree(Jedis jedis, int index, int page, String pid, String pattern) { - List treeList = new ArrayList<>(); long startTime = System.currentTimeMillis(); jedis.select(index); if (StringUtils.isEmpty(pattern)) { @@ -375,69 +374,73 @@ public class RedisUtil { List keyList = new LinkedList<>(keySet); Collections.sort(keyList); - // 组织分组 - String GROUP_KEY = "!分组特殊KEY正常情况不会用这种吧!"; - Map> groupMap = new LinkedHashMap<>(); - List filterKeys = new LinkedList(); - for (String key : keyList) { - String[] datas = key.split(":"); - if (datas.length == 1) { - filterKeys.add(key); - continue; - } - - // 组织分组数据节点 - List childrenKeys = groupMap.get(datas[0]); - if (childrenKeys == null) { - groupMap.put(datas[0], childrenKeys = new LinkedList<>()); - } - childrenKeys.add(key); - if (!filterKeys.contains(GROUP_KEY + datas[0])) { - filterKeys.add(GROUP_KEY + datas[0]); - } - } - // 分页返回 int startIndex = (page - 1) * 1000; int endIndex = page * 1000; - if (endIndex > filterKeys.size()) { - endIndex = filterKeys.size(); + if (endIndex > keyList.size()) { + endIndex = keyList.size(); } - for (String key : filterKeys.subList(startIndex, endIndex)) { - // 分组节点 - if (StringUtils.startsWithIgnoreCase(key, GROUP_KEY)) { - String groupKey = key.replace(GROUP_KEY, ""); - ZTreeBean parent = new ZTreeBean(); - parent.setId(KeyUtil.getUUIDKey()); - parent.setPId(pid); - parent.setName(groupKey + " (" + groupMap.get(groupKey).size() + ")"); - parent.setParent(true); - parent.setChildren(new LinkedList(){{ - // 分组子节点 - for (String childKey : groupMap.get(groupKey)) { - ZTreeBean childNode = new ZTreeBean(); - childNode.setId(KeyUtil.getUUIDKey()); - childNode.setPId(parent.getId()); - childNode.setName(childKey); - childNode.setParent(false); - this.add(childNode); - } - }}); - treeList.add(parent); - continue; - } - // 普通节点 - ZTreeBean zTreeBean = new ZTreeBean(); - zTreeBean.setId(KeyUtil.getUUIDKey()); - zTreeBean.setPId(pid); - zTreeBean.setName(key); - zTreeBean.setParent(false); - zTreeBean.setIcon("../image/data-01.png"); - treeList.add(zTreeBean); + List treeList = new ArrayList<>(); + for (String key : keyList.subList(startIndex, endIndex)) { + groupRecursiveLoad(treeList, key, null, pid); } return treeList; } + + /** + * 分组递归加载节点 + * + * @param nodes + * @param key + * @param pref + * @param pid + */ + public static void groupRecursiveLoad(List nodes, String key, String pref, String pid) { + String thisKey = new String(key); + if (pref != null && key.startsWith(pref)) { + thisKey = thisKey.substring(pref.length()); + } + + /** 普通节点类型:直接添加 */ + String[] metas = thisKey.split(":"); + if (metas.length == 1) { + ZTreeBean node = ZTreeBean.builder() + .id(KeyUtil.getUUIDKey()) + .pId(pid) + .name(key) + .isParent(false) + .icon("../image/data-01.png") + .build(); + nodes.add(node); + return; + } + + /** 对象节点类型:递归添加(Object:Field:Field) */ + // 1、先查找已存在的上级节点 + List children = null; + for (ZTreeBean parent : nodes) { + if (parent.isParent() && parent.getName().equals(metas[0])) { + children = parent.getChildren(); + break; + } + } + // 2、不存在上级时:创建上级节点 + String id = KeyUtil.getUUIDKey(); + if (children == null) { + ZTreeBean parent = ZTreeBean.builder() + .id(id) + .pId(pid) + .name(metas[0]) + .isParent(true) + .children(children = new LinkedList<>()) + .build(); + nodes.add(parent); + } + // 3、递归——添加children + groupRecursiveLoad(children, key, (pref == null ? "" : pref) + metas[0] + ":", id); + } + /** * 按条件获取分页数据(scan) */ -- Gitee