2021-01-29 19:09:21 +08:00
< style >
@ import "./L5/css/iconfont.css" ;
@ import "./L5/css/props.css" ;
< / style >
< template >
2021-02-05 13:35:47 +08:00
< div class = "project-box" v-loading = "topologyLoading" :style="{'border':fromOverView?'none':'1px solid #eeeeee'}" >
2021-02-05 10:44:07 +08:00
<!-- project主要信息 -- >
2021-02-05 13:35:47 +08:00
< div class = "facade-top" v-if = "!editTopologyFlag&&!fromOverView" >
2021-02-05 10:44:07 +08:00
< div class = "facade-top-left" v-loading = "projectInfo.loading" v-if="projectInfoShow&&!fromPrev" >
< div class = "facade-top-title" >
Project information
< / div >
< div >
<!-- < span > < span class = "label" > Id : < / span > { { projectInfo . id } } < / span > -- >
< span > < span class = "label" > Name : < / span > { { projectInfo . name } } < / span >
< / div >
< div >
< span > < span class = "label" > Description : < / span > { { projectInfo . remark ? projectInfo . remark : '--' } } < / span >
< / div >
<!-- < div > -- >
<!-- < span > -- >
<!-- < span class = "label" > Alert state : < / span > -- >
<!-- < div class = "active-icon" style = "background: #B7464A 100%;" > < / div > { { projectInfo . alertStat [ 0 ] } } -- >
<!-- < div class = "active-icon" style = "background: #E64E4E 100%;" > < / div > { { projectInfo . alertStat [ 1 ] } } -- >
<!-- < div class = "active-icon" style = "background: #F7B500 100%;" > < / div > { { projectInfo . alertStat [ 2 ] } } -- >
<!-- < / span > -- >
<!-- < / div > -- >
< div >
< span > < span class = "label" > Module Num : < / span > { { projectInfo . moduleMum } } < / span >
< / div >
< / div >
< div class = "facade-top-right" v-loading = "projectInfo.loading" v-if="projectAlertShow&&!fromPrev" style="padding: 20px 20px 0 20px;height: calc(100% - 20px);" >
< div class = "facade-top-title" >
< span class = "label" style = "padding-left: 0;" > Alert : < / span >
{ { projectInfo . total } }
< / div >
< div class = "facade-top-right-content" >
< div >
< div class = "content-P1-title" >
{ { returnSeverityLabel ( 'P1' ) } }
< / div >
< div >
{ { projectInfo . alertStat [ 0 ] || 0 } }
< / div >
< / div >
< div >
< div class = "content-P2-title" >
{ { returnSeverityLabel ( 'P2' ) } }
< / div >
< div >
{ { projectInfo . alertStat [ 1 ] || 0 } }
< / div >
< / div >
< div style = "margin-bottom: 20px;" >
< div class = "content-P3-title" >
{ { returnSeverityLabel ( 'P3' ) } }
< / div >
< div >
{ { projectInfo . alertStat [ 2 ] || 0 } }
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "project-title" v-if = "showTopTools&&!fromOverView" :style="{'background':editTopologyFlag?'#F6F6F6':'#ffffff','border-bottom':editTopologyFlag? '1px solid #F6F6F6':'' }" >
< div v-show = "editTopologyFlag" class="edit-topologyLine" style="padding-left: 20px" >
2021-01-29 19:09:21 +08:00
<!-- 工具栏 -- >
< span class = "project-topology-tool" >
2021-02-02 10:30:45 +08:00
< el-dropdown trigger = "click" size = "small" placement = "bottom-start" >
2021-02-04 11:09:33 +08:00
< span class = "el-dropdown-title" > < i class = "iconfont icon-cube" > < / i > < i
class = "nz-icon nz-icon-arrow-down" > < / i > < / span >
2021-02-02 10:30:45 +08:00
< el-dropdown-menu slot = "dropdown" @click ="dropdownClick" >
< div style = "height: 450px" >
2021-02-04 11:09:33 +08:00
< el-card shadow = "hover" style = "height:420px;width:284px;overflow-y: auto"
class = "project-topology-add-node" >
2021-02-02 10:30:45 +08:00
<!-- < div class = "drag-header" > — — < / div > -- >
< el-collapse v-model = "activeNames" v-for="(item, index) in tools" :key="index" >
< el-collapse-item :title = "item.group" :name = "item.group" >
< div v-for = "(btn, i) in item.children" :key="'info2'+'-'+index+'-'+i" class="buttons" >
< a
: key = "i"
: title = "btn.data.text"
: draggable = "btn.data"
@ dragstart . stop = "onDrag($event, btn)"
@ mousedown = "dragFlag=false"
@ mouseup = "dragFlagChange(btn)"
class = "btn"
>
< img :src = "btn.data.image" v-if = "btn.data.image" >
< i v-else : class = "`iconfont ${btn.icon}`" > < / i >
< / a >
< span v-if = "item.group==='自定义图片'" class="delIcon" @click="delImg(btn)" > x < / span >
< / div >
< / el-collapse-item >
< / el-collapse >
< / el-card >
< el-upload
2021-02-04 11:09:33 +08:00
class = "avatar-uploader"
action = " "
: show - file - list = "false"
: on - success = "handleAvatarSuccess"
: before - upload = "beforeAvatarUpload"
: auto - upload = "true"
list - type = "picture-card"
style = "width: 284px;height: 30px"
>
2021-02-02 10:30:45 +08:00
< i class = "el-icon-plus" > < / i >
< span >
Upload custom picture
< / span >
< / el-upload >
< / div >
< / el-dropdown-menu >
< / el-dropdown >
2021-02-04 11:09:33 +08:00
< div class = "flex middle special-select mb10"
style = "width: 75px;height: 28px;display: inline-block;margin: 0 40px 0 20px;background: #fff" >
2021-02-02 10:30:45 +08:00
< div class = "full pr10" >
2021-02-05 15:40:16 +08:00
< el-select v-model = "lineName" :placeholder="$t('el.select.placeholder')" size="small"
2021-02-04 11:09:33 +08:00
: popper - append - to - body = "false"
@ change = "changeTopologyOpt(lineName,'lineName')" >
2021-02-02 10:30:45 +08:00
< div slot = "prefix" >
< div class = "icon-item" >
< svg >
< g fill = "none" stroke = "black" stroke -width = " 1 " >
< path
: d = "penLineType.find((item,i)=>item.name==lineName).d"
>
< / path >
< / g >
< / svg >
< / div >
< / div >
< el-option v-for = "(item,index) in penLineType" :value="item.name" :key="index" >
< div class = "icon-item" >
< svg >
< g fill = "none" :stroke = "(lineName==item.name)?'#ee9d3f':'black'" stroke -width = " 1 " >
< path :d = "item.d" :stroke-dasharray = "item['stroke-dasharray']" > < / path >
< / g >
< / svg >
< / div >
< / el-option >
< / el-select >
< / div >
< / div >
2021-01-29 19:09:21 +08:00
2021-02-02 10:30:45 +08:00
< topology-top-tool
v - if = "editTopologyFlag"
: selection . sync = "props"
@ del = "delPen"
: index = "topologyIndex"
ref = "topTool"
@ toolShowChange = "toolShowChange"
: cachesIndex = "cachesIndex"
: toolShow = "toolShow" >
2021-01-29 19:09:21 +08:00
< / topology-top-tool >
2021-02-02 10:30:45 +08:00
2021-01-29 19:09:21 +08:00
< / span >
2021-02-02 10:30:45 +08:00
< span class = "float-right" >
< button @click ="previewTopology" class = "nz-btn nz-btn-size-normal-new nz-btn-style-light-new"
2021-02-05 10:44:07 +08:00
style = "margin-right: 20px"
>
2021-02-02 10:30:45 +08:00
{ { $t ( 'project.topology.preview' ) } }
< / button >
< button @click ="saveTopology" class = "nz-btn nz-btn-size-normal-new nz-btn-style-normal-new"
2021-01-29 19:09:21 +08:00
v - has = "'project_topo_save'" : disabled = "prevent_opt.save"
2021-02-05 10:44:07 +08:00
: class = "{'nz-btn-disabled':prevent_opt.save}"
style = "margin-right: 20px" >
2021-01-29 19:09:21 +08:00
{ { $t ( 'project.topology.save' ) } }
< / button >
2021-02-05 10:44:07 +08:00
< button @click ="cancelTopology" class = "nz-btn nz-btn-size-normal-new nz-btn-style-normal-new" style = "margin-right: 20px" >
{ { $t ( 'project.topology.exit' ) } }
2021-01-29 19:09:21 +08:00
< / button >
< / span >
< / div >
2021-02-02 10:30:45 +08:00
< span class = "edit-topologyLine float-right" style = "padding-top: 5px" v-show = "!editTopologyFlag" >
2021-01-29 19:09:21 +08:00
< button @click ="editTopology" class = "nz-btn nz-btn-size-normal nz-btn-style-light float-right pickTime"
style = "border-right: 1px solid rgba(162,162,162,0.50);margin-right: 12px" type = "button"
>
< i class = "nz-icon nz-icon-edit" :title = "$t('project.topology.edit')" > < / i >
< / button >
< pick-time v-show = "!editTopologyFlag" :showTimePicker="false" class="float-right pickTime"
2021-02-05 15:26:27 +08:00
: refresh - data - func = "reload" v - model = "searchTime" : use - chart - unit = "false"
2021-01-29 19:09:21 +08:00
ref = "pickTime" > < / pick-time >
< / span >
< / div >
< div class = "page" >
<!-- 画布部分 -- >
2021-02-04 18:01:57 +08:00
< div : id = "'topology-canvas' + topologyIndexF" class = "full" : ref = "'topology-canvas'+ topologyIndexF" > < / div >
2021-01-29 19:09:21 +08:00
<!-- 设置属性 -- >
2021-02-02 10:30:45 +08:00
< div class = "props" v-if = "editTopologyFlag&&toolShow.attr" >
< CanvasProps :selection.sync = "props"
@ change = "onUpdateProps"
@ animate = "animateCanvas"
: index = "topologyIndex"
@ del = "delPen"
: modules = "modules"
ref = "CanvasProps" >
< / CanvasProps >
< / div >
2021-01-29 19:09:21 +08:00
<!-- 所有节点上的小图标 -- >
< div v-for = "(item,index) in nodesArr"
2021-02-02 10:30:45 +08:00
: style = "{position: 'absolute',top:item.rect.y - 48+'px',left:item.rect.center.x - 24 +'px'}"
2021-02-05 13:35:47 +08:00
v - if = "!editTopologyFlag&&item.data.iconToolState&&!fromPrev"
2021-02-02 10:30:45 +08:00
class = "network-pop"
2021-01-29 19:09:21 +08:00
>
2021-02-02 10:30:45 +08:00
< i
2021-02-05 15:26:27 +08:00
: class = "{'nz-icon':true, 'nz-icon-shuidi':true,'model-error':item.data.state.error&&!item.data.show,'model-error-active':item.data.state.error&&item.data.show}"
2021-02-02 10:30:45 +08:00
: ref = "'modelTopId'+index"
2021-02-05 11:41:20 +08:00
@ click = "showNodeTools(index,item)"
2021-01-29 19:09:21 +08:00
>
< i class = "nz-icon nz-icon-model" > < / i >
< / i >
<!-- 'selpop' : selpopIs ( item ) , 'no-selPop' : ! selpopIs ( item ) , 'error-model-stat' : modelPopError ( item ) @ click = "popClick(item.id)" -- >
< div v-for = "item1 in popData" >
< transition name = "scaleTool" >
< i v-if = "item.data.show"
2021-02-05 15:26:27 +08:00
: class = "{'nz-icon':true,'nz-icon-hexagonBorder':true,'error-model-stat':item.data.state[item1.id],'selpop':selpopIs(item,item1),'no-selPop':!selpopIs(item,item1),}"
2021-01-29 19:09:21 +08:00
: style = "{top:item1.top,left:item1.left}"
: title = "item1.title"
@ click = "nodeTools(item,item1)"
>
< i class = "nz-icon nz-icon-liubianxing" > < / i >
< i :class = "[item1.className,{'nz-icon':item1.className},'noMove']" > < / i >
< / i >
< / transition >
< / div >
< / div >
<!-- 节点连线相关的 tooltip -- >
< div :style = "{position:'absolute',top:tooltipPosition.top+'px',left:tooltipPosition.left+'px'}"
v - if = "tooltipPosition.show&&!editTopologyFlag"
@ mouseover = "tooltipOver"
@ mouseout = "tooltipOut" >
2021-02-04 17:06:04 +08:00
< topoTooltip :chartDataParent = "chartData" :filterTime = "filterTime" / >
2021-01-29 19:09:21 +08:00
< / div >
< / div >
2021-02-02 10:30:45 +08:00
<!-- < div class = "left-bottom" v-if = "editTopologyFlag" > - - >
2021-02-04 11:09:33 +08:00
<!-- < div class = "title" > 小提示 < / div > -- >
<!-- < ul class = "group" > -- >
<!-- < li > 编辑时 : < / li > -- >
<!-- < li > 1. Ctrl + 鼠标移动 : 移动整个画布 < / li > -- >
<!-- < li > 2. Ctrl + 鼠标滚轮 : 缩放 < / li > -- >
<!-- < li > 3. 选中元素 按下Delete键或者Backspace可以删除元素 < / li > -- >
<!-- < / ul > -- >
2021-02-02 10:30:45 +08:00
<!-- < / div > -- >
2021-01-29 19:09:21 +08:00
<!-- 悬浮network部分 -- >
< div class = "network-info" >
2021-02-02 10:30:45 +08:00
< div v-if = "popDataShow.main" >
2021-01-29 19:09:21 +08:00
< popDataMain :moduleId = "moduleId" :projectId = "projectInfo.id" > < / popDataMain >
< / div >
< div v-if = "popDataShow.info" >
< popDataInfo :moduleId = "moduleId" :projectId = "projectInfo.id" > < / popDataInfo >
< / div >
2021-02-05 11:41:20 +08:00
<!-- chart -- >
< div v-if = "popDataShow.total" >
2021-02-05 13:35:47 +08:00
< topoTooltip :chartDataParent = "chartDataInfo" :filterTime = "filterTime" :isChart = "true" / >
2021-02-05 11:41:20 +08:00
< / div >
2021-01-29 19:09:21 +08:00
< / div >
<!-- endpoint -- >
< transition name = "right-box" >
< endpointTable v-if = "popDataShow.endpoint" :moduleId="moduleId" :projectId="projectInfo.id"
@ close = "popDataShowUpdate('',true)" > endpoint
< / endpointTable >
< / transition >
<!-- asset -- >
< transition name = "right-box" >
< assetTable v-if = "popDataShow.asset" :moduleId="moduleId" :projectId="projectInfo.id"
@ close = "popDataShowUpdate('',true)" > alert
< / assetTable >
< / transition >
<!-- alert -- >
< transition name = "right-box" >
< alertTable v-if = "popDataShow.alert" :moduleId="moduleId" :projectId="projectInfo.id"
@ close = "popDataShowUpdate('',true)" > alert
< / alertTable >
< / transition >
2021-02-05 10:44:07 +08:00
<!-- preview -- >
< el-dialog
: visible . sync = "previewShow"
2021-02-05 11:41:20 +08:00
: width = "'80%'"
: before - close = "previewBeforeClose"
2021-02-05 10:44:07 +08:00
>
2021-02-05 11:41:20 +08:00
< div style = "width: calc(80vw - 40px);height: 80vh" >
< topologyPrev
2021-02-05 10:44:07 +08:00
v - if = "previewShow"
: obj = "obj"
: topoPrevDataS = "topoPrevData"
: fromOverView = "true"
: fromPrev = "true"
: topologyIndexF = "1" >
2021-02-05 11:41:20 +08:00
< / topologyPrev >
2021-02-05 10:44:07 +08:00
< / div >
< / el-dialog >
2021-01-29 19:09:21 +08:00
< / div >
< / template >
< script >
import { Topology , Node , Line , registerNode } from '@topology/core' ;
import * as FileSaver from 'file-saver' ;
2021-02-02 10:30:45 +08:00
import {
Tools ,
canvasRegister ,
imageTemp ,
myShape ,
myAnchors ,
myIconRect ,
myTextRect ,
onChangeAnimate ,
onChangeAnimateLine ,
changeImage ,
myCubec ,
myCubeAnchors
} from './L5/services/canvas.js' ;
2021-01-29 19:09:21 +08:00
// 注册到画布
2021-02-02 10:30:45 +08:00
registerNode ( 'rectangleImg' , myShape , myAnchors , myIconRect , myTextRect ) ;
registerNode ( 'myCube' , myCubec , myCubeAnchors , null , null ) ;
2021-01-29 19:09:21 +08:00
import { getTopology , setTopology } from "../js/common" ;
import CanvasProps from './L5/CanvasProps' ;
import CanvasContextMenu from './L5//CanvasContextMenu' ;
import topologyTopTool from './L5//topologyTopTool' ;
import VueDraggableResizable from 'vue-draggable-resizable' ; //api https://github.com/mauricius/vue-draggable-resizable
import 'vue-draggable-resizable/dist/VueDraggableResizable.css'
import popDataMain from './popData/Main'
import popDataInfo from './popData/Info'
import TotalChart from "./popData/totalChart" ;
import alertTable from "./popData/alertTable" ;
import assetTable from "./popData/assetTable" ;
import endpointTable from "./popData/endpointTable" ;
import ExpressionInfo from "./popData/expressionInfo" ;
import topoTooltip from "./L5/topoTooltip" ;
2021-02-04 13:09:03 +08:00
import { getMetricTypeValue } from '../js/tools'
2021-01-29 19:09:21 +08:00
import bus from "../../../libs/bus" ;
2021-02-05 11:41:20 +08:00
import topologyPrev from './topologyPrev'
2021-01-29 19:09:21 +08:00
import axios from 'axios' ;
2021-02-02 10:30:45 +08:00
2021-01-29 19:09:21 +08:00
const canvasOptions = {
rotateCursor : '/img/rotate.cur' ,
translateKey : 'None' ,
disableEmptyLine : true ,
autoExpandDistance : 0 ,
} ;
let canvas ;
export default {
2021-02-05 10:44:07 +08:00
name : 'topologyL5' ,
2021-01-29 19:09:21 +08:00
data ( ) {
return {
2021-02-05 13:35:47 +08:00
chartDataInfo : { } ,
2021-02-05 10:44:07 +08:00
topoPrevData : { } , //预览数据
2021-02-04 17:06:04 +08:00
imgInit : false , //判断图片是否加载完成
2021-01-29 19:09:21 +08:00
toolGroup : '基本形状' ,
editFlag : true ,
tools : Tools ,
props : { } ,
2021-02-04 18:01:57 +08:00
topologyLoading : false ,
2021-01-29 19:09:21 +08:00
contextmenu : {
left : null ,
top : null ,
bottom : null
} ,
2021-02-02 10:30:45 +08:00
filterTime : [
2021-01-29 19:09:21 +08:00
bus . timeFormate ( bus . getOffsetTimezoneData ( - 1 ) , 'yyyy-MM-dd hh:mm:ss' ) ,
bus . timeFormate ( bus . getOffsetTimezoneData ( ) , 'yyyy-MM-dd hh:mm:ss' )
] ,
saveData : { } ,
dataLength : 0 ,
editTopologyFlag : false ,
searchTime : { } ,
activeNames : [ ] ,
topologyIndex : 0 ,
iconArray : [ ] ,
imgageLoading : false ,
toolShow : {
node : true ,
attr : true ,
nodeCord : [ 0 , 0 ] ,
attrCord : [ 0 , 0 ] ,
height : 500 ,
} ,
dragFlag : true ,
modules : [ ] ,
allModules : [ ] ,
projectInfo : {
title : '' ,
id : '' ,
remark : '' ,
alertStat : [ 1 , 2 , 3 ] ,
moduleMum : 6 ,
loading : true ,
} ,
timer : null , //处理project短时间呢频繁变更的定时器
timer2 : null , //处理平移画布显示iconState的定时器
timer3 : null , //处理tooltip的显示定时器
nodesArr : [ ] ,
popData : [
2021-02-02 10:30:45 +08:00
{
top : '-40px' ,
left : '-21px' ,
className : 'nz-icon-endpoint' ,
id : 'endpoint' ,
title : this . $t ( 'project.topology.endpoint' )
} ,
{ top : '-40px' , left : '19px' , className : 'nz-icon-asset' , id : 'asset' , title : this . $t ( 'project.topology.asset' ) } ,
{ top : '-4px' , left : '40px' , className : 'nz-icon-chart' , id : 'total' , title : this . $t ( 'project.topology.total' ) } ,
{ top : '30px' , left : '19px' , className : '' , id : 'other' , title : '' } ,
{ top : '30px' , left : '-21px' , className : 'nz-icon-info-normal' , id : 'info' , title : this . $t ( 'project.topology.info' ) } ,
{ top : '-4px' , left : '-40px' , className : 'nz-icon-gaojing' , id : 'alert' , title : this . $t ( 'project.topology.alert' ) } ,
2021-01-29 19:09:21 +08:00
] ,
popDataShow : {
endpoint : false ,
asset : false ,
total : false ,
other : false ,
info : false ,
alert : false ,
main : false ,
} ,
moduleId : '' ,
tooltipPosition : {
top : 0 ,
left : 0 ,
show : false ,
} ,
chartData : { } ,
chartGetData : [ ] ,
2021-02-02 10:30:45 +08:00
penLineType : [
{ d : 'M5 19 a50,100 0 0,1 40,0' , "stroke-dasharray" : "" , name : 'curve' } ,
{ d : 'M5 8 l20 0 l0 12 l20 0' , "stroke-dasharray" : "" , name : 'polyline' } ,
{ d : 'M5 14 l40 0' , "stroke-dasharray" : "" , name : 'line' } ,
// {d:'M5 20 C0,8 50,0 85,0',"stroke-dasharray":"",name:'mind'},
] ,
lineName : 'curve' ,
cachesIndex : 0 ,
2021-02-05 10:44:07 +08:00
projectInfo : {
title : '' ,
id : '' ,
remark : '' ,
alertStat : [ 1 , 2 , 3 ] ,
moduleMum : 6 ,
loading : true ,
total : 0 ,
} ,
projectInfoShow : false ,
projectAlertShow : false ,
previewShow : false ,
2021-01-29 19:09:21 +08:00
} ;
} ,
components : {
CanvasProps ,
CanvasContextMenu ,
topologyTopTool ,
VueDraggableResizable ,
popDataMain ,
popDataInfo ,
TotalChart ,
alertTable ,
assetTable ,
endpointTable ,
ExpressionInfo ,
topoTooltip ,
2021-02-05 11:41:20 +08:00
topologyPrev ,
2021-01-29 19:09:21 +08:00
} ,
computed : { } ,
props : {
topologyIndexF : {
type : Number ,
default : 0 ,
} ,
obj : { } ,
showTopTools : {
type : Boolean ,
default : true ,
2021-02-04 13:09:03 +08:00
} ,
fromOverView : {
type : Boolean ,
default : false ,
2021-02-05 10:44:07 +08:00
} ,
fromPrev : {
type : Boolean ,
default : false ,
} ,
topoPrevDataS : {
} ,
2021-01-29 19:09:21 +08:00
} ,
watch : {
topologyIndexF : {
immediate : true ,
handler ( n ) {
2021-02-05 11:41:20 +08:00
this . topologyIndex = n ;
console . log ( n , this . fromPrev ) ;
2021-01-29 19:09:21 +08:00
}
} ,
obj : {
deep : true ,
immediate : true ,
handler ( n ) {
if ( n ) {
2021-02-04 18:01:57 +08:00
this . editTopologyFlag = false ;
this . topologyLoading = true ;
2021-02-05 10:44:07 +08:00
this . projectInfoShow = false ;
this . projectAlertShow = false ;
if ( n . id ) {
this . getProjectData ( n ) ;
}
2021-01-29 19:09:21 +08:00
if ( ! this . timer ) {
this . timer = setTimeout ( ( ) => {
2021-02-04 18:01:57 +08:00
this . topologyLoading = true ;
2021-01-29 19:09:21 +08:00
this . init ( ) ;
this . timer = null
} , 300 )
} else {
clearTimeout ( this . timer ) ;
this . timer = setTimeout ( ( ) => {
2021-02-04 18:01:57 +08:00
this . topologyLoading = true ;
2021-01-29 19:09:21 +08:00
this . init ( ) ;
this . timer = null
} , 300 )
}
}
}
}
} ,
computed : { } ,
created ( ) {
canvasRegister ( ) ;
if ( process . client ) {
document . onclick = event => {
this . contextmenu = {
left : null ,
top : null ,
bottom : null
} ;
} ;
}
} ,
2021-02-04 17:06:04 +08:00
created ( ) {
this . addNodeInit ( ) ;
} ,
2021-01-29 19:09:21 +08:00
mounted ( ) {
2021-02-04 13:09:03 +08:00
document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . addEventListener ( 'mousemove' , this . canvasMove ) ;
2021-01-29 19:09:21 +08:00
window . addEventListener ( 'resize' , this . winResize )
} ,
methods : {
init ( ) {
canvasOptions . on = this . onMessage ;
this . getTopologyData ( ) . then ( ( data ) => {
this . openTopologyData ( data ) . then ( ( ) => {
//获取对应的值 给节点 连线添加对应动画
2021-02-02 10:30:45 +08:00
this . lineName = data . lineName ? data . lineName : this . lineName ;
2021-01-29 19:09:21 +08:00
this . chartGetData = [ ] ;
2021-02-02 10:30:45 +08:00
let axiosArr = [ ] ;
2021-02-04 11:09:33 +08:00
let promiseArr = [ ] ;
let self = this ;
let pensPromise = ( pen , arr , index ) => {
return new Promise ( function ( resolve , reject ) {
Promise . all ( arr ) . then ( ( res ) => {
self . chartGetData [ index ] . res = self . computeData ( res , pen . data . aggregation , pen ) ;
self . setAnimation ( pen , self . chartGetData [ index ] . res ) ;
resolve ( )
} ) ;
} ) ;
} ;
2021-01-29 19:09:21 +08:00
let endTime = this . filterTime [ 1 ] ;
let startTime = this . filterTime [ 0 ] ;
2021-02-02 10:30:45 +08:00
let step = bus . getStep ( startTime , endTime ) ;
2021-02-04 11:09:33 +08:00
data . pens && data . pens . forEach ( ( item , index ) => {
2021-01-29 19:09:21 +08:00
this . chartGetData . push ( { id : item . id , res : [ ] } ) ;
2021-02-02 10:30:45 +08:00
let arr = item . data . expressArr . map ( ( ele ) => {
let query = encodeURIComponent ( ele ) ;
2021-02-04 11:09:33 +08:00
if ( ! query ) {
return new Promise ( resolve => {
resolve ( { data : "" , status : 'no query' } ) ;
} )
}
2021-01-29 19:09:21 +08:00
query += '&nullType=' + 'connected' ;
2021-02-02 10:30:45 +08:00
return this . $get ( '/prom/api/v1/query_range?query=' + query + "&start=" + this . $stringTimeParseToUnix ( startTime ) + "&end=" + this . $stringTimeParseToUnix ( endTime ) + '&step=' + step ) ;
2021-01-29 19:09:21 +08:00
} ) ;
axiosArr . push ( { item , arr } ) ;
2021-02-04 11:09:33 +08:00
promiseArr . push ( pensPromise ( item , arr , index ) )
2021-01-29 19:09:21 +08:00
} ) ;
2021-02-04 11:09:33 +08:00
Promise . all ( promiseArr ) . then ( ( res ) => {
2021-01-29 19:09:21 +08:00
getTopology ( this . topologyIndex ) . open ( data ) ;
getTopology ( this . topologyIndex ) . lock ( 1 ) ;
2021-02-04 13:09:03 +08:00
if ( this . fromOverView ) {
2021-02-04 18:01:57 +08:00
let flag = false ;
let position = {
x : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetWidth ,
y : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetHeight ,
}
2021-02-05 10:44:07 +08:00
2021-02-04 18:01:57 +08:00
getTopology ( this . topologyIndex ) . centerView ( 50 ) ;
getTopology ( this . topologyIndex ) . data . pens . forEach ( item => {
if ( flag ) {
return
}
if ( item . rect . x > position . x || item . rect . y > position . y ) {
getTopology ( this . topologyIndex ) . fitView ( 50 ) ;
flag = true
}
} ) ;
2021-02-05 10:44:07 +08:00
// if(this.fromPrev){
// getTopology(this.topologyIndex).scaleTo(data.scale/2)
// }
2021-02-04 13:09:03 +08:00
// getTopology(this.topologyIndex).fitView();
this . getNodesArr ( ) ;
}
2021-01-29 19:09:21 +08:00
} ) ;
} )
} ) ;
} ,
reload ( ) {
2021-02-05 15:26:27 +08:00
this . topologyLoading = true ;
2021-01-29 19:09:21 +08:00
this . getTopologyData ( ) . then ( ( data ) => {
2021-02-02 19:24:21 +08:00
this . openTopologyData ( data ) . then ( ( ) => {
//获取对应的值 给节点 连线添加对应动画
this . lineName = data . lineName ? data . lineName : this . lineName ;
this . chartGetData = [ ] ;
let axiosArr = [ ] ;
2021-02-04 11:09:33 +08:00
let promiseArr = [ ] ;
let self = this ;
let pensPromise = ( pen , arr , index ) => {
return new Promise ( function ( resolve , reject ) {
Promise . all ( arr ) . then ( ( res ) => {
self . chartGetData [ index ] . res = self . computeData ( res , pen . data . aggregation , pen ) ;
self . setAnimation ( pen , self . chartGetData [ index ] . res ) ;
resolve ( )
} ) ;
} ) ;
} ;
2021-02-02 19:24:21 +08:00
let endTime = this . filterTime [ 1 ] ;
let startTime = this . filterTime [ 0 ] ;
let step = bus . getStep ( startTime , endTime ) ;
2021-02-04 11:09:33 +08:00
data . pens && data . pens . forEach ( ( item , index ) => {
2021-02-02 19:24:21 +08:00
this . chartGetData . push ( { id : item . id , res : [ ] } ) ;
let arr = item . data . expressArr . map ( ( ele ) => {
let query = encodeURIComponent ( ele ) ;
2021-02-04 11:09:33 +08:00
if ( ! query ) {
return new Promise ( resolve => {
resolve ( { data : "" , status : 'no query' } ) ;
} )
}
2021-02-02 19:24:21 +08:00
query += '&nullType=' + 'connected' ;
return this . $get ( '/prom/api/v1/query_range?query=' + query + "&start=" + this . $stringTimeParseToUnix ( startTime ) + "&end=" + this . $stringTimeParseToUnix ( endTime ) + '&step=' + step ) ;
} ) ;
2021-02-05 15:26:27 +08:00
console . log ( arr ) ;
2021-02-02 19:24:21 +08:00
axiosArr . push ( { item , arr } ) ;
2021-02-04 11:09:33 +08:00
promiseArr . push ( pensPromise ( item , arr , index ) )
2021-02-02 19:24:21 +08:00
} ) ;
2021-02-04 11:09:33 +08:00
Promise . all ( promiseArr ) . then ( ( res ) => {
2021-02-02 19:24:21 +08:00
getTopology ( this . topologyIndex ) . open ( data ) ;
getTopology ( this . topologyIndex ) . lock ( 1 ) ;
2021-02-05 11:41:20 +08:00
if ( this . fromOverView ) {
let flag = false ;
let position = {
x : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetWidth ,
y : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetHeight ,
}
getTopology ( this . topologyIndex ) . centerView ( 50 ) ;
getTopology ( this . topologyIndex ) . data . pens . forEach ( item => {
if ( flag ) {
return
}
if ( item . rect . x > position . x || item . rect . y > position . y ) {
getTopology ( this . topologyIndex ) . fitView ( 50 ) ;
flag = true
}
} ) ;
// if(this.fromPrev){
// getTopology(this.topologyIndex).scaleTo(data.scale/2)
// }
// getTopology(this.topologyIndex).fitView();
this . getNodesArr ( ) ;
}
2021-02-02 19:24:21 +08:00
} ) ;
} )
2021-01-29 19:09:21 +08:00
} ) ;
} ,
openTopologyData ( data ) {
2021-02-02 10:30:45 +08:00
return new Promise ( resolve => {
2021-02-04 13:09:03 +08:00
let canvas = new Topology ( 'topology-canvas' + this . topologyIndexF , canvasOptions ) ;
2021-01-29 19:09:21 +08:00
canvas . open ( data ) ;
2021-02-04 18:01:57 +08:00
this . topologyLoading = false ;
2021-01-29 19:09:21 +08:00
setTopology ( this . topologyIndex , canvas ) ;
if ( ! getTopology ( this . topologyIndex ) . data . name ) {
getTopology ( this . topologyIndex ) . data . name = this . obj . name ;
}
getTopology ( this . topologyIndex ) . data . projectId = this . obj . id ;
getTopology ( this . topologyIndex ) . lock ( 1 ) ;
2021-02-04 17:06:04 +08:00
2021-01-29 19:09:21 +08:00
this . getModule ( ) //获取module
resolve ( )
} )
} ,
//获取topology数据
getTopologyData ( ) {
return new Promise ( resolve => {
2021-02-05 10:44:07 +08:00
if ( this . fromPrev ) {
resolve ( this . topoPrevDataS )
}
2021-02-04 13:09:03 +08:00
this . $get ( '/project/topo' , { projectId : this . obj . id } ) . then ( res => {
let data = res . data . topo ;
2021-02-04 17:06:04 +08:00
if ( ! res . data . topo || ! data . pens ) {
2021-02-04 13:09:03 +08:00
data = {
bkColor : '#FFFFFF' ,
gridSize : 10 ,
gridColor : '#ededed' ,
lineWidth : 1 ,
ruleColor : "#4e4e4e"
} ;
2021-02-05 10:44:07 +08:00
this . projectInfoShow = true ;
this . projectAlertShow = true ;
2021-02-04 17:06:04 +08:00
this . saveData = { ... data } ;
resolve ( data ) ;
} else {
let timer = setInterval ( ( ) => {
if ( ! this . imgInit ) {
return
}
clearInterval ( timer ) ;
data . pens . forEach ( ( item => {
if ( item . type === 0 && item . data . imageId ) {
item . image = this . iconArray . find ( item1 => item1 . id == item . data . imageId ) . image
}
2021-02-05 15:26:27 +08:00
if ( item . type === 0 ) {
this . $get ( '/module/stat' , { id : item . data . moduleId } ) . then ( res => {
item . data . state = res . data ;
item . data . state . asset = false ;
item . data . state . endpoint = false ;
item . data . state . alert = false ;
if ( item . data . state . assetStat . down > 0 ) {
item . data . state . asset = true ;
}
if ( item . data . state . endpointStat . down > 0 ) {
item . data . state . endpoint = true ;
}
if ( item . data . state . alertStat . P1 > 0 || item . data . state . alertStat . P3 > 0 || item . data . state . alertStat . P2 > 0 ) {
item . data . state . alert = true ;
}
item . data . state . error = item . data . state . asset && item . data . state . endpoint && item . data . state . alert ;
} ) ;
}
2021-02-05 10:44:07 +08:00
} ) ) ;
if ( ! data . data ) {
this . projectInfoShow = true ;
this . projectAlertShow = true ;
} else if ( ! JSON . stringify ( data . data . projectInfo ) ) {
this . projectInfoShow = true ;
this . projectAlertShow = true ;
} else {
this . projectInfoShow = data . data . projectInfo ;
this . projectAlertShow = data . data . alertInfo ;
}
2021-02-04 17:06:04 +08:00
this . saveData = { ... data } ;
resolve ( data ) ;
} , 100 )
2021-02-04 13:09:03 +08:00
}
} )
2021-01-29 19:09:21 +08:00
} ) ;
} ,
2021-02-04 11:09:33 +08:00
//赋值动画
setAnimation ( pen , res ) { // 根据所有res的状态 赋值动画
let maxLevel = 0 ;
if ( res . length > 0 ) {
res . forEach ( ( response , innerPos ) => {
if ( response . status !== 'success' ) {
return
}
if ( response . data . result ) {
response . data . result . forEach ( ( queryItem , resIndex ) => {
pen . data . valueMapping . forEach ( ( item , index ) => {
if ( item . value === 'base' ) { return }
if ( queryItem . showValue > item . value ) {
queryItem . level = item . level ;
if ( maxLevel < item .level ) {
maxLevel = item . level
}
}
} )
} )
}
} )
}
if ( maxLevel !== 0 ) {
if ( pen . type === 0 ) { // 判断valueMapping 给相应的状态
let selLevel = pen . data . valueMapping . find ( item => item . level === maxLevel ) ;
pen . font . color = selLevel . color . text ;
2021-02-04 18:01:57 +08:00
pen . fillStyle = selLevel . color . fill ;
pen . strokeStyle = selLevel . color . line ;
2021-02-04 13:09:03 +08:00
onChangeAnimate ( pen , selLevel . animateType , selLevel . color . fill , selLevel . color . line ) ;
2021-02-04 11:09:33 +08:00
} else if ( pen . type === 1 ) { // 判断valueMapping 给相应的状态
let selLevel = pen . data . valueMapping . find ( item => item . level === maxLevel ) ;
pen . animateColor = selLevel . color . fill ;
pen . strokeStyle = selLevel . color . line ;
pen . animateType = selLevel . animateType ;
2021-02-04 13:09:03 +08:00
pen . font . color = selLevel . color . text ;
2021-02-04 11:09:33 +08:00
onChangeAnimateLine ( pen , pen . animateType ) ;
}
} else {
if ( pen . type === 0 && pen . animatePlay ) { // 判断valueMapping 给相应的状态
onChangeAnimate ( pen , pen . animateType ) ;
} else if ( pen . type === 1 && pen . animatePlay ) { // 判断valueMapping 给相应的状态
onChangeAnimateLine ( pen , pen . animateType ) ;
}
}
} ,
computeData ( res , type , pen ) { //处理别名 以及 根据type显示对应的值
if ( res . length > 0 ) {
res . forEach ( ( response , innerPos ) => {
if ( response . status !== 'success' ) {
return
}
2021-01-29 19:09:21 +08:00
2021-02-04 11:09:33 +08:00
if ( response . data . result ) {
response . data . result . forEach ( ( queryItem , resIndex ) => {
// 图表中每条线的名字,后半部分
let host = '' ; //up,
if ( queryItem . metric . _ _name _ _ ) {
host = ` ${ queryItem . metric . _ _name _ _ } { ` ; //up,
}
const tagsArr = Object . keys ( queryItem . metric ) ; //["__name__","asset","idc","instance","job","module","project"]
// 设置时间-数据格式对
let tempArr = [ ] ;
let dpsArr = [ ] ;
tempArr = queryItem . values ;
dpsArr = Object . entries ( queryItem . values ) ; //[ ["0",[1577959830.781,"0"]], ["1",[1577959845.781,"0"]] ]
dpsArr = dpsArr . map ( item => {
return [ item [ 0 ] , [ item [ 1 ] [ 0 ] , Number ( item [ 1 ] [ 1 ] ) ] ]
} ) ;
// 判断是否有数据, && tagsArr.length > 0
if ( dpsArr . length ) {
tagsArr . forEach ( ( tag , i ) => {
if ( tag !== '__name__' ) {
host += ` ${ tag } =" ${ queryItem . metric [ tag ] } ", ` ;
}
} ) ;
if ( host . endsWith ( ',' ) ) {
host = host . substr ( 0 , host . length - 1 ) ;
}
if ( queryItem . metric . _ _name _ _ ) {
host += "}" ;
}
if ( ! host || host === '' ) {
host = pen . data . expressArr [ innerPos ] ;
}
//处理legend别名
let alias = this . dealLegendAlias ( host , pen . data . legends [ innerPos ] ) ;
if ( ! alias || alias === '' ) {
alias = host ;
}
queryItem . legend = { name : host + "-" + pen . data . legends [ innerPos ] + "-" + resIndex , alias : alias } ;
2021-02-04 13:09:03 +08:00
queryItem . showValue = getMetricTypeValue ( queryItem . values , type ) ;
2021-02-04 11:09:33 +08:00
// 图表中每条线的名字,去掉最后的逗号与空格:metric名称, 标签1=a,标签2=c
}
} ) ;
}
} )
}
return res
} ,
dealLegendAlias : function ( legend , expression ) {
if ( /\{\{.+\}\}/ . test ( expression ) ) {
let labelValue = expression . replace ( /(\{\{.+?\}\})/g , function ( i ) {
let label = i . substr ( i . indexOf ( '{{' ) + 2 , i . indexOf ( '}}' ) - i . indexOf ( '{{' ) - 2 ) ;
let reg = new RegExp ( label + '=".+?"' ) ;
let value = null ;
if ( reg . test ( legend ) ) {
let find = legend . match ( reg ) [ 0 ] ;
value = find . substr ( find . indexOf ( '"' ) + 1 , find . lastIndexOf ( '"' ) - find . indexOf ( '"' ) - 1 ) ;
}
return value ? value : label ;
} ) ;
return labelValue
} else {
return expression ;
}
} ,
2021-02-05 10:44:07 +08:00
//获取project Info
getProjectData ( n ) {
//获取projectInfo
this . projectInfo . loading = true ;
this . $get ( 'project/info' , { id : n . id } ) . then ( response => {
if ( response . code === 200 ) {
this . projectInfo . loading = false ;
this . projectInfo = { ... this . projectInfo , ... response . data . basic , moduleMum : response . data . module . length } ;
this . projectInfo . total = this . projectInfo . alertStat [ 0 ] + this . projectInfo . alertStat [ 1 ] + this . projectInfo . alertStat [ 2 ] ;
if ( ! this . projectInfo . total ) {
this . projectInfo . total = 0
}
}
} ) ;
} ,
// Severity Label
returnSeverityLabel ( key ) {
return this . $CONSTANTS . alertMessage . severityData . find ( s => { return s . value == key } ) . label
} ,
2021-01-29 19:09:21 +08:00
//获取module
getModule ( ) {
this . projectInfo . loading = true ;
this . $get ( 'project/info' , { id : this . obj . id } ) . then ( response => {
if ( response . code === 200 ) {
this . projectInfo . loading = false ;
this . projectInfo = { ... this . projectInfo , ... response . data . basic , moduleMum : response . data . module . length } ;
this . allModules = response . data . module ;
this . modulesDiff ( )
}
} ) ;
} ,
getNodesArr ( ) {
this . nodesArr = getTopology ( this . topologyIndex ) . data . pens . filter ( item => {
if ( ! item . data ) {
item . data = {
moduleId : '' ,
moduleName : '' ,
show : false ,
error : false ,
expressArr : [ ] ,
}
}
return item . type === 0
} ) ;
// this.nodesArr=this.nodesArr.map(item=>{
// if(!item.data){
// item.data={
// moduleId:'',
// moduleName:'',
// show:false,
// error:false,
// expressArr:[],
// }
// }
// return {
// rect:item.rect,
// data:item.data
// }
// });
//打开动画 是否更新顶部图标
this . nodesArr = JSON . parse ( JSON . stringify ( this . nodesArr ) ) ;
} ,
modelTopClick ( item , index ) {
} ,
//摘除已选择的module
modulesDiff ( data ) {
this . modules = this . allModules ;
if ( getTopology ( this . topologyIndex ) . data . pens ) {
getTopology ( this . topologyIndex ) . data . pens . forEach ( item => {
if ( item . type == 0 ) {
this . modules = this . modules . filter ( item1 => item . data . moduleId !== item1 . id )
}
} )
}
if ( data && data . data && data . data . moduleId ) {
this . modules . unshift ( { id : data . data . moduleId , name : data . data . moduleName } ) ;
}
} ,
//显示module的工具
2021-02-05 11:41:20 +08:00
showNodeTools ( index , pen ) {
console . log ( pen ) ;
2021-01-29 19:09:21 +08:00
this . nodesArr . forEach ( ( item , i ) => {
item . data . show = i === index ;
} )
} ,
//具体内容点击
nodeTools ( node , tool ) {
this . moduleId = node . data . moduleId ;
2021-02-05 15:40:16 +08:00
if ( tool . id === 'total' && ! node . data . expressArr . length ) {
this . popDataShowUpdate ( '' , false , node ) ;
return
2021-02-05 15:26:27 +08:00
}
2021-02-02 10:30:45 +08:00
setTimeout ( ( ) => {
2021-02-05 13:35:47 +08:00
this . popDataShowUpdate ( tool . id , false , node )
2021-02-02 10:30:45 +08:00
} , 100 )
2021-01-29 19:09:21 +08:00
} ,
2021-02-05 13:35:47 +08:00
popDataShowUpdate ( key , flag , node ) { //key 显示对应的弹窗 flag是否不显示工具栏
2021-01-29 19:09:21 +08:00
this . popDataShow = {
endpoint : false ,
asset : false ,
total : false ,
other : false ,
info : false ,
alert : false ,
main : false ,
} ;
2021-02-05 13:35:47 +08:00
if ( key === 'total' ) {
this . chartDataInfo = { ... node . data , ... this . chartGetData . find ( item => item . id === node . id ) } ;
}
2021-01-29 19:09:21 +08:00
this . $nextTick ( ( ) => {
this . popDataShow [ key ] = true ;
} ) ;
if ( flag ) { // 处理关闭后 缩放后显示工具按钮的问题
this . moduleId = '' ;
this . showNodeTools ( '' ) ;
}
2021-02-02 10:30:45 +08:00
if ( key === 'asset' || key === 'alert' || key === 'endpoint' ) {
2021-01-29 19:09:21 +08:00
this . showNodeTools ( '' ) ;
}
} ,
/*topology 方法*/
onDrag ( event , node ) {
this . dragFlag = false ;
setTimeout ( ( ) => {
this . dragFlag = true ;
} , 100 ) ;
2021-02-04 17:06:04 +08:00
event . dataTransfer . setData ( 'Text' , JSON . stringify ( { ... node . data , data : { imageId : node . data . imageId } } ) ) ;
2021-01-29 19:09:21 +08:00
} ,
dragFlagChange ( node ) {
2021-02-02 10:30:45 +08:00
getTopology ( this . topologyIndex ) . addNode (
{
... node . data ,
rect : {
... node . data . rect ,
2021-02-04 13:09:03 +08:00
x : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetWidth / 2 - 50 ,
y : this . $refs [ 'topology-canvas' + this . topologyIndexF ] . offsetHeight / 2 - 50
2021-02-04 17:06:04 +08:00
} ,
data : { imageId : node . data . imageId }
2021-02-02 10:30:45 +08:00
} ) ;
2021-01-29 19:09:21 +08:00
setTimeout ( ( ) => {
this . dragFlag = true ;
} , 100 ) ;
} ,
2021-02-04 18:01:57 +08:00
onMessage ( event , data , e ) {
2021-02-04 17:06:04 +08:00
console . log ( 'onMessage' , event , data ) ;
2021-02-04 11:09:33 +08:00
// console.log(getTopology(this.topologyIndex))
2021-02-02 10:30:45 +08:00
if ( getTopology ( this . topologyIndex ) ) {
this . cachesIndex = getTopology ( this . topologyIndex ) . caches . index ;
if ( this . $refs . topTool ) {
this . $refs . topTool . redoFlag = false
2021-02-04 11:09:33 +08:00
}
;
2021-02-02 10:30:45 +08:00
}
2021-01-29 19:09:21 +08:00
if ( ! Array . isArray ( data ) && data ) { //判断不是数组 提前个data配置好节点属性
2021-02-04 17:06:04 +08:00
if ( data . type === 0 && ! data . data . moduleId ) {
2021-01-29 19:09:21 +08:00
data . data = {
2021-02-04 17:06:04 +08:00
... data . data ,
2021-01-29 19:09:21 +08:00
moduleId : '' ,
moduleName : '' ,
show : false ,
error : false ,
animatePlay : data . animatePlay ,
fillStyle : data . fillStyle ,
strokeStyle : data . strokeStyle ,
2021-02-02 19:24:21 +08:00
lineWidth : this . nodeDefaultWidth ( data . name ) ,
2021-01-29 19:09:21 +08:00
iconToolState : true ,
//chart 配置项
2021-02-04 11:09:33 +08:00
valueMapping : [ {
color : {
line : '#000000' ,
fill : '#ffffff' ,
text : '#000000' ,
} ,
value : 'base' ,
animateType : 'base' ,
level : 0 ,
base : true ,
} ] ,
2021-01-29 19:09:21 +08:00
expressArr : [ ] ,
legends : [ ] ,
tooltipShow : true ,
panelName : 'topologyName' ,
unit : 2 ,
type : 'line' ,
displayChart : true ,
aggregation : 'last' ,
2021-02-02 19:24:21 +08:00
title : '' ,
url : '' ,
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
} else if ( data . type == 1 && ! data . data ) {
//连线是否自动计算锚点
// data.manualCps=true;
2021-01-29 19:09:21 +08:00
data . data = {
animatePlay : data . animatePlay ,
strokeStyle : data . strokeStyle ,
animateColor : data . animateColor ,
arrowColor : data . arrowColor ,
fromArrowColor : data . fromArrowColor ,
toArrowColor : data . toArrowColor ,
lineWidth : 1 ,
//chart 配置项
2021-02-04 11:09:33 +08:00
valueMapping : [ {
color : {
border : '#000000' ,
bac : '#ffffff' ,
text : '#000000' ,
} ,
value : 'base' ,
animateType : 'base' ,
level : 0 ,
base : true ,
} ] ,
2021-01-29 19:09:21 +08:00
expressArr : [ ] ,
legends : [ ] ,
tooltipShow : true ,
panelName : 'topologyName' ,
unit : 2 ,
type : 'line' ,
displayChart : true ,
aggregation : 'last' ,
2021-02-02 19:24:21 +08:00
title : '' ,
moduleName : '' ,
url : '' ,
2021-01-29 19:09:21 +08:00
}
}
2021-02-02 10:30:45 +08:00
if ( data . type === 0 || data . type === 1 ) {
2021-01-29 19:09:21 +08:00
data . lineWidth = data . data . lineWidth ;
}
}
switch ( event ) {
case 'moveInNode' :
case 'moveInLine' :
2021-02-04 18:01:57 +08:00
if ( this . timer3 ) {
clearTimeout ( this . timer3 ) ;
this . timer3 = null
}
2021-01-29 19:09:21 +08:00
this . chartData = { ... data . data , ... this . chartGetData . find ( item => item . id === data . id ) } ;
2021-02-04 18:01:57 +08:00
this . tooltipPosition . show = false ;
setTimeout ( ( ) => {
this . tooltipPosition . show = true ;
} , 50 ) ;
2021-01-29 19:09:21 +08:00
break ;
case 'moveOutNode' :
case 'moveOutLine' :
2021-02-04 18:01:57 +08:00
// this.tooltipPosition.show=false;
// return
2021-01-29 19:09:21 +08:00
if ( ! this . timer3 ) {
this . timer3 = setTimeout ( ( ) => {
this . tooltipPosition . show = false ;
this . timer3 = null
2021-02-04 18:01:57 +08:00
} , 150 )
2021-01-29 19:09:21 +08:00
} else {
clearTimeout ( this . timer3 ) ;
this . timer3 = setTimeout ( ( ) => {
this . tooltipPosition . show = false ;
this . timer3 = null
2021-02-04 18:01:57 +08:00
} , 150 )
2021-01-29 19:09:21 +08:00
}
break ;
}
// 右侧输入框编辑状态时点击编辑区域其他元素, onMessage执行后才执行onUpdateProps方法, 通过setTimeout让onUpdateProps先执行
setTimeout ( ( ) => {
switch ( event ) {
case 'node' :
case 'addNode' :
this . modulesDiff ( data ) ;
2021-02-02 19:24:21 +08:00
if ( data . data . expressArr . length === 0 ) {
data . data . expressArr . push ( '' ) ;
data . data . legends . push ( '' ) ;
}
2021-01-29 19:09:21 +08:00
this . props = {
node : data ,
line : null ,
multi : false ,
expand : this . props . expand ,
nodes : null ,
locked : data . locked ,
pen : data ,
pens : null ,
} ;
this . $nextTick ( ( ) => {
if ( this . $refs . CanvasProps ) {
this . $refs . CanvasProps . tab = '1' ;
}
} ) ;
break ;
case 'line' :
case 'addLine' :
this . props = {
node : null ,
line : data ,
multi : false ,
nodes : null ,
locked : data . locked ,
pen : data ,
pens : null ,
} ;
2021-02-02 19:24:21 +08:00
if ( data . data . expressArr . length === 0 ) {
data . data . expressArr . push ( '' ) ;
data . data . legends . push ( '' ) ;
}
2021-01-29 19:09:21 +08:00
this . $nextTick ( ( ) => {
if ( this . $refs . CanvasProps ) {
this . $refs . CanvasProps . tab = '1' ;
}
} ) ;
break ;
case 'multi' :
this . props = {
node : null ,
line : null ,
multi : true ,
nodes : data . length > 1 ? data : null ,
locked : this . getLocked ( { nodes : data } ) ,
pen : null ,
pens : data . length > 1 ? data : null ,
} ;
break ;
case 'space' :
this . props = {
node : null ,
line : null ,
multi : false ,
nodes : null ,
locked : false ,
pen : null ,
pens : null ,
} ;
break ;
case 'moveOut' :
break ;
case 'moveNodes' :
case 'resizeNodes' :
if ( data . length > 1 ) {
this . props = {
node : null ,
line : null ,
multi : true ,
nodes : data ,
locked : this . getLocked ( { nodes : data } ) ,
pen : null ,
pens : null ,
} ;
} else {
this . props = {
node : data [ 0 ] ,
line : null ,
multi : false ,
nodes : null ,
locked : false ,
pen : data [ 0 ] ,
pens : null ,
} ;
}
break ;
case 'resize' :
2021-02-05 11:41:20 +08:00
console . log ( this . topologyIndexF ) ;
2021-02-04 13:09:03 +08:00
let domRect = document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . getBoundingClientRect ( ) ;
2021-01-29 19:09:21 +08:00
this . toolShow . attrCord = [ domRect . width - 350 , 0 ] ;
this . toolShow . height = domRect . height ;
getTopology ( this . topologyIndex ) . canvasPos = domRect ;
break ;
case 'scale' :
if ( this . $refs . topTool ) {
this . $refs . topTool . option . scale = data ;
}
break ;
case 'locked' :
this . props = {
node : null ,
line : null ,
multi : false ,
nodes : null ,
locked : false ,
pen : null ,
pens : null ,
} ;
break ;
case "delete" :
this . props = {
node : null ,
line : null ,
multi : false ,
nodes : null ,
locked : false ,
pen : null ,
pens : null ,
} ;
break
}
switch ( event ) {
case 'node' :
case 'line' :
case 'space' :
case 'scale' :
2021-02-05 11:41:20 +08:00
case 'translate' :
2021-01-29 19:09:21 +08:00
this . moduleId = '' ;
this . showNodeTools ( '' ) ;
2021-02-05 11:41:20 +08:00
this . popDataShowUpdate ( '' , false )
2021-01-29 19:09:21 +08:00
break ;
}
switch ( event ) {
case 'space' :
case 'scale' :
case 'translate' :
if ( ! this . timer2 ) {
this . timer2 = setTimeout ( ( ) => {
this . getNodesArr ( ) ;
this . timer2 = null
} , 300 )
} else {
clearTimeout ( this . timer2 ) ;
this . timer2 = setTimeout ( ( ) => {
this . getNodesArr ( ) ;
this . timer2 = null
} , 300 )
}
break ;
}
} , 0 ) ;
} ,
getLocked ( data ) {
let locked = true ;
if ( data . nodes && data . nodes . length ) {
for ( const item of data . nodes ) {
if ( ! item . locked ) {
locked = false ;
break ;
}
}
}
if ( locked && data . lines ) {
for ( const item of data . lines ) {
if ( ! item . locked ) {
locked = false ;
break ;
}
}
}
return locked ;
} ,
onUpdateProps ( node ) {
// 如果是node属性改变, 需要传入node, 重新计算node相关属性值
// 如果是line属性改变, 无需传参
getTopology ( this . topologyIndex ) . updateProps ( node ) ;
} ,
handleAvatarSuccess ( ) {
} ,
beforeAvatarUpload ( file ) {
let this _ = this
let isJPG = ( file . type === 'image/jpeg' || file . type === 'image/png' ) ;
const isLt2M = file . size / 1024 / 1024 < 2 ;
if ( ! isJPG ) {
this . $message . error ( this _ . $t ( 'project.topology.imgFormat' ) ) ;
return false ;
}
// if (!isLt2M) {
// this.$message.error( this_.$t('project.topology.imgSize'));
// return false;
// }
const isSize = new Promise ( function ( resolve , reject ) {
let width = 100 ;
let height = 100 ;
let _URL = window . URL || window . webkitURL ;
let img = new Image ( ) ;
img . onload = function ( ) {
let valid = img . width > width && img . height > height ;
valid ? resolve ( ) : reject ( ) ;
}
img . src = _URL . createObjectURL ( file ) ;
} ) . then ( ( ) => {
if ( isJPG ) {
this . file = file ;
this . upload ( ) ;
}
return file ;
} , ( ) => {
this . $message . error ( this _ . $t ( 'project.topology.imgMeasure' ) ) ;
return Promise . reject ( ) ;
} ) ;
return false ;
} ,
toolShowChange ( attr ) {
this . toolShow [ attr ] = ! this . toolShow [ attr ]
} ,
/*topology 方法*/
end ( v ) {
console . log ( v ) ;
} ,
/*tools 方法*/
upload ( ) {
let form = new FormData ( ) ;
form . append ( "file" , this . file ) ;
let fileName = this . file . name ;
form . append ( "name" , fileName . substring ( 0 , fileName . lastIndexOf ( "." ) ) ) ;
this . $post ( '/project/topo/icon' , form , { 'Content-Type' : 'multipart/form-data' } ) . then ( res => {
if ( res . code == 200 ) {
this . $message ( { duration : 2000 , type : 'success' , message : this . $t ( "tip.saveSuccess" ) } ) ;
this . dealImg ( ` /project/topo/icon/ ${ res . data . id } ` ) . then ( ( data ) => {
this . tools [ 1 ] . children . push ( {
... imageTemp ,
data : {
... imageTemp . data ,
text : res . data . imageName ,
image : data ,
imageId : res . data . id ,
}
} )
} )
} else {
this . $message . error ( res . msg ) ;
}
} )
} ,
delImg ( item ) {
this . $delete ( '/project/topo/icon?ids=' + item . data . imageId ) . then ( res => {
if ( res . code == 200 ) {
this . $message ( { duration : 2000 , type : 'success' , message : this . $t ( "tip.deleteSuccess" ) } ) ;
this . addNodeInit ( ) ;
} else {
this . $message . error ( res . msg ) ;
}
} )
} ,
2021-02-04 17:06:04 +08:00
addNodeInit ( ) {
2021-01-29 19:09:21 +08:00
this . $get ( '/project/topo/icon' ) . then ( res => {
this . imgageLoading = true ;
this . tools [ 1 ] . children = [ ] ;
2021-02-04 17:06:04 +08:00
let promiseArr = [ ] ;
2021-01-29 19:09:21 +08:00
res . data . list . forEach ( ( item , index ) => {
item . imageName = item . name ;
delete item . name ;
2021-02-04 17:06:04 +08:00
promiseArr . push ( this . dealImg ( ` /project/topo/icon/ ${ item . id } ` ) ) ;
2021-01-29 19:09:21 +08:00
} ) ;
2021-02-04 17:06:04 +08:00
Promise . all ( promiseArr ) . then ( res2 => {
this . iconArray = [ ... res . data . list ] ;
this . iconArray . forEach ( ( item , index ) => {
this . tools [ 1 ] . children . push ( {
... imageTemp ,
data : {
... imageTemp . data ,
text : item . imageName ,
image : res2 [ index ] ,
imageId : item . id ,
}
} )
item . image = res2 [ index ] ;
} ) ;
this . imgInit = true ;
} )
2021-01-29 19:09:21 +08:00
} )
} ,
dealImg ( url ) {
// 处理后端传过来的图片流乱码问题
if ( url ) {
return new Promise ( ( resolve , reject ) => {
this . $axios
. get ( url , {
responseType : "arraybuffer"
} )
. then ( res => {
return ( "data:image/jpeg;base64," + btoa ( new Uint8Array ( res . data ) . reduce ( ( data , byte ) => data + String . fromCharCode ( byte ) , "" ) ) ) ;
} )
. then ( data => {
resolve ( data ) ;
// changeImage(data,(img)=>{
// resolve(img)
// })
} )
. catch ( err => {
} ) ;
} )
}
} ,
delPen ( obj ) { //删除元素
getTopology ( this . topologyIndex ) . delete ( obj ) ;
this . props = {
node : null ,
line : null ,
multi : false ,
nodes : null ,
locked : false ,
pen : null ,
pens : null ,
} ;
} ,
editTopology ( val ) {
this . editTopologyFlag = true ;
setTimeout ( ( ) => {
getTopology ( this . topologyIndex ) . lock ( 0 ) ;
getTopology ( this . topologyIndex ) . data . pens . forEach ( ( item ) => { //停止动画 以及赋值默认data
item . stopAnimate ( ) ;
if ( item . type === 0 ) {
item . fillStyle = item . data . fillStyle ;
item . strokeStyle = item . data . strokeStyle ;
item . animatePlay = item . data . animatePlay ;
2021-02-04 11:09:33 +08:00
item . font . color = "#000000" ;
2021-01-29 19:09:21 +08:00
} else if ( item . type === 1 ) {
item . animateColor = item . data . animateColor ;
item . strokeStyle = item . data . strokeStyle ;
item . arrowColor = item . data . arrowColor ;
item . fromArrowColor = item . data . fromArrowColor ;
item . toArrowColor = item . data . toArrowColor ;
item . animatePlay = item . data . animatePlay ;
2021-02-04 11:09:33 +08:00
item . font . color = "#000000" ;
2021-01-29 19:09:21 +08:00
}
} )
2021-02-04 13:09:03 +08:00
let domRect = document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . getBoundingClientRect ( ) ;
2021-01-29 19:09:21 +08:00
this . toolShow . attrCord = [ domRect . width - 350 , 0 ] ;
this . toolShow . height = domRect . height ;
getTopology ( this . topologyIndex ) . canvasPos = domRect ;
} )
} ,
animateCanvas ( ) {
getTopology ( this . topologyIndex ) . render ( ) ;
getTopology ( this . topologyIndex ) . animate ( )
} ,
refreshTopology ( ) {
// canvas.open()
} ,
2021-02-02 10:30:45 +08:00
dropdownClick ( ) {
} ,
changeTopologyOpt ( val , key ) {
// this.topologyData.data[key]=this.colorRGBtoHex(val);
// getTopology(this.index).data[key]=val;
// getTopology(this.index).render();
let dataOption = getTopology ( this . topologyIndex ) . data ;
dataOption [ key ] = this . lineName ;
getTopology ( this . topologyIndex ) . render ( ) ;
} ,
//保存
2021-01-29 19:09:21 +08:00
saveTopology ( ) {
2021-02-04 17:06:04 +08:00
let topologyData = getTopology ( this . topologyIndex ) . pureData ( ) ;
2021-01-29 19:09:21 +08:00
let flag = true ;
topologyData . pens . forEach ( item => {
2021-02-02 10:30:45 +08:00
if ( item . type === 0 && ( ( flag && ! item . data ) || ( flag && item . data && ! item . data . moduleId ) ) ) {
2021-01-29 19:09:21 +08:00
flag = false ;
}
} ) ;
if ( flag ) {
this . editTopologyFlag = false ;
2021-02-04 17:06:04 +08:00
topologyData . pens . forEach ( item => {
if ( item . type === 0 && JSON . stringify ( item . data . imageId ) ) {
item . image = "" ;
item . animateFrames = [ ] ;
item . animateReady = null ;
delete item . img ;
delete item . lastImage ;
}
2021-02-05 15:26:27 +08:00
item . data . expressArr = item . data . expressArr . filter ( ( expression , i ) => {
if ( ! expression ) {
item . data . legends . splice ( i , 1 ) ;
return false
} else {
return true
}
} )
2021-02-04 17:06:04 +08:00
} ) ;
2021-02-04 13:09:03 +08:00
this . $put ( '/project/topo' , { topo : JSON . stringify ( topologyData ) , projectId : this . projectInfo . id } ) . then ( res => {
this . prevent _opt . save = false ;
if ( res . code === 200 ) {
this . $message ( {
message : this . $t ( "tip.saveSuccess" ) ,
type : 'success'
} ) ;
this . $nextTick ( ( ) => {
getTopology ( this . topologyIndex ) . lock ( 1 ) ;
let domRect = document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . getBoundingClientRect ( ) ;
this . toolShow . attrCord = [ domRect . width - 350 , 0 ] ;
this . toolShow . height = domRect . height ;
getTopology ( this . topologyIndex ) . canvasPos = domRect ;
this . reload ( ) ;
} )
}
} ) . catch ( res => {
this . prevent _opt . save = false ;
this . $message ( {
message : res . msg ,
type : 'error'
} ) ;
} ) ;
2021-01-29 19:09:21 +08:00
} else {
this . $message ( {
2021-02-02 10:30:45 +08:00
showClose : true ,
message : '请个所有节点绑定module' ,
type : 'warning'
2021-01-29 19:09:21 +08:00
} )
}
} ,
2021-02-02 10:30:45 +08:00
//取消
2021-01-29 19:09:21 +08:00
cancelTopology ( ) {
this . editTopologyFlag = false ;
this . $nextTick ( ( ) => {
getTopology ( this . topologyIndex ) . lock ( 1 ) ;
2021-02-04 13:09:03 +08:00
let domRect = document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . getBoundingClientRect ( ) ;
2021-01-29 19:09:21 +08:00
this . toolShow . attrCord = [ domRect . width - 350 , 0 ] ;
this . toolShow . height = domRect . height ;
getTopology ( this . topologyIndex ) . canvasPos = domRect ;
} ) ;
this . reload ( ) ;
2021-02-02 10:30:45 +08:00
} ,
//预览
previewTopology ( ) {
2021-02-05 10:44:07 +08:00
this . topoPrevData = getTopology ( this . topologyIndex ) . data ;
this . previewShow = true ;
2021-01-29 19:09:21 +08:00
} ,
/*tools 方法*/
winResize ( ) {
2021-02-04 13:09:03 +08:00
let domRect = document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . getBoundingClientRect ( ) ;
2021-01-29 19:09:21 +08:00
this . toolShow . attrCord = [ domRect . width - 350 , 0 ] ;
this . toolShow . height = domRect . height ;
getTopology ( this . topologyIndex ) . canvasPos = domRect ;
getTopology ( this . topologyIndex ) . centerView ( ) ;
} ,
canvasMove ( e ) { // 画布上的移动 确定tooltip的位置
2021-02-04 18:01:57 +08:00
if ( this . tooltipPosition . show ) {
2021-02-02 10:30:45 +08:00
return
}
2021-01-29 19:09:21 +08:00
this . tooltipPosition . top = e . offsetY ;
this . tooltipPosition . left = e . offsetX + 20 ;
} ,
tooltipOver ( ) {
2021-02-04 18:01:57 +08:00
clearTimeout ( this . timer3 ) ;
this . timer3 = null
2021-01-29 19:09:21 +08:00
} ,
tooltipOut ( ) {
2021-02-04 18:01:57 +08:00
this . timer3 = setTimeout ( ( ) => {
this . tooltipPosition . show = false ;
this . timer3 = null
} , 150 )
2021-01-29 19:09:21 +08:00
} ,
2021-02-02 19:24:21 +08:00
nodeDefaultWidth ( nodeName ) {
switch ( nodeName ) {
case 'myCube' :
case "rectangleImg" :
return 0 ;
default :
return 1 ;
}
2021-02-05 11:41:20 +08:00
} ,
previewBeforeClose ( done ) {
console . log ( 123123123123 ) ;
this . $emit ( 'changeTopologyIndexF' ) ;
done ( ) ;
2021-02-05 15:26:27 +08:00
} ,
selpopIs ( pen , state ) { //判断是否有图表
console . log ( pen , state )
let flag = true ;
if ( state . id === 'other' ) {
flag = false ;
}
if ( state . id === 'total' && pen . data . expressArr . length === 0 ) {
flag = false ;
}
return flag
} ,
modelPopError ( pen , state ) {
console . log ( pen , state )
return false ;
if ( item . id === 'asset' && this . activeModelItem . assetError ) {
return true ;
}
if ( item . id === 'alert' && this . activeModelItem . alertError ) {
return true ;
}
if ( item . id === 'endpoint' && this . activeModelItem . endpointError ) {
return true ;
}
return false ;
} ,
2021-01-29 19:09:21 +08:00
} ,
destroyed ( ) {
getTopology ( this . topologyIndex ) . destroy ( ) ;
setTopology ( this . topologyIndex , null ) ;
2021-02-04 17:06:04 +08:00
if ( document . getElementById ( 'topology-canvas' + this . topologyIndexF ) ) {
document . getElementById ( 'topology-canvas' + this . topologyIndexF ) . removeEventListener ( 'mousemove' , this . canvasMove ) ;
}
2021-01-29 19:09:21 +08:00
window . removeEventListener ( 'resize' , this . winResize )
}
}
< / script >
2021-02-02 10:30:45 +08:00
< style lang = "scss" >
2021-02-04 11:09:33 +08:00
. el - dropdown - menu {
. project - topology - add - node {
2021-02-02 10:30:45 +08:00
. el - collapse - item _ _header {
padding : 0 10 px ;
background - color : # ffffff ;
2021-02-02 19:24:21 +08:00
height : 32 px ;
2021-02-02 10:30:45 +08:00
}
2021-02-04 11:09:33 +08:00
. el - collapse - item _ _header . is - active {
2021-02-02 10:30:45 +08:00
background : # F6F6F6 ;
ont - family : Roboto - Bold ;
font - size : 14 px ;
color : # FA901C ;
font - weight : 700 ;
2021-02-04 11:09:33 +08:00
el - collapse - item _ _arrow {
2021-02-02 10:30:45 +08:00
color : # 666 ;
}
}
2021-02-04 11:09:33 +08:00
2021-02-02 10:30:45 +08:00
. el - collapse - item _ _wrap {
padding : 0 10 px ;
background - color : # ffffff ;
}
2021-01-29 19:09:21 +08:00
2021-02-02 10:30:45 +08:00
. el - collapse - item _ _content {
padding : 12 px 0 px ;
display : flex ;
flex - wrap : wrap ;
/*justify-content: space-around;*/
}
2021-01-29 19:09:21 +08:00
2021-02-02 10:30:45 +08:00
. el - card _ _body {
padding : 0 ;
height : 100 % ;
}
2021-01-29 19:09:21 +08:00
2021-02-02 10:30:45 +08:00
. handle {
position : absolute ;
z - index : 2 ;
}
2021-02-04 11:09:33 +08:00
2021-02-02 10:30:45 +08:00
. buttons {
padding : 12 px ;
display : inline - block ;
position : relative ;
vertical - align : middle ;
2021-02-04 11:09:33 +08:00
width : 26 px ;
2021-02-02 10:30:45 +08:00
. delIcon {
position : absolute ;
width : 16 px ;
height : 16 px ;
border - radius : 10 px ;
font - size : 12 px ;
line - height : 16 px ;
text - align : center ;
background : red ;
right : - 8 px ;
top : - 8 px ;
color : # fff ;
display : none ;
cursor : pointer ;
}
a {
display : inline - block ;
color : # 314659 ;
width : 26 px ;
height : 26 px ;
text - align : center ;
text - decoration : none ! important ;
cursor : pointer ;
line - height : 26 px ;
. iconfont {
font - size : 24 px ;
}
img {
max - width : 26 px ;
max - height : 26 px ;
}
& : hover {
color : # 1890 ff ;
}
}
. upload - icon - box {
. el - icon - plus {
font - size : 14 px ;
margin - bottom : 10 px ;
}
2021-01-29 19:09:21 +08:00
2021-02-02 10:30:45 +08:00
display : flex ;
align - items : center ;
justify - content : center ;
flex - direction : column ;
width : 100 % ;
height : 100 % ;
}
}
2021-02-04 11:09:33 +08:00
2021-02-02 10:30:45 +08:00
. buttons : hover {
. delIcon {
/*display: inline-block;*/
}
}
}
2021-02-04 11:09:33 +08:00
. avatar - uploader {
2021-02-02 10:30:45 +08:00
line - height : 30 px ;
2021-02-04 11:09:33 +08:00
. el - icon - plus {
2021-02-02 10:30:45 +08:00
font - size : 12 px ;
color : # FA901C ;
margin : 0 8 px 0 15 px ;
}
2021-02-04 11:09:33 +08:00
. el - upload -- picture - card {
2021-02-02 10:30:45 +08:00
width : 100 % ;
height : 100 % ;
border : none ;
color : # 666 ;
font - size : 14 px ;
line - height : 30 px ;
text - align : left ;
}
2021-02-04 11:09:33 +08:00
. el - upload -- picture - card : hover , . el - upload : focus {
2021-02-02 10:30:45 +08:00
color : # 666 ;
}
}
2021-02-04 11:09:33 +08:00
. avatar - uploader : active el - upload -- picture - card {
2021-02-02 10:30:45 +08:00
color : # DB8B8B ;
}
2021-02-04 11:09:33 +08:00
. avatar - uploader : active . el - upload -- picture - card : hover , . avatar - uploader : active . el - upload : focus {
2021-02-02 10:30:45 +08:00
color : # DB8B8B ;
}
}
< / style >
< style scoped >
@ keyframes model - error - animation {
0 % {
2021-01-29 19:09:21 +08:00
transform : scale ( 0.7 ) ;
}
2021-02-02 10:30:45 +08:00
50 % {
2021-01-29 19:09:21 +08:00
transform : scale ( 1 ) ;
}
100 % {
transform : scale ( 0.7 ) ;
}
}
2021-02-02 10:30:45 +08:00
@ keyframes model - icon - animation {
0 % {
2021-01-29 19:09:21 +08:00
transform : scale ( 1.2 ) translateX ( 1 px ) ;
}
2021-02-02 10:30:45 +08:00
50 % {
2021-01-29 19:09:21 +08:00
transform : scale ( 0.9 ) translateX ( 0 px ) ;
}
100 % {
transform : scale ( 1.2 ) translateX ( 1 px ) ;
}
}
2021-02-02 10:30:45 +08:00
. nz - icon - shuidi {
2021-01-29 19:09:21 +08:00
position : absolute ;
font - size : 48 px ;
2021-02-02 10:30:45 +08:00
color : rgba ( 190 , 233 , 222 , 0.45 ) ;
2021-01-29 19:09:21 +08:00
border - radius : 50 % ;
height : 48 px ;
width : 48 px ;
line - height : 48 px ;
}
2021-02-02 10:30:45 +08:00
. model - error . nz - icon - shuidi {
color : # FADED7 ;
2021-01-29 19:09:21 +08:00
animation : model - error - animation .6 s infinite ease - in - out ;
2021-02-02 10:30:45 +08:00
animation - direction : normal ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. model - error - active . nz - icon - shuidi {
color : # FADED7 ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. nz - icon - model {
2021-01-29 19:09:21 +08:00
color : # 23 BF9A ;
position : absolute ;
top : - 4 px ;
left : 15 px ;
font - size : 18 px ;
line - height : 48 px ;
}
2021-02-02 10:30:45 +08:00
. model - error . nz - icon - model {
2021-01-29 19:09:21 +08:00
color : # EC7F66 ;
animation : model - icon - animation .6 s infinite ease - in - out ;
2021-02-02 10:30:45 +08:00
animation - direction : normal ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. model - error - active . nz - icon - model {
2021-01-29 19:09:21 +08:00
color : # EC7F66 ;
}
2021-02-02 10:30:45 +08:00
2021-01-29 19:09:21 +08:00
. scaleTool - enter - active {
animation : scaleTool - in .15 s ;
}
2021-02-02 10:30:45 +08:00
2021-01-29 19:09:21 +08:00
. scaleTool - leave - active {
animation : scaleTool - in .15 s reverse ;
}
2021-02-02 10:30:45 +08:00
2021-01-29 19:09:21 +08:00
@ keyframes scaleTool - in {
2021-02-02 10:30:45 +08:00
from {
top : 0 px ;
2021-01-29 19:09:21 +08:00
left : 0 px ;
transform : scale ( 0.5 ) ;
}
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon - hexagonBorder {
2021-01-29 19:09:21 +08:00
position : absolute ;
font - size : 48 px ;
color : # 84 d5c2 ;
height : 48 px ;
width : 48 px ;
line - height : 48 px ;
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon - hexagonBorder : hover {
2021-01-29 19:09:21 +08:00
transform : scale ( 1.1 ) ;
color : # 4 BB49B ;
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon - hexagonBorder . error - model - stat {
2021-01-29 19:09:21 +08:00
color : # F5BAAC ;
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon - hexagonBorder . error - model - stat : hover {
2021-01-29 19:09:21 +08:00
color : # EC7F66 ;
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon - liubianxing {
color : # e2f3ef ;
2021-01-29 19:09:21 +08:00
font - size : 44 px ;
position : absolute ;
top : 1 px ;
left : 2 px ;
2021-02-05 11:41:20 +08:00
transform : scale ( 0.95 ) ;
2021-01-29 19:09:21 +08:00
z - index : 0 ;
}
2021-02-02 10:30:45 +08:00
. network - pop . error - model - stat . nz - icon - liubianxing {
color : # FADED7 ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. network - pop . nz - icon . noMove {
2021-01-29 19:09:21 +08:00
position : absolute ;
left : 14 px ;
font - size : 20 px ;
color : # 27 c09c ;
}
2021-02-02 10:30:45 +08:00
. network - pop . error - model - stat . nz - icon . noMove {
2021-01-29 19:09:21 +08:00
color : # EC7F66 ;
}
2021-02-02 10:30:45 +08:00
. network - pop . no - selPop {
2021-02-05 15:26:27 +08:00
color : # 999 ! important ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. network - pop . no - selPop . nz - icon - liubianxing {
color : rgb ( 218 , 218 , 218 ) ;
2021-01-29 19:09:21 +08:00
}
2021-02-02 10:30:45 +08:00
. network - pop . no - selPop . nz - icon - chart {
2021-01-29 19:09:21 +08:00
color : # 999 ;
}
2021-02-02 10:30:45 +08:00
. network - info {
2021-01-29 19:09:21 +08:00
position : absolute ;
right : 0 ;
top : 50 px ;
}
2021-02-05 10:44:07 +08:00
. facade - top {
min - height : 138 px ;
display : flex ;
margin : 12 px 0 ;
height : calc ( 16 % - 40 px ) ;
font - size : 12 px ;
position : absolute ;
top : 5 px ;
left : 15 px ;
z - index : 10 ;
}
. facade - top > div {
height : calc ( 100 % - 40 px ) ;
width : 18 % ;
min - width : 315 px ;
background : # FFFFFF ;
margin - right : 9 px ;
padding : 20 px ;
border : 1 px solid # FFFFFF ;
box - shadow : 1 px 2 px 4 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , - 1 px 1 px 9 px - 1 px rgba ( 205 , 205 , 205 , 0.77 ) ;
}
. facade - top - title {
font - size : 16 px ;
color : # 333333 ;
font - weight : bold ;
padding : 5 px 0 ;
}
. facade - top - left {
display : flex ;
flex - direction : column ;
justify - content : space - around ;
}
. special . label {
margin - left : 30 px ;
}
. facade - top . facade - top - right {
width : auto ;
min - width : 100 px ;
}
. facade - top - right - content {
display : flex ;
justify - content : space - around ;
justify - items : center ;
flex - direction : column ;
height : calc ( 100 % - 30 px ) ;
align - items : flex - start ;
}
. facade - top - right - content > div {
min - width : 84 px ;
height : 22 px ;
display : flex ;
justify - content : space - between ;
color : # fff ;
text - align : center ;
margin - bottom : 5 px ;
line - height : 22 px ;
}
. facade - top - right - content > div > div : last - child {
text - align : center ;
border - radius : 0 4 px 4 px 0 ;
flex : 1 ;
height : calc ( 100 % - 2 px ) ;
padding : 0 8 px ;
min - width : 40 px ;
}
. content - P1 - title {
background : # F2866E ;
border - radius : 4 px 0 0 4 px ;
width : 40 px ;
height : 100 % ;
}
. content - P1 - title + div {
border : 1 px solid # F4907A ;
font - size : 12 px ;
color : # F4907A ;
}
. content - P2 - title {
background : # F89984 ;
border - radius : 4 px 0 0 4 px ;
width : 40 px ;
height : 100 % ;
}
. content - P2 - title + div {
border : 1 px solid # F9A28F ;
font - size : 12 px ;
color : # F9A28F ;
}
. content - P3 - title {
background : # F7BA78 ;
border - radius : 4 px 0 0 4 px ;
width : 40 px ;
height : 100 % ;
}
. content - P3 - title + div {
border : 1 px solid # F7BA78 ;
font - size : 12 px ;
color : # F7BA78 ;
}
. right - content - P1 {
border : 1 px solid ;
}
. align -- center {
text - align : center ;
}
2021-01-29 19:09:21 +08:00
< / style >
< style lang = "scss" scoped >
2021-02-04 11:09:33 +08:00
. project - topology - tool {
2021-02-02 10:30:45 +08:00
display : inline - flex ;
height : 30 px ;
}
2021-02-04 11:09:33 +08:00
. el - dropdown - title {
2021-02-02 10:30:45 +08:00
background : # FFFFFF ;
border : 1 px solid # DEDEDE ;
border - radius : 2 px ;
width : 66 px ;
height : 28 px ;
display : inline - block ;
line - height : 28 px ;
2021-02-04 11:09:33 +08:00
. icon - cube {
2021-02-02 10:30:45 +08:00
margin - left : 15 px ;
}
}
2021-02-04 11:09:33 +08:00
2021-01-29 19:09:21 +08:00
. project - box {
width : 100 % ;
2021-02-05 10:44:07 +08:00
height : calc ( 100 % - 20 px ) ;
margin - top : 10 px ;
2021-01-29 19:09:21 +08:00
position : relative ;
2021-02-05 10:44:07 +08:00
border : 1 px solid # eeeeee ;
border - radius : 2 px ;
2021-01-29 19:09:21 +08:00
. project - title {
2021-02-05 10:44:07 +08:00
height : 34 px ;
padding - top : 8 px ;
padding - bottom : 8 px ;
2021-01-29 19:09:21 +08:00
}
. drag - header {
cursor : move ;
background : # 1 a1a1a ;
color : # fff ;
}
. left - bottom {
position : absolute ;
left : 10 px ;
bottom : 10 px ;
}
}
. page {
display : flex ;
height : calc ( 100 % - 80 px ) ;
width : 100 % ;
position : relative ;
. tools {
width : 300 px ;
height : 100 % ;
border : none ;
position : absolute ;
z - index : 1 ! important ;
left : 20 px ;
background - color : # f9f9f9 ;
. title {
float : left ;
}
}
. full {
flex : 1 ;
overflow : unset ! important ;
}
. props {
2021-02-02 19:24:21 +08:00
width : 500 px ;
2021-01-29 19:09:21 +08:00
height : 100 % ;
border : none ;
position : absolute ;
z - index : 1 ! important ;
2021-02-02 10:30:45 +08:00
right : 0 ;
top : 0 ;
background : # FFFFFF ;
box - shadow : inset 1 px 0 0 0 rgba ( 0 , 0 , 0 , 0.09 ) ;
2021-02-04 18:35:53 +08:00
border - radius : 0 px ;
2021-02-02 10:30:45 +08:00
}
}
2021-02-04 11:09:33 +08:00
. special - select svg {
2021-02-02 10:30:45 +08:00
width : 75 px ;
height : 30 px ;
}
. special - select . el - select . el - select -- small {
width : 100 % ;
}
2021-02-04 11:09:33 +08:00
. special - select / deep / . el - select - dropdown {
width : 75 px ! important ;
. el - select - dropdown _ _item {
2021-02-02 10:30:45 +08:00
padding : 0 0 0 10 px ;
2021-01-29 19:09:21 +08:00
}
}
2021-02-04 11:09:33 +08:00
2021-02-02 10:30:45 +08:00
. special - select / deep / . el - input . el - input -- prefix . el - input -- suffix , . line - width / deep / . el - input . el - input -- prefix . el - input -- suffix {
border : 1 px solid # DCDFE6 ;
height : 28 px ;
}
. special - select / deep / . el - input _ _inner , . line - width / deep / . el - input _ _inner {
display : none ;
}
. special - select / deep / . el - input _ _prefix , . line - width / deep / . el - input _ _prefix {
height : 28 px ;
line - height : 28 px ;
color : # 899 FB7 ;
width : 100 % ;
}
. special - select / deep / . el - input _ _prefix > div {
width : 100 % ;
height : 100 % ;
}
2021-01-29 19:09:21 +08:00
< / style >