8.0 KiB
EasyCode ER 图中心设计方案
背景
当前项目已经在 easycode-web 前台项目工作台中提供图表中心页面,并具备基础 ER 图能力:
easycode-web/src/views/DiagramCenterView.vue负责图表中心入口、图表切换、草稿保存和导出。easycode-web/src/components/ErDiagramView.vue已能基于数据库设计渲染表结构卡片、拖动节点、手工添加关系、导出 PNG。front_project_diagram已能保存diagram_type = er的图表草稿。easycode-web/src/api/project.js已有项目、数据库、图表草稿相关接口封装。
本次目标是把现有 ER 图升级为截图所示的 ER 图工作台:SQL 输入、实体筛选、Chen 风格实体属性图、默认布局、一键美化、样式控制、导出和草稿恢复。
范围
本功能入口只放在 easycode-web 前台项目工作台,不在 ruoyi-ui 后台管理端新增菜单或页面。
允许补充必要后端能力,主要是 SQL DDL 解析接口和图表草稿持久化复用。后端能力只服务 easycode-web 前台项目工作台,不作为后台工具菜单交付。
用户体验
页面采用截图中的三栏结构:
- 左侧为 SQL 输入区,支持清空、加载示例、换一换、上传
.sql文件、重新生成。 - 中间为实体列表,显示已选实体数和关系数,支持全选、单表勾选、实体搜索。
- 右侧为 ER 画布,顶部提供基础 ER 图和系统 ER 图标签。首期实现基础 ER 图,系统 ER 图预留入口。
画布工具栏包含:
- 重新生成:基于当前 SQL 或当前数据库设计重新构建 ER 图。
- 默认布局:恢复稳定网格布局。
- 一键美化:按关系密度和实体数量重新布局。
- 主键下划线:开关主键属性文字下划线。
- 线条粗细:控制关系线和属性线粗细。
- 字体:提供默认、紧凑、论文三种字体方案。
- 导出:支持 PNG、SVG、JSON。
画布交互包含:
- 鼠标滚轮缩放。
- 拖动画布平移。
- 拖动实体节点,属性节点跟随实体移动。
- 双击实体或属性改显示名。
- 选中实体列表后实时隐藏未选实体。
ER 图模型
前端统一使用标准化后的 ER 图模型:
{
"version": 2,
"sql": "CREATE TABLE ...",
"selectedTableNames": ["user", "order"],
"tables": [
{
"tableName": "user",
"tableComment": "用户表",
"columns": [
{
"columnName": "id",
"columnComment": "用户ID",
"columnType": "bigint",
"isPk": "1",
"isIncrement": "1",
"isRequired": "1"
}
]
}
],
"relations": [
{
"id": "order.user_id->user.id",
"source": "order",
"sourceField": "user_id",
"target": "user",
"targetField": "id",
"inferred": true
}
],
"layout": {
"entities": {
"user": { "x": 120, "y": 180 }
}
},
"style": {
"primaryKeyUnderline": true,
"lineWidth": 1,
"fontPreset": "default"
}
}
图形呈现
基础 ER 图采用 Chen 风格:
- 实体使用矩形节点,显示中文表名优先,英文表名作为辅助信息。
- 属性使用椭圆节点,围绕实体排布,显示中文字段注释优先,字段名作为辅助信息。
- 主键属性文字带下划线。
- 属性与实体之间使用细线连接。
- 实体关系线根据外键或
xxx_id字段推断生成。
布局策略:
- 每个实体内部采用椭圆环绕布局,字段数量较少时均匀环绕,字段数量较多时分左右两列。
- 多实体默认按网格布局排列,保证截图中类似的疏朗效果。
- 一键美化时优先把存在关系的实体放近,孤立实体放到外侧。
- 保存草稿后优先恢复用户拖动后的实体坐标。
SQL 解析
SQL 解析放在后端实现,复用项目中已有的 Druid SQL 解析能力,避免前端用正则拆 SQL。
新增接口:
POST /front/project/{projectId}/er/parse-sql
入参:
{
"sql": "CREATE TABLE `user` (...)"
}
出参:
{
"tables": [],
"relations": [],
"warnings": []
}
解析范围:
- MySQL
CREATE TABLE。 - 表名、表注释。
- 字段名、字段类型、字段注释。
- 主键、自增、非空。
- 唯一键和索引可作为后续展示信息保留。
- 显式外键优先生成关系。
- 没有显式外键时,根据
xxx_id字段推断关系。
异常处理:
- 非
CREATE TABLE语句忽略并返回 warning。 - 无法解析的片段返回 warning,不影响其他表生成。
- SQL 为空时前端提示用户输入 SQL 或先生成数据库设计。
持久化
继续复用 front_project_diagram:
diagram_type = ertitle = ER 图diagram_json保存完整 ER 草稿 JSON
数据库设计本身仍通过现有数据库保存接口维护。ER 图草稿只保存图形视图状态、SQL 输入、筛选状态、关系草稿和布局样式,不替代项目数据库设计。
前端改造
建议拆分如下文件:
easycode-web/src/views/DiagramCenterView.vue:保留图表中心容器,负责数据加载、保存、导出和图表切换。easycode-web/src/components/er/ErSqlPanel.vue:SQL 输入、示例、上传和重新生成。easycode-web/src/components/er/ErEntityList.vue:实体筛选、全选、数量统计。easycode-web/src/components/er/ErToolbar.vue:默认布局、一键美化、样式控制、导出按钮。easycode-web/src/components/er/ErChenCanvas.vue:SVG 画布、缩放、平移、节点拖拽、双击改名。easycode-web/src/utils/erChenGraph.js:把数据库表模型转换为实体、属性、关系图模型。easycode-web/src/utils/erLayout.js:默认布局和一键美化布局。easycode-web/src/utils/erDraft.js:草稿合并、版本升级、默认值补齐。easycode-web/src/utils/erExport.js:扩展现有导出,支持 Chen 图 SVG/PNG。
后端改造
建议新增:
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/front/dto/ParseErSqlRequest.javaruoyi-generator/src/main/java/com/ruoyi/generator/domain/front/dto/ParseErSqlResponse.javaruoyi-generator/src/main/java/com/ruoyi/generator/service/front/SqlDdlParseService.java
建议修改:
ruoyi-admin/src/main/java/com/ruoyi/web/controller/front/FrontProjectController.java:新增 SQL 解析接口。easycode-web/src/api/project.js:新增parseErSql(projectId, data)。
分阶段交付
阶段一:ER 图工作台 UI 和 Chen 图
用当前项目数据库设计生成 Chen 风格 ER 图,补齐实体筛选、默认布局、一键美化、样式控制、导出和草稿保存。此阶段不依赖 SQL 解析,能先替换现有卡片式 ER 图体验。
阶段二:SQL 输入和解析
新增后端 SQL 解析接口,前端左侧 SQL 输入接入解析结果。支持粘贴 SQL、上传 SQL 文件、加载示例和重新生成。
阶段三:关系增强和编辑
完善显式外键、推断关系、手工关系编辑、关系删除、关系数量统计。允许用户调整关系后保存到草稿。
阶段四:验证和体验收口
补前端工具函数单测、后端 SQL 解析单测,验证中文注释、多表、大字段量、导出清晰度、移动端布局和草稿兼容。
验收标准
- ER 图中心入口只在
easycode-web前台项目工作台出现。 - 当前项目数据库设计可以直接生成截图风格 ER 图。
- 粘贴 MySQL
CREATE TABLESQL 后可以生成实体、属性和关系。 - 实体列表勾选能实时控制画布显示。
- 主键属性默认下划线展示。
- 支持默认布局、一键美化、拖动实体、缩放和平移。
- 草稿保存后刷新页面能恢复 SQL、筛选、布局和样式。
- 支持 PNG、SVG、JSON 导出。
非目标
- 不在
ruoyi-ui后台管理端新增 ER 图中心。 - 不在第一版实现多人协同编辑。
- 不在第一版实现完整数据库建模器替代功能。
- 不在第一版引入大型图形编辑库,除非原生 SVG 方案在验证中无法满足性能或交互要求。