视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue 中引用gojs绘制E-R图的方法示例
2020-11-27 22:09:26 责编:小采
文档


首先,在vue项目中安装gojs的依赖包,并在项目中引入。

创建tablePreview.vue

<style>
 #sample{
 position: relative;
 margin: 20px;
 }
 #myOverviewDiv {
 position: absolute;
 width:225px;
 height:100px;
 top: 10px;
 left: 10px;
 background-color: aliceblue;
 z-index: 300; /* make sure its in front */
 border: solid 1px blue;
 }
 #mySearch{
 width: 60%;
 float: right;
 margin-right: 20px;
 }
 .input_button{
 margin: 20px;
 }
 #entityRelation{
 width: 100%;
 height: 700px;
 border:1px solid #cccccc;
 }
 .returnShang{
 color: #fff;
 text-underline: none;
 }
 .returnShang:hover{
 color: #fff;
 text-underline: none;
 }
</style>
<template>
 <div>
 <div class="input_button">
 <Button type="success"><router-link to="/dataSourceAdmin" class="returnShang">返回上一级</router-link></Button>
 <Button type="primary" @click="searchDiagram()" style="float: right">Search</Button>
 <Input placeholder="请输入要查询的表名" id="mySearch" v-model="searchText" @keyup.enter.native="searchDiagram()"></Input>
 
 </div>
 <div id="sample">
 <div id="entityRelation"></div>
 <div id="myOverviewDiv"></div>
 </div>
 </div>
</template>
<script src="./tablePreview.js"></script>

在js文件中绘制E-R图,注意:初始化方面必须放在mounted中调用。

tablePreview.js如下

