From 355de6d28489e9ff3d17138575c2fef32266930e Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期四, 15 十月 2020 16:13:08 +0800
Subject: [PATCH] 应用中心未安装算法图标修复,集群节点展示组件更新

---
 src/components/serfDiagram/indexC.vue                                |  499 +++++++++++++++++++++++++++++++++++
 src/pages/ai/index/App.vue                                           |    6 
 src/pages/settings/components/ClusterManagement.vue                  |   32 +
 public/images/settings/cloud.png                                     |    0 
 src/pages/settings/components/CloudNode.vue                          |  115 ++++++++
 src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue |    7 
 src/components/serfDiagram/index.vue                                 |  165 +---------
 7 files changed, 668 insertions(+), 156 deletions(-)

diff --git a/public/images/settings/cloud.png b/public/images/settings/cloud.png
new file mode 100644
index 0000000..34fee95
--- /dev/null
+++ b/public/images/settings/cloud.png
Binary files differ
diff --git a/src/components/serfDiagram/index.vue b/src/components/serfDiagram/index.vue
index 544fb8a..179f7d8 100644
--- a/src/components/serfDiagram/index.vue
+++ b/src/components/serfDiagram/index.vue
@@ -2,7 +2,6 @@
   .net
     d3-network(
        ref='net'
-       v-if="nodes.length"
       :net-nodes="nodes"
       :net-links="links"
       :options="options"
@@ -12,42 +11,12 @@
       @node-hover='nodeHover'
       @node-out='nodeOut'     
     )
-    .clouds(v-if="members.length")
-      //- d3-network(
-      //-   ref='net'
-      //-   v-if="outerNodes.length"
-      //-   :net-nodes="outerNodes"
-      //-   :net-links="links"
-      //-   :options="options"
-      //-   :selection="{nodes: nodeSelected, links: linksSelected}"
-      //-   @drag-start='dragStart'
-      //-   @node-click='nodeClick'
-      //-   @node-hover='nodeHover'
-      //-   @node-out='nodeOut'     
-      //- )
-    .inner
-      d3-network(
-        ref='net'
-        v-if="innerNodes.length"
-        :net-nodes="innerNodes"
-        :net-links="links"
-        :options="options"
-        :selection="{nodes: nodeSelected, links: linksSelected}"
-        @drag-start='dragStart'
-        @node-click='nodeClick'
-        @node-hover='nodeHover'
-        @node-out='nodeOut'     
-      )
-    
-        
-      
-    
 </template>
-
+ 
 <script>
 import D3Network from "./vue-d3-network";
 import RoleIcon from "./icons.js";
