Skip to content
On this page

基础用法

本文覆盖 GrowSchemaDesigner 的接入、工具栏、左轨、浮层表单字段、画布连线规则与导出。方言固定为 PostgreSQL

演示模块接入

菜单:设计器 → 数据库建模,path:schema-designer-playground

宿主需:

  1. 依赖 @grow-admin-rock/schema-designer@grow-admin-cornerstone/apps-designer
  2. IOC 注册 apps-designer
  3. 动态路由合并菜单

业务模块开发DesignCornerstone低代码设计器

在页面中使用

vue
<template>
  <div class="schema-designer-playground">
    <GrowSchemaDesigner
      ref="designerRef"
      v-model="schema"
      @change="onChange"
    />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import {
  GrowSchemaDesigner,
  createDatabaseSchema,
  type DatabaseSchema,
} from '@grow-admin-rock/schema-designer'

const designerRef = ref<InstanceType<typeof GrowSchemaDesigner>>()
const schema = ref<DatabaseSchema>(createDatabaseSchema({ name: 'demo_db' }))

const onChange = (_next: DatabaseSchema) => {
  // 任意编辑后同步;也可只依赖 v-model
}

const persist = () => {
  const snapshot = designerRef.value?.getSchema()
  // 持久化 snapshot 到后端…
}

const reload = (fromServer: DatabaseSchema) => {
  designerRef.value?.setSchema(fromServer)
}
</script>

<style scoped>
.schema-designer-playground {
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 0;
  overflow: hidden;
}
</style>

容器高度

根节点 absolute inset-0,父级必须有明确高度。

Props / Events

