一、流程圖效果
最近一段時間在研究go.js,它是一款前端開發畫流程圖的一個插件,也是一個難點,要說為什么是難點,首先,它是依賴畫布canvas知識開發,其次,要依賴于內部API開發需求,開發專案需求的時候就要花費大量的時間去熟悉go.js的API,然后才能進行開發,話不多說,我就先把我最近做的專案案例效果圖展示一下:

看到效果圖大家可能會想這個挺簡單的,會想沒什么難點,其實真正開發的時候才會知道的、才會領悟到,
二、為什么選go.js流程圖插件去開發專案?
在專案開發一期的時候我用的不是go.js,而用的是一款輕便的流程插件jsplumb.js,它也集成了各種功能性API,但是在開發二期的時候它的內部功能已經滿足不了需求了,所以我就開始在網上查找流程插件,看了很多插件,比如:G6,D3 等這些可視化流程插件都是不能滿足需求,要說為什么不能滿足需求,原因如下:
一、首先,看到效果圖里的內置多點和其他模塊單點連線問題,其他插件是無法這個滿足需求的,可能我沒有深入去了解其他的流程插件吧,但是go.js里內置點連線可以讓開發者很快的理解代碼邏輯,不用耗費大量的時間去想點與點的連線,
二、代碼上的資料結構問題,其他插件里的API資料欄位繁瑣量多,不夠清晰明了,而go.js里的資料結構就兩個重要欄位,一是所有模塊的欄位集合二是連線欄位集合,根據需求可以隨意加欄位,
三、專案開發
(一)、首先直接使用go.js,畫布中是有水印的

其實這個問題不大,替換一行代碼就可以去除水印
引入go.js后,直接在編輯器中全域搜索7eba17a4ca3b1a8346,找到類似這樣結構的代碼
a.ir=b.W[Ra("7eba17a4ca3b1a8346")][Ra("78a118b7")](b.W,ok,4,4);
注:不同的版本代碼不是完全相同的,可能是a.jv(屬性名是會變的) =‘xxxxx’,將這行代碼替換成
a.ir=function(){return true;}; //a.屬性名 要保持一致
去除水印的效果

