vue-safe-force-graph 2.0.50 → 2.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +390 -74
- package/lib/style.css +1 -1
- package/lib/vue-safe-force-graph.js +10790 -10622
- package/lib/vue-safe-force-graph.umd.cjs +41 -41
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,36 +1,30 @@
|
|
|
1
1
|
# vue-safe-force-graph
|
|
2
2
|
|
|
3
|
-
vue-safe-force-graph
|
|
3
|
+
vue-safe-force-graph 是一个使用 Vue3、d3.js 、 canvas 开发的可视化溯源关系图。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Installation
|
|
8
|
-
|
|
9
|
-
You can install vue-safe-force-graph via npm:
|
|
5
|
+
## 安装
|
|
10
6
|
|
|
11
7
|
`npm install vue-safe-force-graph`
|
|
12
8
|
|
|
13
|
-
##
|
|
9
|
+
## 使用方式
|
|
10
|
+
可以在组件中引入 或者可以在全局引入注册组件。
|
|
14
11
|
|
|
15
|
-
|
|
12
|
+
### 方式一:组件中引入
|
|
13
|
+
在vue组件中引入Graph组件和样式:
|
|
16
14
|
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
import ForceGraph, { Graph, Render } from 'vue-safe-force-graph'
|
|
15
|
+
```
|
|
16
|
+
import { Graph } from 'vue-safe-force-graph'
|
|
20
17
|
import 'vue-safe-force-graph/lib/style.css'
|
|
21
|
-
const app = createApp(App)
|
|
22
|
-
app.use(ForceGraph, {
|
|
23
|
-
disableQapm: true, // ture或者false。 true则禁用 Qapm
|
|
24
|
-
})
|
|
25
18
|
```
|
|
26
19
|
|
|
27
|
-
|
|
20
|
+
完整index.vue示例如下:
|
|
28
21
|
|
|
29
22
|
```vue
|
|
30
23
|
<template>
|
|
31
|
-
<
|
|
24
|
+
<div class="graph-container">
|
|
25
|
+
<Graph
|
|
32
26
|
:graph-api="graphApi"
|
|
33
|
-
module="
|
|
27
|
+
:module="module"
|
|
34
28
|
:start-node="startNode"
|
|
35
29
|
:enter-start-node="true"
|
|
36
30
|
:has-level="true"
|
|
@@ -38,41 +32,93 @@ app.use(ForceGraph, {
|
|
|
38
32
|
:vcode="vcode"
|
|
39
33
|
:handle-select-node-event="handleSelectNode"
|
|
40
34
|
:custom-context-menu-event="handleEvent"
|
|
35
|
+
:singles-node-max-num="500"
|
|
41
36
|
@handle-data-loaded="handleDataLoaded"
|
|
42
37
|
/>
|
|
38
|
+
</div>
|
|
43
39
|
</template>
|
|
40
|
+
<script setup>
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
import {
|
|
43
|
+
getGraphConfig, getGraphRequest, getNodesDetail, getSnapshotDetail,
|
|
44
|
+
} from 'src/api/graph'
|
|
45
|
+
import { ref, watch } from 'vue'
|
|
46
|
+
import { useRoute } from 'vue-router'
|
|
47
|
+
import request from '@/utils/request'
|
|
48
|
+
import { Graph } from 'vue-safe-force-graph'
|
|
49
|
+
import 'vue-safe-force-graph/lib/style.css'
|
|
50
|
+
|
|
51
|
+
const module = ref('graph')
|
|
52
|
+
const startNode = ref([])
|
|
53
|
+
const vcode = ref(null)
|
|
54
|
+
const snapshotId = ref(null)
|
|
55
|
+
const forceGraph = ref(null)
|
|
46
56
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
function addSnapshot(params) {
|
|
58
|
+
return request({
|
|
59
|
+
url: `/graph/v1/snapshot/add?module=${module.value}`,
|
|
60
|
+
method: 'post',
|
|
61
|
+
data: params
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const graphApi = {
|
|
66
|
+
getGraphConfig: getGraphConfig,
|
|
67
|
+
getGraphRequest: getGraphRequest,
|
|
68
|
+
getNodesDetail: getNodesDetail,
|
|
69
|
+
addSnapshot1: addSnapshot,
|
|
70
|
+
getSnapshotDetail: getSnapshotDetail,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const route = useRoute()
|
|
74
|
+
|
|
75
|
+
snapshotId.value = route.query.snapshot_id
|
|
76
|
+
vcode.value = route.query.vcode
|
|
77
|
+
|
|
78
|
+
if (route.query.type && route.query.id) {
|
|
79
|
+
startNode.value = [
|
|
80
|
+
{
|
|
81
|
+
type: route.query.type,
|
|
82
|
+
id: route.query.id
|
|
54
83
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const handleHighLight = (type, prop, value) => {
|
|
88
|
+
console.log('forceGraph', forceGraph.value)
|
|
89
|
+
forceGraph.value.handleCustomSelect(type, prop, value)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const handleEvent = (data) => {
|
|
93
|
+
console.log('监听菜单事件', data)
|
|
94
|
+
}
|
|
95
|
+
const handleSelectNode = (data) => {
|
|
96
|
+
console.log('handleSelectNode', data)
|
|
97
|
+
}
|
|
98
|
+
function handleDataLoaded(data) {
|
|
99
|
+
console.log('handleDataLoaded', data)
|
|
71
100
|
}
|
|
72
101
|
</script>
|
|
102
|
+
<style lang="scss">
|
|
103
|
+
.graph-container {
|
|
104
|
+
height: calc(100vh - 66px);
|
|
105
|
+
}
|
|
106
|
+
</style>
|
|
73
107
|
```
|
|
74
108
|
|
|
75
|
-
|
|
109
|
+
|
|
110
|
+
### 方式二:全局引入
|
|
111
|
+
在main.js中引入并注册。
|
|
112
|
+
```js
|
|
113
|
+
// main.js
|
|
114
|
+
import { createApp } from 'vue'
|
|
115
|
+
import Graph from 'vue-safe-force-graph'
|
|
116
|
+
import 'vue-safe-force-graph/lib/style.css'
|
|
117
|
+
const app = createApp(App)
|
|
118
|
+
app.use(Graph)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
在自己的业务组件中使用,全局注册的组件名为`ForceGraphByCanvas`,示例如下 :
|
|
76
122
|
|
|
77
123
|
```vue
|
|
78
124
|
<template>
|
|
@@ -90,43 +136,311 @@ export default {
|
|
|
90
136
|
/>
|
|
91
137
|
</template>
|
|
92
138
|
|
|
93
|
-
<script>
|
|
94
|
-
|
|
95
|
-
|
|
139
|
+
<script setup>
|
|
140
|
+
// 此处js代码参考上面组件引入的实例
|
|
141
|
+
</script>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 组件属性
|
|
145
|
+
| 属性名 | 说明 | 类型 | 默认值 | 是否必填 |
|
|
146
|
+
| ------------------------ | ------------------------------------------------------------ | -------------- | ------------------------------------------------------------ | -------- |
|
|
147
|
+
| graph-api | 图数据相关接口,包含config、节点数据、节点详情接口 | Object | 无 | 是 |
|
|
148
|
+
| module | 当前图模块 用于 获取config接口时的传参。 this.graphApi?.getGraphConfig({name: this.module}).then(() => {}) | String | 无 | 是 |
|
|
149
|
+
| start-node | 开始节点,如 startNode = [{type: "ip",id: "193.36.119.50"}] | Array | 无 | 是 |
|
|
150
|
+
| enter-start-node | 起始节点时是否出现查询添加接口 | Boolean | false | 否 |
|
|
151
|
+
| has-level | 是否有level等级概念 | Boolean | true | 否 |
|
|
152
|
+
| snapshot_id | 快照id | String | 无 | 否 |
|
|
153
|
+
| vcode | 快照密码 | String | 无 | 否 |
|
|
154
|
+
| dark-mode | 是否为深色模式 | Boolean | false | 否 |
|
|
155
|
+
| showPoint | 图左侧的legend图例部分,是否需要`收藏 备注 标签 ` | Boolean | true | 否 |
|
|
156
|
+
| isShowRightMenu | 是否展示右侧详情 部分 | Boolean | true | 否 |
|
|
157
|
+
| hideButtonList | 需要隐藏的顶部按钮, 如 hideButtonList = ["新增节点"]。全部可选项为`[ "新增节点", "删除", "保存快照", "保存图片", "数据导出", "数据导入", "撤销", "恢复", "自动布局", "全局固定", "全局解除固定", "树型布局", "斥力布局","展开折叠", "功能介绍", ]` | Array | 无 | 否 |
|
|
158
|
+
| isRenderStartNode | 是否渲染startNode。 | Boolean | true | 否 |
|
|
159
|
+
| isDefaultSelectStartNode | 是否默认选中开始节点startNode | Boolean | true | 否 |
|
|
160
|
+
| graphUrlPath | 用于生成快照后的图页面的地址路径。 例如当生成快照成功后,会生成一个链接,`https://xxx.b.net/${graphUrlPath}?snapshot_id=xxx` | String | '/graph' | 否 |
|
|
161
|
+
| levelList | level危险级别 | Array | [ { level: '未知', // 级别。必传 levelName: '未知', // 必传。级别的名称 用于展示文案 className: 'unknown', // class样式名。必传 iconType: '', // 默认使用图标,传dot使用圆点样式 normalColor: '#666', // 颜色色值。必传 darkColor: '#c6cdd5', // 暗黑模式颜色色值,非必传。不传使用normalColor dangerNumber: 0, // 是否是 危险的局别。 用于统计危险数,对危险的节点增加样式等。和危险数的排序 }, { level: '危险', levelName: '危险', className: 'warn', iconType: '', // 默认使用图标,传dot使用圆点样式 normalColor: '#CF1322', darkColor: '#fb2400', dangerNumber: 1, }, { level: '普通', levelName: '普通', className: 'normal', iconType: '', // 默认使用图标,传dot使用圆点样式 normalColor: '#007EE2', darkColor: '#0094ff', dangerNumber: -1, }, { level: '安全', levelName: '安全', className: 'safe', iconType: '', // 默认使用图标,传dot使用圆点样式 normalColor: '#009A75', darkColor: '#00da90', dangerNumber: -2, }, ] | 否 |
|
|
162
|
+
| showLevelCount | 是否在左侧图例legend的leve图标l旁边展示相关节点的数量。 | Boolean | false | 否 |
|
|
163
|
+
| title | 在图的左上角设置标题,默认无 | String \| Html | 无 | 否 |
|
|
164
|
+
| isShowNodeMessage | 是否展示 渲染多少个节点的 message提示 | Boolean | true | 否 |
|
|
165
|
+
| nodeTypeScale | 图中关系节点图标大小的缩放比例。如缩小0.5倍则传数字0.5 | Number | 1 | 否 |
|
|
166
|
+
| singlesNodeMaxNum | 单个关系类型下的最大节点数量。如果节点数量超过此值,默认聚合隐藏起来 | Number | 100 | 否 |
|
|
167
|
+
| handleSelectNodeEvent | 选择节点事件的props(兼容angular调用,vue可以使用事件方式) | Function | 无 | 否 |
|
|
168
|
+
| customContextMenuEvent | 自定义右键菜单的点击事件,相关配置参考下面的[自定义右键菜单](#自定义右键菜单)。会返回数据 `{ eventName: 'api.name', customConfig: 'api.customConfig', nodes: 'nodes', allNodes: 'this.history.dataNow.nodes', }`(兼容angular调用,vue可以使用事件方式) | Function | 无 | 否 |
|
|
169
|
+
| handleDataLoaded | 图加载数据完成后 的事件通知。会返回图中所有的节点数据。(兼容angular调用,vue可以使用事件方式) | Function | 无 | 否 |
|
|
170
|
+
| nodeWidth | 节点的宽度 | Number | 24 | 否 |
|
|
171
|
+
| startNodeWidth | 起始节点的宽度 | Number | 24 | 否 |
|
|
172
|
+
| linkDistance | 用于调整**`d3.forceLink` 的距离**:以确保link长度,值越大距离越长。[d3文档](https://d3js.org/d3-force/link#link_distance) (当配置nodeWidth后可能会用到,比如nodewidth太大时,需要增加link距离) | Number | 120 | 否 |
|
|
173
|
+
| strength | d3js的*manyBody*.strength属性。**调整 `d3.forceManyBody` 的强度**:增加或减少节点之间的排斥力,值为负值,负数越大斥力越大,如0表示无斥力,-600中等斥力。[d3文档](https://d3js.org/d3-force/many-body#manyBody_strength)(当配置nodeWidth后可能会用到,比如nodewidth太大时,需要增加节点之间的斥力) | Number | -600 | 否 |
|
|
174
|
+
| customTooltip | 自定义tooltip内容,传入一个函数,函数中能拿到节点数据,函数需返回html模板 | Function | | 否 |
|
|
175
|
+
|
|
176
|
+
### 自定义右键菜单
|
|
177
|
+
|
|
178
|
+
在config接口中配置节点的右键菜单项,图组件拿到数据后渲染到页面上, 并绑定点击事件。点击后emit出去相关的数据。使用者监听该事件,然后自行处理后续流程。
|
|
179
|
+
|
|
180
|
+
菜单项配置在下面详情接口中,**data => records => info => extraNodeContextMenus字段**,如
|
|
181
|
+
|
|
182
|
+
```js
|
|
183
|
+
{
|
|
184
|
+
'code': '0',
|
|
185
|
+
'msg': 'ok',
|
|
186
|
+
'data': {
|
|
187
|
+
'records': [
|
|
188
|
+
{
|
|
189
|
+
'summary': '',
|
|
190
|
+
'tags': [],
|
|
191
|
+
'info': {
|
|
192
|
+
// 额外右键菜单项
|
|
193
|
+
'extraNodeContextMenus': [
|
|
194
|
+
{
|
|
195
|
+
name: 'dealwith1', // 菜单唯一标识,用于点击事件传出去
|
|
196
|
+
namec: '菜单1 无children', // 菜单展示的文案
|
|
197
|
+
icon: 'button_edit_label', // 右键菜单的图标,不传的话默认一个图标
|
|
198
|
+
customConfig: { // 透传自定义配置
|
|
199
|
+
input: 'xxxxx',
|
|
200
|
+
a: 'ceshi'
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: 'dealwith2',
|
|
205
|
+
namec: '菜单2 无children',
|
|
206
|
+
customConfig: {
|
|
207
|
+
input: 'xxxxx',
|
|
208
|
+
a: 'ceshi'
|
|
209
|
+
},
|
|
210
|
+
// children 二级菜单
|
|
211
|
+
children: [
|
|
212
|
+
{
|
|
213
|
+
name: 'xxx',
|
|
214
|
+
namec: 'xxx',
|
|
215
|
+
customConfig: {
|
|
216
|
+
input: '333',
|
|
217
|
+
a: 'ces3333hi'
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'dealwxxith3',
|
|
224
|
+
namec: 'xxx',
|
|
225
|
+
children: [
|
|
226
|
+
{
|
|
227
|
+
name: 'xxx',
|
|
228
|
+
namec: 'xxx',
|
|
229
|
+
children: [
|
|
230
|
+
{
|
|
231
|
+
name: 'threelevel',
|
|
232
|
+
namec: '三级菜单'
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
'id': '1234',
|
|
240
|
+
'name': '123',
|
|
241
|
+
'type': 'url',
|
|
242
|
+
'basic': {
|
|
243
|
+
'level': '未知',
|
|
244
|
+
'check_time': '',
|
|
245
|
+
'desc': ''
|
|
246
|
+
},
|
|
247
|
+
'extends': null
|
|
248
|
+
},
|
|
249
|
+
'brief': []
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
'summary': '',
|
|
253
|
+
'tags': [],
|
|
254
|
+
'info': {
|
|
255
|
+
'id': '234234',
|
|
256
|
+
'name': '234234',
|
|
257
|
+
'type': 'url',
|
|
258
|
+
'basic': {
|
|
259
|
+
'level': '未知',
|
|
260
|
+
'check_time': '',
|
|
261
|
+
'desc': ''
|
|
262
|
+
},
|
|
263
|
+
'extends': null
|
|
264
|
+
},
|
|
265
|
+
'brief': []
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## 事件
|
|
96
273
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
274
|
+
| 事件名 | 说明 | 示例 |
|
|
275
|
+
| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
|
276
|
+
| handle-data-loaded | 图加载数据完成后 的事件通知。会返回图中所有的节点数据 | `<ForceGraphByCanvas :graph-api="graphApi" :module="module" :start-node="startNode" @handle-data-loaded="handleDataLoaded" @custom-contextmenu-click="handleContextmenu" @handle-select-node="handleSelectNode" />` |
|
|
277
|
+
| custom-contextmenu-click | 自定义右键菜单的点击事件。返回 **eventName** 事件名 、**customConfig**、 **当前点击的nodes** 节点的整个数据, 所有节点**allNodes** | 如上 |
|
|
278
|
+
| handle-select-node | 选择节点事件 | 如上 |
|
|
279
|
+
| controlOperation | 操作控制,传入node数据和对应api操作。如显示隐藏按钮 | 示例如下 |
|
|
280
|
+
|
|
281
|
+
##### controlOperation示例
|
|
282
|
+
|
|
283
|
+
```js
|
|
284
|
+
<ForceGraphByCanvas
|
|
285
|
+
ref="forceGraph"
|
|
286
|
+
graph-url-path="/hmGraphByCanvas"
|
|
287
|
+
:graph-api="graphApi"
|
|
288
|
+
:module="module"
|
|
289
|
+
:start-node="startNode"
|
|
290
|
+
@handle-data-loaded="handleDataLoaded"
|
|
291
|
+
/>
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
* 参数格式 { nodes: [{ id: '8c5c0cda7d0f3ec28e818b441037cf2d' }], api: { name: 'show_node' }}
|
|
295
|
+
* */
|
|
296
|
+
function showNode() {
|
|
297
|
+
forceGraph.value.controlOperation({ nodes: [{ id: '8c5c0cda7d0f3ec28e818b441037cf2d' }], api: { name: 'show_node' }})
|
|
298
|
+
}
|
|
299
|
+
function hideNode() {
|
|
300
|
+
forceGraph.value.controlOperation({ nodes: [{ id: '8c5c0cda7d0f3ec28e818b441037cf2d' }], api: { name: 'hide_node' }})
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
##### controlOperation其他api name
|
|
305
|
+
|
|
306
|
+
- `edit_label`修改label
|
|
307
|
+
- `single_edge_select` 单边顶点选择
|
|
308
|
+
- `hold_aggregation`单边顶点聚合
|
|
309
|
+
- `release_aggregation`聚合顶点释放
|
|
310
|
+
- `node_star`收藏
|
|
311
|
+
- `un_node_star`取消收藏
|
|
312
|
+
- `show_label` `show_names` 显示节点名称
|
|
313
|
+
- `un_show_names` `un_show_label` 隐藏节点名称
|
|
314
|
+
- `fix_nodes`固定节点
|
|
315
|
+
- `un_fix_nodes`取消固定节点
|
|
316
|
+
- `delete_node`删除节点
|
|
317
|
+
|
|
318
|
+
### 图标加载方式
|
|
319
|
+
|
|
320
|
+
图标icon图片有2中加载方式:1从cdn中加载,2打包为base64到npm包中加载。
|
|
321
|
+
|
|
322
|
+
图谱中的图标icon默认是从cdn链接中加载的。如果您存在私有化部署不能访问公网的场景,可以联系作者打包base64版本。
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
### 其他配置项
|
|
327
|
+
|
|
328
|
+
**1.关系节点增加统计数字**
|
|
329
|
+
|
|
330
|
+
在config配置中的的plugs对应的新增一个 show_total 字段,布尔值 true 或者 false。
|
|
331
|
+
|
|
332
|
+
**2.icon自定义图标的图片**
|
|
333
|
+
|
|
334
|
+
数据节点的图标。 节点详情**detail**接口的 **info下 新增 icon_img字段** 存在,则使用此 **icon_img** 图片。 可以是图片链接或者是base64。
|
|
335
|
+
|
|
336
|
+
关系节点的图标。 在**config**接口的plugs字段下对应的位置,加一个**icon_img**字段,用于关系节点的图标。
|
|
337
|
+
|
|
338
|
+
**3.节点线上 增加描述文案**
|
|
339
|
+
|
|
340
|
+
在获取节点和link的接口中,在links字段下面,新增一个字段 edge_label,字符串,如果有值则展示此文案,没有则不展示。
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
###### config配置
|
|
345
|
+
|
|
346
|
+
```js
|
|
347
|
+
// config配置
|
|
348
|
+
{
|
|
349
|
+
"code": "0",
|
|
350
|
+
"msg": "ok",
|
|
351
|
+
"request_id": "QJDysikHdHqtwhMRQFek",
|
|
352
|
+
"data": {
|
|
353
|
+
"plugs": {
|
|
354
|
+
"md5": [
|
|
355
|
+
{
|
|
356
|
+
"show_total": true, // 是否展示增加统计数字
|
|
357
|
+
"icon_img": "https://files.codelife.cc/icons/google.svg", // 自定义关系节点图标的图片
|
|
358
|
+
"canloop": true,
|
|
359
|
+
"icon": "file",
|
|
360
|
+
"name": "xxx",
|
|
361
|
+
"namec": "释放文件",
|
|
362
|
+
"path": "xxxx",
|
|
363
|
+
"relay_name": "释放文件"
|
|
364
|
+
},
|
|
365
|
+
]
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
###### detail配置
|
|
374
|
+
|
|
375
|
+
```js
|
|
376
|
+
{
|
|
377
|
+
"code": "0",
|
|
378
|
+
"msg": "ok",
|
|
379
|
+
"data": {
|
|
380
|
+
"records": [
|
|
381
|
+
{
|
|
382
|
+
"summary": "",
|
|
383
|
+
"tags": null,
|
|
384
|
+
"info": {
|
|
385
|
+
"id": "sfdsdfsf",
|
|
386
|
+
"name": "“xxx",
|
|
387
|
+
"type": "report",
|
|
388
|
+
"inner_img": "自定义节点图片", // 自定义图片
|
|
389
|
+
"basic": {
|
|
390
|
+
"title": "“黑球”行动再升级,SMBGhost漏洞攻击进入实战",
|
|
391
|
+
"url": "xxxx",
|
|
392
|
+
"update_time": "2021-04-29 05:11:53"
|
|
393
|
+
},
|
|
394
|
+
"extends": null
|
|
395
|
+
},
|
|
396
|
+
"brief": []
|
|
397
|
+
}
|
|
398
|
+
]
|
|
107
399
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
###### 获取节点数据接口示例
|
|
404
|
+
|
|
405
|
+
```js
|
|
406
|
+
{
|
|
407
|
+
"code": "0",
|
|
408
|
+
"msg": "ok",
|
|
409
|
+
"data": {
|
|
410
|
+
"nodes": [
|
|
411
|
+
{
|
|
412
|
+
"id": "a",
|
|
413
|
+
"name": "a",
|
|
414
|
+
"type": "md5",
|
|
415
|
+
"origin": [],
|
|
416
|
+
"feature": {}
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"id": "b",
|
|
420
|
+
"name": "b",
|
|
421
|
+
"type": "md5",
|
|
422
|
+
"origin": [],
|
|
423
|
+
"feature": {}
|
|
424
|
+
}
|
|
425
|
+
],
|
|
426
|
+
"links": [
|
|
427
|
+
{
|
|
428
|
+
"source": "a",
|
|
429
|
+
"target": "b",
|
|
430
|
+
"type": "domain-md5",
|
|
431
|
+
"desc": "",
|
|
432
|
+
"feature": {},
|
|
433
|
+
"edge_label": "边的描述文案" // 新增:边的描述文案
|
|
434
|
+
}
|
|
435
|
+
]
|
|
123
436
|
}
|
|
124
437
|
}
|
|
125
|
-
</script>
|
|
126
438
|
```
|
|
127
439
|
|
|
128
440
|
|
|
129
|
-
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
## 开发相关
|
|
130
444
|
|
|
131
445
|
### To run the development server
|
|
132
446
|
|
|
@@ -134,7 +448,7 @@ export default {
|
|
|
134
448
|
|
|
135
449
|
### To build the library
|
|
136
450
|
|
|
137
|
-
`npm run
|
|
451
|
+
`npm run lib`
|
|
138
452
|
|
|
139
453
|
### To publish a new version
|
|
140
454
|
|
|
@@ -145,3 +459,5 @@ export default {
|
|
|
145
459
|
### 开发人员手册
|
|
146
460
|
|
|
147
461
|
[开发请看这里](./开发请看这里.md)
|
|
462
|
+
|
|
463
|
+
如有问题请联系 jiangzhenxiang
|