Explorar o código

添加自构建图谱更新文件

yangdr hai 1 mes
pai
achega
4d9ecbb121

+ 1 - 1
src/css/knowledgeUpdate.less

@@ -1,4 +1,4 @@
-.knowledgeMapWrapper {
+.knowledgeMapWrapper.knowledgeUpdate {
   min-width: 1200px;
   height: 100%;
   // background: url("../images/bg2.png");

+ 43 - 0
src/css/selfKnowledgeUpdate.less

@@ -0,0 +1,43 @@
+#app {
+  width: 100%;
+  height: 100%;
+
+  .kg-list {
+    li {
+      display: flex;
+
+      .index {
+        flex: 0 0 50px;
+      }
+
+      .name {
+        flex: 0 0 100px;
+      }
+
+      .op {
+        flex: 0 0 50px;
+      }
+    }
+  }
+  .main-box {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+    .knowledgeCard {
+      margin: 20px;
+    width: 300px;
+    height: 200px;
+    text-align: center;
+    line-height: 200px;
+    background-color: #f9f9f9;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+    padding: 10px;
+    &:hover {
+      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+    }
+  }
+  }
+
+
+}

+ 1 - 1
src/html/knowledgeUpdate.html

@@ -15,7 +15,7 @@
 </head>
 
 <body>
-  <div class="knowledgeMapWrapper wrappper">
+  <div class="knowledgeMapWrapper wrappper knowledgeUpdate">
     <!-- 右键菜单 -->
     <div class="contextmenu">
       <ul>

+ 59 - 57
src/html/selfKnowledgeGraph.html

@@ -17,63 +17,65 @@
 		}
 	</style>
 </head>
+
 <body>
-   <div id="app" v-cloak>
-  <div class="main-box" v-if="!isShowKG">
-    <div class="knowledgeCard" id="knowledgeCard" v-for="item in listData" :key="item.graph_id" @click="showKnowledgeGraph(item.graph_id)">
-      {{ item.graph_name }}
-    </div>
-  </div>
-	<div v-else 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 id="app" v-cloak>
+		<div class="main-box" v-if="!isShowKG">
+			<div class="knowledgeCard" id="knowledgeCard" v-for="item in listData" :key="item.graph_id"
+				@click="showKnowledgeGraph(item.graph_id)">
+				{{ item.graph_name }}
+			</div>
 		</div>
-		<div class="content clearfix">
-			<div class="left">
-				<div id="main" class="mapWrapper">
-				</div>
-				<div id="dragMe" class="legendIcon">
-					<div class="legendIconImg"></div>
-				</div>
-				<div class="category-num"></div>
-				<div select="on" class="dropdown record"><span class="selectedData">历史记录 <span
-							class="icon-triangle-down"></span></span>
-					<ul class="selectList-record">
-						<li class="selectItem" name="艾滋病" label="疾病">艾滋病</li>
-					</ul>
-				</div>
+		<div v-else 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="right" style="display: none;">
-				<div class="top">
-					<div class="select">
-						<div class="box">
-							<span class="selectedName">疾病</span>
-							<img class="iconSlide" src="./images/iconSlideDown.png" alt="iconSlide">
-						</div>
-
-						<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>
-						</ul>
+			<div class="content clearfix">
+				<div class="left">
+					<div id="main" class="mapWrapper">
+					</div>
+					<div id="dragMe" class="legendIcon">
+						<div class="legendIconImg"></div>
 					</div>
-					<div class="search">
-						<input type="text" id="searchInp" placeholder="搜索疾病名称" name="" autocomplete="off">
-						<span class="searchBtn" id="searchBtn">搜索</span>
-						<ul class="tabNameList"></ul>
-						<ul class="tabNameListNoSearch">
-							<li class="ellipsis">请输入内容</li>
+					<div class="category-num"></div>
+					<div select="on" class="dropdown record"><span class="selectedData">历史记录 <span
+								class="icon-triangle-down"></span></span>
+						<ul class="selectList-record">
+							<li class="selectItem" name="艾滋病" label="疾病">艾滋病</li>
 						</ul>
 					</div>
 				</div>
-				<div class="bottom">
-					<!-- <div class="tabList" id="tabList">
+				<div class="right" style="display: none;">
+					<div class="top">
+						<div class="select">
+							<div class="box">
+								<span class="selectedName">疾病</span>
+								<img class="iconSlide" src="./images/iconSlideDown.png" alt="iconSlide">
+							</div>
+
+							<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>
+							</ul>
+						</div>
+						<div class="search">
+							<input type="text" id="searchInp" placeholder="搜索疾病名称" name="" autocomplete="off">
+							<span class="searchBtn" id="searchBtn">搜索</span>
+							<ul class="tabNameList"></ul>
+							<ul class="tabNameListNoSearch">
+								<li class="ellipsis">请输入内容</li>
+							</ul>
+						</div>
+					</div>
+					<div class="bottom">
+						<!-- <div class="tabList" id="tabList">
 						<div class="showTabList">
 						</div>
 						<div class="toggleTab">
