zhuliu 2 éve
szülő
commit
ec7725ad82

+ 20 - 27
RMS-FrontEnd/package-lock.json

@@ -2530,9 +2530,9 @@
       }
     },
     "base64-arraybuffer": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
-      "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
     },
     "base64-js": {
       "version": "1.5.1",
@@ -3999,11 +3999,11 @@
       }
     },
     "css-line-break": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.0.1.tgz",
-      "integrity": "sha512-gwKYIMUn7xodIcb346wgUhE2Dt5O1Kmrc16PWi8sL4FTfyDj8P5095rzH7+O8CTZudJr+uw2GCI/hwEkDJFI2w==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
+      "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
       "requires": {
-        "base64-arraybuffer": "^0.2.0"
+        "utrie": "^1.0.2"
       }
     },
     "css-loader": {
@@ -6206,12 +6206,12 @@
       }
     },
     "html2canvas": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.3.3.tgz",
-      "integrity": "sha512-nQi0ayEY1cMiUMbq/F5hRwMAqsRMo7NIP6VaCqaXnXO6b/FfZO49oSfIJjdyRha28EuY8D6FBCzQOXPQV0TCrA==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
+      "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
       "requires": {
-        "css-line-break": "2.0.1",
-        "text-segmentation": "^1.0.2"
+        "css-line-break": "^2.1.0",
+        "text-segmentation": "^1.0.3"
       }
     },
     "htmlparser2": {
@@ -11739,11 +11739,11 @@
       }
     },
     "text-segmentation": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.2.tgz",
-      "integrity": "sha512-uTqvLxdBrVnx/CFQOtnf8tfzSXFm+1Qxau7Xi54j4OPTZokuDOX8qncQzrg2G8ZicAMOM8TgzFAYTb+AqNO4Cw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
+      "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
       "requires": {
-        "utrie": "^1.0.1"
+        "utrie": "^1.0.2"
       }
     },
     "text-table": {
@@ -12305,18 +12305,11 @@
       "dev": true
     },
     "utrie": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.1.tgz",
-      "integrity": "sha512-JPaDXF3vzgZxfeEwutdGzlrNoVFL5UvZcbO6Qo9D4GoahrieUPoMU8GCpVpR7MQqcKhmShIh8VlbEN3PLM3EBg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
+      "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
       "requires": {
-        "base64-arraybuffer": "^1.0.1"
-      },
-      "dependencies": {
-        "base64-arraybuffer": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz",
-          "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA=="
-        }
+        "base64-arraybuffer": "^1.0.2"
       }
     },
     "uuid": {

+ 1 - 1
RMS-FrontEnd/package.json

@@ -14,7 +14,7 @@
     "core-js": "^3.6.5",
     "echarts": "^5.2.2",
     "element-ui": "^2.15.7",
-    "html2canvas": "^1.3.3",
+    "html2canvas": "^1.4.1",
     "js-cookie": "^3.0.1",
     "less": "^4.1.2",
     "less-loader": "^5.0.0",

+ 7 - 0
RMS-FrontEnd/src/api/patent.js

@@ -75,4 +75,11 @@ export default{
       params: params
     })
   },
+
+   /**
+   * 获取权要树
+   */
+   queryPatentRightTree(params) {
+    return axios.get('/v2/patentRight/queryPatentRightTree', {params})
+  },
 }