-
+ 
 export default {
   name: "SerfDiagram",
   components: {
@@ -56,7 +25,6 @@
   props: {
     agent: String,
     members: Array,
-    searchNodes: Array,
   },
   data() {
     return {
@@ -71,72 +39,9 @@
     };
   },
   computed: {
-    //鍒嗙被鑺傜偣
-    //1.浜戝唴鑺傜偣(瀵瑰簲X86)
-    innerNodes(){
-      // return this.members.map(item=>{
-      //   if(item.hardwareType == '01'||item.hardwareType == '02'){
-      //     return {
-      //       id:item.id,
-      //       name:item.nodeName,
-      //       svgSym: RoleIcon[item.role],
-      //       _color:
-      //         this.agent === v.nodeName
-      //           ? "red"
-      //           : v.role === "master"
-      //             ? "orange"
-      //             : ""
-      //     }
-      //   }
-      // })
-      let arr = [];
-      this.members.forEach(item=>{
-        if(item.hardwareType == '01'||item.hardwareType == '02'){
-          arr.push({
-            id:item.id,
-            cluster_id:item.cluster_id,
-            name:item.nodeName,
-            svgSym: RoleIcon[item.role],
-            _color:
-              this.agent === item.nodeName
-                ? "red"
-                : item.role === "master"
-                  ? "orange"
-                  : ""
-          });
-        }
-      });
-      console.log(this.members);
-      console.log(arr)
-      return arr;
-    },
-    //2.杈硅妭鐐�(鐜板搴攂it)
-    outerNodes(){
-      let arr = [];
-      this.members.forEach(item=>{
-        debugger
-        if(item.hardwareType == '03'){
-          arr.push({
-            id:item.id,
-            cluster_id:item.cluster_id,
-            name:item.nodeName,
-            svgSym: RoleIcon[item.role],
-            _color:
-              this.agent === item.nodeName
-                ? "red"
-                : item.role === "master"
-                  ? "orange"
-                  : ""
-          });
-        }
-      });
-      console.log(this.members);
-      console.log(arr)
-      return arr;
-    },
     nodes() {
       let n = new Array();
-      this.searchNodes.forEach((v, i) => {
+      this.members.forEach((v, i) => {
         n.push({
           id: i,
           name: v.nodeName,
@@ -149,14 +54,14 @@
                 : ""
         });
       });
-      console.log(n)
+ 
       return n;
     },
     links() {
       let arr = new Array();
       let dup = new Array(); // Deduplicate to ensure that two nodes have only one line
       const count = this.members.length;
-
+ 
       switch (count) {
         case 0:
         case 1:
@@ -176,7 +81,7 @@
                 // is me? skip
                 continue;
               }
-
+ 
               if (!dup["d" + target + i]) {
                 arr.push({ sid: i, tid: target });
                 dup["d" + i + target] = 1;
@@ -184,7 +89,7 @@
             }
           }
       }
-
+ 
       return arr;
     },
     options() {
@@ -205,11 +110,6 @@
   created() {
     this.reset();
   },
-  mounted(){
-    console.log(this.members)
-    console.log('innerNodes',this.innerNodes);
-    console.log('outerNodes',this.outerNodes)
-  },
   methods: {
     nodeHover(event, node) {
       console.log(node);
@@ -219,9 +119,9 @@
       this.toolTipStyle.display = "block";
       this.toolTipStyle.top = node.y - 10 + "px";
       this.toolTipStyle.left = node.x + width / 2 - 30 + "px";
-
-      //this.toolTipNode = this.members[node.id].nodeName;
-      //this.toolTipAddr = this.members[node.id].Address;
+ 
+      this.toolTipNode = this.members[node.id].nodeName;
+      this.toolTipAddr = this.members[node.id].Address;
     },
     nodeOut(event, node) {
       node._opacity = node.opacity;
@@ -239,13 +139,12 @@
       //   // is not nodeSelected
       // } else {
       //   this.selectNode(node)
-
+ 
       // }
       // this.selectNodesLinks()
       // this.$set(this.nodes, node.index, node)
       console.log(event,node)
-      console.log(this.members)
-      console.log(this.members[node.id])
+      debugger
       if (event.timeStamp - this.movement < 200) {
         this.$emit("selected-node", event, this.members[node.id]);
       }
@@ -285,13 +184,13 @@
   }
 };
 </script>
-
+ 
 <style>
 .net {
   height: 100%;
   margin: 0;
 }
-
+ 
 .node {
   /* stroke: rgba(18, 120, 98, 0.7); */
   stroke: rgba(76, 78, 78, 0.7);
@@ -301,51 +200,51 @@
   /* fill: #dcfaf3; */
   fill: #e3e4e4;
 }
-
+ 
 .node.selected {
   stroke: #caa455;
 }
-
+ 
 .node.pinned {
   stroke: rgba(190, 56, 93, 0.6);
 }
-
+ 
 .link {
   stroke: rgba(18, 120, 98, 0.3);
 }
-
+ 
 .link,
 .node {
   stroke-linecap: round;
 }
-
+ 
 .link:hover,
 .node:hover {
   stroke: #df8108;
   stroke-width: 1px;
   cursor: pointer;
 }
-
+ 
 .link.selected {
   stroke: rgba(202, 164, 85, 0.6);
 }
-
+ 
 .curve {
   fill: none;
 }
-
+ 
 .link-label,
 .node-label {
   /* fill: #127862; */
   fill: rgba(76, 78, 78, 0.7);
 }
-
+ 
 .link-label {
   -webkit-transform: translateY(-0.5em);
   transform: translateY(-0.5em);
   text-anchor: middle;
 }
-
+ 
 .arrow_box {
   position: absolute;
   background: #fff;
@@ -354,7 +253,7 @@
   font-size: 11px;
   padding-left: 5px;
 }
-
+ 
 .arrow_box p {
   height: 30px;
   line-height: 30px;
@@ -372,7 +271,7 @@
   position: absolute;
   pointer-events: none;
 }
-
+ 
 .arrow_box:after {
   border-color: rgba(136, 183, 213, 0);
   border-right-color: #fff;
@@ -385,14 +284,4 @@
   border-width: 6px;
   margin-top: -6px;
 }
-.clouds{
-  height: 100%;
-  margin:0;
-  background:rgba(149, 221, 255, 0.322);
-}
-.inner{
-  height:300px;
-  margin: 50px auto;
-  background:rgb(201 233 249);
-}
-</style>
+</style>
\ No newline at end of file
diff --git a/src/components/serfDiagram/indexC.vue b/src/components/serfDiagram/indexC.vue
new file mode 100644
index 0000000..4a37ec7
--- /dev/null
+++ b/src/components/serfDiagram/indexC.vue
@@ -0,0 +1,499 @@
+<template lang='pug'>
+  .net
+    //- d3-network(
+    //-   ref='net'
+    //-   class="member"
+    //-   v-if="memberNodes.length && !searchNodes.length"
+    //-   :net-nodes="memberNodes"
+    //-   :net-links="links"
+    //-   :options="options"
+    //-   :selection="{nodes: nodeSelected, links: linksSelected}"
+    //-   @drag-start='dragStart'
+    //-   @node-click='nodeClick'
+    //-   @node-hover='nodeHover'
+    //-   @node-out='nodeOut'     
+    //- )
+    d3-network(
+       ref='net'
+       class="search"
+       v-if="searchNodes.length"
+      :net-nodes="nodes"
+      :net-links="links"
+      :options="options"
+      :selection="{nodes: nodeSelected, links: linksSelected}"
+      @drag-start='dragStart'
+      @node-click='nodeClick'
+      @node-hover='nodeHover'
+      @node-out='nodeOut'     
+    )
+    //- .clouds(v-if="members.length")
+    //-   d3-network(
+    //-     ref='net'
+    //-     v-if="memberNodes.length"
+    //-     :net-nodes="memberNodes"
+    //-     :net-links="links"
+    //-     :options="options"
+    //-     :selection="{nodes: nodeSelected, links: linksSelected}"
+    //-     @drag-start='dragStart'
+    //-     @node-click='nodeClick'
+    //-     @node-hover='nodeHover'
+    //-     @node-out='nodeOut'     
+    //-   )
+    //- .inner
+    //-   d3-network(
+    //-     ref='net'
+    //-     v-if="innerNodes.length"
+    //-     :net-nodes="innerNodes"
+    //-     :net-links="links"
+    //-     :options="options"
+    //-     :selection="{nodes: nodeSelected, links: linksSelected}"
+    //-     @drag-start='dragStart'
+    //-     @node-click='nodeClick'
+    //-     @node-hover='nodeHover'
+    //-     @node-out='nodeOut'     
+    //-   )
+    
+</template>
+
+<script>
+import D3Network from "./vue-d3-network";
+import RoleIcon from "./icons.js";
+
+export default {
+  name: "SerfDiagram",
+  components: {
+    D3Network
+  },
+  props: {
+    agent: String,
+    //members: Array,
+    searchNodes: Array,
+  },
+  data() {
+    return {
+      nodeSize: 20,
+      fontSize: 20,
+      canvas: false,
+      toolTipStyle: {
+        display: "none",
+        height: "30px",
+        width: "120px"
+      }
+    };
+  },
+  computed: {
+    //鍒嗙被鑺傜偣
+    //浜戝唴浜戣竟鑺傜偣
+    memberNodes(){
+      let arr = [];
+      let mockMembers = [
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2f46",
+          hardwareType: "01",
+          id: "DSVAD010120190622",
+          node_id: "DSVAD010120190622",
+          node_ip: "192.168.20.10:30190",
+          node_name: "寮�鍙�20.10-1",
+          role: 'pc'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2f",
+          hardwareType: "02",
+          id: "DSVAD010120190623",
+          node_id: "DSVAD010120190623",
+          node_ip: "192.168.20.10:30190",
+          node_name: "寮�鍙戞祴璇�20.10-1",
+          role:'master'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2g",
+          hardwareType: "03",
+          id: "DSVAD010120190624",
+          node_id: "DSVAD010120190624",
+          node_ip: "192.168.20.10:30190",
+          node_name: "娴嬭瘯20.10-1",
+          role:'pc'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2h",
+          hardwareType: "03",
+          id: "DSVAD010120190625",
+          node_id: "DSVAD010120190625",
+          node_ip: "192.168.20.10:30190",
+          node_name: "娴嬭瘯20.101-1",
+          role:'server'
+        },
+      ]
+      //this.members.forEach(item=>{
+        
+      mockMembers.forEach(item=>{
+        if(item.hardwareType=='03'){
+          arr.push({
+            id:item.id,
+            cluster_id:item.cluster_id,
+            name:item.nodeName,
+            svgSym: RoleIcon[item.role],
+            x: -10,
+            y: -10,
+            _color:
+              this.agent === item.nodeName
+                ? "red"
+                : item.role === "master"
+                  ? "orange"
+                  : ""
+          });
+        }else{
+          arr.push({
+            id:item.id,
+            cluster_id:item.cluster_id,
+            name:item.nodeName,
+            svgSym: RoleIcon[item.role],
+            _color:
+              this.agent === item.nodeName
+                ? "red"
+                : item.role === "master"
+                  ? "orange"
+                  : ""
+          });
+        }    
+               
+      });
+      console.log('serf-mem',arr)
+      return arr;
+    },
+    //1.浜戝唴鑺傜偣(瀵瑰簲X86)
+    innerNodes(){
+      // return this.members.map(item=>{
+      //   if(item.hardwareType == '01'||item.hardwareType == '02'){
+      //     return {
+      //       id:item.id,
+      //       name:item.nodeName,
+      //       svgSym: RoleIcon[item.role],
+      //       _color:
+      //         this.agent === v.nodeName
+      //           ? "red"
+      //           : v.role === "master"
+      //             ? "orange"
+      //             : ""
+      //     }
+      //   }
+      // })
+      let arr = [];
+      this.members.forEach(item=>{
+        if(item.hardwareType == '01'||item.hardwareType == '02'){
+          arr.push({
+            id:item.id,
+            cluster_id:item.cluster_id,
+            name:item.nodeName,
+            svgSym: RoleIcon[item.role],
+            _color:
+              this.agent === item.nodeName
+                ? "red"
+                : item.role === "master"
+                  ? "orange"
+                  : ""
+          });
+        }
+      });
+      console.log(this.members);
+      console.log(arr)
+      return arr;
+    },
+    //2.杈硅妭鐐�(鐜板搴攂it)
+    outerNodes(){
+      let arr = [];
+      this.members.forEach(item=>{
+        debugger
+        if(item.hardwareType == '03'){
+          arr.push({
+            id:item.id,
+            cluster_id:item.cluster_id,
+            name:item.nodeName,
+            svgSym: RoleIcon[item.role],
+            _color:
+              this.agent === item.nodeName
+                ? "red"
+                : item.role === "master"
+                  ? "orange"
+                  : ""
+          });
+        }
+      });
+      console.log(this.members);
+      console.log(arr)
+      return arr;
+    },
+    nodes() {
+      let n = new Array();
+      this.searchNodes.forEach((v, i) => {
+        n.push({
+          id: v.id,
+          cluster_id: v.cluster_id,
+          name: v.nodeName,
+          svgSym: RoleIcon[v.role],
+          _color:
+            this.agent === v.nodeName
+              ? "red"
+              : v.role === "master"
+                ? "orange"
+                : ""
+        });
+      });
+      console.log(n)
+      return n;
+    },
+    links() {
+      let arr = new Array();
+      let dup = new Array(); // Deduplicate to ensure that two nodes have only one line
+      const count = this.members.length;
+
+      switch (count) {
+        case 0:
+        case 1:
+          break;
+        case 2:
+          arr = [{ sid: 0, tid: 1 }];
+          break;
+        case 3:
+          arr = [{ sid: 0, tid: 1 }, { sid: 1, tid: 2 }, { sid: 0, tid: 2 }];
+          break;
+        default:
+          for (let i = 0; i < count; i++) {
+            let loop = Math.round(Math.random() * 5 + 2); // At least 2 times
+            for (let j = 0; j < loop; j++) {
+              let target = Math.round(Math.random() * (count - 1));
+              if (target === i) {
+                // is me? skip
+                continue;
+              }
+
+              if (!dup["d" + target + i]) {
+                arr.push({ sid: i, tid: target });
+                dup["d" + i + target] = 1;
+              }
+            }
+          }
+      }
+
+      return arr;
+    },
+    
+    options() {
+      return {
+        force: 3000,
+        nodeSize: this.nodeSize,
+        fontSize: this.fontSize,
+        nodeLabels: true,
+        canvas: this.canvas,
+        linkWidth: 0,
+        size: {
+          w: 745,
+          h: 426
+        }
+      };
+    }
+  },
+  watch:{
+    searchNodes(n,o){
+      console.log(n,o)
+    }
+  },
+  created() {
+    
+    this.reset();
+  },
+  mounted(){
+    console.log('searchNodes',this.searchNodes)
+    console.log(this.members)
+    console.log('innerNodes',this.innerNodes);
+    console.log('outerNodes',this.outerNodes)
+  },
+  methods: {
+    nodeHover(event, node) {
+      console.log(node);
+      node._opacity = 1;
+      node._size = 28;
+      let width = document.body.clientWidth;
+      this.toolTipStyle.display = "block";
+      this.toolTipStyle.top = node.y - 10 + "px";
+      this.toolTipStyle.left = node.x + width / 2 - 30 + "px";
+
+      //this.toolTipNode = this.members[node.id].nodeName;
+      //this.toolTipAddr = this.members[node.id].Address;
+    },
+    nodeOut(event, node) {
+      node._opacity = node.opacity;
+      node._size = node.size;
+      this.toolTipStyle.display = "none";
+    },
+    dragStart(event) {
+      if (event) {
+        this.movement = event.timeStamp;
+      }
+    },
+    nodeClick(event, node) {
+      // if (this.nodeSelected[node.id]) {
+      //   this.unSelectNode(node.id)
+      //   // is not nodeSelected
+      // } else {
+      //   this.selectNode(node)
+
+      // }
+      // this.selectNodesLinks()
+      // this.$set(this.nodes, node.index, node)
+      console.log(event,node)
+      console.log(this.members)
+      console.log(this.members[node.id])
+      if (event.timeStamp - this.movement < 200) {
+        //this.$emit("selected-node", event, this.members[node.id]);
+        debugger
+        let someNode = this.members.find(one=>one.id == node.id)
+        this.$emit("selected-node", event, someNode);
+      }
+    },
+    reset() {
+      this.nodeSelected = {};
+      this.linksSelected = {};
+      (this.toolTipNode = ""), (this.toolTipAddr = ""), (this.movement = 0);
+    },
+    unSelectNode(nodeId) {
+      if (this.nodeSelected[nodeId]) {
+        delete this.nodeSelected[nodeId];
+      }
+      this.selectNodesLinks();
+    },
+    unSelectLink(linkId) {
+      if (this.linksSelected[linkId]) {
+        delete this.linksSelected[linkId];
+      }
+    },
+    selectNode(node) {
+      this.nodeSelected[node.id] = node;
+    },
+    selectLink(link) {
+      this.$set(this.linksSelected, link.id, link);
+    },
+    selectNodesLinks() {
+      for (let link of this.links) {
+        // node is nodeSelected
+        if (this.nodeSelected[link.sid] || this.nodeSelected[link.tid]) {
+          this.selectLink(link);
+        } else {
+          this.unSelectLink(link.id);
+        }
+      }
+    }
+  }
+};
+</script>
+
+<style>
+.net {
+  height: 100%;
+  margin: 0;
+}
+
+.node {
+  /* stroke: rgba(18, 120, 98, 0.7); */
+  stroke: rgba(76, 78, 78, 0.7);
+  stroke-width: 3px;
+  -webkit-transition: fill 0.5s ease;
+  transition: fill 0.5s ease;
+  /* fill: #dcfaf3; */
+  fill: #e3e4e4;
+}
+
+.node.selected {
+  stroke: #caa455;
+}
+
+.node.pinned {
+  stroke: rgba(190, 56, 93, 0.6);
+}
+
+.link {
+  stroke: rgba(18, 120, 98, 0.3);
+}
+
+.link,
+.node {
+  stroke-linecap: round;
+}
+
+.link:hover,
+.node:hover {
+  stroke: #df8108;
+  stroke-width: 1px;
+  cursor: pointer;
+}
+
+.link.selected {
+  stroke: rgba(202, 164, 85, 0.6);
+}
+
+.curve {
+  fill: none;
+}
+
+.link-label,
+.node-label {
+  /* fill: #127862; */
+  fill: rgba(76, 78, 78, 0.7);
+}
+
+.link-label {
+  -webkit-transform: translateY(-0.5em);
+  transform: translateY(-0.5em);
+  text-anchor: middle;
+}
+
+.arrow_box {
+  position: absolute;
+  background: #fff;
+  /* border: 1px solid #127862; */
+  border: 1px solid rgba(76, 78, 78, 0.7);
+  font-size: 11px;
+  padding-left: 5px;
+}
+
+.arrow_box p {
+  height: 30px;
+  line-height: 30px;
+  width: 100px;
+  overflow: hidden;
+}
+.arrow_box:after,
+.arrow_box:before {
+  right: 100%;
+  top: 50%;
+  border: solid transparent;
+  content: " ";
+  height: 0;
+  width: 0;
+  position: absolute;
+  pointer-events: none;
+}
+
+.arrow_box:after {
+  border-color: rgba(136, 183, 213, 0);
+  border-right-color: #fff;
+  border-width: 5px;
+  margin-top: -5px;
+}
+.arrow_box:before {
+  border-color: rgba(194, 225, 245, 0);
+  border-right-color: #323333;
+  border-width: 6px;
+  margin-top: -6px;
+}
+.clouds{
+  height: 100%;
+  margin:0;
+  background:rgba(149, 221, 255, 0.322);
+}
+.inner{
+  /* height:300px;
+  margin: 50px auto; */
+  background:rgba(152, 183, 251, 0.39);
+}
+</style>
diff --git a/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue b/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
index 943753b..43cfaec 100644
--- a/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
+++ b/src/components/serfDiagram/vue-d3-network/components/svgRenderer.vue
@@ -206,8 +206,7 @@
 };
 </script>
 <style>
-  /* .net-svg{
-    background-color: aquamarine;
-    border-radius: 50%;
-  } */
+  .net-svg{
+    background-color: rgba(127, 255, 212, 0.198);
+  }
 </style>
diff --git a/src/pages/ai/index/App.vue b/src/pages/ai/index/App.vue
index 7e79300..c6cc3ad 100644
--- a/src/pages/ai/index/App.vue
+++ b/src/pages/ai/index/App.vue
@@ -97,7 +97,7 @@
                           <div class="svg-wrap">
                             <img
                               class="baseImg"
-                              :src="`data:image/png;base64,${item.iconBlob}`"
+                              :src="item.iconBlob.indexOf(',')>0? item.iconBlob:`data:image/png;base64,${item.iconBlob}`"
                               alt
                             />
                           </div>
@@ -269,10 +269,10 @@
                           </div>
                           <div class="alg-name">
                             <div style="padding:0px 10px 0px 10px;">
-                              <span v-if="!item.isEdit">{{ item.sdk_name }}</span>
+                              <span v-if="!item.isEdit">{{ item.name }}</span>
                               <el-input
                                 size="small"
-                                v-model="item.sdk_name"
+                                v-model="item.name"
                                 v-if="item.isEdit"
                                 v-focus
                                 :maxlength="15"
diff --git a/src/pages/settings/components/CloudNode.vue b/src/pages/settings/components/CloudNode.vue
new file mode 100644
index 0000000..74a8f55
--- /dev/null
+++ b/src/pages/settings/components/CloudNode.vue
@@ -0,0 +1,115 @@
+<template>
+  <div class="cloud">
+    <div class="inner">
+      <div class="rect">
+        <div class="node" v-for="(item,index) in insideNodes" :key="item.id" :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-name">{{item.nodeName}}</span>
+        </div>
+      </div>
+    </div>
+    <div class="outer">
+      <div class="node" v-for="(item,index) in insideNodes" :key="item.id" :style="{top:36*(index+1)+'px',left:80*(index+1)+'px'}">
+        <span class="node-icon">
+          <!-- <img :src="nodeIcons[item.workType]" alt=""> -->
+        </span>
+        <span class="node-name">{{item.nodeName}}</span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  name:'cloudNode',
+  props:{
+    nodes: Array
+  },
+  data(){
+    return {
+      nodeIcons:[],
+      mockData:[
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2f46",
+          hardwareType: "01",
+          id: "DSVAD010120190622",
+          node_id: "DSVAD010120190622",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "寮�鍙�20.10-1",
+          role: 'pc'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2f",
+          hardwareType: "02",
+          id: "DSVAD010120190623",
+          node_id: "DSVAD010120190623",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "寮�鍙戞祴璇�20.10-1",
+          role:'master'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2g",
+          hardwareType: "03",
+          id: "DSVAD010120190624",
+          node_id: "DSVAD010120190624",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "娴嬭瘯20.10-1",
+          role:'pc'
+        },
+        {
+          cluster_id: "b6132bfe-d3af-4710-ba89-436f614c2h",
+          hardwareType: "03",
+          id: "DSVAD010120190625",
+          node_id: "DSVAD010120190625",
+          node_ip: "192.168.20.10:30190",
+          nodeName: "娴嬭瘯20.101-1",
+          role:'server'
+        },
+      ]
+    }
+  },
+  computed:{
+    
+    insideNodes(){
+      //return this.nodes.filter(item=>item.hardwareType=='01'||item.hardwareType=='02');
+      return this.mockData.filter(item=>item.hardwareType=='01'||item.hardwareType=='02');
+    },
+    outsideNodes(){
+      //return this.nodes.filter(item=>item.hardwareType=='03');
+      return this.mockData.filter(item=>item.hardwareType=='03');
+    }
+  }
+}
+</script>
+<style lang="scss">
+  .cloud{
+    width: 100%;
+    height: 500px;
+    display: flex;
+    .inner{
+      width: 50%;
+      background: url('/images/settings/cloud.png') no-repeat;
+      background-size: 100%;
+      .rect{
+        background:cornflowerblue;
+        position: relative;
+        .node{
+          position: absolute;
+          .node-icon{
+            width:40px;
+            height:40px;
+          }
+          .node-name{
+            font-size:14px;
+            color: #333;
+          }
+        }
+      }
+    }
+    .outer{
+      width:50%;
+      position: relative;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/pages/settings/components/ClusterManagement.vue b/src/pages/settings/components/ClusterManagement.vue
index 8ab8f83..8bc48eb 100644
--- a/src/pages/settings/components/ClusterManagement.vue
+++ b/src/pages/settings/components/ClusterManagement.vue
@@ -100,16 +100,19 @@
           </el-form>
         </div>
       </el-col>
-      <el-col :span="12" style="height: 100%;" v-if="members.length !== 0">
+      <el-col :span="12" style="height: 100%;" v-if="members.length !== 0 && isSearch" class="node-container">
         <serfDiagram
           ref="diagram"
           :members="members"
-          :searchNodes="nodes"
           :agent="agentName"
           v-loading="loading"
           @selected-node="joinNode"
           class="nodes-svg"
         ></serfDiagram>
+      </el-col>
+      <el-col :span="12" style="height: 100%;" v-if="innerNodes.length !== 0 && !isSearch" class="node-container">
+        <cloud-node :nodes="innerNodes">
+        </cloud-node>
       </el-col>
     </el-row>
 
@@ -189,14 +192,15 @@
 import {
   getDevInfo
 } from "@/api/system";
-
+import cloudNode from "./CloudNode";
 import serfDiagram from "@/components/serfDiagram";
 import ipInput from "@/components/subComponents/IPInput";
 import {isIPv4} from "@/scripts/validate";
 export default {
   components: {
     serfDiagram,
-    ipInput
+    ipInput,
+    cloudNode
   },
   data() {
     const checkPwd = (rule, value, callback) => {
@@ -268,13 +272,14 @@
       esNodes: [],
       scheduleId: "",
       isHasColony: false,
+      isSearch: false,
       currentCluster: {},
       searchNum: "",
       loading: false,
       searchDis: false,
       agentName: "",
       members: [],
-      nodes: [],
+      innerNodes: [],
     };
   },
   mounted() {
@@ -372,6 +377,7 @@
       }
     },
     async searchColony() {
+      this.isSearch = true;
       this.$refs["joinForm"].validate(valid => {
         if (valid) {
           this.members = [];
@@ -389,10 +395,12 @@
             .catch(() => {
               this.searchDis = false;
               this.loading = false;
+              this.isSearch = false;
             });
         } else {
           this.searchDis = false;
           this.loading = false;
+          this.isSearch = false;
           return false;
         }
       });
@@ -429,8 +437,7 @@
             return element.node_id === i.node_id;
           });
           if (found === undefined) {
-            //this.members.push(i);
-            this.nodes.push(i);
+            this.members.push(i);
           }
         });
       }
@@ -475,8 +482,9 @@
           this.ruleForm.clustername = res.data.clusterName;
           this.ruleForm.clusterpwd = res.data.clusterpwd
           this.ruleForm.virtualIp = res.data.virtualIp
-          let list = res.data.nodes.map(i => {
-            debugger
+          //let list = res.data.nodes.map(i => {
+          this.isSearch = false;
+          this.innerNodes = res.data.nodes.map(i => {
             let obj = {};
             obj.device_type = i.device_type;
             obj.workType = i.device_type.substr(2,2);
@@ -492,7 +500,8 @@
             obj.role = i.role ? i.role : "pc";
             return obj;
           });
-          this.members = this.members.concat(list);
+           
+          //this.members = this.members.concat(list);
           console.log(this.members)
         } else {
           this.isHasColony = false;
@@ -550,6 +559,7 @@
           this.isHasColony = false;
           this.activeName = "1";
           this.members = [];
+          this.innerNodes = [];
         }
       }).catch(() => { });
 
@@ -778,6 +788,6 @@
   line-height: 30px;
 }
 .nodes-svg{
-  background-color: rgba(127, 255, 212, 0.459);
+  background-color: rgba(127, 172, 255, 0.459);
 }
 </style>

--
Gitblit v1.8.0