对象拓扑图
对象拓扑图以关系图的方式展示一个应用内实体对象、页面与它们引用资源之间的关系。
概述
在应用开发过程中,配置散落在实体对象、页面、表单、视图列表等多个模块中,难以直观看出它们之间的引用关系。对象拓扑图把应用内的资源关系渲染成只读的关系图,帮助开发者快速理解与排查配置。
入口:开发中心 → 应用 → 关系拓扑。拓扑图按应用维度生成,包含两个页签:
| 页签 | 说明 |
|---|---|
| 实体关系 | 展示应用内的实体对象及其字段,以及查找字段(Lookup)指向的实体 |
| 页面关系 | 展示应用内的页面,以及页面布局引用的表单与视图列表 |
关系图为只读视图:卡片的节点与连线不可编辑、不可拖动,但支持平移、缩放、关键字搜索与关系高亮。交互与展示配置详见 拓扑图交互与配置。
配置项
拓扑图本身不产生持久化配置,页面上的可操作项如下:
| 配置项 | 说明 |
|---|---|
| 页签 | 在「实体关系」与「页面关系」之间切换,切换结果写入地址栏 tab 参数 |
| 搜索框 | 按关键字过滤卡片,命中的卡片与行高亮、其余淡出,并显示匹配数量 |
| 适应画布 | 重置视图,把整张关系图缩放平移到画布内, 并清除当前选中 |
| 切换应用 | 跳转到应用首页,便于切换到其他应用继续查看 |
| 卡片链接 | 卡片与行上的箭头链接可直接打开对应资源的编辑页 |
实体关系图
实体关系图以卡片表示实体对象,卡片内每一行是一个字段。
| 卡片 / 元素 | 说明 |
|---|---|
| 当前应用实体 | 应用内的实体对象,卡片头使用主题色,展示全部字段 |
| 外部实体 | 被查找字段引用、但属于其他应用的实体,卡片不展示字段,改为展示其所属应用 |
| 未知实体 | 查找字段指向但已不存在的实体,以警示色展示 |
| 字段行 | 字段名称与字段编码;属于查找关系的字段加粗,并从该行引出连线指向目标实体 |
| 连线 | 表示查找字段的引用关系,指向被引用的实体卡片 |
页面关系图
页面关系图以卡片表示页面,卡片内的每一行是该页面布局引用的资源。
| 卡片 / 元素 | 说明 |
|---|---|
| 页面卡片 | 展示页面名称与标题,卡片头部链接可打开页面布局编辑器 |
| 引用行 | 页面布局引用的表单或视图列表,行内展示资源名称与类型(表单 / 视图列表) |
| 未知资源 | 页面引用 的表单或视图列表已被删除时,展示「资源已不存在」且不可跳转 |
| 行链接 | 表单行打开表单编辑器,视图列表行打开视图列表编辑器 |
下一步
拓扑数据模型
以下内容面向技术实现与 AI 检索。拓扑数据由服务端按应用实时计算后返回,前端使用 X6 渲染为只读关系图。
实体关系图数据
接口返回 MetaTopology:
| 属性名 | 类型 | 含义 |
|---|---|---|
AppId | string | 生成拓扑的应用 Id |
Apps | MetaTopologyApp[] | 涉及的应用(当前应用与外部实体所属应用),扁平去重 |
Entities | MetaTopologyEntity[] | 涉及的全部实体,扁平去重 |
MetaTopologyApp:
| 属性名 | 类型 | 含义 |
|---|---|---|
_id | string | 应用 Id |
Code | string | 应用编码 |
Name | string | 应用名称 |
IsCurrentApp | bool | 是否为当前拓扑所对应的应用 |
MetaTopologyEntity:
| 属性名 | 类型 | 含义 |
|---|---|---|
_id | string | 实体 Id |
Code | string | 实体编码 |
Name | string | 实体名称 |
AppId | string | 所属应用 Id,实体已不存在时为空 |
IsExternal | bool | 是否为外部实体(属于其他应用、仅被查找字段引用),外部实体不返回字段 |
IsUnknown | bool | 被查找字段引用但已无法找到 |
Fields | MetaTopologyField[] | 字段列表,外部实体恒为空 |
MetaTopologyField:
| 属性名 | 类型 | 含义 |
|---|---|---|
_id | string | 字段 Id |
Code | string | 字段编码 |
Name | string | 字段名称 |
FieldType | int | 字段类型,见 MetaFieldTypeEnum |
RelatedMetaObjectId | string | 该字段指向的实体 Id(查找目标或实体数据源背后对象),无关系时为空 |
页面关系图数据
接口返回 MetaPageTopology:
| 属性名 | 类型 | 含义 |
|---|---|---|
AppId | string | 生成拓扑的应用 Id |
Pages | MetaPageTopologyPage[] | 应用内的页面,每个页面携带自身布局引用的资源 |
MetaPageTopologyPage:
| 属性名 | 类型 | 含义 |
|---|---|---|
_id | string | 页面 Id |
Name | string | 页面名称 |
Title | string | 页面标题 |
References | MetaPageTopologyReference[] | 布局引用的表单与视图列表,按布局顺序去重 |
MetaPageTopologyReference:
| 属性名 | 类型 | 含义 |
|---|---|---|
Id | string | 表单或视图列表 Id |
Type | string | 资源类型,取值见 MetaPageTopologyReferenceType |
Name | string | 资源名称,资源已不存在时为空 |
MetaObjectId | string | 资源所属实体对象 Id,用于打开其编辑页 |
IsUnknown | bool | 布局引用的资源已无法找到 |
资源类型常量 MetaPageTopologyReferenceType:
public const string Form = "Form"; // 表单
public const string View = "View"; // 视图列表
数据存储示例
实体关系图返回示例:
{
"AppId": "9f1c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10",
"Apps": [
{ "_id": "9f1c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10", "Code": "book_management", "Name": "图书管理", "IsCurrentApp": true },
{ "_id": "3c8a1d70-45b2-4e19-9f02-8d6b1a4c7e35", "Code": "customer_management", "Name": "客户管理", "IsCurrentApp": false }
],
"Entities": [
{
"_id": "6a2f5c81-0b47-4d19-8e33-9c4b7a1d2f60",
"Code": "order",
"Name": "订单",
"AppId": "9f1c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10",
"IsExternal": false,
"IsUnknown": false,
"Fields": [
{ "_id": "a1b2c3d4-0001-0000-0000-000000000001", "Code": "customer_id", "Name": "客户", "FieldType": 100, "RelatedMetaObjectId": "8b7e6d51-2c49-4a30-b5d1-6f9e2c8a4b17" }
]
},
{
"_id": "8b7e6d51-2c49-4a30-b5d1-6f9e2c8a4b17",
"Code": "customer",
"Name": "客户",
"AppId": "3c8a1d70-45b2-4e19-9f02-8d6b1a4c7e35",
"IsExternal": true,
"IsUnknown": false,
"Fields": []
}
]
}
相关接口
| 接口 | 说明 |
|---|---|
GET /api/MetaApp/GetEntityTopology | 获取实体关系图数据(参数 appId) |
GET /api/MetaApp/GetPageTopology | 获取页面关系图数据(参数 appId) |