yangdr преди 6 месеца
родител
ревизия
3a61134537

+ 93 - 13
src/css/home.less

@@ -56,7 +56,7 @@
         .collapse-sign {
           position: absolute;
           right: 0;
-          bottom: 315px;
+          bottom: 30%;
           color: white;
           z-index: 1;
         }
@@ -463,8 +463,8 @@
 
       .tools-2 {
         font-size: 18px;
-        padding-left: 24px;
-        padding-right: 24px;
+        // padding-left: 24px;
+        // padding-right: 24px;
 
         .blue {
           color: #0793FF;
@@ -477,8 +477,53 @@
           justify-content: space-between;
 
           .left {
-            .el-input__inner {
-              height: 28px;
+
+            // .el-input__inner {
+            //   height: 28px;
+            //   width: 100px;
+            // }
+            display: flex;
+            flex-wrap: nowrap;
+
+            &>.el-autocomplete {
+              .el-input {
+                .el-input__inner {
+                  padding-bottom: 0px;
+                  padding-top: 0px;
+                  height: 30px;
+                  width: 150px;
+                  // margin-left: 36px;
+                }
+              }
+            }
+
+            .el-select {
+              width: 133px;
+              height: 30px;
+
+              .el-input__inner {
+                height: 30px;
+              }
+
+              .el-input__prefix,
+              .el-input__suffix {
+                height: 30px;
+              }
+
+              /* 下面设置右侧按钮居中 */
+              .el-input__suffix {
+                top: 0px;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                flex-wrap: nowrap;
+                flex-direction: row;
+                align-content: flex-start;
+              }
+
+              .el-input__icon {
+                line-height: 32px;
+              }
             }
           }
 
@@ -557,17 +602,52 @@
           display: flex;
           flex-wrap: nowrap;
           align-items: center;
+          margin-bottom: 19px;
+
+          &>.el-autocomplete {
+            .el-input {
+              .el-input__inner {
+                padding-bottom: 0px;
+                padding-top: 0px;
+                height: 30px;
+                width: 180px;
+                // margin-left: 36px;
+              }
+            }
+          }
 
-          .el-input__inner {
-            // padding-bottom: 0px;/
-            padding-top: 0px;
+          .el-select {
+            width: 133px;
             height: 30px;
-            width: 168px;
+
+            .el-input__inner {
+              height: 30px;
+            }
+
+            .el-input__prefix,
+            .el-input__suffix {
+              height: 30px;
+            }
+
+            /* 下面设置右侧按钮居中 */
+            .el-input__suffix {
+              top: 0px;
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              flex-wrap: nowrap;
+              flex-direction: row;
+              align-content: flex-start;
+            }
+
+            .el-input__icon {
+              line-height: 32px;
+            }
           }
         }
 
         .down {
-          margin-top: 19px;
+
           white-space: nowrap;
           display: flex;
           flex-wrap: nowrap;
@@ -578,7 +658,7 @@
               padding-bottom: 0px;
               padding-top: 0px;
               height: 30px;
-              width: 133px;
+              width: 180px;
               margin-left: 36px;
             }
           }
@@ -670,14 +750,14 @@
 
 .icon-close-blue {
   .icon();
-  background-image: url("./img/图层13@2x-1.png");
+  background-image: url("./img/layer13@2x-1.png");
 }
 
 .icon-close-gray {
   .icon();
   // width: 18px;
   // height: 12px;
-  background-image: url("./img/图层13@2x-2.png");
+  background-image: url("./img/layer13@2x-2.png");
   // background-size: 18px 12px;
 }
 

src/css/img/图层50@2x.png → src/css/img/bg50@2x.png


src/css/img/缩4@2x-1.png → src/css/img/direct4@2x-1.png


src/css/img/缩4@2x-2.png → src/css/img/direct4@2x-2.png


src/css/img/组105@2x.png → src/css/img/group105@2x.png


src/css/img/图层13@2x-1.png → src/css/img/layer13@2x-1.png


src/css/img/图层13@2x-2.png → src/css/img/layer13@2x-2.png


src/css/img/密码@2x.png → src/css/img/password@2x.png


src/css/img/矩形46@2x.png → src/css/img/rect46@2x.png


src/css/img/账号2x.png → src/css/img/username2x.png


BIN
src/css/img/图层50.png


BIN
src/css/img/密码.png


BIN
src/css/img/账号.png


+ 48 - 12
src/css/knowledgeMap.less

@@ -40,6 +40,35 @@
          height: 40px;
          line-height: 40px;
      }*/
+    .contextmenu {
+        position: fixed;
+        display: none;
+        width: auto;
+        padding: 20px 21px;
+        border: 1px solid #E7E7E7;
+        z-index: 10;
+        background-color: white;
+        border-radius: 10px;
+        font-size: 20px;
+        font-weight: Regular;
+        box-sizing: border-box;
+
+        ul {
+            .contextmenu-item {
+                margin-bottom: 10px;
+                color: #6D6D6D;
+
+                &:last-child {
+                    margin-bottom: 0px;
+                }
+
+                &:hover {
+                    color: #0793FF;
+                }
+            }
+        }
+    }
+
     .content {
         position: relative;
         width: 100%;
@@ -69,6 +98,10 @@
             cursor: pointer;
             background-color: #FFFFFF;
             overflow: hidden;
+            -webkit-font-smoothing: antialiased;
+            /* 开启字体平滑 */
+            -moz-osx-font-smoothing: grayscale;
+            /* 为 Firefox 设置字体平滑 */
         }
 
     }
@@ -350,8 +383,9 @@
                 color: #A7CFFC;
                 line-height: 44px;
                 // right: 20px;
-                top: 0px;
-                right: 10px;
+                // top: 0px;
+                bottom: -2px;
+                right: 39px;
                 cursor: pointer;
                 // padding: 0 10px 0 0;
                 // width: 100px;
@@ -425,8 +459,8 @@
         display: none;
         width: 34px;
         height: 24px;
-        bottom: 50px;
-        right: 34px;
+        bottom: 0px;
+        right: 20px;
         // border-top: 1px dotted black;
         /*background:linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);*/
     }
@@ -442,22 +476,22 @@
     }
 
     .legendIconImg {
-        background: url('./img/4@2x-2.png') no-repeat;
+        background: url('./img/direct4@2x-2.png') no-repeat;
         background-size: 34px 24px;
     }
 
     .legendIconImg:hover {
-        background: url('./img/4@2x-2.png') no-repeat;
+        background: url('./img/direct4@2x-2.png') no-repeat;
         background-size: 34px 24px;
     }
 
     .legendSlideUp {
-        background: url('./img/4@2x-1.png') no-repeat;
+        background: url('./img/direct4@2x-1.png') no-repeat;
         background-size: 34px 24px;
     }
 
     .legendSlideUp:hover {
-        background: url('./img/4@2x-1.png') no-repeat;
+        background: url('./img/direct4@2x-1.png') no-repeat;
         background-size: 34px 24px;
     }
 
@@ -469,10 +503,12 @@
         color: #A7CFFC;
     }
 
-    .ztree {
+    .ztree,
+    #tree {
         overflow: auto;
         height: calc(100% - 60px) !important;
-        padding: 0 10px 0 30px;
+        // height: 100% !important;
+        padding: 0 10px 20px 30px;
         position: relative;
         font-size: 16px !important;
     }
