可视化建模
数据建模概述
CodeWave 的数据建模是整个应用开发的起点。通过可视化 ER 图设计数据模型,系统自动生成数据库表、CRUD API 和基础页面。
实体设计
字段类型
| 类型 | 说明 | 示例 |
|---|---|---|
| String | 字符串 | 姓名、描述 |
| Integer | 整数 | 年龄、数量 |
| Long | 长整数 | ID、时间戳 |
| Decimal | 小数 | 金额、价格 |
| Boolean | 布尔值 | 是否启用 |
| DateTime | 日期时间 | 创建时间 |
| Date | 日期 | 生日 |
| Enum | 枚举 | 状态、类型 |
| File | 文件 | 附件、图片 |
| Relation | 关联实体 | 外键关联 |
字段约束
字段约束配置
├── 必填(Required)
├── 唯一(Unique)
├── 最大长度(MaxLength)
├── 最小值/最大值(Min/Max)
├── 正则校验(Pattern)
├── 默认值(Default)
└── 自动填充(AutoFill)
├── 创建时间(created_at)
├── 更新时间(updated_at)
└── 创建人(created_by)实体关系
关系类型
├── 一对一(1:1)
│ 示例:用户 ↔ 用户详情
│ 实现:外键在任意一方
├── 一对多(1:N)
│ 示例:部门 → 员工
│ 实现:外键在「多」的一方(员工表有 department_id)
└── 多对多(M:N)
示例:员工 ↔ 角色
实现:中间表(employee_role)自动生成能力
生成数据库表
sql
-- 根据实体定义自动生成 DDL
CREATE TABLE `employee` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` VARCHAR(50) NOT NULL COMMENT '姓名',
`email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
`department_id` BIGINT COMMENT '部门ID',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_department_id` (`department_id`),
CONSTRAINT `fk_employee_department` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';生成 CRUD API
自动生成的 REST API
├── GET /api/employees # 列表查询(支持分页、筛选、排序)
├── GET /api/employees/:id # 详情查询
├── POST /api/employees # 创建
├── PUT /api/employees/:id # 更新
├── DELETE /api/employees/:id # 删除
└── POST /api/employees/batch # 批量操作生成基础页面
- 列表页(带搜索、分页、操作按钮)
- 详情页
- 新建/编辑表单页
生成的页面可以在前端设计器中进一步定制。
业务规则
数据验证
javascript
// 在实体上配置业务规则
// 示例:员工入职日期不能早于公司成立日期
validate: {
hireDate: {
rule: value => value >= '2010-01-01',
message: '入职日期不能早于公司成立日期'
}
}
// 示例:离职日期必须晚于入职日期
validate: {
leaveDate: {
rule: (value, record) => !value || value > record.hireDate,
message: '离职日期必须晚于入职日期'
}
}生命周期钩子
javascript
// 实体生命周期钩子
entity Employee {
// 创建前:自动生成工号
beforeCreate: async (data) => {
data.employeeNo = await generateEmployeeNo()
},
// 创建后:发送欢迎邮件
afterCreate: async (record) => {
await sendWelcomeEmail(record.email, record.name)
},
// 删除前:检查是否有未完成任务
beforeDelete: async (record) => {
const tasks = await Task.count({ assignee: record.id, status: 'pending' })
if (tasks > 0) throw new Error('该员工有未完成任务,无法删除')
}
}