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>
41 lines
4.4 KiB
SQL
41 lines
4.4 KiB
SQL
-- =============================================================================
|
||
-- 契约 #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;创作者私有六类素材,归属隔离浏览/选用/上传)';
|