@@ -480,7 +516,7 @@
     .right-aside-collapse {
         position: absolute;
         display: inline-block;
-        bottom: 315px;
+        bottom: calc((100% + 72px)*0.3);
         width: 24px;
         height: 34px;
         // background: #2D97B2;
@@ -495,7 +531,7 @@
     .right-aside-collapsed {
         position: absolute;
         display: inline-block;
-        bottom: 315px;
+        bottom: calc((100% + 72px)*0.3);
         width: 24px;
         height: 34px;
         background-image: url("./img/toleft2.png");

+ 19 - 9
src/css/knowledgeUpdate.less

@@ -212,6 +212,10 @@
       cursor: pointer;
       background-color: #FFFFFF;
       position: relative;
+      -webkit-font-smoothing: antialiased;
+      /* 开启字体平滑 */
+      -moz-osx-font-smoothing: grayscale;
+      /* 为 Firefox 设置字体平滑 */
     }
 
     .legendIcon {
@@ -219,7 +223,7 @@
       display: none;
       width: 34px;
       height: 24px;
-      bottom: 50px;
+      bottom: 0px;
       right: 379px;
       // border-top: 1px dotted black;
       /*background:linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);*/
@@ -236,22 +240,22 @@
     }
 
     .legendIconImg {
-      background: url('./img/4@2x-2.png') no-repeat;
+      background: url('./img/direct4@2x-2.png') no-repeat;
       background-size: 34px 24px;
     }
 
     .legendIconImg:hover {
-      background: url('./img/4@2x-2.png') no-repeat;
+      background: url('./img/direct4@2x-2.png') no-repeat;
       background-size: 34px 24px;
     }
 
     .legendSlideUp {
-      background: url('./img/4@2x-1.png') no-repeat;
+      background: url('./img/direct4@2x-1.png') no-repeat;
       background-size: 34px 24px;
     }
 
     .legendSlideUp:hover {
-      background: url('./img/4@2x-1.png') no-repeat;
+      background: url('./img/direct4@2x-1.png') no-repeat;
       background-size: 34px 24px;
     }
 
@@ -267,10 +271,15 @@
     right: 0px;
     border-left: 1px dotted #000;
     box-sizing: border-box;
-    overflow-y: auto;
+    overflow: auto;
     padding-top: 19px;
+    box-sizing: border-box;
 
     .content-right-box {
+      max-height: 33%;
+      display: flex;
+      flex-direction: column;
+
       .box-title {
         background-color: rgb(213, 233, 254);
         width: 370.8px;
@@ -289,6 +298,7 @@
         min-height: 100px;
         max-height: 300px;
         overflow: auto;
+        box-sizing: border-box;
 
         .text {
           padding-bottom: 11px;
@@ -436,7 +446,7 @@
 
 .icon-triangle-down {
   .icon();
-  background-image: url("./img/矩形46@2x.png");
+  background-image: url("./img/rect46@2x.png");
   width: 18px;
   height: 12px;
 }
@@ -461,7 +471,7 @@
   vertical-align: middle;
   background-repeat: no-repeat;
   cursor: pointer;
-  background-image: url("./img/105@2x.png");
+  background-image: url("./img/group105@2x.png");
   // border: 1px solid #5BBBFF;
   // box-sizing: content-box;
-}
+}

+ 3 - 3
src/css/login.less

@@ -1,5 +1,5 @@
 #app {
-  background-image: url("./img/图层50@2x.png");
+  background-image: url("./img/bg50@2x.png");
   width: 100vw;
   height: 100vh;
   background-repeat: no-repeat;
@@ -123,13 +123,13 @@
 
 .icon-username {
   .icon();
-  background-image: url("./img/账号2x.png");
+  background-image: url("./img/username2x.png");
 
 }
 
 .icon-password {
   .icon();
-  background-image: url("./img/密码@2x.png");
+  background-image: url("./img/password@2x.png");
 
 }
 

+ 70 - 28
src/html/home.html

@@ -4,7 +4,7 @@
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>主页</title>
+  <title>知识图谱系统</title>
   <script src="./js/vue.js"></script>
   <link rel="stylesheet" href="./elementUI/theme-chalk/index.css">
   <script src="./elementUI/index.js"></script>
@@ -32,11 +32,11 @@
   <div id="app" v-cloak>
     <el-container>
       <el-header>
-        <div class="logo">知识图谱系统logo</div>
+        <div class="logo">知识图谱系统</div>
         <div class="time">{{nowDate}}</div>
         <div class="user-area">
           <span class="icon-avatar"></span>
-          <span class="user-identity">邵逸夫管理员</span>
+          <span class="user-identity">管理员</span>
           <span class="icon-dropdown-down"></span>
         </div>
       </el-header>
@@ -79,8 +79,8 @@
       </el-container>
     </el-container>
     <!-- 对话框 -->
-    <el-dialog :title="dialogData.title" :visible.sync="dialogVisible" width="686px" height="491px" :center="false"
-      :close-on-click-modal="false">
+    <el-dialog :title="dialogData.title" :visible.sync="dialogVisible"
+      :width="dialogData.width?dialogData.width:'686px'" height="491px" :center="false" :close-on-click-modal="false">
       <template #default>
         <div v-if="dialogData.opType=='addEntity'" class="addEntity">
           <div class="tools">
@@ -181,27 +181,39 @@
             <span @click="addRelationshipDropdownAddRow" class="add-row"><span class="icon-add"></span>新增行</span>
           </div>
           <div class="content">
-            <el-table border :data="addRelationshipDropdown" style="width: 100%" height="230">
+            <el-table border :data="addRelationshipDropdown" style="width: 100%" height="250">
               <el-table-column type="index" label="序号" width="70"></el-table-column>
-              <el-table-column prop="startName" label="起始实体名称">
+              <el-table-column label="起始实体类型">
                 <template slot-scope="scope">
-                  <!-- <el-select v-model="scope.row.startLabel" placeholder="请选择">
+                  <el-select v-model="scope.row.startLabel" placeholder="请选择">
                     <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
                     </el-option>
-                  </el-select> -->
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column prop="startName" label="起始实体名称" width="150">
+                <template slot-scope="scope">
                   <el-autocomplete v-model.trim="scope.row.startName"
                     :fetch-suggestions="(queryString,cb)=>{querySearchAsync(queryString,cb,scope.row.startLabel)}"
                     @select="handleSelect($event, scope.row,'start')" placeholder="请选择起始实体"></el-autocomplete>
                 </template>
               </el-table-column>
-              <el-table-column prop="endName" label="目标实体名称">
+              <el-table-column label="目标实体类型">
+                <template slot-scope="scope">
+                  <el-select v-model="scope.row.endLabel" placeholder="请选择">
+                    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column prop="endName" label="目标实体名称" width="150">
                 <template slot-scope="scope">
                   <el-autocomplete v-model.trim="scope.row.endName" placeholder="请选择起目标实体"
                     :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,scope.row.endLabel)})"
                     @select="handleSelect($event, scope.row,'end')"></el-autocomplete>
                 </template>
               </el-table-column>
-              <el-table-column prop="relationshipType" width="175" label="关系名称">
+              <el-table-column prop="relationshipType" width="170" label="关系名称">
                 <template slot-scope="scope">
                   <el-input type="text" v-model="scope.row.relationshipType" placeholder="请输入关系(边)名称">
                 </template>
@@ -246,7 +258,13 @@
         <div v-if="dialogData.opType=='addProperty-dropdown'" class="modifyEntityName-dropdown">
           <div class="tools-2">
             <div class="tools-2-up">
-              <div class="left"> <span>实体名称:</span>
+              <div class="left">
+                <span>实体类型:</span>
+                <el-select v-model="addPropertyDropdown.label" placeholder="请选择">
+                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                  </el-option>
+                </el-select>
+                <span style="margin-left: 10px;">实体名称:</span>
                 <el-autocomplete v-model.trim="addPropertyDropdown.name"
                   :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,addPropertyDropdown.label)})"
                   @select="handleSelect($event,addPropertyDropdown,'addProperty-dropdown')"
@@ -265,6 +283,7 @@
             <el-table border :data="addPropertyDropdown.property" style="width: 100%" height="230">
               <el-table-column type="index" label="序号" width="73"></el-table-column>
               <el-table-column prop="key" label="属性名称">
+
                 <template slot-scope="scope">
                   <el-input type="text" v-model="scope.row.key" placeholder="请输入属性名称">
                 </template>
@@ -368,10 +387,18 @@
         <div v-if="dialogData.opType=='addRelationship'" class="modifyEntityName">
           <div class="content">
             <div class="up">起始实体名称:{{addRelationship.startName}}</div>
-            <div class="center">目标实体名称: <el-autocomplete v-model.trim="addRelationship.endName"
+            <div class="center">
+              目标实体类型:<el-select v-model="addRelationship.endLabel" placeholder="请选择">
+                <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+            <div class="center">
+              目标实体名称: <el-autocomplete v-model.trim="addRelationship.endName"
                 :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,addRelationship.endLabel)})"
                 @select="handleSelect($event, addRelationship,'addRelationship')"
-                placeholder="请输入实体名称"></el-autocomplete></div>
+                placeholder="请输入实体名称"></el-autocomplete>
+            </div>
             <div class="down">关系名称:<el-input v-model.trim="addRelationship.relationshipType"
                 placeholder="请输入关系名称"></el-input>
             </div>
@@ -488,7 +515,7 @@
           "secondName": ""
         },
         dialogVisible: false,