(二)、html
<--第一種--> <template> <div id="wrap"> <div id="chart-wrap"> <div id="chart-palette"></div><-- 畫布一 --> <div id="chart-diagram"></div><-- 畫布二 --> </div> </div> </template>
如圖:
第二種
結合vue的拖拽組件vuedraggable 實作業務需求,
<template>
<div id="chart-wrap">
<vuedraggable @end.stop="end" @start.stop="move">
<div v-for="tab in tabLIst" :key="tab.id" >
<i : /> {{ tab.text }}
<el-tooltip effect="dark" :content="tab.tooltip" placement="top">
<i />
</el-tooltip>
</div>
</vuedraggable>
<div id="chart-diagram"></div>
</div>
</template>
如圖:
(三)、畫布的基本設定 ,
this.diagram = $(go.Diagram, "chart-diagram",
{
// 畫布初始位置
initialContentAlignment: go.Spot.LeftSide, // 居中顯示
"undoManager.isEnabled": true, // 支持 Ctrl-Z 和 Ctrl-Y 操作
// 初始坐標
// initialPosition: new go.Point(0, 0),
//allowSelect:false, ///禁止選中
// "toolManager.hoverDelay": 100, //tooltip提示顯示延時
// "toolManager.toolTipDuration": 10000, //tooltip持續顯示時間
// isReadOnly:true,//只讀
//禁止水平拖影片布
//禁止水平滾動條
allowHorizontalScroll: false,
// 禁止垂直拖影片布
//禁止垂直滾動條
allowVerticalScroll: false,
allowZoom: true,//畫布是否可以縮放
"grid.visible": false, //顯示網格
// allowMove: true, //允許拖動
// allowDragOut:true,
allowDelete: true,//禁止洗掉節點
allowCopy: true,//禁止復制
// 禁止撤銷和重做
// "undoManager.isEnabled": false,
// 畫布比例
// scale:1.5,
// minScale:1.2,//畫布最小比例
// maxScale:2.0,//畫布最大比例
// 畫布初始化影片時間
// "animationManager.duration": 600,
// 禁止畫布初始化影片
"animationManager.isEnabled": false,
// autoScale:go.Diagram.Uniform,//自適應
// autoScale:go.Diagram.UniformToFill,//自適應
// "draggingTool.dragsLink": false,//拖動線
// autoScale:go.Diagram.None,//默認值不自適應
// 畫布邊距padding
// padding:80或者new go.Margin(2, 0)或new go.Margin(1, 0, 0, 1)
// validCycle: go.Diagram.CycleDestinationTree,//只允許有一個父節點
//節點模塊影片 S
// "animationManager.initialAnimationStyle":go.Animation.EaseOutExpo,
// "animationManager.initialAnimationStyle": go.Animation.EaseInOutQuad,
"animationManager.initialAnimationStyle": go.AnimationManager.None,
// "animationManager.initialAnimationStyle":go.AnimationManager.AnimateLocations,
//節點模塊影片 D
// validCycle: go.Diagram.CycleNotUndirected,
// validCycle: go.Diagram.CycleNotDirected,
// validCycle: go.Diagram.CycleSourceTree,
//ismodelfied:true //禁止拖拽
// 禁止滑鼠拖動區域選中
// "dragSelectingTool.isEnabled" : false,
//允許使用delete鍵洗掉模塊
"commandHandler.deletesTree": true,
// "hasHorizontalScrollbar":false,//去除水平滾動條
// "hasVerticalScrollbar":false,//去除豎直滾動條
// "canStart":false,
// allowClipboard: true,
// "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom, //有滑鼠滾輪事件放大和縮小,而不是向上和向下滾動
// layout: $(go.TreeLayout,
// { angle: 90, layerSpacing: 80 }),
}
);
(三)、事件監聽 整體畫布及節點的監聽
// 監聽連線
this.diagram.addDiagramListener("LinkDrawn", (e) => {
console.log(e.subject.part);
});
// 監聽洗掉
this.diagram.addDiagramListener("SelectionDeleted", (e) => {
e.subject.each(function (n) {
console.log(n.data.key);
});
})
// 修改節點
this.diagram.addDiagramListener("TextEdited", (evt) => {
console.log(e.subject.part);
});
// 監聽點擊
this.diagram.addDiagramListener("ObjectSingleClicked", (e) => {
//這是清除高亮的
// e.diagram.commit((d) => {
// d.clearHighlighteds();
// }, "no highlighteds");
});
// // 移動事件
this.diagram.addDiagramListener("SelectionMoved", (e) => {
console.log(e.diagram.lastInput.documentPoint);
});
(四)、連線點封裝函式
// 節點連接線
makePort (name, align, spot, output, input) {
var horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom)
return $(go.Shape, {
fill: 'transparent', // 默認透明不現實
strokeWidth: 0, // 無邊框
fromMaxLinks: 1, //
width: horizontal ? NaN : 10, // 垂直"port"則8像素寬
height: !horizontal ? NaN : 5, // 水平"port"則8像素
alignment: align, // 同其模塊對齊
stretch: horizontal
? go.GraphObject.Horizontal
: go.GraphObject.Vertical, // 自動同其模塊一同伸縮
portId: name, // 宣告ID
fromSpot: spot, // 宣告連線頭連出此"port"的位置
fromLinkable: output, // 布爾型,是否允許連線從此"port"連出
toLinkable: input, // 布爾型,是否允許連線從此"port"連出
toSpot: spot, // 宣告連線尾連入此"port"的位置
cursor: 'pointer', // 滑鼠由指標改為手指,表示此處可點擊生成連線
mouseEnter: function (e, port) {
// 滑鼠移到"port"位置后,高亮
if (!e.diagram.isReadOnly) port.fill = 'rgba(255,0,255,0.3)'
},
mouseLeave: function (e, port) {
// 滑鼠移出"port"位置后,透明
port.fill = 'transparent'
}
})
}
(五)、節點連線的高亮函式,
isHighlightedFun(link) {
return $$(go.Shape,
"RoundedRectangle", {
fill: "rgba(217,236,255,.2)",
stroke: "rgba(39,154,242,.1)",
strokeWidth: 1,
},
new go.Binding("stroke", "isHighlighted", (h) => {
if (link == "link") {
return h ? "rgba(39,154,242,1)" : "rgba(39,154,242,.8)";
} else {
return h ? "rgba(39,154,242,1)" : "rgba(39,154,242,.6)";
}
}).ofObject(),
new go.Binding("strokeWidth", "isHighlighted", (h) => {
return h ? 2.5 : 1.3;
}).ofObject(),
)
}
如圖:


先寫到這,下周繼續寫,如有不足 可以私信單聊共享技術經驗,,,,,,,,,,,,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/5459.html
標籤:JavaScript
