HTML/CSS可视化RBAC图表

7
我在我的数据库中存储了一个RBAC结构 (使用Yii构建的项目)。我希望能够生成一个图表来可视化这些元素之间的关系,以确保我没有犯逻辑错误,并向其他团队成员展示。
我想创建一个页面来生成图表/树形结构。我认为我可以处理服务器端部分,但我不知道如何生成HTML/CSS(或图像)。
图表中的节点可以有多个子节点和多个父节点。箭头是有方向的。例如:example 我不介意使用最新的CSS3和HTML5技术,因为它只会被选定的人使用。

你可以尝试使用pear包吗? - John Peter
你也可以使用 http://sigmajs.org/ 库。 - user1326628
4个回答

3
我之前也遇到过类似的问题。我最终找到了一个非常好用的JS库来解决这个问题,它就是Dracula。
以下是该库的链接:https://github.com/strathausen/dracula 根据你的需求,你只需要像这样做:
var g = new Graph();

g.addEdge('author', 'create');
g.addEdge('author', 'reader');
g.addEdge('author', 'admin');

// add here the other edges.

var layouter = new Graph.Layout.Spring();
layouter.layout();

var renderer = new Graph.Renderer.Raphael('#canvas', g, 400, 300);
renderer.draw();

更多信息,我让你去查阅文档。

希望对你有所帮助。

[补充]

一般来说,显示节点和箭头并不是件大事,使用 SVG 使其变得几乎微不足道。但当你想使用规则来组织节点的显示时,比如“尽量减少交叉边的数量”、“显示子节点在它们的父节点下方”等等,这些都需要复杂的数学计算。

我不认为 Dracula 允许用户自定义此类规则。然而,考虑到您的评论,我认为可能有一种相对简单的方法可以使布局看起来像竖直树形结构,因为这是一个无环图(至少看起来是这样的)。但是你将不得不通过制作自己的库来实现这一点。


我一直在研究这个,感觉不错。但是由于文档缺失,所以很难理解。我设法创建了一些还算可以的东西。难点在于让布局看起来像垂直树形结构,类似于示例中的那样。 - Nathan H

1

请尝试以下内容:

图表是最常用的数据结构之一,与链表和树一起使用。在最近的PHP项目中,我需要构建一个图形结构来分析一些相互链接的URL。问题的性质很简单,所以我选择了Pear存储库中可用的代码,而不是编写自己的代码。

Pear Structures_Graph包允许创建和操作图形数据结构。它允许构建有向或无向图,节点中存储数据和元数据。该库提供了用于图形遍历以及从图形拓扑中提取特征的函数。

还可以参考以下位置:http://www.codediesel.com/algorithms/building-a-graph-data-structure-in-php/

一些示例代码:

<?php

require_once 'Structures/Graph.php';
require_once 'Structures/Graph/Node.php';

$nonDirectedGraph = new Structures_Graph(false);

$nodes_names = array('a', 'b', 'c' ,'d', 'e');
$nodes = array();

foreach($nodes_names as $node) {
    /* Create a new node / vertex */
    $nodes[$node] = new Structures_Graph_Node();

    /* Add the node to the Graph structure */
    $nonDirectedGraph ->addNode($nodes[$node]);
}

/**
  * Specify connections between different nodes.
  * For example in the following array, 'a-b'
  * specifies that node 'a' is connected to node 'b'.
  * Also refer to the figure above.
  */

$vertices = array('a-b', 'b-c', 'b-d', 'd-c', 'c-e', 'e-d');

foreach($vertices as $vertex) {
    $data = preg_split("/-/",$vertex);
    $nodes[$data[0]]->connectTo($nodes[$data[1]]);
}
?>

如果我理解正确的话,您解释了一种构建图形结构的方法,而我真正想找的是向用户展示它的方法... - Nathan H
当然,如果你理解了“Structures_Graph”,你肯定可以做到这一点。 - John Peter

1

使用SVG怎么样?SVG可以通过CSS进行样式设置,通过Javascript进行访问,并嵌入HTML文档中。而且使用矢量格式似乎对于图形可视化来说是足够的,因为它有很多优点。其中一个优点 - 特别是在Web环境下 - 是与位图图像相比,大型图形的文件大小更小。

对于图形可视化本身,Graphviz是一个不错的选择。它是一个自1988年以来一直在积极开发的图形渲染软件/库。它能够呈现各种类型的图形,并将结果图像导出到包括SVG在内的各种图像格式中。它使用所谓的“dot语言”来描述图形。请查看Graphviz 项目页面以找到许多关于dot语言的示例和文档。

您是否已经在命令行上尝试过dotdot是Graphviz软件包中的一个二进制文件,它读取用dot语言编写的文件并将其呈现为所需的图像格式。这是一个很好的实验起点。

我曾经使用它来动态绘制PHP类图。我在php中生成了一个.dot文件,并使用exec dot -Tsvg graph.dot将其转换为SVG。

PEAR存储库中还有一个名为Image_Graphviz的GraphViz PHP包装库,可用于类似于您的项目。

当然,如果您使用通用图形绘制库而不是手动绘制它们,则必须进行一些布局妥协。但是,当熟悉dot语言时,您将获得最佳结果。


0
如果你能在服务器端使用Python,那么你可以使用Networkx生成高质量的图形,并将它们保存为SVG、PNG或其他你喜欢的格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接