@@ -85,8 +87,8 @@
 
 					</div> -->
 
-					<div class="tabBottom">
-						<!-- <div class="radioList">
+						<div class="tabBottom">
+							<!-- <div class="radioList">
 							<span class="radioItem disease ICD10" data-type="1" sub-type="1">
 								<img class="iconRadio" src="/images/radioSelect.png" alt="iconRadio">
 								ICD10
@@ -104,18 +106,18 @@
 								ATC分类
 							</span>
 						</div> -->
-						<div id="tree" class="ztree"></div>
-						<div class="right-aside-collapse"></div>
+							<div id="tree" class="ztree"></div>
+							<div class="right-aside-collapse"></div>
 
-					</div>
+						</div>
 
+					</div>
 				</div>
+
 			</div>
 
 		</div>
-
 	</div>
-   </div>
 
 	<!-- <div class="footer ltLogo" style="display: none;">
 		杭州朗通信息技术有限公司 & 浙江省卫生健康委&nbsp;&nbsp;&nbsp;联合开发

+ 164 - 0
src/html/selfKnowledgeUpdate.html

@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">
+  <title>自构建图谱更新</title>
+  <link href="../resources/favicon.ico" rel="shortcut icon">
+  <style>
+    .node_name {
+      color: #000;
+    }
+  </style>
+</head>
+
+<body>
+  <div id="app">
+    <div class="main-box" v-if="!isShowKG">
+      <div class="knowledgeCard" id="knowledgeCard" v-for="item in listData" :key="item.graph_id"
+        @click="showKnowledgeGraph(item.graph_id)">
+        {{ item.graph_name }}
+      </div>
+    </div>
+    <div v-else class="knowledgeMapWrapper wrappper knowledgeUpdate">
+      <!-- 右键菜单 -->
+      <div class="contextmenu">
+        <ul>
+          <li class="contextmenu-item" title="新增实体" data-id="addEntity">新增实体</li>
+          <li class="contextmenu-item" title="修改实体名称" data-id="modifyEntityName">修改实体名称</li>
+          <li class="contextmenu-item" title="编辑实体" data-id="editEntity">编辑实体</li>
+          <li class="contextmenu-item" title="删除实体" data-id="deleteEntity">删除实体</li>
+          <li class="contextmenu-item" title="新增关系" data-id="addRelationship">新增关系</li>
+          <li class="contextmenu-item" title="新增属性" data-id="addProperty">新增属性</li>
+          <li class="contextmenu-item" title="实体链接" data-id="entityLink">实体链接</li>
+          <li class="contextmenu-item" title="实体合并" data-id="entityMerge">实体合并</li>
+          <li class="contextmenu-item" title="展开关系" data-id="expandRelationships">展开关系</li>
+          <li class="contextmenu-item" title="展开属性" data-id="expandProperty">展开属性</li>
+          <li class="contextmenu-item center" title="全部展开" data-id="expandAll">全部展开</li>
+          <li class="contextmenu-item center" title="全部关闭" data-id="closeAll">全部关闭</li>
+        </ul>
+      </div>
+      <!-- 线的菜单 -->
+      <div class="contextmenu-edge">
+        <ul>
+          <li class="contextmenu-item" title="修改关系" data-id="modifyRelationship">修改关系</li>
+          <li class="contextmenu-item" title="删除关系" data-id="deleteRelationship">删除关系</li>
+        </ul>
+      </div>
+      <!-- 节点的菜单 -->
+      <div class="contextmenu-node">
+        <ul>
+          <li class="contextmenu-item" title="修改属性" data-id="modifyProperty">修改属性</li>
+          <li class="contextmenu-item" title="删除属性" data-id="deleteProperty">删除属性</li>
+        </ul>
+      </div>
+
+      <div class="topbar">
+        <div class="topbar-left">
+          <div select="off" class="item-box-1 dropdown">
+            <span>实体更新</span><span class="icon-triangle-down"></span>
+            <ul class="selectList">
+              <li class="selectItem" title="新增实体" data-id="addEntity">新增实体</li>
+              <li class="selectItem" title="修改实体名称" data-id="modifyEntityName-dropdown">修改实体名称</li>
+              <li class="selectItem" title="编辑实体" data-id="editEntity">编辑实体</li>
+              <li class="selectItem" title="删除实体" data-id="deleteEntity-dropdown">删除实体</li>
+            </ul>
+          </div>
+          <div select="off" class="item-box-1 dropdown">
+            <span>关系更新</span><span class="icon-triangle-down"></span>
+            <ul class="selectList">
+              <li class="selectItem" title="新增关系" data-id="addRelationship-dropdown">新增关系</li>
+              <li class="selectItem" title="修改关系名称" data-id="modifyRelationshipName-dropdown">修改关系名称</li>
+            </ul>
+          </div>
+          <div select="off" class="item-box-1 dropdown">
+            <span>属性更新</span><span class="icon-triangle-down"></span>
+            <ul class="selectList">
+              <li class="selectItem" title="新增属性" data-id="addProperty-dropdown">新增属性</li>
+              <li class="selectItem" title="修改属性" data-id="modifyProperty-dropdown">修改属性</li>
+            </ul>
+          </div>
+        </div>
+        <div class="topbar-right">
+          <div class="topbar-right-item">
+            <!-- select="on" 表示会改变 .selectedData -->
+            <div select="on" class="item-box-2 dropdown search-type">
+              <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>
+              </ul>
+            </div>
+          </div>
+          <div class="topbar-right-item">
+            <div class="search">
+              <input type="text" id="searchInp" placeholder="搜索疾病名称" name="" autocomplete="off">
+              <span class="searchBtn" id="searchBtn">搜索</span>
+              <ul class="tabNameList"></ul>
+              <ul class="tabNameListNoSearch">
+                <li class="ellipsis">请输入内容</li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="content clearfix">
+        <div class="left">
+          <div id="main" class="mapWrapper"></div>
+          <div id="dragMe" class="legendIcon">
+            <div class="legendIconImg"></div>
+          </div>
+          <div class="category-num"></div>
+          <div select="on" class="record">
+            <span class="selectedData">历史记录 <span class="icon-triangle-down"></span></span>
+            <ul class="selectList-record">
+              <li class="selectItem-record" name="艾滋病" label="疾病">艾滋病</li>
+            </ul>
+          </div>
+        </div>
+        <div class="right">
+          <div class="content-right-box basic-information">
+            <div class="box-title">基本信息</div>
+            <div class="box-content">
+              <div class="text">
+                <p class="text-key">ID:</p>
+                <p class="text-value">1001</p>
+              </div>
+              <div class="text">
+                <p class="text-key">类型:</p>
+                <p class="text-value">疾病</p>
+              </div>
+              <div class="text">
+                <p class="text-key">名称:</p>
+                <p class="text-value">上呼吸道感染</p>
+              </div>
+            </div>
+          </div>
+          <div class="content-right-box property">
+            <div class="box-title">属性</div>
+            <div class="box-content"></div>
+          </div>
+          <div class="content-right-box entity-node">
+            <div class="box-title">实体节点</div>
+            <div class="box-content"></div>
+            <div class="box-footer">
+              <button class="link-entity">实体链接</button>
+              <button class="merge-entity">实体合并</button>
+              <button class="delete-entity">实体删除</button>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </div>
+
+</body>
+
+</html>