export default{
 data() {
 return {
 myDiagram: '',
 searchText: '',
 tabViewList: '',
 tabRelView: ''
 }
 },
 mounted() {
 var dataSoureId = JSON.parse(sessionStorage.getItem("previewInfo")).datasourceId
 let _this = this
 _this.$ajax.post(_this.cfg.api.dataPoolAdmin.tableRelView +'?datasourceId=' + dataSoureId)
 .then(function (res) {
 if(res.data.result) {
 _this.tabViewList = res.data.data.tabViewList
 _this.tabRelView = res.data.data.tabRelViewList
 _this.init()
 }
 })
 
 },
 methods: {
 init() {
 var go = this.go
 if (window.goSamples) goSamples(); // init for these samples -- you don't need to call this
 var a = go.GraphObject.make; // 定义模板
 
 this.myDiagram =
 a(go.Diagram, 'entityRelation', // 必须命名或引用div html元素
 {
 initialContentAlignment: go.Spot.Center,
 allowDelete: false,
 allowCopy: false,
 layout: a(go.ForceDirectedLayout),
 "undoManager.isEnabled": true
 });
 
 // define several shared Brushes
 var bluegrad = a(go.Brush, "Linear", { 0: "rgb(150, 150, 250)", 0.5: "rgb(86, 86, 186)", 1: "rgb(86, 86, 186)" });
 var greengrad = a(go.Brush, "Linear", { 0: "rgb(158, 209, 159)", 1: "rgb(67, 101, 56)" });
 var redgrad = a(go.Brush, "Linear", { 0: "rgb(206, 106, 100)", 1: "rgb(180, 56, 50)" });
 var yellowgrad = a(go.Brush, "Linear", { 0: "rgb(254, 221, 50)", 1: "rgb(254, 182, 50)" });
 var lightgrad = a(go.Brush, "Linear", { 1: "#E6E6FA", 0: "#FFFAF0" });
 
 // the template for each attribute in a node's array of item data
 var itemTempl =
 a(go.Panel, "Horizontal",
 a(go.Shape,
 { desiredSize: new go.Size(10, 10) },
 new go.Binding("figure", "figure"),
 new go.Binding("fill", "color")),
 a(go.TextBlock,//items样式
 { stroke: "#333333",
 row: 0, alignment: go.Spot.Center,
 margin: new go.Margin(0, 14, 0, 2),
 font: "bold 14px sans-serif" },
 new go.Binding("text", "name"))
 );
 
 // define the Node template, representing an entity
 this.myDiagram.nodeTemplate =
 a(go.Node, "Auto", // the whole node panel
 { selectionAdorned: true,
 resizable: true,
 layoutConditions: go.Part.LayoutStandard & ~go.Part.LayoutNodeSized,
 fromSpot: go.Spot.AllSides,
 toSpot: go.Spot.AllSides,
 isShadowed: true,
 shadowColor: "#CCAA" },
 new go.Binding("location", "location").makeTwoWay(),
 // whenever the PanelExpanderButton changes the visible property of the "LIST" panel,
 // clear out any desiredSize set by the ResizingTool.
 new go.Binding("desiredSize", "visible", function(v) { return new go.Size(NaN, NaN); }).ofObject("LIST"),
 // define the node's outer shape, which will surround the Table
 a(go.Shape, "Rectangle",
 /*{ fill: lightgrad, stroke: "#756875", strokeWidth: 3 }),*/
 new go.Binding("fill", "isHighlighted", function(h) { return h ? "#F44336" : "#A7E7FC"; }).ofObject()),
 a(go.Panel, "Table",
 { margin: 15, stretch: go.GraphObject.Fill },
 a(go.RowColumnDefinition, { row: 0, sizing: go.RowColumnDefinition.None }),
 // the table header
 a(go.TextBlock,
 {
 row: 0, alignment: go.Spot.Center,
 margin: new go.Margin(0, 14, 0, 2), // leave room for Button
 font: "bold 16px sans-serif"
 },
 new go.Binding("text", "key")),
 // 折叠/展开按钮
 /*a("PanelExpanderButton", "LIST", // the name of the element whose visibility this button toggles
 { row: 0, alignment: go.Spot.TopRight }),*/
 // the list of Panels, each showing an attribute
 a(go.Panel, "Vertical",
 {
 name: "LIST",
 row: 1,
 padding: 0,//表名到下边框的距离
 alignment: go.Spot.TopLeft,
 defaultAlignment: go.Spot.Left,
 stretch: go.GraphObject.Horizontal,
 itemTemplate: itemTempl
 },
 new go.Binding("itemArray", "items"))
 ) // end Table Panel
 ); // end Node
 
 // define the Link template, representing a relationship
 this.myDiagram.linkTemplate =
 a(go.Link, // the whole link panel
 {
 selectionAdorned: true,
 layerName: "Foreground",
 reshapable: true,
 routing: go.Link.AvoidsNodes,
 corner: 5,
 curve: go.Link.JumpOver,
 toEndSegmentLength: 100
 },
 a(go.Shape, // the link shape
 { stroke: "#303B45", strokeWidth: 2.5 }),
 a(go.TextBlock, // the "from" label
 {
 textAlign: "center",
 font: "bold 14px sans-serif",
 stroke: "#1967B3",
 segmentIndex: 0,
 segmentOffset: new go.Point(NaN, NaN),
 segmentOrientation: go.Link.OrientUpright
 },
 new go.Binding("text", "text")),
 a(go.TextBlock, // the "to" label
 {
 textAlign: "center",
 font: "bold 14px sans-serif",
 stroke: "#1967B3",
 segmentIndex: -1,
 segmentOffset: new go.Point(NaN, NaN),
 segmentOrientation: go.Link.OrientUpright
 },
 new go.Binding("text", "toText"))
 );
 
 // create the model for the E-R diagram
 var nodeDataArray = []
 for(var i =0; i< this.tabViewList.length; i++){
 nodeDataArray.push(JSON.parse(JSON.stringify(
 { key: this.tabViewList[i].tableName,
 name: this.tabViewList[i].tableCnName,
 items: [{name: this.tabViewList[i].tableCnName, isKey: false, figure: 'Decision', color: "#2d8cf0"}]
 }
 )))
 }
 var linkDataArray = []
 for(var j =0; j< this.tabRelView.length; j++){
 linkDataArray.push(JSON.parse(JSON.stringify(
 { from: this.tabRelView[j].fromTableName, to: this.tabRelView[j].toTableName,
 text: this.tabRelView[j].fromText, toText: this.tabRelView[j].toText
 })
 ))
 }
 /*var nodeDataArray = [
 { key: this.tabViewList[].tableName,
 items: [ { name: "角色标识:BIGINT", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "模块标识:BIGINT", iskey: false, figure: "Cube", color: bluegrad }] },
 { key: "角色信息表",
 items: [ { name: "标识:BIGINT", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "名称:VARCHAR(100)", iskey: false, figure: "Cube1", color: bluegrad },
 { name: "描述:VARCHAR(100)", iskey: false, figure: "Cube1", color: bluegrad },
 { name: "排序:VARCHAR(100)", iskey: false, figure: "Cube1", color: bluegrad } ] },
 { key: "用户权限表",
 items: [ { name: "CategoryID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "CategoryName", iskey: false, figure: "Cube", color: bluegrad },
 { name: "Description", iskey: false, figure: "Cube", color: bluegrad },
 { name: "Picture", iskey: false, figure: "TriangleUp", color: redgrad } ] },
 { key: "用户信息表",
 items: [ { name: "OrderID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "ProductID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "UnitPrice", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Quantity", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Discount", iskey: false, figure: "MagneticData", color: greengrad } ] },
 { key: "表1",
 items: [ { name: "OrderID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "ProductID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "UnitPrice", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Quantity", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Discount", iskey: false, figure: "MagneticData", color: greengrad } ] },
 { key: "表2",
 items: [ { name: "OrderID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "ProductID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "UnitPrice", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Quantity", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Discount", iskey: false, figure: "MagneticData", color: greengrad } ] },
 { key: "表3" },
 { key: "表4",
 items: [ { name: "OrderID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "ProductID", iskey: true, figure: "Decision", color: yellowgrad },
 { name: "UnitPrice", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Quantity", iskey: false, figure: "MagneticData", color: greengrad },
 { name: "Discount", iskey: false, figure: "MagneticData", color: greengrad } ] },
 ];*/
 /*var linkDataArray = [
 { from: "角色权限表", to: "角色信息表", text: "N", toText: "1" },
 { from: "角色权限表", to: "用户权限表", text: "N", toText: "1" },
 { from: "用户信息表", to: "角色权限表", text: "N", toText: "1" },
 { from: "表1", to: "角色权限表", text: "N", toText: "1" },
 { from: "角色权限表", to: "表1", text: "N", toText: "1" },
 { from: "表2", to: "用户信息表", text: "N", toText: "1" },
 { from: "表3", to: "用户信息表", text: "N", toText: "1" },
 { from: "表4", to: "角色权限表", text: "N", toText: "1" }
 ];*/
 this.myDiagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
 // Overview
 var myOverview =
 a(go.Overview, "myOverviewDiv", // the HTML DIV element for the Overview
 { observed: this.myDiagram, contentAlignment: go.Spot.Center });
 },
 searchDiagram() { // called by button
 var input = document.getElementById("mySearch");
 if (!input) return;
 input.focus();
 this.myDiagram.startTransaction("highlight search");
 if (this.searchText) {
 // search four different data properties for the string, any of which may match for success
 // create a case insensitive RegExp from what the user typed
 var regex = new RegExp(this.searchText, "i");
 var results = this.myDiagram.findNodesByExample({ key: regex },{name: regex});
 this.myDiagram.highlightCollection(results);
 // try to center the diagram at the first node that was found
 if (results.count > 0) this.myDiagram.centerRect(results.first().actualBounds);
 } else { // empty string only clears highlighteds collection
 this.myDiagram.clearHighlighteds();
 }
 
 this.myDiagram.commitTransaction("highlight search");
 }
 }
}

这里在gojs的EntityRelationship实例的基础上,加了遮罩图与搜索后高亮显示功能。

遮罩层的作用是当有很多数据时,可以通过拖动遮罩层来查找。

 

这个是遮罩层的div

这里是把之前定义好的Diagram放进遮罩层。

搜索框的作用即是更快的找到相应的数据,下图代码是设置搜索后显示高亮的数据。

效果图如下:

下载本文
显示全文
专题