games-development-ai/contracts/db-schemas/V24.0.0__create_game_material.sql
lili 09ced58930 feat(studio): U6 R-MAT 素材实体/浏览/选用/上传(compose infra FileApi)
R-MAT 创作者私有素材库(六类 sprite/character/effect/scene/ui/music,冻结同枚举):
- StudioMaterialDO + game_material 表(V24.0.0,归属 creator_user_id,idx_owner_cat)
- 3 端点 /app-api/studio/asset/{upload,browse,select}(studio 领域端点,需登录用户)
- upload:六类校验 + 大小≤10MB + 每类目 MIME 白名单 → composes huijing-module-infra
  FileApi.createFile 存字节 → provider 包装 ref → 落库 → 返回冻结 StudioAssetContextItem
- browse:owner-isolated 分页(强制 eq creator_user_id),可选 category 过滤
- select-into-draft:把本人素材 ref 写入草稿会话 assetContext(JsonUtils 序列化,按 ref 去重合并)
- MaterialProvider SPI + 工厂 + mmx-cli mock(graceful degrade,仿 AdProviderFactory)
- 错误码段 1-112-005-***(七个);studio.yaml 加 3 端点 + schemas(additive)

验证:mvn -pl game-module-studio-server,-api -am test 全绿
(StudioMaterialServiceImplTest 17/17,studio 模块 61/61)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:54:56 -07:00

41 lines
4.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 契约 #2 DB 迁移 | 模块:studio(game-module-studio,U6 R-MAT 素材库)| owner:studio 路
-- 文件:V24.0.0__create_game_material.sql(Flyway,只新增;已合入禁止修改,回滚写新补偿迁移 V24.0.1 DROP TABLE)
-- 内容:创作者私有素材库表 game_material(六类素材 浏览/选用/上传)
-- 职责(U6 R-MAT):创作者维度可复用素材实体。上传时字节由 huijing-module-infra FileApi 存储,本表只登记 ref/url/元数据。
-- 边界纪律:
-- - 与 game_studio_asset(会话内单步整包槽位)是两个概念:本表=创作者素材库(六类,归属隔离),不混用。
-- - 字节存储权威归 infra(FileApi);本表只持 ref/url 引用,不在 studio 重造文件存储。
-- - 六类 category 冻结(sprite/character/effect/scene/ui/music),与 studio.yaml StudioAssetContextItem +
-- source-project.schema.json assetSpec.category 四处同引同一枚举(MaterialCategoryEnum)。
-- 约定:InnoDB + utf8mb4;显式列;含 Yudao 审计列 creator/create_time/updater/update_time/deleted + tenant_id;
-- 归属隔离用 creator_user_id(业务字段,区别于审计列 creator);中文列注释;关键查询建索引、禁裸 select*。
-- 上传红线:单文件 ≤10MB + 每类目 MIME 白名单(在 Service 可信边界校验,DB 仅登记 size_bytes/mime_type 审计)。
-- 错误码段:studio = 1-112-***-***(素材库 005 段)
-- =============================================================================
-- -----------------------------------------------------------------------------
-- 表:game_material —— 创作素材库表(R-MAT;创作者私有六类素材,归属隔离浏览/选用/上传)
-- 用途:上传素材(infra 存字节)后登记一行;浏览按 creator_user_id 隔离分页;选用把 ref 写入草稿 assetContext。
-- 引用边界:ref/url 引用 infra 存储的访问路径(MVP ref=url 同源,自描述可寻址);P1 ref 可换 mmx-cli assetId。
-- -----------------------------------------------------------------------------
CREATE TABLE `game_material` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '素材 ID',
`creator_user_id` BIGINT NOT NULL COMMENT '创作者用户 ID(业务字段;归属隔离:创作者只见/只用自己的素材。区别于审计列 creator)',
`category` VARCHAR(16) NOT NULL COMMENT '素材类目(六类:sprite图元/character角色/effect特效/scene场景/ui界面/music音乐;MaterialCategoryEnum)',
`name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '素材名称(上传文件原名兜底,浏览展示用)',
`ref` VARCHAR(512) NOT NULL COMMENT '平台素材引用 ref(喂 assetContext.ref);MVP=infra 访问路径,P1 可换 mmx-cli assetId',
`url` VARCHAR(512) NULL DEFAULT NULL COMMENT '素材访问 URL(只读镜像,可空);MVP=infra FileApi 返回路径',
`provider` VARCHAR(32) NOT NULL DEFAULT 'mmx-cli' COMMENT '素材来源 provider(缺省 mmx-cli;切 provider 不动消费侧,§5.5)',
`size_bytes` BIGINT NULL DEFAULT NULL COMMENT '文件大小(字节),上传记录供配额/红线审计',
`mime_type` VARCHAR(128) NULL DEFAULT NULL COMMENT '文件 MIME 类型(如 image/png、audio/mpeg)',
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Yudao 审计列)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除:0未删 1已删',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID(Yudao 多租户兼容,MVP 单租户=0)',
PRIMARY KEY (`id`),
KEY `idx_owner_cat` (`creator_user_id`, `category`, `id`) COMMENT '创作者素材浏览(归属隔离 + 按类目过滤 + 按 id 倒序)'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '创作素材库表(R-MAT;创作者私有六类素材,归属隔离浏览/选用/上传)';