+ 1 - 1
src/js/home.js

@@ -176,7 +176,7 @@ const vm = new Vue({
             },
             {
               id: "selfKnowledgeUpdate",
-              url: "",
+              url: "/selfKnowledgeUpdate.html",
               title: '自构建图谱更新',
               children: null
             },

+ 790 - 0
src/js/selfKnowledgeUpdate.js

@@ -0,0 +1,790 @@
+// const $ = require("jquery");
+require("babel-polyfill");
+const echarts = require("echarts");
+require("./../css/knowledgeUpdate.less");
+require("./../css/common.less");
+require("../css/selfKnowledgeUpdate.less")
+// require("ztree");
+const $ = require("jquery");
+require("babel-polyfill");
+const echarts = require("echarts");
+require("./../css/knowledgeUpdate.less");
+require("./../css/common.less");
+// require("ztree");
+
+require('./../resources/images/icon.png');
+require('./../resources/images/iconOpen.png');
+require('./../resources/images/iconClose.png');
+require('./../resources/images/node.png');
+require('./../resources/images/radioUnSelect.png');
+require('./../resources/images/radioSelect.png');
+require('./../resources/images/iconSlideUp.png');
+require('./../resources/images/iconSlideDown.png');
+require('./../resources/images/iconSelect.png');
+require('./../resources/images/syflogo.png');
+require('./../resources/images/logo.png');
+require('./../resources/images/logo_shaoyifu.png');
+require('./../resources/zTree/js/jquery.ztree.core.min.js');
+require('./../resources/zTree/js/jquery.ztree.excheck.min.js')
+require('./../resources/zTree/css/zTreeStyle/zTreeStyle.css');
+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, expandProperty,
+  setSelectName, hideHideTab, hideSlide, reDrawGraph } = require('./graphMap.js');
+/**右侧侧边栏折叠*/
+let isRightCollapse = false
+window.select_type = "疾病";
+window.select_type_noSearch = "疾病";
+window.refreshTree = true
+let disease = getUrlArgObject("disease")
+// 用来存储节点操作的数据
+window.knowledgeMapData = {}//当前右键节点数据
+window.graphMapUpdatedData = null //实时更新的关系图数据
+window.graphMap = null //当前关系图实例对象
+window.knowledgeMapSetting = {
+  operation: "edit", //操作类型,修改
+  draggable: true, //是否能拖拽节点
+  zTree: false,//是否有zTree
+  expandPropertyId: [],//存储展开属性的nodeId
+  expandRelationshipsId: [],//存储展开关系的nodeId
+  currentNodeId: -1,//存储右侧显示的节点的nodeId
+  legends: [],//图例
+  selected: {},//选中的数据
+  showLegend: true, //是否显示图例
+  showLegendNum: 0,//展示图例的数量
+  showLegendAll: false,//是否展示全部图例
+  records: [],//历史记录
+}
+
+setHei()
+ifHideLogo();
+function setHei() {
+  const clientHei = $(window).height()
+  const contentHei = 580
+  $(".left").css("height", contentHei + 'px')
+  $(".right").css("height", contentHei + 'px')
+  if (select_type == "疾病") {
+    setTabBottomHei(1)
+  } else {
+    setTabBottomHei(2)
+  }
+  $("#main").css("height", contentHei - 20 - 20 - 10 + 'px')
+}
+$(window).resize(function () {
+  setHei()
+  // getGraph(graphTxt,select_type);
+})
+
+//关系图
+getGraph(disease || "艾滋病", select_type, true);
+// getTree(1, 1, disease || "艾滋病");
+$('#searchInp').val(disease || "艾滋病")
+
+//选择类型
+$('.select').click(function (e) {
+  e.stopPropagation();
+  hideSlide('selectList')
+  const selectListShow = $('.selectList').css('display')
+  if (selectListShow == 'none') {
+    $('.iconSlide').attr('src', './images/iconSlideUp.png')
+  } else {
+    $('.iconSlide').attr('src', './images/iconSlideDown.png')
+  }
+  $('.selectList').fadeToggle()
+
+})
+$('.search-type .selectList .selectItem').click(function () {
+  select_type_noSearch = $(this).attr('data-id')
+  const txt = $(this).text()
+  const oldTxt = $(".selectedName").html()
+  setSelectName(txt)
+
+  $("#searchInp").attr("placeholder", `请输入${txt}名称`)
+  if (txt != oldTxt) {
+    $('#searchInp').val("")
+  }
+})
+
+$('.dropdown').on('click', function (el) {
+  el.stopPropagation();
+  // hideSlide()
+  $(".dropdown").not($(this)).find(".selectList").slideUp()
+  $(this).find(".selectList").slideToggle()
+})
+
+$(".record .selectedData,.record").on("click", function (event) {
+  // console.log("event-record", event)
+  event.stopPropagation()
+  // event.preventDefault()
+  $(".record .selectList-record").slideToggle()
+  $(".record .selectList-record .selectItem-record").on("click", function (event) {
+    // event.stopPropagation()
+    // console.log("eve")
+    const name = $(this).attr("name")
+    const label = $(this).attr("label")
+    // reDrawGraph(name, label)
+    getGraph(name, label)
+    // $(".record .selectList-record").slideUp()
+  })
+})
+
+
+//搜索节点名
+$("#searchInp").bind("input propertychange", function (event) {
+  const val = $("#searchInp").val().trim()
+  if (val) {
+    getNode(val, select_type_noSearch)
+  } else {
+    $(".tabNameList").hide()
+  }
+});
+
+//切换条目
+$('.radioItem').click(function (e) {
+  const initDiag = disease || "艾滋病"
+  const type = $(this).attr('data-type')
+  // $(this).children('img').attr('src')
+  $('.iconRadio').attr('src', '/images/radioUnSelect.png')
+  $(this).children('img').attr('src', '/images/radioSelect.png')
+  $('#searchInp').val(initDiag)
+  getTree(type, 1, initDiag);
+  getGraph(initDiag, select_type);
+  // updateTree(initDiag)
+})
+
+//搜索
+$('#searchBtn').click(function (e) {
+  e.stopPropagation()
+  hideSlide()
+  const val = $('#searchInp').val().trim()
+  if (val) {
+    const clientHei = $(window).height()
+    const contentHei = clientHei - 80
+    $(".tabNameList").hide()
+    getGraph(val, select_type_noSearch).then(() => {
+      if (!window.refreshTree) {
+        return
+      }
+      select_type = select_type_noSearch
+
+      if (select_type == '疾病') {
+        // $('#searchInp').val("高血压3级")
+        getTree(1, 1, val);
+      } else if (select_type == '药品通用名') {
+        getTree(0, 2, val);
+      } else if (select_type == '症状') {
+        getTree(0, 3, val);
+      }
+      // else if (select_type == '手术和操作') {
+      //   getTree(0, 4, val);
+      // }
+      else if (select_type == '实验室检查') {
+        getTree(0, 5, val);
+      } else if (select_type == '辅助检查') {
+        getTree(0, 6, val);
+      }
+      if (select_type == '疾病') {
+        $('.iconRadio').attr('src', '/images/radioUnSelect.png')
+        $('.ICD10 img').attr('src', '/images/radioSelect.png')
+        $(".radioList").show()
+        setTabBottomHei(1)
+      } else {
+        $(".radioList").hide()
+        setTabBottomHei(2)
+      }
+      let renderTabInfo = getTab(select_type)
+      renderTab(renderTabInfo)
+
+    })
+
+
+
+  } else {
+    $('.tabNameListNoSearch').show()
+  }
+})
+
+
+
+let renderTabInfo = getTab("疾病")
+renderTab(renderTabInfo)
+
+$(".tabList").click(function (e) {
+  e.stopPropagation()
+  hideSlide()
+})
+$(".hideTabList").click(function (e) {
+  e.stopPropagation()
+  hideSlide()
+})
+
+//点击页面其他地方关闭下拉
+$('html').click(function () {
+  hideSlide()
+  // const selectListShow = $('.selectList').css('display')
+  // const tabNameListShow = $('.tabNameList').css('display')
+  // const tabNameListNoSearchShow = $('.tabNameListNoSearch').css('display')
+  // const hideTabListShow = $('.hideTabList').css('display')
+  // if(selectListShow == 'block'){
+  //     $('.selectList').hide()
+  //     $('.iconSlide').attr('src','./images/iconSlideDown.png')
+  // }
+  // if(tabNameListShow == 'block'){
+  //     $('.tabNameList').hide()
+  // }
+  // if(tabNameListNoSearchShow == 'block'){
+  //     $('.tabNameListNoSearch').hide()
+  // }
+  // if(hideTabListShow == 'block'){
+  //     hideHideTab()
+  // }
+})
+
+
+
+
+let toggleTabHtml = ""
+$(".right-aside-collapse").on("click", function () {
+  isRightCollapse = !isRightCollapse
+
+  if (isRightCollapse) {
+    toggleTabHtml = $("#tabList > .toggleTab").html()
+    $("#tabList > .toggleTab").empty()
+    // document.querySelector('.toggleTab').style.display = 'none';
+    $(".right").animate({ "width": '110px' }, function () {
+    })
+    const contentWidth = $(".content").width()
+    const leftWidth = (contentWidth - 110).toString() + 'px'
+    // console.log("contentWidth", leftWidth);
+    $(".content .left").animate({ 'width': leftWidth, }, function () {
+      window.graphMap.resize()
+      // console.log("graphMap", window.graphMap)
+    })
+
+  } else {
+    $("#tabList > .toggleTab").html(toggleTabHtml)
+    $(".right").animate({ "width": '394px' })
+    const contentWidth = $(".content").width()
+    const leftWidth = (contentWidth - 394).toString() + 'px'
+    $(".content .left").animate({ 'width': leftWidth, }, function () {
+      window.graphMap.resize()
+      // console.log("graphMap", window.graphMap)
+    })
+  }
+})
+
+// 接收来自home.html的数据
+window.addEventListener("message", function (event) {
+  // console.log("message", event.data);
+  if (event.data.operation == "left-collapse") {
+    const contentWidth = $(".content").width()
+    // console.log("contentWidth", contentWidth)
+    let leftWidth = 0
+    if (isRightCollapse) {
+      leftWidth = (contentWidth - 110).toString() + 'px'
+      $(".content .left").css('width', leftWidth)
+
+    } else {
+      leftWidth = (contentWidth - 394).toString() + 'px'
+      $(".content .left").css('width', leftWidth)
+
+    }
+    // console.log("leftWidth", leftWidth);
+    window.graphMap.resize()
+  }
+  if (event.data.operation === 'update-graph') { //重新绘制关系图
+    reDrawGraph()
+  }
+})
+
+$("div[class*='contextmenu']").on("contextmenu", function (event) {
+  event.preventDefault()
+})
+
+$("div[class*='contextmenu'] .contextmenu-item").on("click", function () {
+  const opType = $(this).attr("data-id")
+  const title = $(this).attr("title")
+  const showFooter = true
+  const dialogVisible = true
+  const data = {
+    opType, title, data: window.knowledgeMapData, showFooter, dialogVisible
+  }
+  menuOperation(opType, data)
+})
+
+$(".dropdown[select='off'] .selectList .selectItem").on("click", function () {
+  const opType = $(this).attr("data-id")
+  const title = $(this).attr("title")
+  const showFooter = true
+  const dialogVisible = true
+  const data = {
+    opType, title, showFooter, dialogVisible, data: {}
+  }
+  menuOperation(opType, data)
+
+})
+
+
+
+
+
+// 自定义的菜单和部分下拉框的操作
+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': //展开属性
+      expandProperty(data.data, true)
+      break
+    case 'modifyEntityName-dropdown':
+      selectedName = $(".selectedName").html().trim()
+      searchInp = $("#searchInp").val().trim()
+      // console.log("modifyEntityName-dropdown", selectedName, searchInp);
+      data.data = { selectedName, searchInp }
+      window.parent.postMessage(data, parentURL);
+      break
+    case 'deleteEntity-dropdown':
+      selectedName = $(".selectedName").html().trim()
+      searchInp = $("#searchInp").val().trim()
+      // console.log("modifyEntityName-dropdown", selectedName, searchInp);
+      data.data = { selectedName, searchInp }
+      window.parent.postMessage(data, parentURL);
+      break
+    case 'deleteRelationship':
+      let endId = 0
+      let endLabel = "string"
+      let property = {}
+      let relationshipType = "string"
+      let startId = 0
+      let startLabel = "string"
+      window.graphMapUpdatedData.node.forEach((element, index) => {
+        if (index == data.data.target) {
+          endId = element.nodeId
+        }
+      });
+      window.parent.postMessage(data, parentURL);
+      break
+    case "modifyRelationshipName-dropdown":
+      data.showFooter = false
+      window.parent.postMessage(data, parentURL);
+      break
+    case "modifyProperty-dropdown":
+      data.showFooter = false
+      window.parent.postMessage(data, parentURL);
+      break
+    case "expandRelationships": //右键展开关系
+      if (data.data.name === 0 || data.data.expanded) return;
+
+      post(api.getGraph, {
+        "inputStr": data.data.properties.name,
+        "labelName": data.data.type
+      }).then(res => {
+        const { code, msg } = res.data
+        const nodeLength = window.graphMapUpdatedData.node.length
+        // let selected = {}
+        if (code === '0') {
+          res.data.data.node.forEach(node => {
+            if (!node.itemStyle.display && node.label && node.symbol == 'circle') {
+              node.symbol = 'pin'
+            }
+          });
+          const newNodeData = res.data.data
+          //添加新的类
+          // 判断有没有新添加的类型
+          for (let i = 2; i < newNodeData.categories.length; i++) {
+            let isCategory = false
+            for (let j = 0; j < window.graphMapUpdatedData.categories.length; j++) {
+              if (newNodeData.categories[i].name === window.graphMapUpdatedData.categories[j].name) {
+                isCategory = true
+                break
+              }
+            }
+            if (!isCategory) {
+              window.graphMapUpdatedData.categories.push(newNodeData.categories[i])
+              window.knowledgeMapSetting.legends.push(newNodeData.categories[i])
+              window.knowledgeMapSetting.selected[newNodeData.categories[i].name] = true
+            }
+          }
+
+          newNodeData.node.forEach((node, index) => {
+            let nodeIndex = -1
+            if (index === 0) {
+              nodeIndex = data.data.name
+              //标志该节点已经展开过
+              window.graphMapUpdatedData.node[nodeIndex].expanded = true
+            } else {
+              nodeIndex = nodeLength + index - 1
+              node.name = nodeIndex
+              for (let i = 0; i < window.graphMapUpdatedData.categories.length; i++) {
+                if (newNodeData.categories[node.category].name === window.graphMapUpdatedData.categories[i].name) {
+                  // console.log(newNodeData.categories[node.category].name, window.graphMapUpdatedData.categories[i].name, i)
+                  node.category = i
+                  break
+                }
+              }
+              window.graphMapUpdatedData.node.push(node)
+            }
+          })
+          newNodeData.links.forEach(link => {
+            if (link.source === 0) {
+              link.source = data.data.name
+            } else {
+              link.source += (nodeLength - 1)
+            }
+            if (link.target === 0) {
+              link.target = data.data.name
+            } else {
+              link.target += (nodeLength - 1)
+            }
+          })
+          window.graphMapUpdatedData.links = window.graphMapUpdatedData.links.concat(newNodeData.links)
+          // window.graphMapUpdatedData.links = [...window.graphMapUpdatedData.links, ...newNodeData.links]
+          let legendData = null
+          //重新计算showLegendNum
+          reShowLegendNum()
+          if (window.knowledgeMapSetting.showLegendAll) {
+            legendData = window.knowledgeMapSetting.legends.map(el => el.name)
+          } else {
+            legendData = window.knowledgeMapSetting.legends.slice(0, window.knowledgeMapSetting.showLegendNum).map(el => el.name)
+          }
+          reNodeCloseAndExpand()
+          window.graphMap.setOption({
+            legend: [{
+              selected: window.knowledgeMapSetting.selected,
+              data: legendData,
+            }],
+            series: [{
+              type: 'graph',
+              categories: window.graphMapUpdatedData.categories,
+              data: window.graphMapUpdatedData.node,  // 更新节点数据
+              links: window.graphMapUpdatedData.links,  // 更新边数据
+            }]
+          }, false);  // 仅更新指定的部分,不重绘图表
+
+        }
+      }).catch(err => {
+
+      })
+      break
+    case "addRelationship-dropdown":
+      window.parent.postMessage(data, parentURL);
+      break
+    case "closeAll":
+      nodeAllCloseAndExpand(false)
+      break
+    case "expandAll":
+      nodeAllCloseAndExpand(true)
+      break
+    default:
+      window.parent.postMessage(data, parentURL);
+  }
+}
+
+// 节点全部关闭和展开,flag为true代表全部展开,为false是全部关闭
+function nodeAllCloseAndExpand(flag) {
+  let selected = window.knowledgeMapSetting.selected
+  for (let key in selected) {
+    if (key !== "中心词" && key !== "关系") {
+      selected[key] = flag
+      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
+          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 }
+          }
+
+          targetIndex = -1
+          sourceIndex = -1
+          linkIndex = -1
+          // break
+        }
+      }
+      // console.log("key", key, "linkIndex", linkIndex)
+      // if (!(linkIndex >= 0)) continue;
+
+    }
+  }
+  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);  //
+
+}
+
+//重新隐藏之前的节点
+function reNodeCloseAndExpand() {
+  let selected = window.knowledgeMapSetting.selected
+  //隐藏(透明化)虚拟节点
+  for (let name in 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) {
+        targetIndex = window.graphMapUpdatedData.links[index].target
+        sourceIndex = window.graphMapUpdatedData.links[index].source
+        linkIndex = index
+        if (selected[name]) {
+          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 }
+        }
+        targetIndex = -1
+        sourceIndex = -1
+        linkIndex = -1
+      }
+    }
+  }
+}
+function reShowLegendNum() {
+  window.knowledgeMapSetting.showLegendNum = 0;
+  let sum = 0
+  for (let i = 0; i < window.knowledgeMapSetting.legends.length; i++) {
+    sum += 2 + window.knowledgeMapSetting.legends[i].name.length + 1
+    if (sum <= 60) {
+      window.knowledgeMapSetting.showLegendNum++
+    }
+  }
+  if (window.knowledgeMapSetting.legends.length > window.knowledgeMapSetting.showLegendNum) {
+    $('.legendSlideUp').toggleClass('legendSlideUp')
+    $('.legendIcon').css('display', "block")
+  } else {
+    $('.legendSlideUp').toggleClass('legendSlideUp')
+    $('.legendIcon').css('display', "none")
+  }
+  $(".category-num").html(`${window.knowledgeMapSetting.legends.length}`)
+}
+
+
+$(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")) {
+    $(this).attr("class", "icon-rect-selected")
+    // console.log("icon-rect-select")
+  } else {
+    $(this).attr("class", "icon-rect-select")
+    // console.log("icon-rect-selected")
+  }
+})
+// 右侧实体删除
+$(document).on("click", ".content .right .entity-node .delete-entity", function () {
+  if (confirm("确定要删除选中的实体吗?")) {
+    const entityNodeId = []
+    $(".content .right .entity-node .box-content .text").each(function (textIndex, textElement) {
+      if ($(textElement).find(".select-sign span").is(".icon-rect-selected")) {
+        entityNodeId.push(Number($(textElement).attr("nodeId")))
+        // $(textElement).remove()
+      }
+    })
+    post(api.deleteEntity, entityNodeId).then(res => {
+      const { data, code, msg } = res.data
+      if (code == '0') {
+        reDrawGraph()
+      }
+    }).catch(err => {
+      console.log("deleteEntity接口报错", err)
+    })
+    // console.log("entityNodeId", entityNodeId)
+  }
+
+})
+
+// 右侧实体合并
+$(document).on("click", ".content .right .entity-node .merge-entity", function () {
+  const entityNode = []
+  $(".content .right .entity-node .box-content .text").each(function (textIndex, textElement) {
+    if ($(textElement).find(".select-sign span").is(".icon-rect-selected")) {
+      entityNode.push(window.graphMapUpdatedData.node[Number($(textElement).attr("nodeIndex"))])
+      // $(textElement).remove()
+    }
+  })
+  if (entityNode.length !== 2) {
+    alert("实体合并只能选择两个")
+
+  } else if (entityNode[0].type !== entityNode[1].type) {
+    alert("合并的两个实体需要类型相同")
+  }
+  else {
+    const entityVO = {
+      "firstId": entityNode[0].nodeId,
+      "firstLabel": entityNode[0].type,
+      "firstName": entityNode[0].properties.name,
+      "newLabel": entityNode[0].type,
+      "newName": "",
+      "secondId": entityNode[1].nodeId,
+      "secondLabel": entityNode[1].type,
+      "secondName": entityNode[1].properties.name
+    }
+    const data = {
+      opType: "merge-entity",
+      showFooter: true,
+      dialogVisible: true,
+      data: entityVO,
+      title: "实体合并提示",
+    }
+    // console.log("entityVO", entityVO)
+    menuOperation(data.opType, data)
+  }
+
+})
+
+$(document).on("click", ".link-entity", function () {
+  const entityNode = []
+  $(".content .right .entity-node .box-content .text").each(function (textIndex, textElement) {
+    if ($(textElement).find(".select-sign span").is(".icon-rect-selected")) {
+      entityNode.push(window.graphMapUpdatedData.node[Number($(textElement).attr("nodeIndex"))])
+      // $(textElement).remove()
+    }
+  })
+  // console.log("entityNode", entityNode)
+  const data = {
+    opType: "entityLink",
+    showFooter: true,
+    dialogVisible: true,
+    data: {
+      categories: window.graphMapUpdatedData.categories,
+      entityNode: entityNode,
+    },
+    title: "实体链接提示",
+  }
+  menuOperation(data.opType, data)
+})
+
+
+
+Vue.use(ElementUI)
+setHei()
+ifHideLogo();
+function setHei() {
+  const clientHei = $(window).height()
+  const contentHei = 580
+  $(".left").css("height", contentHei + 'px')
+  $(".right").css("height", contentHei + 'px')
+  if (select_type == "疾病") {
+    setTabBottomHei(1)
+  } else {
+    setTabBottomHei(2)
+  }
+  $("#main").css("height", contentHei - 20 - 20 - 10 + 'px')
+}
+$(window).resize(function () {
+  setHei()
+  // getGraph(graphTxt,select_type);
+
+})
+
+const vm = new Vue({
+  el: "#app",
+  name: "selfKnowledgeGraph",
+  data() {
+    return {
+      isShowKG: false,
+      currentKnowledgeGraph: {
+        label: '症状',
+        name: "头痛"
+      },
+      listData: [
+        // {
+        //   id: 1,
+        //   title: "测试图1",
+        //   label: '症状',
+        //   name: "头痛"
+        // },
+        // {
+        //   id: 2,
+        //   title: "测试图2",
+        //   label: '症状',
+        //   name: "头痛"
+        // }
+      ]
+    }
+  },
+  methods: {
+    showKnowledgeGraph(id) {
+      // Object.assign(this.currentKnowledgeGraph, { ...data })
+      // this.currentKnowledgeGraph.label = data.label
+      // this.currentKnowledgeGraph.name = data.name
+      this.isShowKG = true
+      this.initGraph(id)
+    },
+    initGraph(id) {
+      window.graph_id = id //清除上一个关系图实例
+      let user_id = localStorage.getItem("userId") ? JSON.parse(localStorage.getItem("userId")) : 1
+      window.user_id = user_id
+      getGraph('艾滋病', '疾病', id)
+      getTree(user_id, id, '艾滋病')
+
+    },
+    getUserGraphs: function () {
+      get(api.userGraphs, {
+        user_id: localStorage.getItem("userId") ? JSON.parse(localStorage.getItem("userId")) : 1,
+        pageNo: 1,
+        pageSize: 10,
+      }).then(res => {
+        const { code, records } = res.data
+        if (code === 200) {
+          this.listData = [...records]
+        }
+      }).catch(e => {
+        console.log(e)
+      })
+    }
+  },
+  computed: {
+    kgUrl() {
+      return `./knowledgeGraph.html?self=true&input=${this.currentKnowledgeGraph.name}&label=${this.currentKnowledgeGraph.label}`;
+    }
+  },
+  watch: {
+
+  },
+  mounted() {
+    this.getUserGraphs()
+  },
+  beforeDestroy() {
+
+  },
+})
+
+module.exports = {
+  getTab,
+  renderTab
+}

