From 83b010226237a7a7eb8d77078eda14f3359a4bac Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期五, 16 十月 2020 13:27:22 +0800
Subject: [PATCH] 集群节点展示更新

---
 src/pages/settings/components/CloudNode.vue                          |  148 ++++++++++++++++++++++++++++++++++++++++++-------
 src/components/serfDiagram/vue-d3-network/index.vue                  |   14 ++++
 src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue |    6 -
 src/components/serfDiagram/index.vue                                 |   12 +++
 4 files changed, 150 insertions(+), 30 deletions(-)

diff --git a/src/components/serfDiagram/index.vue b/src/components/serfDiagram/index.vue
index 179f7d8..f8ad4fd 100644
--- a/src/components/serfDiagram/index.vue
+++ b/src/components/serfDiagram/index.vue
@@ -2,6 +2,7 @@
   .net
     d3-network(
        ref='net'
+      :startX="startX"
       :net-nodes="nodes"
       :net-links="links"
       :options="options"
@@ -25,6 +26,9 @@
   props: {
     agent: String,
     members: Array,
+    sizeX: Number,
+    sizeY: Number,
+    startX: Number
   },
   data() {
     return {
@@ -100,9 +104,13 @@
         nodeLabels: true,
         canvas: this.canvas,
         linkWidth: 0,
+        // size: {
+        //   w: 745,
+        //   h: 426
+        // }
         size: {
-          w: 745,
-          h: 426
+          w: this.sizeX || 445,
+          h: this.sizeY || 426
         }
       };
     }
diff --git a/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue b/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
index 43cfaec..53b7f34 100644
--- a/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
+++ b/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
@@ -205,8 +205,4 @@
   }
 };
 </script>
-<style>
-  .net-svg{
-    background-color: rgba(127, 255, 212, 0.198);
-  }
-</style>
+
diff --git a/src/components/serfDiagram/vue-d3-network/index.vue b/src/components/serfDiagram/vue-d3-network/index.vue
index 5ef31b5..3c8d774 100644
--- a/src/components/serfDiagram/vue-d3-network/index.vue
+++ b/src/components/serfDiagram/vue-d3-network/index.vue
@@ -13,6 +13,7 @@
     svgRenderer
   },
   props: {
+    startX: Number,
     netNodes: {
       type: Array
     },
@@ -52,6 +53,10 @@
       canvas: false,
       nodes: [],
       links: [],
+      nodeX: [],
+      nodeY: [],
+      minWidth:0,
+      minHeight:0,
       size: {
         w: 500,
         h: 420
@@ -273,7 +278,11 @@
           vm.$set(node, "_opacity", node._size / 30);
           vm.$set(node, "opacity", node._opacity);
         }
-
+        // this.nodeX.push(node.x);
+        // this.nodeY.push(node.y);
+        // this.minWidth = Math.max(...this.nodeX) - Math.min(...this.nodeX);
+        // this.minHeight = Math.max(...this.nodeY) - Math.min(...this.nodeY);
+        // console.log(this.nodeX,this.nodeY,this.minWidth,this.minHeight);
         return node;
       });
     },
