npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

d3-force-layout

v1.9.7

Published

本模块是d3.js的关系图封装库,支持功能罗列如下。 - 包含实体(节点),关系(线条),以有向图形式展示。 - 能体现实体的关键程度以及关系的强弱。实体的关系越多,半径则越大。关系权重越大,线条就越粗。 - 实现实体检索以及关系检索,快速定位。 - 实现以某一个实体为中心点展开其相关实体及关系。 - 支持单击,双击事件订阅。比如注册单击事件,用户可自定义响应后查看实体或关系详情。 - 支持自定义右键菜单。用户可自定义不同菜单项及对应的响应事件。 - 查看某实体时,自动直观显示其邻接点,其它

Downloads

11

Readme

模块介绍

本模块是d3.js的关系图封装库,支持功能罗列如下。

  • 包含实体(节点),关系(线条),以有向图形式展示。
  • 能体现实体的关键程度以及关系的强弱。实体的关系越多,半径则越大。关系权重越大,线条就越粗。
  • 实现实体检索以及关系检索,快速定位。
  • 实现以某一个实体为中心点展开其相关实体及关系。
  • 支持单击,双击事件订阅。比如注册单击事件,用户可自定义响应后查看实体或关系详情。
  • 支持自定义右键菜单。用户可自定义不同菜单项及对应的响应事件。
  • 查看某实体时,自动直观显示其邻接点,其它实体模糊化。
  • 展示样式配置。用户可由不同的节点或线条类型自定义个性化的展示效果。
  • 算法分析

如何使用

  • npm install
  • npm run build即可在dist生成relation-chart.js,其它项目使用直接引入relation-chart.js即可
  • 使用类RelationChart渲染关系图

相关DEMO演示

  • 当前项目执行npm start,访问http://localhost:8081 即可,DEMO源码参照src>index.ts。
  • 网安业务图谱分析前端项目,使用VUE实现,参照 [email protected]:TopMind/net-security-graph.git

