补齐游戏分发封面与截图的冻结、上传与展示
- 服务端:游戏表追加可空 cover_object_key / screenshots_json,版本表追加可空 metadata_json,创建版本时校验必需封面、最多 6 张截图与图片素材归属,并从素材记录派生对象键生成冻结资料。 - 服务端:审核通过时把冻结资料整体生效到游戏行;只有已公开且存在有效活动版本的游戏,其封面/截图素材才在 /api/assets/read-url 获得匿名读授权。 - 服务端:作者与管理员回读版本时追加 frozenMetadata,带回封面与截图素材 ID 供续发复用,公开投影仍只暴露对象键。 - 网页:/games/publish 新增「封面与截图」区,复用平台图片直传与 confirm 通道,缺封面或截图超量在发请求前拦截,更新版本时按冻结资料回填且不要求重新上传。 - 网页:游戏广场卡片与详情页 hero 换签展示真实封面,详情页新增可点击的截图缩略图条,无素材或换签失败时静默回退原有渐变占位。 - AGC:发布面板支持封面必选与截图最多 6 张,新增素材直传服务并在创建游戏前拦截缺封面,同一文件重复提交复用素材 ID。 - AGC:http 能力作用域新增阿里云 OSS 直传地址,客户端同时校验直传目标必须是平台素材存储。 - 契约与文档:同步 shared-contracts、packages/shared 契约,更新 SpacetimeDB 迁移注释、后端架构、玩法链路与实施计划文档,并补齐网页端与 AGC 定向测试。
This commit is contained in:
@@ -64,6 +64,13 @@ export type GameDistributionGame = {
|
||||
tags: string[];
|
||||
coverColor: string;
|
||||
icon: string;
|
||||
/**
|
||||
* 公开封面的 OSS objectKey;未上传封面时为空,展示层需回退到 coverColor/icon 占位。
|
||||
* 通过 `/api/assets/read-url` 换签名 URL 读取,不接受直连外链。
|
||||
*/
|
||||
coverObjectKey?: string | null;
|
||||
/** 公开截图的 OSS objectKey 列表,最多 6 张,随版本冻结。 */
|
||||
screenshots?: string[];
|
||||
author: GameDistributionAuthor;
|
||||
deviceSupport: GameDistributionDeviceSupport;
|
||||
inputModes?: GameDistributionInputMode[];
|
||||
@@ -90,6 +97,8 @@ export type GameDistributionCreateGameRequest = {
|
||||
category: GameDistributionCategory;
|
||||
tags?: string[];
|
||||
coverAssetId?: string;
|
||||
/** 截图素材 ID(最多 6 张,复用平台图片上传与归属校验)。 */
|
||||
screenshots?: string[];
|
||||
deviceSupport: GameDistributionDeviceSupport;
|
||||
inputModes: GameDistributionInputMode[];
|
||||
orientation: GameDistributionOrientation;
|
||||
@@ -130,10 +139,37 @@ export type GameDistributionRecoveryAction =
|
||||
| 'fix_package'
|
||||
| 'fix_metadata';
|
||||
|
||||
/** 冻结资料里的截图:同时保留素材 ID(作者续发可复用)与对象键(展示换签用)。 */
|
||||
export type GameDistributionFrozenScreenshot = {
|
||||
assetId: string;
|
||||
objectKey: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* 随版本冻结的游戏资料快照。
|
||||
*
|
||||
* 只有作者本人(版本回读)与管理员(审核回读)会拿到素材 ID;公开投影只给对象键。
|
||||
* 历史版本可能没有快照,读取方必须按空值处理。
|
||||
*/
|
||||
export type GameDistributionVersionFrozenMetadata = {
|
||||
title?: string;
|
||||
summary?: string;
|
||||
description?: string;
|
||||
category?: GameDistributionCategory;
|
||||
tags?: string[];
|
||||
coverAssetId?: string | null;
|
||||
coverObjectKey?: string | null;
|
||||
screenshots?: GameDistributionFrozenScreenshot[];
|
||||
deviceSupport?: GameDistributionDeviceSupport;
|
||||
inputModes?: GameDistributionInputMode[];
|
||||
orientation?: GameDistributionOrientation;
|
||||
};
|
||||
|
||||
export type GameDistributionVersionDetail = {
|
||||
game: GameDistributionGame;
|
||||
version: GameDistributionPrivateVersion & {
|
||||
recoveryAction: GameDistributionRecoveryAction;
|
||||
frozenMetadata?: GameDistributionVersionFrozenMetadata | null;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user