games-development-ai/contracts/db-schemas/V11.0.0__create_passport_player_invite.sql
zizi 063ec4edf2 docs(rename): ③ 文档/契约漂移清理——contracts+docs+根文档 yudao 标识同步 com.wanxiang.huijing(follow-up,脚本)
- 范围:全仓除已完成的 game-cloud/game-admin(及排除区);91 文件
- cn.iocoder.yudao→com.wanxiang.huijing / cn.wanxiang.game→com.wanxiang.huijing.game / cn.iocoder.cloud→com.wanxiang / Yudao*→Huijing* / bare yudao→huijing
- 含 contracts/api-schemas(apiInterface FQCN)、docs/architecture+agent-specs(含中文名,git ls-files -z 修复)、AGENTS.md/CLAUDE.md 等根文档
- 保留不动:上游归属 URL(gitee/github yudaocode·YunaiV,改则断链+违反署名)、game-cloud Flyway 迁移注释(保 checksum)、lockfile(装包重生)
- 纯文档/字符串,零构建影响(game-cloud/game-admin 字节码未动)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 14:32:44 +00:00

89 lines
9.4 KiB
SQL
Raw Permalink 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 迁移 | 主题真实鉴权与匿名玩家身份HJ-PASSPORT-EXEC-001 §4.2| ownerpassportsystem 内扩展,方案乙)
-- 文件V11.0.0__create_passport_player_invite.sqlFlyway只新增/ALTER已合入禁止修改回滚写新补偿迁移 V11.0.1
-- 拍板依据2026-06-10 鉴权七项(评审版 §9.1,全拍)——
-- 拍板1=C 验证码为主+邀请码旁路 / 拍板2 报备前受限激活 / 拍板4 创作限 A2 白名单 / 拍板6 实名提现前收集 / 拍板7=B 纯客户端 anonId。
-- 内容passport 扩展的两张新表 + 一处 ALTER共三段
-- 1. game_player —— 玩家/创作者最小身份(即 OAuth2 token 的 userIduserType=MEMBER实名字段仅预留
-- 2. game_invite_code —— 邀请码(报备前受限激活旁路,生成/核销/限量/有效期/退役全生命周期;报备后走配置开关退役);
-- 3. game_runtime_session ALTER —— player_user_id 放宽 NULL匿名试玩+ 补 anon_id匿名会话归属
-- 守门①(必守,沿用 V10 守门②):本 V11 跨 system(player/invite) + runtime(session) 多表,只放仓根 contracts/db-schemas/(源)
-- + huijing-server 执行目录(唯一执行副本),不放任何单模块 -server/db/migration/(避免同版本 V11 出现在多个 classpath jar 触发 Flyway 重复校验失败)。
-- 守门②:含中文 SQLmini-desktop 执行必须 --default-character-set=utf8mb4。
-- 让位声明§4.1V10 已被黄金闭环占、V11 被本件占Wave4 community/biz 原规划的 V10/V11 顺延 V12/V13。
-- 约定InnoDB + utf8mb4显式列含 Huijing 审计列 + tenant_idMVP 单租户=1tenant.enable=false状态机用 tinyint非法流转由服务端拒绝。
-- 错误码段:玩家身份 = 1-002-090-***;邀请码 = 1-002-091-***(落 system 段,见 passport.yaml 与 ErrorCodeConstants
-- =============================================================================
-- -----------------------------------------------------------------------------
-- 表game_player —— 玩家/创作者最小身份system passport 扩展,方案乙)
-- id 即 OAuth2 token 的 userIduserType=MEMBER登录主键=mobile。
-- 拍板6real_name/id_card_no 仅预留AES 密文,应用层加密),提现前才收集,本件不写入。
-- 拍板4creator_flag 白名单位A2 种子名单(~5 人),置位走 admin 端点 /admin-api/passport/player/set-creator。
-- 目标3评审版first_anon_id 落注册时携带的客户端 anonId做匿名↔登录归因衔接。
-- -----------------------------------------------------------------------------
CREATE TABLE `game_player` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '玩家编号(即 OAuth2 token 的 userIduserType=MEMBER',
`mobile` VARCHAR(11) NOT NULL COMMENT '手机号(登录主键;日志/响应必须脱敏,库内 MVP 明文+唯一键)',
`nickname` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '昵称(注册默认生成,可改)',
`avatar` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '头像 URL',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0正常 1禁用对齐 CommonStatusEnum',
`creator_flag` TINYINT NOT NULL DEFAULT 0 COMMENT '创作者白名单位0玩家 1创作者A2 种子名单拍板4置位走 admin 端点)',
`real_name` VARCHAR(256) NULL COMMENT '真实姓名AES 密文预留提现前收集拍板6本件不写入',
`id_card_no` VARCHAR(256) NULL COMMENT '身份证号AES 密文预留;同上,本件不写入)',
`register_channel` VARCHAR(16) NOT NULL DEFAULT 'sms' COMMENT '注册通道sms验证码 / invite邀请码旁路漏斗归因',
`register_ip` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '注册 IP风控/审计)',
`invite_code_id` BIGINT NULL COMMENT '核销的邀请码编号invite 通道必填,关联 game_invite_code.id',
`first_anon_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '注册时携带的客户端 anonId匿名↔登录归因衔接评审版目标3缺失落空串归因降级不阻断登录',
`login_date` DATETIME NULL COMMENT '最近登录时间',
-- 标准审计列(与既有 game_* 表同范式,对齐 V3 game_runtime_session
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者Huijing 审计列)',
`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 '租户 IDHuijing 多租户兼容MVP 单租户=0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_mobile` (`mobile`, `deleted`, `tenant_id`) COMMENT '手机号唯一(含 deleted/tenant_id 适配逻辑删+多租户,同 V3 uk_version 范式;并发重复注册由此键兜底)'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '玩家/创作者最小身份system passport 扩展,方案乙)';
-- -----------------------------------------------------------------------------
-- 表game_invite_code —— 邀请码拍板1=C / 拍板2 受限激活:生成/核销/限量/有效期/退役全生命周期)
-- 报备前陌生玩家凭「手机号+邀请码」零短信注册;报备后 invite-register 走配置开关退役§5.4)。
-- 核销语义(防并发超发,写明给实现 agent核销与建号同一本地事务
-- UPDATE game_invite_code SET used_count = used_count + 1
-- WHERE id = ? AND status = 0 AND used_count < max_uses AND (expire_time IS NULL OR expire_time > NOW())
-- affected=0 即核销失败(耗尽/停用/过期分支由前置查询给精确错误码,条件更新做最终一致兜底,建号事务整体回滚)。
-- -----------------------------------------------------------------------------
CREATE TABLE `game_invite_code` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
`code` VARCHAR(16) NOT NULL COMMENT '邀请码/口令生成时随机大写字母数字避易混淆字符uk_code 冲突重试)',
`batch_no` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '批次号(运营按渠道发放归因,如 batch-xhs-01',
`max_uses` INT NOT NULL DEFAULT 1 COMMENT '限量:最大核销次数',
`used_count` INT NOT NULL DEFAULT 0 COMMENT '已核销次数(条件更新原子累加,见核销语义)',
`expire_time` DATETIME NULL COMMENT '有效期NULL=不过期)',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0启用 1停用停用=单码退役;全量退役走配置开关 §5.4',
`remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注(发放对象/用途)',
-- 标准审计列(与 game_player 同范式)
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者Huijing 审计列)',
`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 '租户 IDMVP 单租户=0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`, `deleted`, `tenant_id`) COMMENT '码值唯一(含 deleted/tenant_id 适配逻辑删+多租户)'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '邀请码报备前玩家受限激活旁路报备后退役拍板1C/2';
-- -----------------------------------------------------------------------------
-- ALTERgame_runtime_session 匿名试玩兼容§2.3 ⚠ 硬边界 / §4.2 / §4.3
-- 背景V3 建表 player_user_id BIGINT NOT NULL匿名开试玩会话session/start userId=null会撞 NOT NULL
-- RuntimeSessionServiceImpl.setPlayerUserId(null) 直落 → "匿名试玩" 半截。本件放宽 NULL + 补 anon_id。
-- 存量兼容§4.3V3 存量行 player_user_id 均有值mock 喂 1MODIFY 放宽 NULL 不破坏存量;
-- anon_id DEFAULT '' 兼容存量。回滚V11.0.1)还原 NOT NULL 前须确认无 NULL 行anon_id 列可留存不删,无害。
-- 口径anon_id 与 telemetry game_telemetry_event.anon_idV5同口径纯客户端 anonId拍板7=B
-- -----------------------------------------------------------------------------
ALTER TABLE `game_runtime_session`
MODIFY COLUMN `player_user_id` BIGINT NULL COMMENT '试玩玩家用户 ID匿名试玩为空2026-06-10 鉴权件放开;预览场景=创作者本人)',
ADD COLUMN `anon_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '客户端 anonId匿名会话归属与 telemetry anon_id 同口径拍板7=B';