1. 建表:订单和客户

先把要保存的数据说清楚。示例中,“远山科技”是客户,“SO-001”是它的一张订单,金额为 1,280 元。客户可以有多张订单,每张订单只关联一个客户。

本章目标

完成本章后,你会有客户、订单两张表和两条客户数据。此时还没有订单页面,重点是把后续功能要保存的信息和关系确定下来。

先理解表、字段和关系

表可以理解为保存同类记录的地方,字段描述每条记录包含什么。一位客户是一条客户记录,客户名称和联系人是它的字段。

订单使用 customerId 指向客户,而不是每次录入时再复制一遍客户名称和联系人。这样多张订单可以引用同一位客户,联系人变化时也有统一的维护位置。

金额用整数分保存,可以明确输入、计算与显示的单位。页面输入的 1280 元要转换成 128000 分;后面检查保存结果时会用到这条约定。

约定字段

客户表 tutorialCustomers:

字段用途规则
id客户标识主键,由服务端生成
name客户名称必填
contact联系人必填

订单表 tutorialOrders:

字段用途规则
id订单标识主键,由服务端生成
number订单号必填且唯一,比如 SO-001
customerId关联客户指向客户表的 id,必填
amountCents金额,单位为分正整数;1,280 元保存为 128000
ownerId申请人使用当前登录用户的真实 ID,由服务端填写
status当前状态初始为 draft
version状态版本初始为 0,每次状态变化加一
comment审批意见初始为空字符串

状态只使用 draft(草稿)、submitted(待审批)、approved(已通过)、rejected(已驳回)。后面的章节沿用这套命名。

让 AI Agent 建表

将这段需求和上面的字段表一起交给应用目录中的 AI Agent:

先读取当前应用的 AGENTS.md、应用开发 Skill 中的数据模型和迁移说明。

为订单教程建立 tutorialCustomers 和 tutorialOrders 两张表,严格使用我提供的字段约定。客户与订单通过 customerId 关联;订单号唯一,金额按整数分保存。使用新迁移,不修改已经执行的历史迁移,不重置数据库。

请准备两个演示客户:远山科技(林女士)、星河商贸(周先生)。种子重复执行不能重复插入。暂时不要创建订单,ownerId 应在后续创建订单时从登录身份取得。

完成后执行迁移,检查主键、唯一约束、客户引用和金额校验。报告生成的文件与实际检查结果。

迁移放在 database/main/migrations/,种子放在 database/main/seeds/。迁移负责结构,种子负责练习数据。AI Agent 生成迁移后,执行:

pnpm nocobase db apply

db apply 执行迁移后会同时刷新 database/main/collections/ 下生成的数据库描述文件,不需要再单独执行 collections generate。不能靠手工修改这些文件来建表。迁移显示已跳过,可能只是 pnpm dev 启动时已经自动执行,开发服务端同样会刷新这些文件;继续检查实际表结构。

检查结果

请 AI Agent 查询两张表,并核对:客户有两个不同的 ID;订单的 customerId 引用客户 ID;number 有唯一约束;金额是整数。此时订单表为空是正常的。

如果迁移失败,先读出失败的迁移名和原因。不要反复改动已执行文件,也不要为了绕过失败而执行 pnpm nocobase db reset:它会删除所有受管表,清空之前的练习。

下一步:做列表页和详情页。