说明
modelValue可选;初始 / 外部同步的 DatabaseSchema
update:modelValue编辑后抛出深拷贝(配合 v-model
changeupdate:modelValue 同内容,便于非 v-model

外部修改 modelValue 会 clone 回填画布;内部每次提交也会向外 emit。本组件无服务端保存,持久化由宿主在 change / getSchema 时完成。

defineExpose

方法说明
getSchema()当前 schema 深拷贝
setSchema(next)整体替换并清空选中态
exportJson()触发浏览器下载 JSON(同工具栏「导出」)

界面总览

┌──────────────────────────────────────────────────────────────┐
│ [添加表] [清空] [复制 JSON] [导出 JSON]     操作提示文案…      │
├────┬───────────────┬─────────────────────────────────────────┤
│轨  │ 库信息/SQL    │ Vue Flow:表节点 + 关联边 + MiniMap      │
│道  │               │ 选中后浮层:表配置 / 关联配置            │
└────┴───────────────┴─────────────────────────────────────────┘

工具栏旁提示大意:拖拽字段圆点连线创建关联;拖动关联线端点可改接字段;悬停关联线可点垃圾桶删除。

工具栏

操作行为禁用 / 确认
添加表createSchemaTable:默认名 table / table_1…,自带 id BIGINT 主键自增;并选中新表
清空删除全部表与关联,保留库名 / 注释 / queries无表时禁用;确认框标题「清空画布」,文案「将删除全部表与关联,是否继续?」,确认「清空」
复制 JSONcopySchemaJson 写剪贴板无表时禁用;失败 alert('复制失败,请检查浏览器剪贴板权限')
导出 JSON下载 {库名}.json无表时禁用

左侧轨道

轨道面板标题内容
库信息(默认)数据库库名、注释、方言只读、统计
SQL 查询SQL 查询queries[] 列表与表单

再点同一轨可关闭侧栏。

库信息字段

字段说明
库名最长 63,经 clampIdentifier;默认脚手架常为 untitled_db
注释可选
方言disabled,固定展示「PostgreSQL」
统计表数量 / 关联数量 / SQL 查询数量

SQL 查询面板

本版只做配置存档(不连真实库执行)。写入 schema.queries

操作说明
添加默认名 query_1…;表单:名称(必填)、说明、SQL
编辑 / 复制新增 / 删除列表项操作;复制名带 _copy
SQL 编辑GrowCodeEditordefault-language="sql",不可切语言
提示名称空 → warning「请输入查询名称」;成功 toast「添加成功 / 修改成功 / 已删除」

执行库展示为当前 schema.name(仅提示用)。数据准备消费的是已发布表结构,不会自动跑这里的 SQL。

浮层与抽屉

表配置(选中表后)

标题类似「表 · {name}」。

区域字段
表名(最长 63)、注释
每列名称、类型(SCHEMA_COLUMN_TYPE_OPTIONS)、默认值「可空」、注释
类型相关VARCHAR/CHAR → 长度(常见默认 255);NUMERIC → 精度(如 10)+ 小数位(如 2)
约束主键、自增 (IDENTITY)、非空、唯一、索引

规则要点:

  • 设为主键:强制非空,全表仅一个主键;常建议同时开自增
  • 删除被关联占用的字段:确认「该字段已被关联使用…」,确认后同步删关联
  • 删除整表:确认「确定删除表「x」及其相关关联吗?」;若有 N:N,可能连带删中间表

关联配置(选中边后)

字段说明
关联类型1:1 / 1:N / N:N;N:N 时类型不可改
源 / 目标表与字段只读展示;N:N 另有中间表信息
删除时 / 更新时CASCADE / SET NULL / RESTRICT / NO ACTION

创建关联抽屉(连线后)

字段默认
类型one-to-many(1:N)
onDeleteRESTRICT
onUpdateCASCADE

说明:

  • 1:1 / 1:N:连线语义为「起点 = 被引用侧(通常 PK),终点 = 外键侧」;若终点表连到源表主键,可自动补 FK 列,命名常为 {sourceTable}_id
  • N:N:自动生成 isJunction 中间表(节点上有「中间表」标识)

详见 表关联

画布交互

操作行为
拖拽表节点写入 table.position
点击表选中 + 打开表配置浮层
字段左右圆点拖线打开创建关联抽屉;禁止自连
点击关联线选中 + 打开关联配置
拖动边端点改接非 N:N 可改接字段;N:N / 中间表相关边有限制
悬停边 → 垃圾桶删除关联(有确认);N:N 可一并删中间表
Delete / Backspace选中关联时删除(输入框内不触发);无二次确认
Controls / MiniMap缩放约 0.2–1.25、平移、鸟瞰
Vue Flow 删除键delete-key-code 含 Backspace、Delete

连线方向

务必记住:起点是被引用的主键侧,终点是外键侧。方向反了会导致自动建 FK 的行为不符合预期。

工厂与工具函数

ts
import {
  createDatabaseSchema,
  createSchemaTable,
  createSchemaColumn,
  createSchemaRelation,
  exportSchemaJson,
  downloadSchemaJson,
  copySchemaJson,
  SCHEMA_COLUMN_TYPE_OPTIONS,
  RELATION_TYPE_OPTIONS,
  clampIdentifier,
  MAX_DATABASE_NAME_LENGTH, // 63
} from '@grow-admin-rock/schema-designer'
函数说明
createDatabaseSchemaversion: 1dialect: 'postgresql',空 tables/relations
createSchemaTable默认带 id 主键列
createSchemaColumn默认 VARCHAR(255)、可空
exportSchemaJson规范化后的 JSON 字符串
clampIdentifier截断标识符至最大长度

持久化建议

ts
// 保存
await api.saveSchema(designerRef.value!.getSchema())

// 回填
designerRef.value!.setSchema(await api.loadSchema(id))
// 或
schema.value = await api.loadSchema(id) // 依赖 v-model 回填

导出给数据准备 / 后端时,保持 tables / relations / queries 完整;数据准备侧类型为对齐的 DataPrepDatabaseSchema不会从 schema-designer 运行时 import Vue。

相关文档