+ 16 - 2
webpack.config.js

@@ -7,8 +7,8 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');
 const ExtractTextPlugin = require("extract-text-webpack-plugin");
 const webpack = require('webpack');
 // const proxyHost = "http://173.18.12.195:5050";
-// const proxyHost = "http://173.18.12.205:8086/healsphere";
-const proxyHost = "http://192.18.1.235:8000/open-platform"
+const proxyHost = "http://173.18.12.205:8086/healsphere";
+// const proxyHost = "http://192.18.1.235:8000/open-platform"
 // const proxyHost = "http://192.18.1.235:8000";
 // const proxyHost = "http://173.18.12.192:5050";
 module.exports = {
@@ -23,6 +23,7 @@ module.exports = {
     knowledgeUpdate: path.resolve(__dirname, 'src/js', 'knowledgeUpdate.js'),
     graphDataStatistics: path.resolve(__dirname, 'src/js', 'graphDataStatistics.js'),
     selfKnowledgeGraph: path.resolve(__dirname, 'src/js', 'selfKnowledgeGraph.js'),
+    selfKnowledgeUpdate: path.resolve(__dirname, 'src/js', 'selfKnowledgeUpdate.js'),
     vendor: 'lodash'// 多个页面所需的公共库文件,防止重复打包带入
   },
   output: {
@@ -74,6 +75,19 @@ module.exports = {
         collapseWhitespace: true //删除空白符与换行符
       }
     }),
+    new HtmlWebpackPlugin({
+      title: '自构建图谱更新',
+      template: path.resolve(__dirname, 'src/html', 'selfKnowledgeUpdate.html'),
+      filename: 'selfKnowledgeUpdate.html',
+      chunks: ['selfKnowledgeUpdate', 'vendor', 'common'],
+      inject: true,
+      hash: true, //防止缓存
+      minify: {
+        removeAttributeQuotes: true, //压缩 去掉引号
+        removeComments: true, //移除HTML中的注释
+        collapseWhitespace: true //删除空白符与换行符
+      }
+    }),
     new HtmlWebpackPlugin({
       title: '登录界面',
       template: path.resolve(__dirname, 'src/html', 'login.html'),