cnwangzd@gmail.com пре 11 месеци
родитељ
комит
ff719ac8b9

+ 1 - 0
.gitignore

@@ -21,3 +21,4 @@ pnpm-debug.log*
 *.njsproj
 *.sln
 *.sw?
+*.zip

+ 1 - 1
app/matrix/m3graph/index.html

@@ -41,5 +41,5 @@
     </div>
     <div id="app"></div>
     <!-- built files will be auto injected -->
-    <script type="text/javascript" src="/static/app/matrix/m3graph/js/chunk-vendors.46c1597e.js"></script><script type="text/javascript" src="/static/app/matrix/m3graph/js/app.bcc3bc07.js"></script></body>
+    <script type="text/javascript" src="/static/app/matrix/m3graph/js/chunk-vendors.46c1597e.js"></script><script type="text/javascript" src="/static/app/matrix/m3graph/js/app.eebf558b.js"></script></body>
 </html>


+ 4 - 0
src/components/graph/GraphHandler.vue

@@ -296,6 +296,10 @@ export default {
       })
 
   },
+  beforeDestroy() {
+        // 移除事件监听器,防止内存泄漏
+        this.eventHub.$off('graph-position', this.onCellPosition); 
+   },
   methods: {
     // 初始化
     init(){

+ 21 - 18
src/components/graph/index.vue

@@ -1,22 +1,22 @@
 <template>
     <el-container style="height:calc(100vh - 30px);background:#fff;">
-    <el-main style="padding: 0px;">
-        <Split @onDragEnd="onDragEnd" ref="splitRef" style="overflow:hidden;">
-            <SplitArea :size="split.sizes[0]" :minSize="0" style="overflow:hidden;">
-                <SearchBar @graph-data="onSetData" ref="searchBarRef"></SearchBar>
-                <GraphHandler :graphData="graphData" 
-                    :global="global"
-                    @control-show="onControlShow"
-                    @entity-search="onEntitySearch"></GraphHandler>
-            </SplitArea>
-            <SplitArea :size="split.sizes[1]" :minSize="0" style="overflow:hidden;position: relative;">
-                <div style="position:absolute;top:0px;right:0px;font-size:16px;">
-                    <el-button type="text" icon="el-icon-close" @click="onCloseRight"></el-button>
-                </div>
-                <ContentBar ref="contentRef" @open-right="onOpenRight"></ContentBar>
-            </SplitArea>
-        </Split>
-    </el-main>
+        <el-main style="padding: 0px;">
+            <Split @onDragEnd="onDragEnd" ref="splitRef" style="overflow:hidden;">
+                <SplitArea :size="split.sizes[0]" :minSize="0" style="overflow:hidden;">
+                    <SearchBar @graph-data="onSetData" ref="searchBarRef"></SearchBar>
+                    <GraphHandler :graphData="graphData" 
+                        :global="global"
+                        @control-show="onControlShow"
+                        @entity-search="onEntitySearch"></GraphHandler>
+                </SplitArea>
+                <SplitArea :size="split.sizes[1]" :minSize="0" style="overflow:hidden;position: relative;">
+                    <div style="position:absolute;top:0px;right:0px;font-size:16px;">
+                        <el-button type="text" icon="el-icon-close" @click="onCloseRight"></el-button>
+                    </div>
+                    <ContentBar ref="contentRef" @open-right="onOpenRight"></ContentBar>
+                </SplitArea>
+            </Split>
+        </el-main>
     </el-container>
 </template>
 
@@ -42,6 +42,9 @@ export default {
         GraphHandler: resolve => {require(['./GraphHandler.vue'], resolve)},
         ContentBar: resolve => {require(['../search/index.vue'], resolve)}
     },
+    mounted(){
+        this.eventHub.$on('entity-search',this.onEntitySearch);
+    },
     methods:{
         onControlShow(data){
             this.$refs['searchBarRef'].$children[0].control.show = data;
@@ -60,7 +63,7 @@ export default {
             this.$refs.splitRef.reset();
         },
         onOpenRight(){
-            this.split.sizes = [70,30];
+            this.split.sizes = [60,40];
         },
         onCloseRight(){
             this.split.sizes = [100,0];

+ 24 - 14
src/components/graph/searchbar/SearchBar.vue

@@ -33,18 +33,18 @@
                 </el-button>
                 <el-dropdown trigger="click">
                     <span class="el-dropdown-link">
-                        <el-button type="text" icon="el-icon-folder-opened" ></el-button>
+                        <el-button type="text" icon="el-icon-menu" ></el-button>
                     </span>
                     <el-dropdown-menu slot="dropdown">
-                        <el-dropdown-item @click.native="onFileNew">新建</el-dropdown-item>
+                        <!-- <el-dropdown-item @click.native="onFileNew">新建</el-dropdown-item>
                         <el-dropdown-item @click.native="dialog.fileOpen.show = true" divided>打开</el-dropdown-item>
                         <el-dropdown-item @click.native="onFileOpenTo">打开到</el-dropdown-item>
                         <el-dropdown-item @click.native="onFileSave" divided>保存</el-dropdown-item>
-                        <el-dropdown-item @click.native="onFileSaveAs">另存为</el-dropdown-item>
+                        <el-dropdown-item @click.native="onFileSaveAs">另存为</el-dropdown-item> -->
                         <el-dropdown-item @click.native="onSaveAsPdf">另存为PDF</el-dropdown-item>
-                        <el-dropdown-item @click.native="onFileDelete" divided>删除</el-dropdown-item>
+                        <!-- <el-dropdown-item @click.native="onFileDelete" divided>删除</el-dropdown-item> -->
                         <el-dropdown-item @click.native="onFilePrint" divided>打印</el-dropdown-item>
-                        <el-dropdown-item @click.native="onFileClose" divided>关闭</el-dropdown-item>
+                        <!-- <el-dropdown-item @click.native="onFileClose" divided>关闭</el-dropdown-item> -->
                     </el-dropdown-menu>
                 </el-dropdown>
             </template>
@@ -53,7 +53,7 @@
             <div class="div-hover-effect" style="display:flex;padding:10px;cursor:pointer;" 
                 v-for="(item,index) in entity.search.result"
                 :key="index"
-                @click="onEntitySelect(item)"
+                @click="onEntitySelect(item);"
                 draggable="true" 
                 @dragstart="onEntityDragStart(item,$event)">
                 
@@ -63,11 +63,11 @@
                     </div>
                 </el-image>
                 <div style="height:48px;line-height:48px;width:80%;padding-left:10px;">{{ item.value }}</div>
-                <el-tooltip content="拖动到画布">
-                    <el-button type="text" icon="el-icon-menu" style="padding-left:10px;cursor:pointer;"></el-button>
+                <el-tooltip content="拖动到画布" open-delay="1000">
+                    <el-button type="default" size="mini" icon="el-icon-menu" style="cursor:pointer;"></el-button>
                 </el-tooltip>
-                <el-tooltip content="实体分析">
-                    <el-button type="text" icon="el-icon-postcard" style="padding-left:10px;cursor:pointer;" @click="onEntityDiagnosis(item)">
+                <el-tooltip content="实体分析" open-delay="1000">
+                    <el-button type="default" size="mini" icon="el-icon-postcard" style="margin-left:10px;cursor:pointer;" @click="onEntityDiagnosis(item)">
                     </el-button>
                 </el-tooltip>
             </div>
@@ -224,8 +224,8 @@ export default {
             } )
             
         },
-        onEntitySelect(){
-
+        onEntitySelect(item,event){
+            // event.dataTransfer.setData("Text",JSON.stringify(item));
         },
         onEntityDragStart(item,event){
             event.dataTransfer.setData("Text",JSON.stringify(item));
@@ -233,8 +233,8 @@ export default {
         onEntityDragEnd(){
 
         },
-        ononEntityDiagnosis(){
-
+        onEntityDiagnosis(item){
+            this.eventHub.$emit('entity-search',item);
         },
         onFileNew(){
             /* this.deleteCells(true);
@@ -338,6 +338,7 @@ export default {
             this.file.dialogSaveAs.visible = false; */
         },
         onSaveAsPdf(){
+            
             // mxUtils.printScreen(inst.app.$refs.graphViewRef.$refs.graphViewContainerInst.model.editor.graph);
         },
         onFileClose(){
@@ -382,6 +383,15 @@ export default {
 </script>
 
 <style scoped>
+    .div-hover-effect {
+  transition: background-color 0.3s ease, box-shadow 0.3s ease;
+}
+
+.div-hover-effect:hover {
+  background-color: rgba(0, 128, 255, 0.15); /* 淡蓝色背景 */
+  box-shadow: 0 4px 8px rgba(0, 128, 255, 0.4); /* 淡蓝色阴影 */
+}
+
     .search-bar.el-container{
         position: relative;
         z-index: 1000;

+ 2 - 2
src/components/search/entity.vue

@@ -6,15 +6,15 @@
         <div class="animated fadeIn entity-box">
             <el-button type="default" class="btn-entity" v-for="(item,index) in dt.rows" :key="index">
                 <el-image style="width:64px;margin:5px;" :src="item | pickIcon"></el-image>
+                <div style="font-weight: 900;font-size: 16px;">{{item.name}}</div>
                 <div>
-                    <p><span>名称:</span>{{item.name}}</p>
                     <p><span>IP:</span>{{item.ip}}</p>
                     <p><span>OS:</span>{{item.os}}</p>
                     <p><span>站点:</span>{{item.node}}</p>
                     <p><span>部门:</span>{{item.department}}</p>
                     <p><span>应用:</span>{{item.desc}}</p>
                     <p><span>创建时间:</span>{{moment(item.vtime).format("YYYY-MM-DD hh:mm:ss")}}</p>
-                    <p><span>ID:</span>{{item.id}}</p>
+                    <!-- <p><span>ID:</span>{{item.id}}</p> -->
                 </div>
             </el-button>
         </div>

+ 18 - 5
src/components/search/index.vue

@@ -8,13 +8,14 @@
             </el-input>
         </el-header>
         <el-main style="overflow: hidden;height: 100%;padding:0px;" v-if="search.result && search.result.all.length>0">
-            <div style="width:96%;padding:10px;background:#f2f2f2;display:flex;flex-wrap:wrap;align-items:flex-start;">
+            <div style="width:98%;padding:10px;background:#f2f2f2;display:flex;flex-wrap:wrap;align-items:flex-start;">
                 <el-button type="text" class="el-icon-s-data"> 结果</el-button>
                 <template v-for="(v,k) in search.result">
-                    <el-button type="default" :key="k" 
+                    <el-button type="default" 
+                        :key="k" 
                         @click="onScrollTo(k)"
-                        v-if="v.title && v.rows.length > 0">
-                        {{v.title}}: {{v.rows.length}}
+                        v-if="pickIfShow(v)">
+                        {{v.title}}: {{  rowsCount(v.rows) }}
                     </el-button>
                 </template>
             </div>
@@ -40,7 +41,7 @@
                         <component 
                             :ref="k"
                             v-bind:is="k" :global="global" :dt="v" 
-                            :key="k" v-if="v.title && v.rows.length>0"></component>
+                            :key="k" v-if="v.title && v.show"></component>
                     </template>
                 </el-main>
                 
@@ -58,6 +59,8 @@
 
 <script>
 import _isEmpty from 'lodash/isEmpty';
+import _map from 'lodash/map';
+import _filter from 'lodash/filter';
 import { scrollTo } from 'scroll-js';
 
 export default {
@@ -116,6 +119,13 @@ export default {
 
     },
     methods: {
+        pickIfShow(v){
+            return v.title && v.show;
+        },
+        rowsCount(rows){
+
+            return rows.length;
+        },
         onScrollTo(name){
             let el = this.$refs[name][0].$el.offsetTop;
             let container = this.$refs['container'].$el;
@@ -131,10 +141,13 @@ export default {
                 return false;
             }
 
+            this.search.result = [];
+
             this.search.loading = true;
             let param = encodeURIComponent( JSON.stringify( {term:this.search.term, preset:null} ) );
             this.m3.callFS("/matrix/m3graph/search/searchByTerm.js", param).then(res=>{
                 this.search.result = res.message;
+                console.log(111,this.search.result)
                 this.search.loading = false;
             }).catch(err=>{
                 this.search.loading = false;

+ 7 - 1
src/components/search/logView.vue

@@ -24,7 +24,7 @@
                 </el-dropdown-menu>
             </el-dropdown>
         </el-header>
-        <el-main :loading="editor.loading" style="padding:0px;overflow:hidden;">
+        <el-main v-loading="editor.loading" style="padding:0px;overflow:hidden;">
             <Editor
                 v-model="editor.data"
                 @init="onEditorInit"
@@ -109,6 +109,12 @@ export default{
             let param = encodeURIComponent(JSON.stringify( this.model ));
 
             this.m3.callFS("/matrix/m3graph/search/searchBitlogByTerm.js",param).then(rtn=>{
+                if(_.isEmpty(rtn.message.result)){
+                    this.model.show = false;
+                    this.editor.loading = false;
+                    return false;    
+                }
+                
                 this.editor.data = this.arrayToCsv(rtn.message.result);
                 this.editor.loading = false;
             }).catch(()=>{

+ 3 - 3
src/components/search/logs.vue

@@ -3,9 +3,9 @@
         <div>
             <el-button type="text" icon="el-icon-warning"> {{dt.title}}</el-button>
         </div>   
-        <div class="animated fadeIn chart-container" v-for="(chart,index) in dt.rows" :key="index">
-            <logView :model="chart"></logView>
-        </div>
+        <template class="animated fadeIn chart-container" v-for="(chart,index) in dt.rows">
+            <logView :model="chart" :key="index" v-if="chart.show"></logView>
+        </template>
     </div>
 </template>