-        dialogData: { title: "提示", opType: "", showFooter: true },
+        dialogData: { title: "提示", opType: "", showFooter: true, width: "" },
         modifyProperty: { //右键修改属性
           "label": "",
           "newPropertyName": "",
@@ -510,7 +537,7 @@
         },
         addRelationship: {//右键新增关系
           "endId": null,
-          "endLabel": "",
+          "endLabel": "疾病",
           "endName": "",
           "property": {},
           "relationshipType": "",
@@ -521,7 +548,7 @@
         modifyEntityName: { // 修改关系实体名称-右键 的值
           "oldName": "",
           "name": "",
-          "nodeId": null,
+          "nodeId": -1,
           "label": "",
         },
         deleteEntity: { name: "", nodeId: "" },//右键删除实体
@@ -545,14 +572,14 @@
         ],
         options: [
           { "label": "疾病", "value": "疾病" },
-          { "label": "药品", "value": "药品通用名" },
+          { "label": "药品", "value": "药品" },
           { "label": "症状", "value": "症状" },
           { "label": "手术和操作", "value": "手术和操作" },
           { "label": "实验室检查", "value": "实验室检查" },
           { "label": "辅助检查", "value": "辅助检查" },
         ],
         addPropertyDropdown: {
-          "label": "",
+          "label": "疾病",
           "nodeId": 0,
           "name": "",
           "property": [{ key: "", value: "" }]
@@ -599,7 +626,7 @@
             id: "1",
             url: "",
             title: "知识图谱查询",
-            label: "/images/图层8@2x.png",
+            label: "/images/layer8@2x.png",
             children: [
               {
                 id: "knowledgeGraph",
@@ -613,7 +640,7 @@
             id: "2",
             url: "",
             title: "图谱知识管理",
-            label: "./images/图层9@2x.png",
+            label: "./images/layer9@2x.png",
             children: [
               {
                 id: "knowledgeUpdate",
@@ -627,7 +654,7 @@
             id: "3",
             url: "",
             title: "系统管理",
-            label: "./images/图层10@2x.png",
+            label: "./images/layer10@2x.png",
             children: [
               {
                 id: "userManage",
@@ -647,7 +674,7 @@
             id: "4",
             url: "",
             title: "统计分析",
-            label: "./images/图层11@2x.png",
+            label: "./images/layer11@2x.png",
             children: [
               {
                 id: "graphDataStatistics",
@@ -722,7 +749,15 @@
       },
       sendChildWindowMessage: function (operation, data) {
         const iframe = this.$refs.iframe
-        iframe.contentWindow.postMessage({ operation, data }, "*")
+        if (operation == "update-graph") {
+          setTimeout(() => {
+            iframe.contentWindow.postMessage({ operation, data }, "*")
+          }, 1000)
+        } else {
+          iframe.contentWindow.postMessage({ operation, data }, "*")
+        }
+
+
       },
       receiveIframeMsg() {
         const iframe = this.$refs.iframe
@@ -733,6 +768,7 @@
             this.dialogData.title = event.data.title
             this.dialogData.opType = opType
             this.dialogData.showFooter = event.data.showFooter
+            this.dialogData.width = event.data.width
             this.dialogVisible = event.data.dialogVisible
             if (opType == 'modifyEntityName-dropdown') {
               this.selectedName = event.data.data.selectedName
@@ -784,6 +820,10 @@
               this.$nextTick(() => {
                 this.drawGraph()
               })
+            } else if (opType == "addRelationship-dropdown") {
+              this.dialogData.width = '900px'
+            } else if (opType == "addProperty-dropdown") {
+              this.dialogData.width = '800px'
             }
           }
         })
@@ -841,8 +881,9 @@
             axios.post("/api" + api.createEntityProperty, data).then(res => {
               const { msg, code, data } = res.data
               if (res.data.code == '0') {
-                this.addPropertyDropdown.property = []
-                this.dialogVisible = false
+                //this.addPropertyDropdown.property = []
+                //this.dialogVisible = false
+                this.addPropertyDropdown = { ...this.$options.data().addPropertyDropdown }
                 this.sendChildWindowMessage("update-graph", "")
               }
             }).catch(err => {
@@ -986,6 +1027,7 @@
               if (res.data.code == '0') {
                 this.dialogVisible = false
                 this.sendChildWindowMessage("update-graph", "")
+                return
               }
             }).catch(err => {
               console.log("createRelationship接口错误", err)
@@ -993,9 +1035,9 @@
             break
           default:
             this.dialogVisible = false
+            this.sendChildWindowMessage("update-graph", "")
         }
-        const iframe = this.$refs.iframe
-        iframe.contentWindow.postMessage({ operation: "update-graph", data: {} }, "*")
+
       },
       getNode() {
         axios.post("/api" + api.getNode, {

+ 80 - 34
src/html/homeMini.html

@@ -4,7 +4,7 @@
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>主页</title>
+  <title>知识图谱系统</title>
   <script src="./js/vue.js"></script>
   <link rel="stylesheet" href="./elementUI/theme-chalk/index.css">
   <script src="./elementUI/index.js"></script>
@@ -32,15 +32,18 @@
   <div id="app" v-cloak>
     <el-container>
       <el-header v-if="false">
-        <div class="logo">知识图谱系统logo</div>
+        <div class="logo">知识图谱系统</div>
         <div class="time">{{nowDate}}</div>
         <div class="user-area">
-          <span class="user-identity">邵逸夫管理员</span>
+          <span class="icon-avatar"></span>
+          <span class="user-identity">管理员</span>
+          <span class="icon-dropdown-down"></span>
         </div>
       </el-header>
       <el-container>
         <el-aside :width="isCollapse?'69px':'268px'" v-if="false">
-          <div class="collapse-sign collapse-sign-close" @click="isCollapse=!isCollapse"></div>
+          <div :class="isCollapse? 'collapse-sign collapse-sign-open': 'collapse-sign collapse-sign-close'"
+            @click="isCollapse=!isCollapse"></div>
           <el-menu :default-active="currentPage.id" :collapse-transition="false" :collapse="isCollapse"
             background-color="#D5E9FE" text-color="#000000" active-text-color="#FFFFFF">
             <el-submenu v-for="menu in menuData" :key="menu.id" :index="menu.id">
@@ -66,6 +69,7 @@
                 </span>
               </el-tab-pane>
             </el-tabs>
+            <div class="padding"></div>
           </div>
           <div class="content">
             <iframe ref="iframe" v-show="currentPage.url" src="knowledgeUpdate.html" frameborder="0"></iframe>
@@ -75,14 +79,14 @@
       </el-container>
     </el-container>
     <!-- 对话框 -->
-    <el-dialog :title="dialogData.title" :visible.sync="dialogVisible" width="686px" height="491px" :center="false"
-      :close-on-click-modal="false">
+    <el-dialog :title="dialogData.title" :visible.sync="dialogVisible"
+      :width="dialogData.width?dialogData.width:'686px'" height="491px" :center="false" :close-on-click-modal="false">
       <template #default>
         <div v-if="dialogData.opType=='addEntity'" class="addEntity">
           <div class="tools">
             <span>导出模板</span>
             <span>导入</span>
-            <span @click="addEntityAddRow">新增行</span>
+            <span @click="addEntityAddRow" class="add-row add-row"><span class="icon-add"></span>新增行</span>
           </div>
           <div class="content">
             <el-table border :data="tableData" style="width: 100%" height="230">
@@ -174,30 +178,42 @@
           <div class="tools">
             <span>导出模板</span>
             <span>导入</span>
-            <span @click="addRelationshipDropdownAddRow">新增行</span>
+            <span @click="addRelationshipDropdownAddRow" class="add-row"><span class="icon-add"></span>新增行</span>
           </div>
           <div class="content">
-            <el-table border :data="addRelationshipDropdown" style="width: 100%" height="230">
+            <el-table border :data="addRelationshipDropdown" style="width: 100%" height="250">
               <el-table-column type="index" label="序号" width="70"></el-table-column>
-              <el-table-column prop="startName" label="起始实体名称">
+              <el-table-column label="起始实体类型">
                 <template slot-scope="scope">
-                  <!-- <el-select v-model="scope.row.startLabel" placeholder="请选择">
+                  <el-select v-model="scope.row.startLabel" placeholder="请选择">
                     <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
                     </el-option>
-                  </el-select> -->
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column prop="startName" label="起始实体名称" width="150">
+                <template slot-scope="scope">
                   <el-autocomplete v-model.trim="scope.row.startName"
                     :fetch-suggestions="(queryString,cb)=>{querySearchAsync(queryString,cb,scope.row.startLabel)}"
                     @select="handleSelect($event, scope.row,'start')" placeholder="请选择起始实体"></el-autocomplete>
                 </template>
               </el-table-column>
-              <el-table-column prop="endName" label="目标实体名称">
+              <el-table-column label="目标实体类型">
+                <template slot-scope="scope">
+                  <el-select v-model="scope.row.endLabel" placeholder="请选择">
+                    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column prop="endName" label="目标实体名称" width="150">
                 <template slot-scope="scope">
                   <el-autocomplete v-model.trim="scope.row.endName" placeholder="请选择起目标实体"
                     :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,scope.row.endLabel)})"
                     @select="handleSelect($event, scope.row,'end')"></el-autocomplete>
                 </template>
               </el-table-column>
-              <el-table-column prop="relationshipType" width="175" label="关系名称">
+              <el-table-column prop="relationshipType" width="170" label="关系名称">
                 <template slot-scope="scope">
                   <el-input type="text" v-model="scope.row.relationshipType" placeholder="请输入关系(边)名称">
                 </template>
@@ -242,7 +258,13 @@
         <div v-if="dialogData.opType=='addProperty-dropdown'" class="modifyEntityName-dropdown">
           <div class="tools-2">
             <div class="tools-2-up">
-              <div class="left"> <span>实体名称:</span>
+              <div class="left">
+                <span>实体类型:</span>
+                <el-select v-model="addPropertyDropdown.label" placeholder="请选择">
+                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                  </el-option>
+                </el-select>
+                <span style="margin-left: 10px;">实体名称:</span>
                 <el-autocomplete v-model.trim="addPropertyDropdown.name"
                   :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,addPropertyDropdown.label)})"
                   @select="handleSelect($event,addPropertyDropdown,'addProperty-dropdown')"
@@ -251,7 +273,7 @@
               <div class="right">
                 <span class="blue">导出模板</span>
                 <span class="blue">导出</span>
-                <span @click="addPropertyDropdownAddRow()" class="blue">新增行</span>
+                <span @click="addPropertyDropdownAddRow()" class="blue add-row"><span class="icon-add"></span>新增行</span>
               </div>
             </div>
             <div class="tools-2-down"> <span>请添加实体:<span class="blue">{{addPropertyDropdown.name}}</span> 相关的属性值</span>
@@ -261,6 +283,7 @@
             <el-table border :data="addPropertyDropdown.property" style="width: 100%" height="230">
               <el-table-column type="index" label="序号" width="73"></el-table-column>
               <el-table-column prop="key" label="属性名称">
+
                 <template slot-scope="scope">
                   <el-input type="text" v-model="scope.row.key" placeholder="请输入属性名称">
                 </template>
@@ -290,7 +313,7 @@
                 <span>实体名称:{{addProperty.name}}</span>
               </div>
               <div class="right">
-                <span @click="addPropertyAddRow()" class="blue">新增行</span>
+                <span @click="addPropertyAddRow()" class="blue add-row"><span class="icon-add"></span>新增行</span>
               </div>
             </div>
             <div class="tools-2-down"></div>
@@ -364,10 +387,18 @@
         <div v-if="dialogData.opType=='addRelationship'" class="modifyEntityName">
           <div class="content">
             <div class="up">起始实体名称:{{addRelationship.startName}}</div>
-            <div class="center">目标实体名称: <el-autocomplete v-model.trim="addRelationship.endName"
+            <div class="center">
+              目标实体类型:<el-select v-model="addRelationship.endLabel" placeholder="请选择">
+                <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+            <div class="center">
+              目标实体名称: <el-autocomplete v-model.trim="addRelationship.endName"
                 :fetch-suggestions="((queryString,cb)=>{querySearchAsync(queryString,cb,addRelationship.endLabel)})"
                 @select="handleSelect($event, addRelationship,'addRelationship')"
-                placeholder="请输入实体名称"></el-autocomplete></div>
+                placeholder="请输入实体名称"></el-autocomplete>
+            </div>
             <div class="down">关系名称:<el-input v-model.trim="addRelationship.relationshipType"
                 placeholder="请输入关系名称"></el-input>
             </div>
@@ -484,7 +515,7 @@
           "secondName": ""
         },
         dialogVisible: false,
-        dialogData: { title: "提示", opType: "", showFooter: true },
+        dialogData: { title: "提示", opType: "", showFooter: true, width: "" },
         modifyProperty: { //右键修改属性
           "label": "",
           "newPropertyName": "",
@@ -506,7 +537,7 @@
         },
         addRelationship: {//右键新增关系
           "endId": null,
-          "endLabel": "",
+          "endLabel": "疾病",
           "endName": "",
           "property": {},
           "relationshipType": "",
@@ -517,7 +548,7 @@
         modifyEntityName: { // 修改关系实体名称-右键 的值
           "oldName": "",
           "name": "",
-          "nodeId": null,
+          "nodeId": -1,
           "label": "",
         },
         deleteEntity: { name: "", nodeId: "" },//右键删除实体
@@ -541,14 +572,14 @@
         ],
         options: [
           { "label": "疾病", "value": "疾病" },
-          { "label": "药品", "value": "药品通用名" },
+          { "label": "药品", "value": "药品" },
           { "label": "症状", "value": "症状" },
           { "label": "手术和操作", "value": "手术和操作" },
           { "label": "实验室检查", "value": "实验室检查" },
           { "label": "辅助检查", "value": "辅助检查" },
         ],
         addPropertyDropdown: {
-          "label": "",
+          "label": "疾病",
           "nodeId": 0,
           "name": "",
           "property": [{ key: "", value: "" }]
@@ -595,7 +626,7 @@
             id: "1",
             url: "",
             title: "知识图谱查询",
-            label: "/images/图层8@2x.png",
+            label: "/images/layer8@2x.png",
             children: [
               {
                 id: "knowledgeGraph",
@@ -609,7 +640,7 @@
             id: "2",
             url: "",
             title: "图谱知识管理",
-            label: "./images/图层9@2x.png",
+            label: "./images/layer9@2x.png",
             children: [
               {
                 id: "knowledgeUpdate",
@@ -623,7 +654,7 @@
             id: "3",
             url: "",
             title: "系统管理",
-            label: "./images/图层10@2x.png",
+            label: "./images/layer10@2x.png",
             children: [
               {
                 id: "userManage",
@@ -643,7 +674,7 @@
             id: "4",
             url: "",
             title: "统计分析",
-            label: "./images/图层11@2x.png",
+            label: "./images/layer11@2x.png",
             children: [
               {
                 id: "graphDataStatistics",
@@ -718,7 +749,15 @@
       },
       sendChildWindowMessage: function (operation, data) {
         const iframe = this.$refs.iframe
-        iframe.contentWindow.postMessage({ operation, data }, "*")
+        if (operation == "update-graph") {
+          setTimeout(() => {
+            iframe.contentWindow.postMessage({ operation, data }, "*")
+          }, 1000)
+        } else {
+          iframe.contentWindow.postMessage({ operation, data }, "*")
+        }
+
+
       },
       receiveIframeMsg() {
         const iframe = this.$refs.iframe
@@ -729,6 +768,7 @@
             this.dialogData.title = event.data.title
             this.dialogData.opType = opType
             this.dialogData.showFooter = event.data.showFooter
+            this.dialogData.width = event.data.width
             this.dialogVisible = event.data.dialogVisible
             if (opType == 'modifyEntityName-dropdown') {
               this.selectedName = event.data.data.selectedName
@@ -780,6 +820,10 @@
               this.$nextTick(() => {
                 this.drawGraph()
               })
+            } else if (opType == "addRelationship-dropdown") {
+              this.dialogData.width = '900px'
+            } else if (opType == "addProperty-dropdown") {
+              this.dialogData.width = '800px'
             }
           }
         })
@@ -837,8 +881,9 @@
             axios.post("/api" + api.createEntityProperty, data).then(res => {
               const { msg, code, data } = res.data
               if (res.data.code == '0') {
-                this.addPropertyDropdown.property = []
-                this.dialogVisible = false
+                //this.addPropertyDropdown.property = []
+                //this.dialogVisible = false
+                this.addPropertyDropdown = { ...this.$options.data().addPropertyDropdown }
                 this.sendChildWindowMessage("update-graph", "")
               }
             }).catch(err => {
@@ -982,6 +1027,7 @@
               if (res.data.code == '0') {
                 this.dialogVisible = false
                 this.sendChildWindowMessage("update-graph", "")
+                return
               }
             }).catch(err => {
               console.log("createRelationship接口错误", err)
@@ -989,9 +1035,9 @@
             break
           default:
             this.dialogVisible = false
+            this.sendChildWindowMessage("update-graph", "")
         }
-        const iframe = this.$refs.iframe
-        iframe.contentWindow.postMessage({ operation: "update-graph", data: {} }, "*")
+
       },
       getNode() {
         axios.post("/api" + api.getNode, {
@@ -1412,7 +1458,7 @@
         handler(newVal, oldVal) {
           setTimeout(() => {
             this.sendChildWindowMessage("left-collapse", this.isCollapse)
-          }, 500)
+          }, 200)
         }
       },
       "searchInp": {

+ 10 - 2
src/html/knowledgeGraph.html

@@ -11,13 +11,21 @@
 	<link href="../resources/favicon.ico" rel="shortcut icon">
 	<style>
 		.node_name {
-			color: #000;
+			color: #333333;
+			font-size: 16px !important;
+			font-weight: Regular;
 		}
 	</style>
 </head>
 
 <body>
 	<div class="knowledgeMapWrapper wrappper">
+		<div class="contextmenu">
+			<ul>
+				<li class="contextmenu-item" title="全部展开" data-id="expandAll">全部展开</li>
+				<li class="contextmenu-item" title="全部关闭" data-id="closeAll">全部关闭</li>
+			</ul>
+		</div>
 		<div class="title" style="display: none;">
 			<div class="titleTxt">
 				<!--<img class="titleLogo ltLogo" src="./images/logo.png" alt="logo">
@@ -44,7 +52,7 @@
 
 						<ul class="selectList">
 							<li class="selectItem" title="疾病" data-id="疾病">疾病</li>
-							<li class="selectItem" title="药品" data-id="药品通用名">药品</li>
+							<li class="selectItem" title="药品" data-id="药品">药品</li>
 							<li class="selectItem" title="症状" data-id="症状">症状</li>
 							<li class="selectItem" title="手术和操作" data-id="手术和操作">手术和操作</li>
 							<li class="selectItem" title="实验室检查" data-id="实验室检查">实验室检查</li>

+ 1 - 2
src/html/knowledgeUpdate.html

@@ -79,7 +79,7 @@
             <span class="selectedName selectedData">疾病</span><span class="icon-triangle-down"></span>
             <ul class="selectList">
               <li class="selectItem" title="疾病" data-id="疾病">疾病</li>
-              <li class="selectItem" title="药品" data-id="药品通用名">药品</li>
+              <li class="selectItem" title="药品" data-id="药品">药品</li>
               <li class="selectItem" title="症状" data-id="症状">症状</li>
               <li class="selectItem" title="手术和操作" data-id="手术和操作">手术和操作</li>
               <li class="selectItem" title="实验室检查" data-id="实验室检查">实验室检查</li>
@@ -152,7 +152,6 @@
           </div>
         </div>
       </div>
-
     </div>
 
   </div>

+ 1 - 1
src/html/login.html

@@ -61,7 +61,7 @@
     name: "login",
     data: function () {
       return {
-        captchaUrl: "./images/组11拷贝2x.png",
+        captchaUrl: "./images/CAPTCHA2x.png",
         rules: {
           username: [{ required: true, message: "账号是必填", trigger: 'blur' }],
           password: [{ required: true, message: "密码是必填", trigger: 'blur' }]

+ 353 - 59
src/js/graphMap.js

@@ -18,10 +18,6 @@ function getGraph(val, type) {
         if (res.data.code == 0) {
             // select_type = select_type_noSearch
             $('#searchInp').val(val)
-            // 销毁之前关系图
-            if (window.graphMap) {
-                window.graphMap.dispose();
-            }
             drawGraph(res.data.data, null)
             window.graphTxt = val
             window.refreshTree = true
@@ -55,26 +51,47 @@ function reDrawGraph(name, label) {
     }).then(res => {
         if (res.data.code == 0) {
             Object.assign(window.graphMapUpdatedData, res.data.data)
-            rightMsgRender(window.graphMapUpdatedData.node[0])
+            let expandPropertyNode
+            for (let i = 0; i < window.graphMapUpdatedData.node.legend; i++) {
+                const node = window.graphMapUpdatedData.node[i]
+                if (node.nodeId === window.knowledgeMapSetting.currentNodeId) {
+                    rightMsgRender(node)
+                    break
+                }
+            }
             window.graphMap.setOption({
                 series: [{
+                    categories: window.graphMapUpdatedData.categories,
                     type: 'graph',
                     data: window.graphMapUpdatedData.node,  // 更新节点数据
                     links: window.graphMapUpdatedData.links,  // 更新边数据
                 }]
             }, false);  // 仅更新指定的部分,不重绘图表
+
+            // expandProperty({},false) //展开原来已经展开的属性
         }
     })
 
 }
 
 function drawGraph(data, resultShowId) {
+    // 销毁之前关系图,并恢复基础配置
+    if (window.graphMap) {
+        window.graphMap.dispose();
+        window.graphMap = null
+        window.knowledgeMapSetting.expandRelationshipsId = []
+        window.knowledgeMapSetting.expandPropertyId = []
+        window.knowledgeMapSetting.currentNodeId = -1
+    }
     // var colors = [
     //     '#FB95AF','#788083','#B2CCCF','#68BDF6','#FFD86E','#6DCE9F','#9BB2F0','#DBB7AC'
     // ]
-    // var myChart = echarts.init(document.getElementById('main'));
+
     var chartDom = document.getElementById('main');
-    var myChart = echarts.init(chartDom);
+    var myChart = echarts.init(chartDom, null, {
+        // devicePixelRatio: 2.5,  // 设置设备像素比,适应高分辨率显示
+        renderer: 'svg'
+    });
     var categories = data['categories'];
     window.mapData = JSON.parse(JSON.stringify(data))
     var legends = categories.slice(2, categories.length);
@@ -84,14 +101,20 @@ function drawGraph(data, resultShowId) {
     //     element.itemStyle = {}
     // });
     for (let i = 0; i < legends.length; i++) {
-
         sum += 2 + legends[i].name.length + 1
         if (sum <= 60) {
             showLegendNum++
         }
     }
+    let selected = {} //存储选择的种类
+    for (let i = 0; i < data.categories.length; i++) {
+        selected[data.categories[i].name] = true
+    }
+
+    // console.log("selected", selected)
     var option = {
         title: {
+            show: false,
             text: '医学知识图谱',
             top: '10',
             left: '10',
@@ -127,11 +150,15 @@ function drawGraph(data, resultShowId) {
             // borderWidth: 1,
             // borderStyle: 'dotted',  // 设置边框样式为虚线
             padding: [20, 2000, 20, 20],
-            backgroundColor: "#ccc",
+            backgroundColor: "#ffffff",
             margin: [0, 0, 0, 0],
-            selected: {},
+            selected: selected,
             textStyle: {
-                color: '#000',
+                // fontFamily: 'Tahoma',  // 设置字体
+                fontSize: 18,
+                // fontWeight: 'regular',
+                color: '#333333',
+                fontWeight: 'normal',       // 正常字重
             },
             // orient: 'vertical',
             data: legends.slice(0, showLegendNum).map(function (a) {
@@ -163,10 +190,10 @@ function drawGraph(data, resultShowId) {
                     }
                 },
                 force: {
-                    repulsion: 500,
+                    repulsion: 1000,
                     gravity: 0.8,
                     friction: 0.2, //动画速度
-                    edgeLength: [4, 7],
+                    edgeLength: [4, 15],
                     layoutAnimation: true
                 },
                 draggable: window.knowledgeMapSetting.draggable,
@@ -187,7 +214,7 @@ function drawGraph(data, resultShowId) {
                     normal: {
                         width: 2,
                         cursor: 'default',
-                        color: 'target'
+                        color: 'target',
                     }
                 },
                 edgeLabel: {
@@ -195,14 +222,22 @@ function drawGraph(data, resultShowId) {
                         show: true,
                         formatter: function (x) {
                             return x.data.value;  //横线关系
-                        }
-                    }
+                        },
+                        textStyle: {
+                            // cursor: 'pointer',
+                            fontSize: 16,
+                            fontWeight: 'normal',       // 正常字重
+                        },
+
+                    },
                 },
                 label: {
                     normal: {
                         show: true,
                         textStyle: {
                             cursor: 'pointer',
+                            fontSize: 16,
+                            fontWeight: 'normal',       // 正常字重
                         },
                         color: '#000', //label字体颜色
                         formatter: function (x) {
@@ -226,16 +261,17 @@ function drawGraph(data, resultShowId) {
         myChart.resize();
     })
     myChart.on('click', dataClick);
-    let selected = {}
+
     myChart.on('legendselectchanged', function (obj) {
         // console.log("legendselectchanged", obj)
         selected = obj.selected
+        Object.assign(selected, obj.selected)
         const name = obj.name
         let targetIndex = -1
         let sourceIndex = -1
         let linkIndex = -1
         for (let index = 0; index < window.graphMapUpdatedData.links.length; index++) {
-            if (window.graphMapUpdatedData.links[index].value === name || window.graphMapUpdatedData.links[index].valueBackup === name) {
+            if (window.graphMapUpdatedData.links[index].value === name) {
                 targetIndex = window.graphMapUpdatedData.links[index].target
                 sourceIndex = window.graphMapUpdatedData.links[index].source
                 linkIndex = index
@@ -243,18 +279,29 @@ function drawGraph(data, resultShowId) {
             }
         }
         if (obj.selected[name]) {
-            // console.log("links[linkIndex]", window.graphMapUpdatedData.links[linkIndex])
             window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 1 }
             window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 1 }
-            window.graphMapUpdatedData.links[linkIndex].value = window.graphMapUpdatedData.links[linkIndex].valueBackup
+            window.graphMapUpdatedData.links[linkIndex].hideLabel = false
         } else {
             window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 0 }
-            window.graphMapUpdatedData.links[linkIndex].valueBackup = window.graphMapUpdatedData.links[linkIndex].value
-            window.graphMapUpdatedData.links[linkIndex].value = ""
+            window.graphMapUpdatedData.links[linkIndex].hideLabel = true
             window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 0 }
         }
+        // console.log("links", window.graphMapUpdatedData.links[linkIndex])
         window.graphMap.setOption({
             series: [{
+                edgeLabel: {
+                    show: true,
+                    // selected: selected,
+                    formatter: function (x) {
+                        if (x.data.hideLabel) {
+                            return " ";
+                        }
+                        else {
+                            return x.data.value;  //横线关系
+                        }
+                    },
+                },
                 type: 'graph',
                 data: window.graphMapUpdatedData.node,  // 更新节点数据
                 links: window.graphMapUpdatedData.links,  // 更新边数据
@@ -262,7 +309,6 @@ function drawGraph(data, resultShowId) {
         }, false);  // 仅更新指定的部分,不重绘图表
     })
 
-
     myChart.setOption(option, true);
     if (legends.length > showLegendNum) {
         $('.legendSlideUp').toggleClass('legendSlideUp')
@@ -283,10 +329,20 @@ function drawGraph(data, resultShowId) {
             option.legend[0].data = legends.slice(0, showLegendNum)
             option.legend[0].selected = selected
         }
+        option.series[0].edgeLabel = {
+            formatter: function (x) {
+                if (x.data.hideLabel) {
+                    return " ";
+                }
+                else {
+                    return x.data.value;  //横线关系
+                }
+            }
+        }
         myChart.setOption(option, false);
     })
     //
-    if (window.knowledgeMapSetting.operation == "edit") {
+    if (window.knowledgeMapSetting.operation === "edit") {
         chartDom.addEventListener('contextmenu', function (event) {
             event.preventDefault(); // 阻止默认右键菜单出现
             // console.log("contextmenu-1", event);
@@ -353,10 +409,112 @@ function drawGraph(data, resultShowId) {
 
         })
     }
-
+    if (window.knowledgeMapSetting.operation === "view") {
+        chartDom.addEventListener('contextmenu', function (event) {
+            event.preventDefault(); // 阻止默认右键菜单出现
+            $(".contextmenu").hide()
+        });
+        //知识图谱查询查询界面的菜单点击
+        $(".contextmenu .contextmenu-item").on("click", function (event) {
+            const dataId = $(this).attr("data-id")
+            // console.log("contextmenu-view-click", event, "dataId", dataId)
+            switch (dataId) {
+                case "closeAll":
+                    for (let key in selected) {
+                        if (key !== "中心词" && key !== "关系") {
+                            selected[key] = false
+                            let targetIndex = -1
+                            let sourceIndex = -1
+                            let linkIndex = -1
+                            for (let index = 0; index < window.graphMapUpdatedData.links.length; index++) {
+                                if (window.graphMapUpdatedData.links[index].value === key) {
+                                    targetIndex = window.graphMapUpdatedData.links[index].target
+                                    sourceIndex = window.graphMapUpdatedData.links[index].source
+                                    linkIndex = index
+                                    break
+                                }
+                            }
+                            // console.log("key", key)
+                            if (selected[key]) {
+                                window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 1 }
+                                window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 1 }
+                                window.graphMapUpdatedData.links[linkIndex].hideLabel = false
+                            } else {
+                                window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 0 }
+                                window.graphMapUpdatedData.links[linkIndex].hideLabel = true
+                                window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 0 }
+                            }
+                        }
+                    }
+                    break
+                case "expandAll":
+                    for (let key in selected) {
+                        if (key !== "中心词" && key !== "关系") {
+                            selected[key] = true
+                            let targetIndex = -1
+                            let sourceIndex = -1
+                            let linkIndex = -1
+                            for (let index = 0; index < window.graphMapUpdatedData.links.length; index++) {
+                                if (window.graphMapUpdatedData.links[index].value === key) {
+                                    targetIndex = window.graphMapUpdatedData.links[index].target
+                                    sourceIndex = window.graphMapUpdatedData.links[index].source
+                                    linkIndex = index
+                                    break
+                                }
+                            }
+                            if (selected[key]) {
+                                window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 1 }
+                                window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 1 }
+                                window.graphMapUpdatedData.links[linkIndex].hideLabel = false
+                            } else {
+                                window.graphMapUpdatedData.links[linkIndex].lineStyle = { opacity: 0 }
+                                window.graphMapUpdatedData.links[linkIndex].hideLabel = true
+                                window.graphMapUpdatedData.node[targetIndex].itemStyle = { opacity: 0 }
+                            }
+                        }
+                    }
+                    break
+                default:
+            }
+            window.graphMap.setOption({
+                legend: [{ selected: selected, }],
+                series: [{
+                    edgeLabel: {
+                        show: true,
+                        formatter: function (x) {
+                            if (x.data.hideLabel) {
+                                return " ";
+                            }
+                            else {
+                                return x.data.value;  //横线关系
+                            }
+                        },
+                    },
+                    type: 'graph',
+                    data: window.graphMapUpdatedData.node,  // 更新节点数据
+                    links: window.graphMapUpdatedData.links,  // 更新边数据
+                }]
+            }, false);  //
+        })
+        //知识图谱查询 的右键菜单事件
+        myChart.on('contextmenu', function (event) {
+            event.event.stop() //停止原有的默认行为
+            // console.log("contextmenu-view:", event);
+            // 只允许中心节点可以展开右键
+            if (event.dataType === "node" && event.data.category === 0) {
+                $(".contextmenu").show().css({
+                    "left": event.event.event.pageX + 'px',
+                    'top': event.event.event.pageY + 'px'
+                })
+            } else {
+                $(".contextmenu").hide()
+            }
+        })
+    }
     window.graphMap = myChart
     window.graphMapUpdatedData = data
     rightMsgRender(data.node[0])
+    window.knowledgeMapSetting.currentNodeId = data.node[0].nodeId
 }
 
 const rightMsgRender = function (data) {
@@ -386,25 +544,48 @@ const rightMsgRender = function (data) {
     $(".property .box-content").html(property_str)
     const mainId = data.nodeId
     // const mainIndex = data.name
+    let entityNodes = []
     let entity_node_str = ""
-    console.log("getOption", window.graphMap.getOption())
+    // console.log("getOption", window.graphMap.getOption())
+    // 查找符合的节点
     window.graphMapUpdatedData.node.forEach(node => {
         if (node.nodeId === mainId && node.symbol === "diamond") {
             window.graphMapUpdatedData.links.forEach(link => {
                 if (link.source === node.name) {
                     const entityNode = window.graphMapUpdatedData.node[link.target]
                     if (entityNode.symbol !== "diamond") {
-                        entity_node_str += `
-                        <div class="text" nodeIndex="${entityNode.name}" nodeId="${entityNode.nodeId}" label="${entityNode.type}">
-                            <p class='select-sign'><span class='icon-rect-select'></span>&nbsp;</p>
-                            <p class="text-key">${entityNode.type}:</p>
-                            <p class="text-value">${entityNode.properties.name}</p>
-                        </div>`
+                        let isEntityNode = false
+                        for (let i = 0; i < entityNodes.length; i++) {
+                            if (entityNode.type === entityNodes[i].type &&
+                                entityNode.nodeId === entityNodes[i].nodeId
+                            ) {
+                                isEntityNode = true
+                                break
+                            }
+                        }
+                        if (!isEntityNode) entityNodes.push(entityNode);
+
+                        // entity_node_str += `
+                        // <div class="text" nodeIndex="${entityNode.name}" nodeId="${entityNode.nodeId}" label="${entityNode.type}">
+                        //     <p class='select-sign'><span class='icon-rect-select'></span>&nbsp;</p>
+                        //     <p class="text-key">${entityNode.type}:</p>
+                        //     <p class="text-value">${entityNode.properties.name}</p>
+                        // </div>`
                     }
                 }
             })
         }
     })
+    // 渲染实体节点
+    for (let i = 0; i < entityNodes.length; i++) {
+        const entityNode = entityNodes[i]
+        entity_node_str += `
+        <div class="text" nodeIndex="${entityNode.name}" nodeId="${entityNode.nodeId}" label="${entityNode.type}">
+            <p class='select-sign'><span class='icon-rect-select'></span>&nbsp;</p>
+            <p class="text-key">${entityNode.type}:</p>
+            <p class="text-value">${entityNode.properties.name}</p>
+        </div>`
+    }
     $(".content .right .entity-node .box-content").html(entity_node_str)
 }
 
@@ -482,7 +663,10 @@ function dataClick(param) {
     if (param.dataType != 'node') return;
     var data = param.data;
     rightMsgRender(data)
-    if (data.itemStyle.color) return;
+    window.knowledgeMapSetting.currentNodeId = param.data.nodeId
+    let labelList = ["疾病", "药品", "症状", "手术和操作", "实验室检查", "辅助检查"]
+    // if(labelList.indexOf(param.type)===-1) return;
+    if (data.itemStyle.color || labelList.indexOf(param.data.type) === -1 || !data.itemStyle.display) return;
     const clientHei = $(window).height()
     const contentHei = clientHei - 80
     // console.log('data', data,select_type)
@@ -493,10 +677,9 @@ function dataClick(param) {
         if (data.symbol != "circle") {
             return
         } else {
-
             if (data.type == select_type) {
                 $('#searchInp').val(data.label)
-                if (window.knowledgeMapSetting.operation !== "edit") {
+                if (window.knowledgeMapSetting.zTree) {
                     updateTree(data.label)
                 }
 
@@ -522,7 +705,7 @@ function dataClick(param) {
                 if (data.type == "疾病") {
                     getTree(1, 1, data.label);
                     getGraph(data.label, select_type);
-                } else if (data.type == "药品通用名") {
+                } else if (data.type == "药品") {
                     getTree(0, 2, data.label);
                     getGraph(data.label, select_type);
                 } else if (data.type == "症状") {
@@ -548,6 +731,7 @@ function dataClick(param) {
 
 
 function getTree(subType, type, showNodeName) {
+    if (!window.knowledgeMapSetting.zTree) return; //没有树跳过
     post(api.getTree,
         {
             "subType": subType,     //科室subType: 2, 疾病type:1
@@ -557,10 +741,12 @@ function getTree(subType, type, showNodeName) {
         if (res.data.code == 0) {
             const data = res.data.data
             drawTree(data, showNodeName)
+
         }
     })
 }
 function drawTree(data, showNodeName) {
+    if (!window.knowledgeMapSetting.zTree) return;
     /**
         属性说明  id  当前节点的唯一ID
         pId [必须大写]  代表当前节点的父节点id
@@ -633,12 +819,44 @@ function drawTree(data, showNodeName) {
     var zNodes = data.nodes;
     // var zNodes = zTreeData.nodes; 
     $.fn.zTree.init($("#tree"), setting, zNodes);
+    // console.log("zNodes", zNodes)
     if (showNodeName) {
         // updateTree(showNodeName)
+        selectedZTreeNode(showNodeName)
+    }
+    // selectedZTreeNode("艾滋病")
+}
+
+function selectedZTreeNode(nodeName) {
+    const zTreeObj = $.fn.zTree.getZTreeObj("tree")
+    // console.log("zTreeObj", zTreeObj)
+    const targetNode = zTreeObj.getNodeByParam("name", nodeName); // 获取 id 为 2 的节点
+    // console.log("targetNode", targetNode)
+    if (targetNode) {
+        // 展开指定父节点
+        zTreeObj.expandNode(targetNode.getParentNode(), true, false, false);;
+
+        zTreeObj.selectNode(targetNode);
+        const selectPId = $('.curSelectedNode').attr('id')
+        if (selectPId) {
+            const selectId = selectPId.substring(0, selectPId.length - 1) + 'ico'
+            $('#' + selectId).append('<img class="iconSelect" src="./images/iconSelect.png">')
+        }
+        // 可选: 滚动到指定节点
+
+        // zTreeObj.scrollToNode(targetNode);
+        // $.fn.zTree.getZTreeObj("tree").expandAll(true);
+        const parent = document.querySelector(`#tree`)
+        const child = document.querySelector(`.curSelectedNode`)
+        parent.scrollTo({
+            top: child.offsetTop,//需要父元素设置postion(relative、absolute、fixed)
+            behavior: "smooth"
+        })
 
     }
 }
 
+
 function getNode(val, type) {
     post(api.getNode,
         {
@@ -676,7 +894,7 @@ function getNode(val, type) {
                     if (select_type == '疾病') {
                         // $('#searchInp').val("高血压3级")
                         getTree(1, 1, txt);
-                    } else if (select_type == '药品通用名') {
+                    } else if (select_type == '药品') {
                         getTree(0, 2, txt);
                     } else if (select_type == '症状') {
                         getTree(0, 3, txt);
@@ -766,7 +984,7 @@ function getKeyEvent(evt) {
 }
 
 function getTab(tabName) {
-    let tabList = ["疾病", "药品通用名", "症状", "手术和操作", "实验室检查", "辅助检查"]
+    let tabList = ["疾病", "药品", "症状", "手术和操作", "实验室检查", "辅助检查"]
     let tabListCopy = tabList.slice()
     const index = tabList.findIndex(item => item == tabName)
 
@@ -795,9 +1013,9 @@ function renderTab(data) {
     let showtabStr = ``
     let hidetabStr = ``
     for (let i = 0; i < showList.length; i++) {
-        showtabStr += `	<span class="tab ${i === activeIndex ? 'activeTab' : ''}" data-id="${showList[i]}">${showList[i] == "药品通用名" ? "药品" : showList[i]}</span>`
+        showtabStr += `	<span class="tab ${i === activeIndex ? 'activeTab' : ''}" data-id="${showList[i]}">${showList[i] == "药品" ? "药品" : showList[i]}</span>`
         if (i === activeIndex) {
-            if (showList[i] == "药品通用名") {
+            if (showList[i] == "药品") {
                 $("#searchInp").attr("placeholder", `请输入药品名称`)
             } else {
                 $("#searchInp").attr("placeholder", `请输入${showList[i]}名称`)
@@ -808,10 +1026,11 @@ function renderTab(data) {
     for (let i = 0; i < hideList.length; i++) {
         hidetabStr += `<span class="tab " data-id="${hideList[i]}">${hideList[i]}</span>`
     }
-    hidetabStr += `<div class="toggleTab">
-    <span class="toggleTabTxt">收起</span>
-    <span class="toggleArrow dropdown-up" style="bottom:0px;"  alt=""/>
-    </div>`
+    // hidetabStr += `<div class="toggleTab">
+    // <span class="toggleTabTxt">收起</span>
+    // <span class="toggleArrow dropdown-up" style="bottom:0px;"  alt=""/>
+    // </div>`
+
     // console.log('showtabStr',showtabStr)
 
     $('.showTabList').html(showtabStr)
@@ -824,12 +1043,21 @@ function ToggleTab() {
     $(".toggleTab").off("click").click(function (e) {
         e.stopPropagation()
         hideSlide("hideTabList")
+        let toggleTabTxt = $(".toggleTab .toggleTabTxt").text().trim()
+        if (toggleTabTxt === '展开') {
+            $(".toggleTab .toggleTabTxt").text("收起")
+            $(".toggleTab .toggleArrow").css({ "transform": "rotate(0deg)" })
+        } else {
+            $(".toggleTab .toggleTabTxt").text("展开")
+            $(".toggleTab .toggleArrow").css({ "transform": "rotate(180deg)" })
+        }
         const hideTabDis = $(".hideTabList").css("display")
         if (hideTabDis == "none") {
             showHideTab()
         } else {
             hideHideTab()
         }
+
     })
 
 
@@ -837,7 +1065,7 @@ function ToggleTab() {
 function showHideTab() {
     $(".hideTabList").show()
     $(".tabList").addClass("tabListShow")
-    $(".toggleTab").css("display", "none")
+    // $(".toggleTab").css("display", "none")
     $(".hideTabList .toggleTab").css("display", "inline-block")
     // $(".toggleTabTxt").html("收起")
     // $(".toggleArrow").attr("src",iconUp)
@@ -855,10 +1083,11 @@ bindTabClick()
 //切换tab
 function bindTabClick() {
     $('.tabList .tab').click(function () {
+        $(".tabList .tab").removeClass("activeTab")
         const id = $(this).attr('data-id')
         $(this).addClass("activeTab").siblings().removeClass('activeTab')
         let renderInfo = getTab(id)
-        renderTab(renderInfo)
+        // renderTab(renderInfo)
         if (id != select_type) {
             if (id != "疾病") {
                 $(".radioList").hide()
@@ -873,16 +1102,16 @@ function bindTabClick() {
 
             if (id == "疾病") {
 
-                $('#searchInp').val(disease || "急性胰腺炎")
+                $('#searchInp').val(disease || "艾滋病")
                 $('.iconRadio').attr('src', '/images/radioUnSelect.png')
                 $('.ICD10 img').attr('src', '/images/radioSelect.png')
-                getTree(1, 1, disease || "急性胰腺炎");
-                getGraph(disease || "急性胰腺炎", select_type);
+                getTree(1, 1, disease || "艾滋病");
+                getGraph(disease || "艾滋病", select_type);
 
-            } else if (id == "药品通用名") {
-                $('#searchInp').val("地高辛(XC01AAD072A001010100372)")
-                getTree(0, 2, "地高辛(XC01AAD072A001010100372)");
-                getGraph("地高辛(XC01AAD072A001010100372)", select_type);
+            } else if (id == "药品") {
+                $('#searchInp').val("硝苯地平缓释片(Ⅱ)")
+                getTree(0, 2, "硝苯地平缓释片(Ⅱ)");
+                getGraph("硝苯地平缓释片(Ⅱ)", select_type);
             } else if (id == "症状") {
                 $('#searchInp').val("背痛")
                 getTree(0, 3, "背痛");
@@ -900,11 +1129,9 @@ function bindTabClick() {
                 getTree(0, 6, "肝彩超");
                 getGraph("肝彩超", select_type);
             }
-
             // getTree(1,1,"");  //切换tab重新画菜单树
         }
-
-        hideHideTab()
+        // hideHideTab()
     })
 }
 
@@ -928,7 +1155,7 @@ function setTabBottomHei(type) {
 }
 
 function setSelectName(name) {
-    if (name == "药品通用名") {
+    if (name == "药品") {
         $('.selectedName').html("药品")
         $('.selectedName').attr("title", "药品")
         $("#searchInp").attr("placeholder", `请输入药品名称`)
@@ -945,7 +1172,9 @@ function setSelectName(name) {
     }
 }
 function hideSlide(expectClass) {
-    let hideSlideList = ['selectList', 'tabNameList', 'tabNameListNoSearch', 'hideTabList', 'contextmenu', 'contextmenu-edge', 'contextmenu-node']
+    let hideSlideList = ['selectList', 'tabNameList', 'tabNameListNoSearch',
+        // 'hideTabList',
+        'contextmenu', 'contextmenu-edge', 'contextmenu-node']
     let index = hideSlideList.findIndex(item => item == expectClass)
     for (let i = 0; i < hideSlideList.length; i++) {
         if (i != index) {
@@ -961,6 +1190,69 @@ function hideSlide(expectClass) {
     }
 }
 
+function expandProperty(data, flag) {
+    // console.log("expandProperty", data)
+    if (flag) { //把节点添加到配置中
+        window.knowledgeMapSetting.expandPropertyId.push(data.nodeId)
+    }
+    // window.graphMapUpdatedData
+    // 生成一个虚拟节点
+    let sourceIndex = -1
+    //检验是否要展开属性
+    let checkHasProperties = Object.keys(data.properties).filter(key => key !== "name" || key !== "is_deleted").length > 0
+
+    if (checkHasProperties) {
+        const newNode = {
+            category: data.category,
+            label: "",
+            name: window.graphMapUpdatedData.node.length,
+            nodeId: data.nodeId,
+            properties: data.properties,
+            symbol: "diamond",
+            symbolSize: 10,
+            type: data.type,
+            itemStyle: data.itemStyle
+        }
+        window.graphMapUpdatedData.node.push(newNode)
+        const newLink = {
+            value: "属性",
+            source: data.name,
+            target: newNode.name,
+        }
+        window.graphMapUpdatedData.links.push(newLink)
+        sourceIndex = newNode.name
+    } else return
+    // 属性节点
+    for (let i in data.properties) {
+        if (i == 'name' || i == 'is_deleted') continue
+        const newNode = {
+            category: data.category,
+            label: i + ":" + data.properties[i],
+            name: window.graphMapUpdatedData.node.length,
+            nodeId: data.nodeId,
+            properties: { name: i, value: data.properties[i], parentName: data.properties.name },
+            symbol: "diamond",
+            symbolSize: 28,
+            type: data.type,
+            itemStyle: data.itemStyle
+        }
+        window.graphMapUpdatedData.node.push(newNode)
+        const newLink = {
+            value: "",
+            source: sourceIndex,
+            target: newNode.name,
+        }
+        window.graphMapUpdatedData.links.push(newLink)
+    }
+
+    window.graphMap.setOption({
+        series: [{
+            type: 'graph',
+            data: window.graphMapUpdatedData.node,  // 更新节点数据
+            links: window.graphMapUpdatedData.links,  // 更新边数据
+        }]
+    }, false);  // 仅更新指定的部分,不重绘图表
+}
 
 module.exports = {
     drawGraph,
@@ -974,5 +1266,7 @@ module.exports = {
     setSelectName,
     hideHideTab,
     hideSlide,
-    reDrawGraph
+    reDrawGraph,
+    selectedZTreeNode,
+    expandProperty
 }

+ 9 - 10
src/js/index.js

@@ -23,19 +23,22 @@ const iconUp = require('./../resources/images/iconUp.png');
 const iconDown = require('./../resources/images/iconDown.png');
 const { post, api, ifHideLogo, getUrlArgObject } = require('./api.js');
 const { mapData, zTreeData, mapData3, zTreeData3 } = require('./data.js');
-const { drawGraph, updateTree, getGraph, getTree, getNode, getTab, renderTab, setTabBottomHei, setSelectName, hideHideTab, hideSlide } = require('./graphMap.js');
+const { drawGraph, updateTree, getGraph, getTree, getNode, getTab, renderTab, setTabBottomHei, selectedZTreeNode,
+    setSelectName, hideHideTab, hideSlide } = require('./graphMap.js');
 /**右侧侧边栏折叠*/
 let isRightCollapse = false
 window.select_type = "疾病";
 window.select_type_noSearch = "疾病";
 window.refreshTree = true
 let disease = getUrlArgObject("disease")
-
+// 用来存储节点操作的数据
+window.knowledgeMapData = {}
 /**知识图谱的部分配置信息*/
 window.knowledgeMapSetting = {
     operation: "view", //操作类型,查看
     showLegend: true, //是否展示图例
     draggable: false,
+    zTree: true
 }
 
 setHei()
@@ -58,9 +61,9 @@ $(window).resize(function () {
 })
 
 //关系图
-getGraph(disease || "急性胰腺炎", select_type);
-getTree(1, 1, disease || "急性胰腺炎");
-$('#searchInp').val(disease || "急性胰腺炎")
+getGraph(disease || "艾滋病", select_type);
+getTree(1, 1, disease || "艾滋病");
+$('#searchInp').val(disease || "艾滋病")
 
 //选择类型
 $('.select').click(function (e) {
@@ -104,7 +107,7 @@ $("#searchInp").bind("input propertychange", function (event) {
 $('.radioItem').click(function (e) {
     $('.radioItem').css('color', '#333333')
     $(this).css("color", '#409EF1')
-    const initDiag = disease || "急性胰腺炎"
+    const initDiag = disease || "艾滋病"
     const type = $(this).attr('data-type')
     // $(this).children('img').attr('src')
     $('.iconRadio').attr('src', '/images/radioUnSelect.png')
@@ -155,11 +158,7 @@ $('#searchBtn').click(function (e) {
             }
             let renderTabInfo = getTab(select_type)
             renderTab(renderTabInfo)
-
         })
-
-
-
     } else {
         $('.tabNameListNoSearch').show()
     }

+ 24 - 65
src/js/knowledgeUpdate.js

@@ -23,7 +23,7 @@ const iconUp = require('./../resources/images/iconUp.png');
 const iconDown = require('./../resources/images/iconDown.png');
 const { post, api, ifHideLogo, getUrlArgObject } = require('./api.js');
 const { mapData, zTreeData, mapData3, zTreeData3 } = require('./data.js');
-const { drawGraph, updateTree, getGraph, getTree, getNode, getTab, renderTab, setTabBottomHei,
+const { drawGraph, updateTree, getGraph, getTree, getNode, getTab, renderTab, setTabBottomHei, expandProperty,
   setSelectName, hideHideTab, hideSlide, reDrawGraph } = require('./graphMap.js');
 /**右侧侧边栏折叠*/
 let isRightCollapse = false
@@ -33,11 +33,14 @@ window.refreshTree = true
 let disease = getUrlArgObject("disease")
 // 用来存储节点操作的数据
 window.knowledgeMapData = {}
-
 window.knowledgeMapSetting = {
   operation: "edit", //操作类型,修改
-  showLegend: true,
-  draggable: false,
+  showLegend: true, //是否显示图例
+  draggable: false, //是否能拖拽节点
+  zTree: false,//是否有zTree
+  expandPropertyId: [],//存储展开属性的nodeId
+  expandRelationshipsId: [],//存储展开关系的nodeId
+  currentNodeId: -1,//存储右侧显示的节点的nodeId
 }
 
 setHei()
@@ -60,9 +63,9 @@ $(window).resize(function () {
 })
 
 //关系图
-getGraph(disease || "急性胰腺炎", select_type, true);
-// getTree(1, 1, disease || "急性胰腺炎");
-$('#searchInp').val(disease || "急性胰腺炎")
+getGraph(disease || "艾滋病", select_type, true);
+// getTree(1, 1, disease || "艾滋病");
+$('#searchInp').val(disease || "艾滋病")
 
 //选择类型
 $('.select').click(function (e) {
@@ -91,6 +94,8 @@ $('.search-type .selectList .selectItem').click(function () {
 
 $('.dropdown').on('click', function (el) {
   el.stopPropagation();
+  // hideSlide()
+  $(".dropdown").not($(this)).find(".selectList").slideUp()
   $(this).find(".selectList").slideToggle()
 })
 
@@ -109,7 +114,7 @@ $("#searchInp").bind("input propertychange", function (event) {
 
 //切换条目
 $('.radioItem').click(function (e) {
-  const initDiag = disease || "急性胰腺炎"
+  const initDiag = disease || "艾滋病"
   const type = $(this).attr('data-type')
   // $(this).children('img').attr('src')
   $('.iconRadio').attr('src', '/images/radioUnSelect.png')
@@ -283,7 +288,7 @@ $(".dropdown[select='off'] .selectList .selectItem").on("click", function () {
   const showFooter = true
   const dialogVisible = true
   const data = {
-    opType, title, showFooter, dialogVisible
+    opType, title, showFooter, dialogVisible, data: {}
   }
   menuOperation(opType, data)
 
@@ -293,67 +298,14 @@ $(".dropdown[select='off'] .selectList .selectItem").on("click", function () {
 
 // 自定义的菜单和部分下拉框的操作
 function menuOperation(opType, data) {
+  data.width = ""
   console.log("menuOperationData", data);
   let selectedName = ""
   let searchInp = ""
   const parentURL = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port + "/home.html";
   switch (opType) {
-    case 'expandProperty':
-      // window.graphMapUpdatedData
-      // 生成一个虚拟节点
-      let sourceIndex = -1
-      if (Object.keys(data.data.properties).length > 2) {
-        const newNode = {
-          category: data.data.category,
-          label: "",
-          name: window.graphMapUpdatedData.node.length,
-          nodeId: data.data.nodeId,
-          properties: data.data.properties,
-          symbol: "diamond",
-          symbolSize: 10,
-          type: data.data.type,
-          itemStyle: data.data.itemStyle
-        }
-        window.graphMapUpdatedData.node.push(newNode)
-        const newLink = {
-          value: "属性",
-          source: data.data.name,
-          target: newNode.name,
-        }
-        window.graphMapUpdatedData.links.push(newLink)
-        sourceIndex = newNode.name
-      } else return
-      // 属性节点
-      for (let i in data.data.properties) {
-        if (i == 'name' || i == 'is_deleted') continue
-        const newNode = {
-          category: data.data.category,
-          label: i + ":" + data.data.properties[i],
-          name: window.graphMapUpdatedData.node.length,
-          nodeId: data.data.nodeId,
-          properties: { name: i, value: data.data.properties[i], parentName: data.data.properties.name },
-          symbol: "diamond",
-          symbolSize: 28,
-          type: data.data.type,
-          itemStyle: data.data.itemStyle
-        }
-        window.graphMapUpdatedData.node.push(newNode)
-        const newLink = {
-          value: "",
-          source: sourceIndex,
-          target: newNode.name,
-        }
-        window.graphMapUpdatedData.links.push(newLink)
-      }
-
-      window.graphMap.setOption({
-        series: [{
-          type: 'graph',
-          data: window.graphMapUpdatedData.node,  // 更新节点数据
-          links: window.graphMapUpdatedData.links,  // 更新边数据
-        }]
-      }, false);  // 仅更新指定的部分,不重绘图表
-
+    case 'expandProperty': //展开属性
+      expandProperty(data.data, true)
       break
     case 'modifyEntityName-dropdown':
       selectedName = $(".selectedName").html().trim()
@@ -451,11 +403,18 @@ function menuOperation(opType, data) {
 
       })
       break
+    case "addRelationship-dropdown":
+      data.width = "700px"
+      window.parent.postMessage(data, parentURL);
+      break
     default:
       window.parent.postMessage(data, parentURL);
   }
 }
 
+
+
+
 $(document).on("click", ".content .right .entity-node .box-content .text .select-sign span", function () {
   // $(this).attr("class", "icon-rect-select")
   if ($(this).hasClass("icon-rect-select")) {

src/public/images/组11拷贝2x.png → src/public/images/CAPTCHA2x.png


src/public/images/图层10@2x.png → src/public/images/layer10@2x.png


src/public/images/图层11@2x.png → src/public/images/layer11@2x.png


src/public/images/图层8@2x.png → src/public/images/layer8@2x.png


src/public/images/图层9@2x.png → src/public/images/layer9@2x.png