RelationChart参数说明

  • 选择器:选择器为字符串类型,api使用querySelector获取dom元素
  • data:是数据内容,包含了nodes数组和links数组。
    • nodes(节点对象数组,节点包含以下字段)
      • 基本字段
        • id 唯一标识 节点ID号
        • title 节点名称(可以为空)
        • type 节点类型 (可以为空)
      • 可选字段
        • 其它一些需要通过信息面板显示的字段
        • tags 该节点上打的标签数组
          • id 标签ID 唯一性
          • name 标签名字
          • icon 标签对应图标路径
        • style 样式对象(给单个节点配置样式)各字段详情含义见nodeConf配置描述
          • textSize
          • textColor
          • min
          • max
          • step
          • url
          • fillColor
          • strokeColor
          • strokeWidth
    • relations(关系对象数组,关系包含以下字段)
      • 基本字段
        • id 唯一标识 关系ID
        • type 关系类型 (可以为空)
        • source 源点对象或ID
        • target 目标点对象或ID
        • weight 表示线条权重(weight越大,线条越粗,为空值默认为1)
      • 可选字段
        • 其它一些需要通过信息面板显示的字段
        • style 样式对象(给单个关系配置样式)各字段详情含义见lineConf配置描述
  • config:可配置展示样式及注册交互事件
    • width 图谱长度
    • height图谱高度
    • linkDistance 节点间连线长度
    • chargeValue 节点间排斥力
    • enableZoom 鼠标控制关系图移动及放大缩小
    • puffUrl 异常结点图片路径
    • nodeConf 节点样式配置,有以下三种方式可以配置(优先级:单个节点配置>类型配置>全局配置,详情见以下案例)
      • 全局配置(通过在default字段下配置)
        • textShow 是否显示节点文字(结点文字是否显示只能全局配置所有节点,默认false)
        • textSize 文字大小 (默认12)
        • textColor 文字颜色 (默认'#000)
        • min 节点半径最小设置 (默认13)
        • max 节点半径最大设置 (默认100)
        • step 节点步长、每增加一条连线半径的增长值(默认1)
        • url 填充图案 (默认'')
        • fillColor 填充颜色 (默认'rgb(255, 76, 10)')
        • strokeColor 描边颜色 (默认'')
        • strokeWidth 描边大小 (默认0)
      • 类型配置(通过类型名type字段下配置)
        • textSize
        • textColor
        • min
        • max
        • step
        • url
        • fillColor
        • strokeColor
        • strokeWidth
      • 单个节点配置(在节点数据下增加style字段)
        • textSize
        • textColor
        • min
        • max
        • step
        • url
        • fillColor
        • strokeColor
        • strokeWidth
    • lineConf 线条样式配置,有以下三种方式可以配置(优先级:单个节点配置>类型配置>全局配置,详情见以下案例)
      • 全局配置(通过在default字段下配置)
        • strokeColor 线条颜色 (默认值'rgb(128, 194, 216)')
        • strokeDasharray svg虚线样式设置,如果不设置,则展示为实线 (默认'')
      • 类型配置(通过类型名type字段下配置)
        • strokeColor
        • strokeDasharray
      • 单个节点配置(在结点数据下增加style字段)
        • strokeColor
        • strokeDasharray
    • events事件
      • 节点事件(node字段下)
        • click 单击事件(支持节点和关系)
        • dblclick 双击事件(支持节点和关系)
        • contextMenu节点右键菜单 (支持节点和关系)
        • add 添加节点事件(在这里将节点数据真正添加到数据库中,需要返回promise)
        • deleteTag 删除标签(从数据库中将标签从节点中删除,需要返回promise)
      • 关系事件(link字段下)
        • click 单击事件(支持节点和关系)
        • dblclick 双击事件(支持节点和关系)
        • contextMenu节点右键菜单 (支持节点和关系)
        • add 添加节点事件(在这里将结点数据真正添加到数据库中,需要返回promise)

RelationChart API

基本API

- setConfig(config):重新设置配置  深拷贝
- redraw(config):重新设置配置、清空画布并重绘
- showNodeText(isShow):显示/隐藏节点文字
- transform(x, y, k):关系图手动控制移动位置及放大缩小(x:X轴移动距离、y:Y轴移动距离、k:缩放倍数)
- updateWH(w,h) 更新画布宽高
- setStatus(status):设置画布当前的状态
    - 1 表示点击画布可添加节点
    - 2 表示点击A节点、再点击B节点,可在两个节点之间添加连线 
    - 3 表示点击A节点、再点击B节点,可显示两个节点之间最短路径
- getStatus():获取画布当前状态值
- batchUpdate(nodes, links):批量更新节点及关系数据
- addNode(node):添加一个或多个结点(node可以单个节点数据或者是节点数组)
- updateNodeInfo(id, info):修改单个节点数据对象值(id节点号、info需要修改的节点对象)
- removeNode(data):移除节点及其关系(data是节点数据)
- nodes():返回所有节点数据
- addLink(link):添加一个或多个关系(link可以是单条连线、也可以是数组)
- updateLinkInfo(id, info):更新关系信息
- removeLink(data):删除关系连线
- links():返回所有关系数据
- search(nodeName, relType) 搜索
    - 只有nodeName,根据节点名找到名字为nodeName的结点
    - 有节点名nodeName, relType连线类型 找到线条类型是relType,线条的source或target是nodeName的连线
- refresh():刷新画布

算法分析类API:目前支持路径溯源、环形依赖以及异常点等

- getPaths(startNode,endNode)方法表示路径溯源 , startNode表示起始节点,endNode表示结束节点
- getCycle方法获取关系图所有的环形依赖
- getSpecialNodes方法获取所有异常点
- highlight(nodes,links)方法表示高亮关系图中的节点与连线,在算法分析中经常用到。
- setHighlightMode方法表示设置高亮模式,仅展示算法相关的节点与连线,其余图形隐藏
- cancelHighlightMode方法表示取消高亮模式,展示所有的节点与连线

RelationChart Example

(1)在项目中使用

<script type="text/javascript" src="relation-chart.js"></script>

(2)关系图数据结构(模拟产生一些测试数据)

let nodes = [],links= [];
let newNode = {
    id: guid(),    //guid为生成唯一标识的方法
    title: "192.168.191.1",
    type: "IP"   
}; 
let newNode2 = {
    id: guid(),
    title: "dns server 1",
    type: "DNS",
    tags: [{ id: `tag_1`, name: '收藏aaaa', icon: './assets/images/icon-heart.png' }], 
    style: {
        // textSize: 12,
        textColor: 'red',
        min: 20,
        max: 100,
        step: 1,
        fillColor: 'red',
        strokeColor: 'rgba(255,215,0,0.4)',
        strokeWidth: 3,
        url: './assets/images/icon-start.png'
    }
};
nodes.push(newNode);
nodes.push(newNode2 );
let link = {
            target: nodes[target],
            id: guid(),
            title: "rel",
            source: nodes[source],
            type: Math.floor(Math.random()*10)%2 === 0?"ATTACK":"RELY",
            weight:Math.floor(Math.random()*3+1)
        };
links.push(link);

(3)创建RelationChart对象

let chart = new RelationChart("#canvas", {
    nodes: nodes,
    links: links
}, {
        puffUrl: "http://118.126.90.43:9080/puff",
        height: document.documentElement.clientHeight,
        width: document.documentElement.clientWidth - 250,
        linkDistance: 150,
        chargeValue: -500,
        enableZoom: true,
        nodeConf: {
            default: {
                textShow: true
            },
            email: {
                url: `./assets/images/mail.svg`,
                textColor: '#5aafec',
                fillColor: '#5aafec'
            },
            dns: {
                fillColor: '#b4a0db',
                url: `./assets/images/dns.svg`,
                textColor: '#b4a0db'
            },
            ip: {
                fillColor: '#31c5c7',
                url: `./assets/images/ip.svg`,
                textColor: '#31c5c7'
            },
            account: {
                fillColor: '#feb77f',
                url: `./assets/images/account.svg`,
                textColor: '#feb77f'
            }
        },
        lineConf: {
            visit: {
                strokeColor: '#9bfc84'
            },
            login: {
                strokeColor: '#73dad7'
            },
            analysis: {
                strokeColor: '#ff7b33',
                strokeDasharray: '5,5'
            }
        },
        events: {
            node: {
                click: (data) => {
                    showInfo(data);
                },
                dblclick: (data) => {
                    console.log("dblclick", data);
                },
                contextMenu: [{
                    title: '最短路径算法',
                    children: [
                        {
                            title: "设为开始结点",
                            action: function (data, index) {
                                startVert = data;
                                distanceEvent();
                            }
                        }, {
                            title: "设为结束结点",
                            action: function (data, index) {
                                endVert = data;
                                distanceEvent();
                            }
                        }
                    ]
                }, {
                    title: "环",
                    action: function (data, index) {
                        let results = chart.getCycle();
                        showAgorithmInfo(Agorithm.Cycle, results);
                    }
                }, {
                    title: "异常点",
                    action: function (data, index) {
                        let results = chart.getSpecialNodes();
                        showAgorithmInfo(Agorithm.SpecialNodes, results);
                    }
                }, {
                    title: "展开相关实体和关系",
                    action: function (data, index) {
                        let newNodes = createNodes(3);
                        nodes = nodes.concat(newNodes);
                        let i = 0;
                        for (let node of newNodes) {
                            chart.addNode(node);
                            let link = createLink(data.id, node.id, links.length + i);
                            chart.addLink(link);
                            links.push(link);
                            i++;
                        }
                        chart.refresh();
                        // nodes = chart.nodes();
                        // links = chart.links();
                        updateTypeNum();
                    }
                }, {
                    title: "移除当前节点",
                    action: function (data, index) {
                        let rmvLink = chart.removeNode(data);
                        chart.refresh();
                        //nodes = chart.nodes();
                        //links = chart.links();
                        statNodes[nodeTypes.indexOf(data.type)]--;
                        for (let link of rmvLink) {
                            statRel[relTypes.indexOf(link.type)]--;
                        }
                        nodes = nodes.filter(item => item.id != data.id);
                        let rmvLinkIds = rmvLink.map(item => item.id);
                        links = links.filter(item => rmvLinkIds.indexOf(item.id) == -1);
                        updateTypeNum();
                    }
                }, {
                    title: "标签",
                    children: [
                        {
                            title: `<img src='./assets/images/icon-heart.png' /> 收藏`,
                            action: (data, index) => {
                                console.log(data, index);
                                chart.addTag(data, { text: '收藏', url: './assets/images/icon-heart.png' })
                            }
                        }
                    ]
                }]
            },
            link: {
                click: (data) => {
                    showInfo(data);
                },
                dblclick: (data) => {
                    console.log("dblclick", data);
                },
                contextMenu: [{
                    title: '删除',
                    action: (data, index) => {
                        chart.removeLink(data);
                        nodes = chart.nodes();
                        links = chart.links();
                        updateTypeNum();
                    }
                }]
            }
        }
    });