+ 11 - 3
RMS-FrontEnd/src/icons/icon2/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4121381 */
-  src: url('iconfont.woff2?t=1690508543387') format('woff2'),
-       url('iconfont.woff?t=1690508543387') format('woff'),
-       url('iconfont.ttf?t=1690508543387') format('truetype');
+  src: url('iconfont.woff2?t=1693990073029') format('woff2'),
+       url('iconfont.woff?t=1693990073029') format('woff'),
+       url('iconfont.ttf?t=1693990073029') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,14 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-zhankai-zhijiao:before {
+  content: "\e6f1";
+}
+
+.icon-shouqi-zhijiao:before {
+  content: "\e6f2";
+}
+
 .icon-yanjing_yincang:before {
   content: "\eb45";
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 1
RMS-FrontEnd/src/icons/icon2/iconfont.js


+ 14 - 0
RMS-FrontEnd/src/icons/icon2/iconfont.json

@@ -6,6 +6,20 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "15490195",
+      "name": "展开-直角",
+      "font_class": "zhankai-zhijiao",
+      "unicode": "e6f1",
+      "unicode_decimal": 59121
+    },
+    {
+      "icon_id": "15490196",
+      "name": "收起-直角",
+      "font_class": "shouqi-zhijiao",
+      "unicode": "e6f2",
+      "unicode_decimal": 59122
+    },
+    {
       "icon_id": "5387735",
       "name": "眼睛_隐藏",
       "font_class": "yanjing_yincang",

BIN
RMS-FrontEnd/src/icons/icon2/iconfont.ttf


BIN
RMS-FrontEnd/src/icons/icon2/iconfont.woff


BIN
RMS-FrontEnd/src/icons/icon2/iconfont.woff2


+ 4 - 0
RMS-FrontEnd/src/main.js

@@ -29,6 +29,10 @@ Vue.use(directive)
 import myRichText from '@/views/components/common/RichText/index'
 Vue.use(myRichText);
 
+import direct from './utils/direct'
+Vue.use(direct)
+import model from './utils/model'
+Vue.use(model)
 
 import VueQuillEditor from 'vue-quill-editor'
 import 'quill/dist/quill.core.css'

+ 105 - 0
RMS-FrontEnd/src/utils/direct/drag.js

@@ -0,0 +1,105 @@
+/**
+ * 拖拽移动
+ * @param  {elementObjct} bar 鼠标点击控制拖拽的元素
+ * @param {elementObjct}  target 移动的元素
+ * @param {function}  callback 移动后的回调
+ */
+ export function startDrag(bar, target, callback) {
+    var params = {
+      top: 0,
+      left: 0,
+      currentX: 0,
+      currentY: 0,
+      flag: false,
+      cWidth: 0,
+      cHeight: 0,
+      tWidth: 0,
+      tHeight: 0
+    };
+   
+    // 给拖动块添加样式
+    bar.style.cursor = 'move';
+   
+    // 获取相关CSS属性
+    // o是移动对象
+    // var getCss = function (o, key) {
+    //   return o.currentStyle ? o.currentStyle[key] :             document.defaultView.getComputedStyle(o, false)[key];
+    // };
+   
+    bar.onmousedown = function (event) {
+      // 按下时初始化params
+      var e = event ? event : window.event;
+      params = {
+        top: target.offsetTop,
+        left: target.offsetLeft,
+        currentX: e.clientX,
+        currentY: e.clientY,
+        flag: true,
+        cWidth: document.body.clientWidth,
+        cHeight: document.body.clientHeight,
+        tWidth: target.offsetWidth,
+        tHeight: target.offsetHeight
+      };
+   
+      // 给被拖动块初始化样式
+      target.style.margin = 0;
+      target.style.top = params.top + 'px';
+      target.style.left = params.left + 'px';
+   
+      if (!event) {
+        // 防止IE文字选中
+        bar.onselectstart = function () {
+          return false;
+        }
+      }
+   
+      document.onmousemove = function (event) {
+        // 防止文字选中
+        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
+   
+        var e = event ? event : window.event;
+        if (params.flag) {
+          var nowX = e.clientX;
+          var nowY = e.clientY;
+          // 差异距离
+          var disX = nowX - params.currentX;
+          var disY = nowY - params.currentY;
+          // 最终移动位置
+          var zLeft = 0;
+          var zTop = 0;
+   
+          zLeft = parseInt(params.left) + disX;
+          // 限制X轴范围
+          if (zLeft <= -parseInt(params.tWidth / 2)) {
+            zLeft = -parseInt(params.tWidth / 2);
+          }
+          if (zLeft >= params.cWidth - parseInt(params.tWidth * 0.5)) {
+            zLeft = params.cWidth - parseInt(params.tWidth * 0.5);
+          }
+   
+          zTop = parseInt(params.top) + disY;
+          // 限制Y轴范围
+          if (zTop <= 0) {
+            zTop = 0;
+          }
+          if (zTop >= params.cHeight - parseInt(params.tHeight * 0.5)) {
+            zTop = params.cHeight - parseInt(params.tHeight * 0.5);
+          }
+   
+          // 执行移动
+          target.style.left = zLeft + 'px';
+          target.style.top = zTop + 'px';
+        }
+   
+        if (typeof callback == "function") {
+          callback(zLeft, zTop);
+        }
+      }
+   
+      document.onmouseup = function () {
+        params.flag = false;
+        document.onmousemove = null;
+        document.onmouseup = null;
+      };
+    };
+  }

+ 246 - 0
RMS-FrontEnd/src/utils/direct/index.js

@@ -0,0 +1,246 @@
+// 引入拖拽js
+import { startDrag } from './drag.js'
+ 
+/**
+ * 为el-dialog弹框增加拖拽功能
+ * @param {*} el 指定dom
+ * @param {*} binding 绑定对象
+ * desc   只要用到了el-dialog的组件,都可以通过增加v-draggable属性变为可拖拽的弹框
+ */
+const draggable = (el, binding) => {
+    // 绑定拖拽事件 [绑定拖拽触发元素为弹框头部、拖拽移动元素为整个弹框]
+    startDrag(el.querySelector('.el-dialog__header'), el.querySelector('.el-dialog'), binding.value);
+};
+
+const dragControllerDiv=(el, binding)=>{
+  var resize = el.children[1];
+  var left =el.children[0];
+  var mid = el.children[2];
+  var box = el;
+  // if(!resize){
+  //   return false
+  // }
+  resize.onmousedown = function (e) {
+    //颜色改变提醒
+    resize.style.background = '#818181';
+    var startX = e.clientX;
+    resize.left = resize.offsetLeft;
+    // 鼠标拖动事件
+    document.onmousemove = function (e) {
+        var endX = e.clientX;
+        var moveLen = resize.left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+        var maxT = box.clientWidth - resize.offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+
+        if (moveLen < 32) moveLen = 32; // 左边区域的最小宽度为32px
+        if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px
+
+        resize.style.left = moveLen; // 设置左侧区域的宽度
+
+            left.style.width = moveLen + 'px';
+           if(mid){
+            mid.style.width = (box.clientWidth - moveLen - 10) + 'px';
+           }
+        
+    };
+    // 鼠标松开事件
+    document.onmouseup = function (evt) {
+        //颜色恢复
+        resize.style.background = '#d6d6d6';
+        document.onmousemove = null;
+        document.onmouseup = null;
+        resize.releaseCapture && resize.releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
+    };
+    resize.setCapture && resize.setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
+    return false;
+};
+ 
+};
+const dragControllerDiv1=(el,binding)=>{
+  var resize1 = el.children[2];
+  var resize2 = el.children[1];
+  var left = el.children[0];
+  var mid = el.children[3];
+  var box = el;
+  if(resize2){
+    dragControllerDiv2(el,binding)
+    // return false
+  }
+      // 鼠标按下事件
+      resize1.onmousedown = function (e) {
+        var flex = box.style.flexDirection
+        switch (flex) {
+          case 'row-reverse':
+            resize1.left = mid.offsetWidth;
+              break;
+          case 'row':
+            resize1.left = left.offsetWidth;
+              break;
+          case 'column-reverse':
+              break;
+          case 'column':
+              break;
+          default:
+              break;
+      }
+          //颜色改变提醒
+          resize1.style.background = '#818181';
+          var startX = e.clientX;
+          // resize1.left = resize1.offsetLeft-50;
+          // 鼠标拖动事件
+          document.onmousemove = function (e) {
+             
+              var endX = e.clientX;
+              var moveLen = resize1.left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+              var maxT = box.clientWidth - resize1.offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+
+              if (moveLen < 32) moveLen = 32; // 左边区域的最小宽度为32px
+              if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px
+
+              // resize1.style.left = moveLen; // 设置左侧区域的宽度
+
+                  switch (flex) {
+                      case 'row-reverse':
+                          mid.style.width = moveLen + 'px';
+                          if(left){
+                           left.style.width = (box.clientWidth - moveLen - 10) + 'px';
+                          }
+                          break;
+                      case 'row':
+                          left.style.width = moveLen + 'px';
+                          if(mid){
+                              mid.style.width = (box.clientWidth - moveLen - 10) + 'px';
+                          }
+                          break;
+                      case 'column-reverse':
+                          
+                          break;
+                      case 'column':
+                          
+                          break;
+                      default:
+                          break;
+                  }
+             
+              
+          };
+          // 鼠标松开事件
+          document.onmouseup = function (evt) {
+              //颜色恢复
+              resize1.style.background = '#d6d6d6';
+              document.onmousemove = null;
+              document.onmouseup = null;
+              resize1.releaseCapture && resize1.releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
+          };
+          resize1.setCapture && resize1.setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
+          return false;
+        }
+};
+const dragControllerDiv2=(el,binding)=> {
+  var resize1 = el.children[1];
+  // var resize2 = el.children[1];
+  var left = el.children[0];
+  var mid = el.children[3];
+  var box = el
+  mid.style.width = '100%'
+  left.style.width = '100%'
+      // 鼠标按下事件
+      resize1.onmousedown = function (e) {
+          var flex = box.style.flexDirection
+          switch (flex) {
+              case 'row-reverse':
+                 
+                  break;
+              case 'row':
+                  
+                  break;
+              case 'column-reverse':
+                  resize1.top = mid.offsetHeight;
+                  break;
+              case 'column':
+                  resize1.top = left.offsetHeight;
+                  break;
+              default:
+                  break;
+          }
+          //颜色改变提醒
+          resize1.style.background = '#818181';
+          var startX = e.clientY;
+          // resize1[i].top = resize1[i].offsetTop;
+          // 鼠标拖动事件
+          document.onmousemove = function (e) {
+              var endX = e.clientY;
+              var moveLen = resize1.top + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+              var maxT = box.clientHeight - resize1.offsetHeight; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+              if (moveLen < 150) moveLen = 150; // 左边区域的最小宽度为32px
+              if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px
+
+              resize1.style.top = moveLen; // 设置左侧区域的宽度
+                  switch (flex) {
+                      case 'row-reverse':
+                         
+                          break;
+                      case 'row':
+                          
+                          break;
+                      case 'column-reverse':
+                          mid.style.height = moveLen + 10 + 'px';
+                          if(left){
+                              left.style.height = (box.clientHeight - moveLen ) + 'px';
+                          }
+                          break;
+                      case 'column':
+                          left.style.height = moveLen + 10 + 'px';
+                          if(mid){
+                              mid.style.height = (box.clientHeight - moveLen ) + 'px';
+                          }
+                          break;
+                      default:
+                          break;
+                  }
+             
+          };
+          // 鼠标松开事件
+          document.onmouseup = function (evt) {
+              //颜色恢复
+              resize1.style.background = '#d6d6d6';
+              document.onmousemove = null;
+              document.onmouseup = null;
+              resize1.releaseCapture && resize1.releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
+          };
+          resize1.setCapture && resize1.setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
+          return false;
+        }
+};
+//下拉框懒加载
+const SelectLazyLoading=(el,binding)=>{
+   
+    let SELECT_DOM = el.querySelector(
+      ".el-select-dropdown .el-select-dropdown__wrap"
+    );
+    if(!SELECT_DOM){
+        return false
+    }
+    SELECT_DOM.addEventListener("scroll", function () {
+        // scrollHeight:当前所有选项的高度
+      // scrollTop:滚动的距离
+      // clientHeight:下拉框的高度
+      let condition = this.scrollHeight - this.scrollTop - 1 <= this.clientHeight;
+      if (condition) {
+        binding.value();
+      }
+    });
+}
+const directives = {
+    draggable,
+    dragControllerDiv,
+    dragControllerDiv1,
+    SelectLazyLoading
+};
+// 这种写法可以批量注册指令
+export default {
+  install(Vue) {
+      Object.keys(directives).forEach((key) => {
+      Vue.directive(key, directives[key]);
+    });
+  },
+};

+ 16 - 0
RMS-FrontEnd/src/utils/model/index.js

@@ -0,0 +1,16 @@
+// 全局注册自定义
+// import myCustomSvg from '@/views/visual/componentsSvg/customSvg.vue';
+import myCustomSvg from './svg/customSvg.vue';
+import myTree from './tree/index.vue';
+
+var models = {
+  myCustomSvg,
+  myTree
+}
+export default {
+  install(Vue) {
+      Object.keys(models).forEach((key) => {
+        Vue.component(key, models[key]);
+      });
+  },
+};

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 208 - 0
RMS-FrontEnd/src/utils/model/svg/Popover.vue


+ 133 - 0
RMS-FrontEnd/src/utils/model/svg/customSvg.vue

@@ -0,0 +1,133 @@
+<template>
+  <!-- 自定义组件 -->
+  <div class="customSvg" >
+    <!-- 用来存放svg -->
+    <div class="svgDiv" v-html="html">
+    </div>
+    <myPopover :QuestionTotal="QuestionTotal"></myPopover>
+  </div>
+</template>
+
+<script>
+import mixins from "./mixins";
+import MyPopover from './Popover.vue'
+export default {
+  components: {
+    MyPopover
+  },
+  mixins: [mixins],
+  props: {
+    title: {
+      type: String,
+      default: '竞争对手威胁应对'
+    },
+  },
+  watch: {
+    'QuestionTotal'(val) {
+      if (val && Object.keys(this.total).length > 0 && Object.keys(this.QuestionTotal).length > 0) {
+        this.getHtml()
+      }
+    },
+    'total'(val) {
+      if (val && Object.keys(this.total).length > 0 && Object.keys(this.QuestionTotal).length > 0) {
+        this.getHtml()
+      }
+    }
+  },
+  data() {
+    return {
+      svgData: [
+        {
+          title: '专利培育布局',
+          value: '../专利培育布局A1.svg'
+        },
+        {
+          title: '产品上市/出口风险控制',
+          value: '../产品上市出口风险控制A2.svg'
+        },
+        {
+          title: '侵权纠纷',
+          value: '../侵权纠纷A3.svg'
+        },
+        {
+          title: '专利维权',
+          value: '../专利维权A4.svg'
+        },
+        {
+          title: 'IPO上市',
+          value: '../IPO上市A5.svg'
+        },
+        {
+          title: '专利盘点与运维',
+          value: '../专利盘点与运维A6.svg'
+        },
+        {
+          title: '科技与重大立项专利导航',
+          value: '../科技与重大立项专利导航A7.svg'
+        },
+        {
+          title: '竞争对手威胁应对',
+          value: '../竞争对手威胁应对A8.svg'
+        },
+      ],
+      html: '',
+      fileContent:''
+    }
+  },
+  async mounted() {
+    await this.init()
+  },
+  methods: {
+    async init() {
+      // 需要显示哪一个svg文件
+      let show = this.svgData.find(item => {
+        return item.title == this.title
+      });
+      // 展示svg文件
+      await fetch(show.value).then(res => res.text()).then(data => {
+        this.fileContent = data
+        if (Object.keys(this.total).length > 0 && Object.keys(this.QuestionTotal).length > 0) {
+          this.getHtml()
+        }
+      })
+    },
+    getHtml() {
+        var data = this.fileContent
+        let reg = new RegExp("\{\{(.+?)\}\}", "g");
+        let a = data.match(reg);
+        let reg1 = new RegExp("(?<=\{\{)(.*)?(?=\}\})",'g')
+        a.forEach(item => {
+          var arr = item.match(reg1)[0].split(/\,|\,/)
+          if (arr[1].trim() == 1) {
+            var value = this.getQuestionTotal(arr[0].trim())
+          } else if (arr[1].trim() == 2) {
+            var value = this.getTotal(arr[0].trim())
+          } else {
+            var num = this.getTotal(arr[0].trim())
+            var value = num>0?arr[1].trim():'#63769b69'
+          }
+          data = data.replace(item, value);
+        })
+        this.html = data;
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.customSvg{
+  position: relative;
+  width: 100%;
+  height: 100%;
+  .svgDiv{
+    position: absolute;
+    left: 0; 
+    top: 0;
+    bottom:0;
+    right:0;
+    margin:auto;
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>

+ 44 - 0
RMS-FrontEnd/src/utils/model/svg/mixins.js

@@ -0,0 +1,44 @@
+// import Popover from './Popover'
+import Question from './question.vue'
+export default {
+  props: {
+    total: Object,
+    QuestionTotal:Array,
+    questionName:String
+  },
+  components: {
+    // Popover,
+    Question
+  },
+
+  data() {
+    return {}
+  },
+  methods: {
+    handleClick(type) {
+      this.$emit('on-click', type)
+    },
+    getTotal(type) {
+      const total = this.total[type]
+      if (total) {
+        return total
+      }
+      return 0
+    },
+    getQuestionTotal(type) {
+      if(this.QuestionTotal.length>0){
+        const total = this.QuestionTotal.find(item=>{return item.applicationScenarioName == type}).eventNumber
+        if (total) {
+          return total
+        }
+      }
+      
+      return 0
+    },
+    getQuestionId(type){
+      if(this.QuestionTotal.length>0){
+         return this.QuestionTotal.find(item=>{return item.applicationScenarioName == type})
+      }
+    },
+  }
+}

+ 149 - 0
RMS-FrontEnd/src/utils/model/svg/question.vue

@@ -0,0 +1,149 @@
+<template>
+  <div>
+    <div style="height: 300px; overflow: auto" v-infinite-scroll="load">
+      <el-table
+        :data="tableData"
+        border
+        header-row-class-name="custom-table-header"
+        v-loading="loading"
+        @sort-change="sortChange"
+        element-loading-text="请耐心等待,数据正在加载中..."
+      >
+        <el-table-column label="#" type="index" align="center" width="55">
+          <template slot-scope="scope">
+            <div>
+              <!-- <el-checkbox-group
+                v-model="checkList"
+                style="display: inline-block"
+              >
+                <el-checkbox
+                  :label="scope.row.id"
+                >
+                  <span>{{ scope.$index + 1 + (queryParams.current - 1) * queryParams.size }}</span>
+                </el-checkbox>
+              </el-checkbox-group> -->
+              <span>{{ scope.$index + 1 + (queryParams.current - 1) * queryParams.size }}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="事件名称"
+          prop="questionName"
+          align="center"
+          width="150px"
+          sortable="custom"
+          show-overflow-tooltip
+        >
+          <template slot="header">
+            <span>
+              <el-tooltip
+                class="item"
+                effect="dark"
+                content="事件:商业目标/解决问题/对应项目"
+                placement="top"
+              >
+                <span>事件名称</span>
+              </el-tooltip>
+            </span>
+          </template>
+          <template slot-scope="scope">
+            <div>
+              <el-link type="primary" @click="checkQuestion(scope.row)">{{
+                scope.row.questionName
+              }}</el-link>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="描述"
+          prop="description"
+          align="center"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column
+          label="事件时间"
+          prop="eventDate"
+          align="center"
+          width="200px"
+          sortable="custom"
+          show-overflow-tooltip
+        ></el-table-column>
+        <!-- <el-table-column label="创建人" prop="createPersonName" align="center" width="200px" show-overflow-tooltip></el-table-column>
+        <el-table-column label="创建时间" prop="createTime" align="center" width="200px" sortable="custom" show-overflow-tooltip></el-table-column> -->
+      </el-table>
+    </div>
+    <!-- <div style="margin-top:20px;display:flex; justify-content: flex-end;">
+        <el-button type="primary" size="small" style="width:150px" @click="submit">确定</el-button>
+    </div> -->
+    <!-- <div class="pagination">
+        <el-pagination :current-page.sync="queryParams.current" :page-size="queryParams.size" :total="total"
+            @current-change="handleCurrentChange" layout="total, prev, pager, next, jumper" background></el-pagination>
+        </div> -->
+  </div>
+</template>
+<script>
+export default {
+  props: ["type"],
+  data() {
+    return {
+      tableData: [],
+      checkList: [],
+      total: 1,
+      queryParams: {
+        current: 1,
+        size: 10,
+      },
+      loading: false,
+    };
+  },
+  watch: {
+    type(val) {
+      if (val) {
+        this.getList2();
+      }
+      
+    },
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    load() {
+      if (this.total > this.queryParams.current * this.queryParams.size) {
+        this.queryParams.current += 1
+        this.getList();
+      }
+    },
+    submit(){
+        this.$emit("questionId", {ids:this.checkList,type:this.type});
+    },
+    checkQuestion(row) {
+        var arr = [row]
+      this.$emit("questionId", {questions:arr,type:this.type.applicationScenarioName});
+    },
+    handleCurrentChange(val) {
+      this.queryParams.current = val;
+      this.getList();
+    },
+    getList() {
+      // console.log(this.type)
+      if(!this.type){
+        return false
+      }
+      this.tableData = []
+      this.queryParams.applicationScenario =this.type? this.type.applicationScenarioValue:null
+      this.$api.queryByApplicationScenario(this.queryParams).then(response=>{
+        if(response.code == 200){
+          this.tableData = this.tableData.concat(response.data.list)
+          this.total = response.data.totalSizes
+        }
+      })
+    },
+    getList2() {
+      this.queryParams.current = 1;
+      this.getList();
+    },
+    sortChange() {},
+  },
+};
+</script>

+ 274 - 0
RMS-FrontEnd/src/utils/model/tree/index.vue

@@ -0,0 +1,274 @@
+<template>
+    <div>
+      <ul class="all-list" v-if='show'>
+        <li v-for="(item) in list" :key="item[nodeKey]">
+          <div class="tree-item expend">
+            <!-- 使用vuex保存选中状态,勾选父组件,自动选中其全部子组件 -->
+            <input type="checkbox" :checked="checked.includes(item.id)" @click="changeBox(item)" v-if="showCheck" />
+            <div
+              class="icon-size"
+              @click="toggle(item[nodeKey])"
+              
+            >
+            <span :style="{visibility:(item[props.children] && item[props.children].length)? '':'hidden'}">
+              <i class="iconfont icon-zhankai-zhijiao" v-if="!openArr.includes(item[nodeKey])"></i>
+                <i class="iconfont icon-shouqi-zhijiao" v-else></i>  
+            </span>
+            </div>
+            <div :id="'right' + item.sort">
+                <span class="content" style="
+                      word-break: break-word;
+                      white-space: normal;
+                      height: 100%;
+                    ">{{ item[props.name] }}</span>
+            </div>
+            
+          </div>
+          <!-- 递归 -->
+          <div
+            v-show="openArr.includes(item[nodeKey])"
+          >
+            <leftTree class="item" :list="item[props.children]" :props="props" :nodeKey="nodeKey" :expends="openArr" :inner="true"></leftTree>
+          </div>
+        </li>
+      </ul>
+    </div>
+</template>
+   
+  <script>
+  export default {
+    name: "leftTree",
+    data() {
+      return {
+        // expends: [],
+        checkboxIds: [],
+        checked:[],
+        treeNode:[],
+        openArr:this.expends,
+        show:true
+      };
+    },
+    props: {
+      list: {
+        type: Array,
+        default:()=>{
+            return []
+        }
+      },
+      showCheck:{
+        default:false
+      },
+      props:{
+        default:()=>{
+            return {
+                name:'name',
+                children:'children'
+            }
+        }
+      },
+      nodeKey:{
+        default:'id'
+      },
+      expends:{
+        default:()=>{
+            return []
+        }
+      },
+      inner:{}
+    },
+   mounted() {
+    this.getAllNode(this.list)
+   },
+   watch:{
+    expends(val){
+        var data = [...new Set(this.openArr.concat(val))]
+        this.openNode(data)
+    },
+    list(){
+        this.getAllNode(this.list)
+        
+    }
+   },
+    methods: {
+        getAllNode(data,parentNode){
+            if(data.length>0){
+                data.forEach(item => {
+                    this.treeNode.push(
+                        {
+                            nodeKey:item[this.nodeKey],
+                            parentNode:parentNode
+                        }
+                    )
+                    if(item.children && item.children.length){
+                        this.getAllNode(item.children,item[this.nodeKey])
+                    }
+                });
+            }
+            if(this.openArr.length>0){
+                this.openNode(this.openArr)
+            }
+            // var arr = JSON.parse(JSON.stringify(this.expends))
+            // this.expends.forEach(item => {
+            //     this.parentNode(item)
+            // });
+        },
+        openNode(data){
+            var arr = JSON.parse(JSON.stringify(data))
+            data.forEach(item=>{
+                var a = this.treeNode.find(i=>{
+                    return i.nodeKey == item
+                })
+                if(a){
+                    if(a.parentNode==0 || a.parentNode){
+                        if(arr.indexOf(a.parentNode)==-1){
+                            arr.push(a.parentNode)
+                        }
+                        this.parentNode(arr,a.parentNode)
+                    }
+                }
+            })
+            this.$set(this,'openArr',arr)
+            // this.show = false
+            // this.$nextTick(()=>{
+            //     this.show = true
+            // })
+            // this.openArr = arr
+        },
+        parentNode(arr,nodeKey){
+            var a = this.treeNode.find(i=>{
+                return i.nodeKey == nodeKey
+            })    
+            if(a){
+                if(a.parentNode==0 || a.parentNode){
+                    if(arr.indexOf(a.parentNode)==-1){
+                        arr.push(a.parentNode)
+                    }
+                    this.parentNode(arr,a.parentNode)
+                }
+            }                    
+        },
+      toggle(i) {
+        // 如果有则删除
+        if (this.openArr.includes(i)) {
+          let index = this.openArr.indexOf(i);
+          this.openArr.splice(index, 1);
+        } else {
+          // 如果没有则添加
+          this.openArr.push(i);
+        }
+      },
+   
+      changeBox(data) {
+        this.checked = data
+      }
+    },
+  };
+  </script>
+  <style lang='scss' scoped>
+  .item {
+    // padding-left: 4px;
+  }
+  .bold {
+    font-weight: bold;
+  }
+  ul {
+    line-height: 1.5em;
+    list-style-type: none;
+    white-space: nowrap;
+    position: relative;
+  }
+  li {
+    list-style-type: none;
+    padding: 4px;
+    user-select: none;
+  }
+  input[type="checkbox"] {
+    position: relative;
+    cursor: pointer;
+    display: inline-block;
+    vertical-align: middle;
+    margin: 1.5px;
+    margin-right: 4px;
+    z-index: 0;
+  }
+   
+  .tree-item {
+    display: flex;
+    // align-items: center;
+  }
+  .expend {
+    position: relative;
+  }
+   
+  .expend::before {
+    content: "";
+    position: absolute;
+    width: 6px;
+    // left: 15px;
+    top: 9px;
+    border-top: 1px dotted #c3c5c8;
+  }
+   
+  .all-list::before {
+    content: "";
+    position: absolute;
+    width: 1px;
+    height: calc(100% - 40px);
+    // left: 12px;
+    // top: 20px;
+    border-left: 1px dotted #c3c5c8;
+  }
+   
+  .item .expend::before {
+    content: "";
+    position: absolute;
+    width: 6px;
+    left: -4px;
+    top: 9px;
+    border-top: 1px dotted #c3c5c8;
+  }
+   
+  .item .all-list::before {
+    content: "";
+    position: absolute;
+    width: 1px;
+    height: calc(100% - 12px);
+    // left: 22px;
+    top: 0;
+    border-left: 1px dotted #c3c5c8;
+  }
+   
+  .item ul {
+    height: 100%;
+    // padding-left: 2em;
+  }
+   
+  .content {
+    // padding-left: 4px;
+  }
+  .spacing {
+    display: inline-block;
+    width: 18.5px;
+    height: 1em;
+  }
+  .icon-size {
+    display: inline-block;
+    width: 30px;
+    height: 30px;
+    z-index: 10;
+    margin-right: 4px;
+    margin-left:-20px;
+    i{
+        font-size: 30px;
+    }
+  }
+   
+//   .expend-icon {
+//     background: url("../../../assets/tree/expend.png") #05193a no-repeat center;
+//     background-size: cover;
+//   }
+//   .reduce-icon {
+//     background: url("../../../assets/tree/reduce.png") #05193a no-repeat center;
+//     background-size: cover;
+//   }
+  </style>

+ 275 - 6
RMS-FrontEnd/src/views/components/articles/components/PatentRight.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="patent-articles-patent-right" @mouseup="mouseup" @mousemove="mousemove">
-    <el-tabs v-model="name">
+    <el-tabs v-model="name"  @tab-click="handleClick">
       <el-tab-pane label="原文" name="0" :style="{height: height + 'px',overflowY: 'auto'}">
         <!-- <p class="common" v-for="(item, index) in records.original">
           <span v-if="item" :data-type="'权利要求原文'+(index+1)"  v-html="getViewDom(item,'权利要求原文'+(index+1))"></span>
@@ -16,6 +16,37 @@
       <el-tab-pane v-if="(signPatentNo == patent.patentNo) && type1!=7" label="权利特征" name="2" :style="{height: height + 'px',overflowY: 'auto'}">
           <Features :patentNo="signPatentNo" :reportId="reportId"></Features>
       </el-tab-pane>
+      <el-tab-pane
+        label="权要树"
+        name="2"
+        :style="{ height: height + 'px', overflowY: 'auto' }"
+      >
+        <div class="box" ref="box" v-dragControllerDiv :style="setStyle()" style="height:calc(100% - 20px)">
+          <div
+            class="left tree"
+            style="width: 70%"
+            :style="{ height: height + 'px', overflowY: 'auto' }"
+          >
+            <myTree :list="patent.patentRightTree" style="height: 100%" :props="{
+              name:'content',
+              children:'children'
+            }" nodeKey="sort" :expends="expends"></myTree>
+          </div>
+          <div class="resize" title="收缩侧边栏" style="width: 10px">⋮</div>
+          <div class="mid" id="chart" style="width: calc(100% - 30% - 10px);overflow:auto">
+            <!--右侧div内容-->
+            <div
+            id="charts"
+              style="max-width: 100%; min-width: 300px;position:relative"
+              v-if="show">
+              <div v-for="(item,index) in this.patent.patentRightTree" :key="index" :id="'chart'+index" style="width:500px;margin:0 auto;"></div>
+            </div>
+            <div style="position:absolute;top:10px;right:20px;">
+              <el-link type="primary" @click="imageDownLoad">下载为图片</el-link>
+            </div>
+          </div>
+        </div>
+      </el-tab-pane>
     </el-tabs>
   </div>
 </template>
@@ -25,7 +56,7 @@ import { addContrast } from './mixins'
 import { commonMixins } from "./mixins"
 import Features from './features.vue'
 import { patentKeywordsHighlight,changeTranslation } from "@/views/components/common/mixins";
-
+import html2canvas from "html2canvas"
 export default {
   components:{
     Features
@@ -34,6 +65,11 @@ export default {
   mixins: [commonMixins,addContrast,patentKeywordsHighlight,changeTranslation],
   data() {
     return {
+      expends: [],
+      show:false,
+      isClickId: "",
+      scrollTop:0,
+      isClick:false,
       height: 0,
       fullHeight: document.documentElement.clientHeight,
       records: {
@@ -43,9 +79,9 @@ export default {
     }
   },
   watch: {
-    fullHeight() {
-      this.refresh()
-    },
+    // fullHeight() {
+    //   this.refresh()
+    // },
     patentId() {
       this.initData()
     },
@@ -54,7 +90,12 @@ export default {
          this.initData()
       }
      
-    }
+    },
+    name(){
+      if(this.name!=2){
+        this.show = false
+      }
+    },
   },
   created() {
     window.addEventListener('resize', this.handleResize)
@@ -64,6 +105,234 @@ export default {
     this.initData()
   },
   methods: {
+    handleClick(tab, event) {
+      this.show = true
+      if (this.name == 2 && !this.patent.patentRightTree) {
+        this.$api
+          .queryPatentRightTree({ patentNo: this.patent.patentNo })
+          .then((response) => {
+            if (response.code == 200) {
+              this.$set(this.patent, "patentRightTree", response.data);
+              this.$nextTick(()=>{
+                this.getEchart();
+              })
+             
+            }
+          });
+      } else if(this.name == 2 && this.patent.patentRightTree) {
+        this.$nextTick(()=>{
+          this.getEchart();
+        })
+      }
+    },
+    imageDownLoad(){
+      var dom = document.getElementById('charts')
+      html2canvas(dom).then(canvas => {
+        // 转成图片,生成图片地址
+         var imgUrl = canvas.toDataURL("image/png");
+         var blob = this.base64ToBlob(imgUrl)
+         var eleLink = document.createElement("a");
+          eleLink.href = URL.createObjectURL(blob); // 转换后的图片地址
+          eleLink.download = "权要树";
+          document.body.appendChild(eleLink);
+          // 触发点击
+          eleLink.click();
+          // 然后移除
+          document.body.removeChild(eleLink);
+        
+        // const link = document.createElement('a')
+        // let url = URL.createObjectURL(blob)
+        // link.href = url
+        // link.download = item.url.substring(0,item.url.indexOf('?'))
+        // link.click()
+    });
+    },
+    base64ToBlob(data){
+      var dataUrl = data.replace('data:image/png;base64,','')
+      let bstr = window.atob(dataUrl)
+      let n = bstr.length
+      let u8arr = new Uint8Array(n)
+      while (n--) {
+          u8arr[n] = bstr.charCodeAt(n);
+      }
+      return new Blob([u8arr], { type: "image/png" });
+    },
+    getData(data) {
+      data.forEach((item) => {
+        item.name = Number(item.sort) + 1;
+        if (item.children && item.children.length > 0) {
+          this.getData(item.children);
+        }
+      });
+    },
+    getEchart() {
+      var data = JSON.parse(JSON.stringify(this.patent.patentRightTree));
+      this.getData(data);
+      var that = this
+      data.forEach((item,index) => {
+        var option = {
+        // height: "100%",
+        backgroundColor: "#fbfbfb",
+        series: [
+          {
+          itemStyle: {
+            normal: {
+              color: "#06c",
+              borderColor: "#06c",
+            },
+            emphasis: {
+              borderColor: "#06c",
+              color: "#06c",
+            },
+          },
+          lineStyle: {
+            color: "#2979ff",
+          },
+          type: "tree",
+          data: [item],
+          // top: "1%",
+          left: "100px",
+          // bottom: "1%",
+          right: "100px",
+          symbolSize: 0,
+          symbol: "emptyCircle",
+          label: {
+            position: "left",
+            verticalAlign: "middle",
+            align: "right",
+            color: "#293c55",
+            margin: [2, 4],
+            borderWidth: 1,
+            borderColor: "#aaa",
+            backgroundColor: "white",
+            borderRadius: 2,
+            padding: [5, 4],
+            rich: {
+              keywords: {
+                color: "red",
+                fontSize: "12",
+              },
+              index: {
+                fontSize: 12,
+                color: "#2979ff",
+                position: "10%",
+              },
+            },
+            formatter: function(data, data1) {
+              // rgb(178, 215, 255)
+              if(data.data.sort+'' == that.isClickId){
+                data.data.label = {
+                  fontSize: 12,
+                  padding: [5, 4],
+                  backgroundColor: 'rgb(178, 215, 255)',
+                  borderColor: '#aaa',
+                  color: '#293c55',
+                }
+              // }else{
+                // data.data.label = {
+                //   fontSize: 12,
+                //   padding: [5, 4],
+                //   backgroundColor: 'white',
+                //   borderColor: '#aaa',
+                //   color: '#293c55',
+                // }
+              }
+            },
+          },
+          leaves: {
+            label: {
+              position: "right",
+              verticalAlign: "middle",
+              align: "left",
+            },
+          },
+
+          expandAndCollapse: false,
+          animationDuration: 550,
+          animationDurationUpdate: 750,
+        }
+        ],
+      };
+      this.sendingChart(option,index);
+      });
+      
+    },
+    sendingChart(option,index) {
+      var myChart = this.$echarts.init(document.getElementById("chart"+index));
+      myChart.clear();
+      var option = option;
+      option && myChart.setOption(option);
+      myChart.on("click", (param) => {
+        this.showRightPosition(param.data.sort);
+        var dom = document.getElementById("chart")
+        // param.data.label = {
+        //   fontSize: 12,
+        //   padding: [5, 4],
+        //   backgroundColor: 'rgb(178, 215, 255)',
+        //   borderColor: '#aaa',
+        //   color: '#293c55',
+        // }
+        // dom.style.display='none'
+        // this.$nextTick(()=>{
+        //   dom.style.display='block'
+        //   myChart.resize()
+        // })
+        if(!this.isClick){
+          this.scrollTop = dom.scrollTop
+        }
+        this.isClick = true
+       this.show = false
+        this.$nextTick(()=>{
+          this.show = true
+          this.$nextTick(()=>{
+            this.getEchart()
+            this.isClick = false
+            document.getElementById("chart").scrollTop = this.scrollTop
+          })
+          
+        })
+      });
+      const eleArr = Array.from(new Set(myChart._chartsViews[0]._data._graphicEls))
+        const itemHeight = 50
+        const currentHeight = itemHeight * (eleArr.length-1) || itemHeight
+        const newHeight = Math.max(currentHeight,itemHeight)
+        myChart.resize({
+          height:newHeight+50
+        })
+
+    },
+    showRightPosition(id) {
+      var index = this.expends.indexOf(id);
+      if (index == -1) {
+        this.expends.push(id);
+      }else{
+        this.expends.splice(1,index)
+        this.expends.push(id);
+      }
+      if (this.isClickId + "") {
+        var dom1 = document.getElementById("right" + this.isClickId);
+        dom1.style.background = "";
+      }
+      this.isClickId = id;
+      var dom = document.getElementById("right" + id);
+      dom.style.background = "rgb(178, 215, 255)";
+      this.$nextTick(()=>{
+        this.tiaozhuan(id)
+      })
+      
+    },
+    tiaozhuan(id) {
+      const href = `#right${id}`
+      const anchor = document.createElement('a');
+        anchor.href = href;
+        anchor.style.display = "none";
+        document.body.appendChild(anchor);
+        setTimeout(function () {
+          anchor.click();
+          document.body.removeChild(anchor);
+        }, 66);
+        return true;
+    },
     initData() {
       if(this.patent.rights){
         this.records.original = this.patent.rights.map(item => item.content)

+ 10 - 1
RMS-FrontEnd/src/views/components/articles/components/mixins.js

@@ -333,6 +333,9 @@ export const addContrast = {
       var a = temNode.parentElement
       NotIncludeDataType(a)
       function NotIncludeDataType(node) {
+        if(!node){
+          return false
+        }
         if (node.getAttribute("data-type") != null) {
           temNode = node
         } else {
@@ -362,6 +365,9 @@ export const addContrast = {
         var rightPosition = this.getColumn(node1, selectObj)
       }
       this.getColumn(temNode, selectObj);
+      if(temNode.nodeType == 3){
+        return false
+      }
       this.isFirst = true
       return { "Id": this.uuid(), "column": temNode.getAttribute("data-type"), "index": this.anchorOffset, "text": selectObj.toString(), 'temNode': temNode.innerHTML,'rightSort':rightSort,'rightPosition':rightPosition };
     },
@@ -376,6 +382,9 @@ export const addContrast = {
     getColumnNode(node) {
       //获取节点所在的栏位节点
       if (node != null) {
+        if(node.nodeType == 9){
+          return false
+        }
         if (node.nodeType != 3 && node.getAttribute("data-type") != null) {
           return node;
         } else {
@@ -392,7 +401,7 @@ export const addContrast = {
       var temPath = path;
       if (baseNode != null) {
         temPath.push(baseNode);
-        if (baseNode.childNodes.length > 0) {
+        if (baseNode.childNodes && baseNode.childNodes.length > 0) {
           for (let i = 0; i < baseNode.childNodes.length; i++) {
             this.getNodes(baseNode.childNodes[i], temPath);
           }

+ 4 - 3
RMS-FrontEnd/src/views/components/common/mixins.js

@@ -337,14 +337,15 @@ export const patentKeywordsHighlight = {
         if(!str){
           return ''
         }
-        var arr = str.split(/\r\n/g)
+        var arr = str.split(/\r{0,}\n{1,}\n{0,}\r{0,}/g)
         arr.forEach((item,index)=>{
-          html = html + `<p class="common" right-sort="${index}"> ${item} </p>`
+          item = item.trim().replace(/\r{0,}\n{1,}\n{0,}\r{0,}/g,'')
+          html = html + `<p class="common" style="margin:0px;" right-sort="${index}"> ${item} </p>`
         })
       }else{
         row.forEach((item,index) => {
           if(item[key]){
-             html = html + `<p class="common" right-sort="${index}"> ${item[key]} </p>`
+             html = html + `<p class="common" style="margin:0px;" right-sort="${index}"> ${item[key]} </p>`
           }
        })
       }

+ 16 - 15
RMS-FrontEnd/vue.config.js

@@ -109,35 +109,36 @@ module.exports = {
     },
     proxy: {
       '/pdfjs': {
-        target: 'http://192.168.0.57:8879',
+        target: 'http://192.168.1.24:8877',
         ws: true,
         changeOrigin: true
       },
-      '/file': {
-        target: 'http://192.168.0.57:8879',
+      // '/file': {
+      //   target: 'http://192.168.0.57:8879',
+      //   ws: true,
+      //   changeOrigin: true
+      // },
+      '/api/v2': {
+        // target: 'http://192.168.1.24:8877',
+        target: 'http://192.168.1.7:8877',
+        // target: 'http://139.224.24.90:8877',
+
         ws: true,
         changeOrigin: true
       },
       '/permission': {
-        // target: 'http://192.168.0.57:8879',
-        target: 'http://139.224.24.90:8880',
+        // target: 'http://139.224.24.90:8871',
+        target:'http://192.168.1.7:8871',
         ws: true,
         changeOrigin: true,
         pathRewrite:{
           '/api':''
       }
       },
-      '/api/v2': {
-        // target: 'http://192.168.0.57:8879',
-        target: 'http://192.168.1.13:8879',
-        // target: 'http://139.224.24.90:8879',
-
-        ws: true,
-        changeOrigin: true
-      },
+      
       '/report':{
-        target:'http://192.168.1.13:8885',
-        // target:'http://192.168.1.14:8885',
+        // target:'http://139.224.24.90:8872',
+        target:'http://192.168.1.24:8872',
         ws:true,
         changeOrigin:true
       }