数据库与CRUD生成

XYGo Admin 2026-04-22 86 次阅读

建表规范、SQL幂等写法、CRUD生成器扩展目标

表命名

所有扩展数据表必须以 xy_{扩展名}_ 为前缀:

复制代码
xy_shop_order          ✅ 正确

xy_shop_product        ✅ 正确

xy_order               ❌ 错误(缺少扩展名前缀)

shop_order             ❌ 错误(缺少 xy_ 前缀)

安装 SQL

install/pgsql.sqlinstall/mysql.sql全新安装时执行,建议使用幂等写法:

sql 复制代码
-- PostgreSQL

CREATE TABLE IF NOT EXISTS xy_shop_order (

    id         bigserial PRIMARY KEY,

    order_no   varchar(64) NOT NULL DEFAULT '',

    status     smallint    NOT NULL DEFAULT 1,

    amount     decimal(10,2) NOT NULL DEFAULT 0,

    created_at bigint      NOT NULL DEFAULT 0,

    updated_at bigint      NOT NULL DEFAULT 0,

    deleted_at bigint      NOT NULL DEFAULT 0

);



CREATE INDEX IF NOT EXISTS idx_shop_order_status ON xy_shop_order(status);

CREATE INDEX IF NOT EXISTS idx_shop_order_deleted_at ON xy_shop_order(deleted_at);

升级 SQL

upgrade/pgsql.sql版本升级时执行。必须使用幂等写法:

sql 复制代码
-- 新增字段

ALTER TABLE xy_shop_order ADD COLUMN IF NOT EXISTS remark varchar(500) DEFAULT '';



-- 新增索引

CREATE INDEX IF NOT EXISTS idx_shop_order_created_at ON xy_shop_order(created_at);



-- 新增表

CREATE TABLE IF NOT EXISTS xy_shop_refund (

    id         bigserial PRIMARY KEY,

    order_id   bigint NOT NULL DEFAULT 0,

    reason     varchar(500) NOT NULL DEFAULT ''

);



-- 新增配置(不覆盖已有值)

INSERT INTO xy_sys_config ("group", "key", "value")

VALUES ('shop', 'payment_timeout', '1800')

ON CONFLICT ("group", "key") DO NOTHING;

卸载 SQL

uninstall/pgsql.sql 在卸载时执行,菜单由安装器自动清理,无需手写:

sql 复制代码
DROP TABLE IF EXISTS xy_shop_order;

DROP TABLE IF EXISTS xy_shop_refund;

CRUD 代码生成器

系统内置的代码生成器支持直接生成代码到扩展目录:

  1. 进入后台 → 开发工具 → 代码生成

  2. 选择数据表后进入第二步「基础配置」

  3. 在「生成目标」下拉中选择已安装的扩展

  4. 所有路径自动切换为扩展目录

  5. 生成的代码直接放入 server/addons/{name}/web/src/addons/{name}/

双控制器感知

如果扩展使用了双控制器模式(controller/controller.go 中同时定义了 AdminControllerV1ControllerV1),CRUD 生成器会自动识别并做以下处理:

  • 生成的控制器文件自动添加 admin_ 前缀(如 admin_order.go

  • 方法 receiver 自动使用 *AdminControllerV1 而非 *ControllerV1

  • module.go 中的 ag.Bind(controller.NewAdminV1()) 自动取消注释

如果是普通单控制器模式的扩展,生成器行为不变,仍使用 *ControllerV1