@@ -307,7 +316,8 @@
       if (forces.Center !== false)
         sim.force("center", d3.forceCenter(this.center.x, this.center.y));
       if (forces.X !== false) {
-        sim.force("X", d3.forceX(this.center.x).strength(forces.X));
+        //sim.force("X", d3.forceX(this.center.x).strength(forces.X));
+        sim.force("X", d3.forceX(this.startX||160).strength(forces.X));
       }
       if (forces.Y !== false) {
         sim.force("Y", d3.forceY(this.center.y).strength(forces.Y));
diff --git a/src/pages/settings/components/CloudNode.vue b/src/pages/settings/components/CloudNode.vue
index 01e0532..c285ab4 100644
--- a/src/pages/settings/components/CloudNode.vue
+++ b/src/pages/settings/components/CloudNode.vue
@@ -1,45 +1,72 @@
 <template>
   <div class="cloud">
     <div class="inner">
+      <!-- <div
+        class="rect"
+        :style="{width:`${minWidth+BaseWidth}px`,height:`${minHeight+BaseHeight}px`}"
+      >-->
       <div class="rect">
-        <div
+        <!-- <div
           class="node"
-          v-for="(item,index) in insideNodes"
+          v-for="item in insideNodes"
           :key="item.id"
-          :style="{top:36*(index+1)+'px',left:60*(index+1)+'px'}"
+          :style="{top:item.t+'px',left:item.l+'px'}"
         >
           <span class="node-icon">
-            <!-- <img :src="nodeIcons[item.workType]" alt=""> -->
           </span>
           <span class="node-name">{{item.nodeName}}</span>
-        </div>
+        </div>-->
+        <serfDiagram
+          ref="inside-nodes"
+          :members="insideNodes"
+          :agent="agentName"
+          :sizeX="400"
+          :sizeY="330"
+          class="inside-nodes"
+        ></serfDiagram>
       </div>
     </div>
     <div class="outer">
-      <div
+      <serfDiagram
+        ref="outer-nodes"
+        :members="outsideNodes"
+        :agent="agentName"
+        :sizeX="230"
+        :sizeY="370"
+        :startX="60"
+        class="outer-nodes"
+      ></serfDiagram>
+      <!-- <div
         class="node"
-        v-for="(item,index) in insideNodes"
+        v-for="(item,index) in outsideNodes"
         :key="item.id"
-        :style="{top:36*(index+1)+'px',left:80*(index+1)+'px'}"
+        :style="{top:36*(index+1)+'px',left:60*(index+1)+'px'}"
       >
-        <span class="node-icon">
-          <!-- <img :src="nodeIcons[item.workType]" alt=""> -->
-        </span>
+        <span class="node-icon"></span>
         <span class="node-name">{{item.nodeName}}</span>
-      </div>
+      </div>-->
     </div>
   </div>
 </template>
 <script>
+import SerfDiagram from "@/components/serfDiagram";
 export default {
   name: 'cloudNode',
   props: {
     nodes: Array
   },
+  components: {
+    SerfDiagram
+  },
   data () {
     return {
-
+      agentName: '',
       nodeIcons: [],
+      //insideNodes: [],
+      BaseWidth: 150,
+      BaseHeight: 70,
+      minWidth: 0,
+      minHeight: 0,
       mockData: [
         {
           cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2f46",
@@ -56,7 +83,7 @@
           id: "DSVAD010120190623",
           node_id: "DSVAD010120190623",
           node_ip: "192.168.20.10:30190",
-          nodeName: "寮�鍙戞祴璇�20.10-1",
+          nodeName: "寮�鍙戞祴璇�20.11-1",
           role: 'master'
         },
         {
@@ -65,7 +92,7 @@
           id: "DSVAD010120190624",
           node_id: "DSVAD010120190624",
           node_ip: "192.168.20.10:30190",
-          nodeName: "娴嬭瘯20.10-1",
+          nodeName: "娴嬭瘯20.13-1",
           role: 'pc'
         },
         {
@@ -77,17 +104,97 @@
           nodeName: "娴嬭瘯20.101-1",
           role: 'server'
         },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614cf",
+          hardwareType: "02",
+          id: "DSVAD01012019063",
+          node_id: "DSVAD01012019063",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "寮�鍙戞祴璇�20.15-1",
+          role: 'master'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-710-ba89-436f614cf",
+          hardwareType: "02",
+          id: "DSVAD0101201906",
+          node_id: "DSVAD0101209063",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "k20.15-128437586",
+          role: 'master'
+        },
+        {
+          cluster_id: "b612bfe-d3af-710-ba89-436f614cf",
+          hardwareType: "02",
+          id: "DSVAD010120906",
+          node_id: "DSVAD010120963",
+          node_ip: "192.168.20.107:30190",
+          nodeName: "kfl20.15-127586",
+          role: 'master'
+        },
       ]
     }
+  },
+  mounted () {
+    //this.getInsideNodes();
+  },
+  methods: {
+    getRandom (index) {
+      if (index % 2 == 0) {
+        return Math.random() * 20
+      } else {
+        return Math.random() * 50
+      }
+    },
+    getInsideNodes () {
+      //return this.nodes.filter(item=>item.hardwareType=='01'||item.hardwareType=='02');
+      //return this.mockData.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
+      let arr = this.mockData.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
+      let len = arr.length;
+      let lefts = [];
+      let tops = [];
+      this.insideNodes = arr.map((item, index) => {
+        lefts.push((20 - len) * (index + 1) + this.getRandom(index));
+        tops.push(30 * (index + 1));
+        return {
+          l: 10 + this.getRandom(index),
+          t: 30 * (index + 1),
+          nodeName: item.nodeName,
+          id: item.id,
+          workType: item.workType
+        }
+      });
+      this.minWidth = Math.max(...lefts) - Math.min(...lefts);
+      this.minHeight = Math.max(...tops) - Math.min(...tops);
+      console.log('w,h', this.minWidth, this.minHeight);
+    },
   },
   computed: {
     cloudPic () {
       return '/images/settings/cloud.png'
     },
     insideNodes () {
-      //return this.nodes.filter(item=>item.hardwareType=='01'||item.hardwareType=='02');
-      return this.mockData.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
+      return this.nodes.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
     },
+    // insideNodes () {
+    //   //return this.nodes.filter(item=>item.hardwareType=='01'||item.hardwareType=='02');
+    //   //return this.mockData.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
+    //   let arr = this.mockData.filter(item => item.hardwareType == '01' || item.hardwareType == '02');
+    //   let len = arr.length;
+    //   let lefts = [];
+    //   let tops = [];
+    //   let temp = arr.map((item,index)=>{
+    //     lefts.push((20-len)*(index+1));
+    //     tops.push(30*(index+1));
+    //     return {
+    //       l: (20-len)*(index+1),
+    //       t: 30*(index+1),
+    //       nodeName: item.nodeName,
+    //       id: item.id,
+    //       workType: item.workType
+    //     }
+    //   });
+    //   return temp;
+    // },
     outsideNodes () {
       //return this.nodes.filter(item=>item.hardwareType=='03');
       return this.mockData.filter(item => item.hardwareType == '03');
@@ -103,11 +210,10 @@
   .inner {
     background: url('/images/settings/cloud.png') no-repeat;
     background-size: 100%;
-    width: 50%;
     .rect {
-      margin: 100px;
-      background: cornflowerblue;
+      //background: rgba(176, 203, 253, 0.3);
       position: relative;
+      margin: 100px;
       .node {
         position: absolute;
         .node-icon {
@@ -122,7 +228,7 @@
     }
   }
   .outer {
-    width: 50%;
+    width: 40%;
     position: relative;
     .node {
       position: absolute;

--
Gitblit v1.8.0