当前位置:   article > 正文

用Echarts 制作一个数据库表的关联关系图(二)_数据库表关系图

数据库表关系图

         前面 用Echarts 制作一个数据库表的关联关系图(一 中提到了几个问题,接下来一个一个解决。

1、添加节点

        目前项目背景为:左边是展示数据库表的 ztree 树,树的上面是一些对ztree 树进行操作的一些按钮,我的思路是在左边按钮区域添加一个按钮,选中树节点后(可支持多选),点击按钮后做添加操作。

  1. let [ ...temp ] = this.gData; // 节点的数据存在vuex state中
  2. temp.push({ // 保存节点的名字和ID
  3. name: nodes[0].name,
  4. value:nodes[0].tableId,
  5. x: 0,
  6. y: 0
  7. });

这样数据就保存起来了。

2、节点坐标

       当节点变化时,在 commit 后,先计算节点个数,再计算每个点的坐标,计算坐标的核心代码如下:

  1. // 表格关联关系 节点坐标计算
  2. export function getXYbyCount(count,width,height){
  3. let w = width | 500;
  4. let h= height | 400;
  5. let centerX=(w-100)/2;
  6. let centerY =(h-100)/2;
  7. let r = centerX < centerY ? centerX:centerY;
  8. let pointX = 100+centerY;
  9. let pointY = 100+centerY;
  10. let point = [];
  11. for(let i=0;i<count;i++){
  12. point.push(
  13. {
  14. x:pointX-r*Math.cos(i*2*Math.PI/count),
  15. y:pointY-r*Math.sin(i*2*Math.PI/count)
  16. }
  17. );
  18. }
  19. return point;
  20. }

    不多说了,学过数学的都能看懂。

3、触发Echarts 刷新

    vue 中双向绑定必须绑定到 html 元素,才能用 watch 监控直接改变的 state ,如下所示:

  1. watch:{
  2. // 鉴定节点的变化 重新加载图表
  3. gData:function (val) {
  4. this.initGraph();
  5. }
  6. },

4、连接线如何连接

     echarts 点击节点时,可以捕捉到点击事件,于是就可以设置个超时时间,把点击的节点记录下来,做连线,

  1. // 点击事件
  2. handleClick(handler) {
  3. // 判断是节点 还是 连线
  4. if(handler.dataType === 'node'){
  5. if(this.tableSchemas[handler.value] === undefined){
  6. this.getTableSchemaByid(handler.value);
  7. }
  8. // 判断是否已经存在节点
  9. if(_.indexOf(this.nodeArr,handler.name+"#"+handler.value) === -1){
  10. this.nodeArr.push(handler.name+"#"+handler.value);
  11. }
  12. // console.log(this.nodeArr);
  13. // 点击超时 清空
  14. setTimeout(()=>{
  15. this.nodeArr=[];
  16. },2000);
  17. // 点击了两个节点
  18. if(this.nodeArr.length >= 2){
  19. // 判断重复使用 两种组合方式 有连线了就不再连接了
  20. let lineValue1 = ''; // 该行和以下非真实代码
  21. let lineValue2 = '';
  22. let tmp = {
  23. source: sourceNode,
  24. target: targetNode,
  25. lineStyle: {
  26. normal: {
  27. width: 5,
  28. curveness: 0.2
  29. }
  30. },
  31. value:lineValue1
  32. };
  33. // 控制重复连线
  34. if( (_.indexOf(this.optionLinks,lineValue1) === -1) &&
  35. (_.indexOf(this.optionLinks,lineValue2) === -1) ){
  36. this.optionLinks.push(lineValue1);
  37. // 设置连线
  38. this.option.series[0].links.push(tmp);
  39. }
  40. this.myChart.setOption(this.option);
  41. this.nodeArr=[];
  42. }
  43. }
  44. else{
  45. if(this.allCondition[handler.value]){
  46. // 已经保存过条件处理逻辑
  47. }
  48. else {
  49. // 重新初始化 为了防止值重复 { 一些处理代码}
  50. // some code
  51. }
  52. }
  53. }

5、请求节点字段信息

        当点击节点时候去请求并记录节点的信息。在本地保存临时变量,如果已存在该表格信息,就不再请求服务器。

6、连接条件框

        用一个条件框,切换节点或者连线的时候做更新,效果

如图所示:

7、添加删除修改条件逻辑

     上图所示的弹出层,我们只需要一个,vue是数据驱动的,当连线切换时候,我们去更新数据就行,

  1. // 选择的所有关联条件
  2. allCondition:{},
  3. // 存放表的字段信息 key :tavleId value:schemas
  4. tableSchemas:{},
  5. // 选中表格1 的字段
  6. tableFirst:[],
  7. // 选中表格2 的字段
  8. tableSecond:[],
  9. // 当前连线的的信息
  10. currentItem:
  11. {
  12. count:1,
  13. // 起始表格名字
  14. tableSource:'',
  15. // 目标表格名字
  16. tableTarget:'',
  17. tableIds:'',
  18. // 表格直接的关联方式
  19. tableConnector:'INNER',
  20. data:[
  21. {
  22. itemId:1,
  23. tableFirstId:'tableFirstId1',
  24. tableRightId:'tableRightI1',
  25. },
  26. ]
  27. },
  28. // 弹出框是否显示
  29. modalRelation:false,
  30. // 连接线
  31. optionLinks:[],
  32. // 当前图表
  33. myChart: {},

      相信一看到这些数据结构及定义,就懂了。

8、最终条件的保存

     用上个步骤的 allCondition 即可。保存到后端时,转换成相应的数据结构,前端需要再次展示的时候,还原回来即可。

 

总结

     这就是开发表关联的一个思路和大部分代码,做的时候不要急,也不能乱,一个个小功能拆分出来,向上累积,最终就会达到我们想要的效果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/828492
推荐阅读
相关标签
  

闽ICP备14008679号