Initial Brisk Unity SDK project

This commit is contained in:
2026-04-10 22:04:51 +08:00
commit 47f9a8bafa
171 changed files with 11091 additions and 0 deletions

View File

@@ -0,0 +1,319 @@
# Brisk API接口与示例文档
## 1. 核心约定
- 项目唯一标识:`game_key`
- 项目级 `channel / platform` 已移除
- 初始化与动态配置:
- 必填 `game_key`
- 可选 `client_version`
- 登录身份:
- `login_provider`
- `login_user_id`
- 登录成功后服务端返回内部身份:
- `player_id`
- `project_account_id`
- `access_token`
- 需要跨系统跳转玩家时,空间模块与后台排行榜查询支持直接传:
- `login_provider + login_user_id`
## 2. 客户端主流程
1. `GET /api/client/bootstrap`
2. `POST /api/auth/login/exchange`
3.`Bearer access_token` 调用:
- `GET /api/player/me`
- `GET /api/announcements`
- 排行榜、存档、空间等业务接口
4. `GET /api/config/current` 为公开接口,登录前后都可调用
## 3. 初始化
### 3.1 获取初始化信息
`GET /api/client/bootstrap`
查询参数:
- `game_key`:必填
- `client_version`:可选,建议传入;不传时只会命中不设版本范围的配置
- `device_id`:可选
示例:
```bash
curl "https://brisk.lightyears.ltd/api/client/bootstrap?game_key=demo-game&client_version=1.0.0&device_id=device-001"
```
返回重点:
- `project_name`
- `server_time`
- `maintenance_mode`
- `maintenance_message`
- `feature_flags`
- `dynamic_config`
- `min_client_version`
## 4. 登录
### 4.1 登录换票
`POST /api/auth/login/exchange`
请求体:
- `game_key`:必填
- `login_provider`:必填,例如 `tap`
- `login_user_id`:与 `code` 二选一
- `code`:与 `login_user_id` 二选一
- `device_id`:可选
- `client_version`:可选
- `nickname`:可选
- `avatar_url`:可选
- `profile_json`:可选对象
示例:
```bash
curl -X POST "https://brisk.lightyears.ltd/api/auth/login/exchange" \
-H "Content-Type: application/json" \
-d '{
"game_key": "demo-game",
"login_provider": "tap",
"login_user_id": "tap_user_10001",
"device_id": "android-001",
"client_version": "1.0.0",
"nickname": "Tap Player",
"avatar_url": "https://example.com/avatar.png",
"profile_json": {
"region": "cn",
"source": "tap"
}
}'
```
返回重点:
- `access_token`
- `expires_in`
- `player_id`
- `project_account_id`
- `is_new_player`
- `profile.login_provider`
- `profile.login_user_id`
## 5. 玩家与动态配置
### 5.1 获取当前玩家
`GET /api/player/me`
返回重点:
- `player_id`
- `project_account_id`
- `login_provider`
- `login_user_id`
- `nickname`
- `avatar_url`
- `profile_json`
### 5.2 获取动态配置
`GET /api/config/current`
查询参数:
- `game_key`:必填
- `client_version`:可选,建议传入;不传时只会命中不设版本范围的配置
说明:
- `feature_flags` 现在是标准 key-value 对象
- `dynamic_config` 保持为自定义 JSON 对象
- 命中规则只看 `client_version`
- 该接口当前无需 `Bearer access_token`
示例:
```bash
curl "https://brisk.lightyears.ltd/api/config/current?game_key=demo-game&client_version=1.0.0"
```
## 6. 公告
### 6.1 获取公告列表
`GET /api/announcements`
### 6.2 标记已读
`POST /api/announcements/{id}/read`
## 7. 排行榜
### 7.1 客户端接口
- `GET /api/ranks/{rank_key}/top`
- `GET /api/ranks/{rank_key}/me`
- `GET /api/ranks/{rank_key}/around-me`
- `POST /api/ranks/{rank_key}/score`
- `GET /api/ranks/{rank_key}/season/current`
- `GET /api/ranks/{rank_key}/history`
- `GET /api/ranks/{rank_key}/history/{season_id}`
提交分数示例:
```bash
curl -X POST "https://brisk.lightyears.ltd/api/ranks/season-score/score" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"score": 128}'
```
排行榜返回项重点:
- `rank`
- `player_id`
- `project_account_id`
- `login_provider`
- `login_user_id`
- `score`
- `nickname`
- `avatar_url`
### 7.2 后台排行榜接口
- `GET /api/admin/ranks`
- `POST /api/admin/ranks`
- `PUT /api/admin/ranks/{rank_key}`
- `DELETE /api/admin/ranks/{rank_key}`
- `DELETE /api/admin/ranks/{rank_key}/players/{player_id}`
- `GET /api/admin/ranks/{rank_key}/leaderboard`
- `POST /api/admin/ranks/{rank_key}/reset`
- `GET /api/admin/ranks/{rank_key}/seasons`
- `GET /api/admin/ranks/{rank_key}/seasons/{season_id}/logs`
后台当前榜单查询支持参数:
- `project_id`
- `page`
- `page_size`
- `player_id`
- `project_account_id`
- `login_provider`
- `login_user_id`
## 8. 云存档
说明:
- 云存档是二进制上传/下载接口
- 适合直接存 Unity 存档 bytes、protobuf、msgpack、压缩包等
- 不限制为 JSON
接口:
- `GET /api/archives/slots`
- `GET /api/archives/slot/{slot_no}/meta`
- `POST /api/archives/slot/{slot_no}/upload`
- `GET /api/archives/slot/{slot_no}/download`
上传示例:
```bash
curl -X POST "https://brisk.lightyears.ltd/api/archives/slot/1/upload" \
-H "Authorization: Bearer <token>" \
-F "base_version=0" \
-F "checksum=<sha256>" \
-F "file=@save.dat"
```
## 9. 玩家空间
说明:
- 空间数据当前为 `payload_json`
- 适合公开资料、展示文案、轻量个性化内容
- 如果是游戏主存档,请优先走云存档模块
接口:
- `PUT /api/spaces/me`
- `GET /api/spaces/{player_id}`
- `GET /api/spaces/{player_id}/stats`
- `GET /api/spaces/{player_id}/likes`
- `POST /api/spaces/{player_id}/like`
- `DELETE /api/spaces/{player_id}/like`
- `GET /api/spaces/me/visits`
- `GET /api/spaces/by-login`
- `GET /api/spaces/by-login/stats`
- `GET /api/spaces/by-login/likes`
- `POST /api/spaces/by-login/like`
- `DELETE /api/spaces/by-login/like`
按第三方身份查看空间示例:
```bash
curl "https://brisk.lightyears.ltd/api/spaces/by-login?login_provider=tap&login_user_id=tap_user_10001" \
-H "Authorization: Bearer <token>"
```
按第三方身份点赞示例:
```bash
curl -X POST "https://brisk.lightyears.ltd/api/spaces/by-login/like?login_provider=tap&login_user_id=tap_user_10001" \
-H "Authorization: Bearer <token>"
```
## 10. 后台项目与配置
### 10.1 项目
- `GET /api/admin/projects`
- `GET /api/admin/projects/{id}`
- `POST /api/admin/projects`
- `PUT /api/admin/projects/{id}`
- `DELETE /api/admin/projects/{id}`
- `POST /api/admin/projects/{id}/icon`
- `GET /api/admin/projects/{id}/icon`
说明:
- 创建项目时只传项目信息,不再传 `channel / platform`
- `game_key` 由服务端自动生成
### 10.2 当前动态配置
- `GET /api/admin/configs/current?project_id=...`
- `PUT /api/admin/configs/current`
### 10.3 公告
- `GET /api/admin/announcements`
- `GET /api/admin/announcements/{id}`
- `POST /api/admin/announcements`
- `PUT /api/admin/announcements/{id}`
- `DELETE /api/admin/announcements/{id}`
### 10.4 玩家
- `GET /api/admin/players`
- `GET /api/admin/players/{player_id}`
- `POST /api/admin/players/{player_id}/ban`
- `POST /api/admin/players/{player_id}/unban`
玩家列表支持筛选:
- `project_id`
- `player_id`
- `project_account_id`
- `login_provider`
- `login_user_id`
## 11. OpenAPI
完整 OpenAPI 导出:
- [openapi.yaml](/F:/OtherWork/BriskGameSerivce/openapi.yaml)

View File

@@ -0,0 +1,226 @@
# Brisk Unity SDK接入文档
## 1. 这份文档适合做什么
这份文档用于在 Unity 侧封装 Brisk SDK。
建议把 SDK 拆成以下层次:
- `BriskClient`
- `BriskAuth`
- `BriskConfig`
- `BriskAnnouncements`
- `BriskRanks`
- `BriskArchives`
- `BriskSpaces`
## 2. 初始化模型
Unity 客户端初始化建议持有:
- `baseUrl`
- `gameKey`(必填)
- `clientVersion`(推荐传入;服务端接口当前可选,但会影响版本命中)
- `deviceId`(推荐传入;`bootstrap` 接口当前可选)
不再需要项目级 `channel / platform`
示例:
```csharp
var options = new BriskOptions {
BaseUrl = "https://brisk.lightyears.ltd",
GameKey = "demo-game",
ClientVersion = Application.version,
DeviceId = SystemInfo.deviceUniqueIdentifier
};
```
## 3. 登录模型
登录属于独立模块,不属于初始化参数。
Unity 登录接口建议统一成:
```csharp
Task<LoginResult> LoginAsync(
string loginProvider,
string loginUserId = null,
string code = null,
string nickname = null,
string avatarUrl = null,
Dictionary<string, object> profileJson = null
)
```
说明:
- `loginProvider`:如 `tap`
- `loginUserId`:平台返回的稳定唯一用户 ID
- `code`:如果平台走 code 兑换模式则传这个
- `loginUserId``code` 二选一
- `nickname / avatarUrl / profileJson` 为可选同步资料
## 4. 推荐接入顺序
1. `BootstrapAsync()`
2. 从第三方 SDK 获取:
- `loginProvider`
- `loginUserId``code`
- 可选昵称、头像、扩展资料
3. `LoginAsync(...)`
4. 保存 `accessToken`
5. 拉取:
- `GetMeAsync()`
- `GetCurrentConfigAsync()`
- `ListAnnouncementsAsync()`
6. 进入业务模块
## 5. 身份模型建议
Unity SDK 内建议同时保存两套身份:
- 外部身份:
- `LoginProvider`
- `LoginUserId`
- 内部身份:
- `PlayerId`
- `ProjectAccountId`
原因:
- 跨系统跳转、和第三方 SDK 共存时,外部身份更方便
- 游戏内高频接口仍以内部 `player_id` 为主更自然
## 6. 空间跳转建议
如果排行榜头像点击来自第三方平台,推荐直接支持:
```csharp
Task<SpaceInfo> GetSpaceByLoginIdentityAsync(string loginProvider, string loginUserId)
Task<SpaceStats> GetSpaceStatsByLoginIdentityAsync(string loginProvider, string loginUserId)
Task LikeSpaceByLoginIdentityAsync(string loginProvider, string loginUserId)
```
这样可以避免 Unity 侧先做一次平台 ID 到 Brisk `player_id` 的映射查询。
## 7. 排行榜模块建议
客户端侧建议封装:
- `GetRankTopAsync(rankKey, limit)`
- `GetRankMeAsync(rankKey)`
- `GetRankAroundMeAsync(rankKey, range)`
- `SubmitScoreAsync(rankKey, score)`
- `GetCurrentSeasonAsync(rankKey)`
- `GetSeasonHistoryAsync(rankKey, limit)`
- `GetSeasonHistoryDetailAsync(rankKey, seasonId, limit)`
榜单项需要暴露:
- `Rank`
- `PlayerId`
- `ProjectAccountId`
- `LoginProvider`
- `LoginUserId`
- `Score`
- `Nickname`
- `AvatarUrl`
## 8. 云存档模块建议
云存档适合承载真实游戏数据。
原因:
- 上传下载是二进制流
- 天然适配 bytes
- 可直接存:
- JSON bytes
- protobuf bytes
- msgpack bytes
- 压缩后的存档二进制
Unity SDK 建议提供:
- `GetArchiveSlotsAsync()`
- `GetArchiveMetaAsync(slotNo)`
- `UploadArchiveAsync(slotNo, baseVersion, checksum, byte[])`
- `DownloadArchiveAsync(slotNo)`
## 9. 玩家空间模块建议
玩家空间适合承载公开展示数据,不建议放主存档。
推荐放:
- 简介文本
- 头像展示字段
- 成就展示摘要
- 公开资料卡
当前接口核心是:
- `UpdateMySpaceAsync(payloadJson)`
- `GetSpaceByPlayerIdAsync(playerId)`
- `GetSpaceByLoginIdentityAsync(loginProvider, loginUserId)`
- `LikeSpaceAsync(playerId)`
- `LikeSpaceByLoginIdentityAsync(loginProvider, loginUserId)`
- `GetMyVisitsAsync(limit)`
## 10. 动态配置建议
动态配置拆为两层:
- `feature_flags`
- 适合直接做开关或 key-value 判断
- `dynamic_config`
- 适合结构化配置对象
Unity SDK 可以考虑:
-`feature_flags` 映射成 `Dictionary<string, object>`
-`dynamic_config` 保留原始 JSON并允许上层自行反序列化
## 11. 错误与登录态处理
SDK 需要统一处理:
- HTTP 非 2xx
- 业务码非 0
- 401 / 登录态失效
- 维护模式
- 玩家被封禁
- 存档版本冲突
建议统一抛出:
```csharp
public sealed class BriskApiException : Exception {
public int HttpStatus { get; }
public int Code { get; }
public string ServerMessage { get; }
}
```
## 12. Unity 侧最小落地清单
第一版 SDK 至少要覆盖:
1. 初始化
2. 登录换票
3. 登录态保存
4. 玩家信息读取
5. 动态配置读取
6. 公告读取与已读
7. 排行榜提交与读取
8. 云存档上传下载
9. 玩家空间读取、写入、点赞
10.`login_provider + login_user_id` 访问空间
## 13. 配套文件
- API 总文档:
- [Brisk API接口与示例文档.md](/F:/OtherWork/BriskGameSerivce/Brisk%20API%E6%8E%A5%E5%8F%A3%E4%B8%8E%E7%A4%BA%E4%BE%8B%E6%96%87%E6%A1%A3.md)
- OpenAPI
- [openapi.yaml](/F:/OtherWork/BriskGameSerivce/openapi.yaml)

View File

@@ -0,0 +1,194 @@
# Brisk 错误码文档(内部实施版)
**版本**v0.1
**日期**2026-04-08
**说明**:当前工程内已使用的错误码分组与含义。
---
## 1. 返回结构
```json
{
"code": 0,
"message": "ok",
"data": {}
}
```
- `code = 0` 表示成功
-`0` 表示失败
---
## 2. 错误码分组
| 范围 | 模块 |
|---|---|
| `10001 - 10099` | 客户端 token / bootstrap / auth |
| `20001 - 20099` | 后台鉴权 |
| `21000 - 21999` | 后台项目 |
| `22000 - 22999` | 后台动态配置 |
| `23000 - 23999` | 后台玩家 |
| `24000 - 24999` | 后台审计日志 |
| `30000 - 30999` | 动态配置读取 |
| `40000 - 40999` | 公告 |
| `41000 - 41999` | 后台公告 |
| `50000 - 50999` | 排行榜 |
| `51000 - 51999` | 后台榜单 |
| `60000 - 60999` | 存档 |
| `70000 - 70999` | 玩家空间 |
| `80000 - 80999` | 限流 |
---
## 3. 当前已使用错误码
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `10001` | 客户端鉴权 | 缺少 token |
| `10002` | 客户端鉴权 | token 无效 |
| `10010` | `bootstrap` | 缺少必填查询参数 |
| `10011` | `bootstrap` | 项目不存在 |
| `10020` | `auth/login/exchange` | 请求体格式错误 |
| `10021` | `auth/login/exchange` | 缺少必填字段 |
| `10022` | `auth/login/exchange` | 登录交换失败 |
| `10023` | `auth/logout` | 缺少会话 |
| `10024` | `auth/logout` | 退出登录失败 |
| `10025` | `auth/login/exchange` | 项目维护中 |
| `10026` | `auth/login/exchange` | 玩家已封禁 |
| `10003` | 客户端访问控制 | 项目维护中 |
| `10004` | 客户端访问控制 | 玩家已封禁 |
| `10005` | 客户端访问控制 | 访问校验失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `20001` | 后台鉴权 | 缺少后台 token |
| `20002` | 后台鉴权 | 后台 token 无效 |
| `20010` | `admin/auth/login` | 请求体格式错误 |
| `20011` | `admin/auth/login` | 缺少用户名或密码 |
| `20012` | `admin/auth/login` | 后台登录失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `21010` | `admin/projects` | 项目列表查询失败 |
| `21011` | `admin/projects` | 创建项目请求体错误 |
| `21012` | `admin/projects` | 缺少项目名称或 game_key |
| `21013` | `admin/projects` | 创建项目失败 |
| `21014` | `admin/projects/{id}` | 项目 ID 非法 |
| `21015` | `admin/projects/{id}` | 更新请求体错误 |
| `21016` | `admin/projects/{id}` | 项目不存在 |
| `21017` | `admin/projects/{id}` | 更新项目失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `22010` | `admin/configs` | project_id 非法 |
| `22011` | `admin/configs` | 配置列表查询失败 |
| `22012` | `admin/configs` | 创建配置请求体错误 |
| `22013` | `admin/configs` | project_id 非法 |
| `22014` | `admin/configs` | 创建配置失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `23010` | `admin/players` | project_id 非法 |
| `23011` | `admin/players` | 玩家列表查询失败 |
| `23012` | `admin/players/{player_id}/ban` | player_id 非法 |
| `23013` | `admin/players/{player_id}/ban` | 玩家不存在 |
| `23014` | `admin/players/{player_id}/ban` | 封禁失败 |
| `23015` | `admin/players/{player_id}/unban` | player_id 非法 |
| `23016` | `admin/players/{player_id}/unban` | 玩家不存在 |
| `23017` | `admin/players/{player_id}/unban` | 解封失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `24010` | `admin/audit-logs` | 审计日志查询失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `30010` | `config/current` | 缺少必填查询参数 |
| `30011` | `config/current` | 项目不存在 |
| `30012` | `config/current` | 配置读取失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `40010` | `announcements` | 缺少会话 |
| `40011` | `announcements` | 公告查询失败 |
| `40012` | `announcements/{id}/read` | 缺少会话 |
| `40013` | `announcements/{id}/read` | 公告 ID 非法 |
| `40014` | `announcements/{id}/read` | 公告不存在 |
| `40015` | `announcements/{id}/read` | 标记已读失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `41010` | `admin/announcements` | project_id 非法 |
| `41011` | `admin/announcements` | 公告列表查询失败 |
| `41012` | `admin/announcements` | 创建公告请求体错误 |
| `41013` | `admin/announcements` | 缺少公告必填字段 |
| `41014` | `admin/announcements` | 创建公告失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `50010` | `ranks/top` | 缺少会话 |
| `50011` | `ranks/top` | 榜单查询失败 |
| `50012` | `ranks/me` | 缺少会话 |
| `50013` | `ranks/me` | 玩家排名查询失败 |
| `50014` | `ranks/around-me` | 缺少会话 |
| `50015` | `ranks/around-me` | 附近排名查询失败 |
| `50016` | `ranks/score` | 缺少会话 |
| `50017` | `ranks/score` | 分数请求体错误 |
| `50018` | `ranks/score` | 分数提交失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `51010` | `admin/ranks` | project_id 非法 |
| `51011` | `admin/ranks` | 榜单列表查询失败 |
| `51012` | `admin/ranks` | 创建榜单请求体错误 |
| `51013` | `admin/ranks` | 缺少榜单必填字段 |
| `51014` | `admin/ranks` | 创建榜单失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `60010` | `archives/meta` | 缺少会话 |
| `60011` | `archives/meta` | 存档元数据查询失败 |
| `60012` | `archives/upload` | 缺少会话 |
| `60013` | `archives/upload` | 上传表单错误 |
| `60014` | `archives/upload` | 缺少文件 |
| `60015` | `archives/upload` | 文件读取失败 |
| `60016` | `archives/upload` | 版本冲突 |
| `60017` | `archives/upload` | 校验值不匹配 |
| `60018` | `archives/upload` | 存档超出大小限制 |
| `60019` | `archives/upload` | 上传失败 |
| `60020` | `archives/download` | 缺少会话 |
| `60021` | `archives/download` | 存档不存在 |
| `60022` | `archives/download` | 下载失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `70010` | `spaces/{player_id}` | 缺少会话 |
| `70011` | `spaces/{player_id}` | 玩家不存在 |
| `70012` | `spaces/{player_id}` | 空间读取失败 |
| `70013` | `spaces/me` | 缺少会话 |
| `70014` | `spaces/me` | 请求体错误 |
| `70015` | `spaces/me` | 空间更新失败 |
| `70016` | `spaces/{player_id}/like` | 缺少会话 |
| `70017` | `spaces/{player_id}/like` | 玩家不存在 |
| `70018` | `spaces/{player_id}/like` | 点赞失败 |
| `70019` | `spaces/{player_id}/like` | 缺少会话 |
| `70020` | `spaces/{player_id}/like` | 玩家不存在 |
| `70021` | `spaces/{player_id}/like` | 取消点赞失败 |
| `70022` | `spaces/me/visits` | 缺少会话 |
| `70023` | `spaces/me/visits` | 访客列表查询失败 |
| 错误码 | 接口/模块 | 含义 |
|---|---|---|
| `80001` | 限流中间件 | 请求过于频繁 |
| `80002` | 限流中间件 | 限流服务不可用 |
---
## 4. 使用规则
- 新接口优先复用所属模块的错误码段
- 成功统一返回 `code = 0`
- 同一类错误尽量复用已有错误码
- 新增错误码时同步更新本文件

View File

@@ -0,0 +1,101 @@
# Brisk Game Service
Brisk 游戏服务端工程。
当前已实现模块:
- 客户端初始化 `bootstrap`
- 登录换票 `auth`
- 玩家信息 `player`
- 动态配置 `config`
- 公告 `announcements`
- 排行榜 `ranks`
- 云存档 `archives`
- 玩家空间 `spaces`
- 管理后台认证、项目、配置、公告、排行榜、存档、玩家、空间、审计
- Worker 清理任务与基础限流
## 当前核心模型
- 项目唯一标识只有 `game_key`
- 项目级 `channel / platform` 已移除
- 初始化和动态配置只依赖 `game_key`,配置筛选只看 `client_version`
- 登录模块单独处理第三方身份:
- `login_provider`:如 `tap`
- `login_user_id`:该登录平台返回的稳定唯一用户 ID
- 服务端登录成功后返回内部:
- `player_id`
- `project_account_id`
- `access_token`
- 空间、排行榜后台筛选等模块支持直接使用 `login_provider + login_user_id`
- 内部仍优先解析到 `player_id` 再执行业务查询,便于性能和统一索引
## 本地运行
推荐使用 Docker Compose
```bash
copy .env.example .env
docker compose up --build
```
默认接口:
- `GET /health`
- `GET /api/ping`
- `GET /openapi.yaml`
开发环境默认账号:
- 后台用户名:`admin`
- 后台密码:`admin123456`
- 后台操作员:`operator`
- 操作员密码:`operator123456`
## 接入说明
- 客户端初始化:
- 必填 `game_key`
- 可选 `client_version`
- `device_id` 仅作透传与诊断辅助
- 客户端登录:
- 必填 `game_key`
- 必填 `login_provider`
- `login_user_id``code` 二选一
- 可选透传 `nickname``avatar_url``profile_json`
- 云存档:
- 支持二进制文件上传/下载,适合直接存游戏存档 bytes
- 玩家空间:
- 当前为 `payload_json` 结构,适合资料卡、展示文本等轻量公开数据
## 测试脚本
Windows PowerShell
```powershell
.\scripts\smoke-test.ps1
.\scripts\acceptance.ps1 -Tasks all -ManageStack
```
## 迁移
数据库迁移目录:
- [0001_init.sql](/F:/OtherWork/BriskGameSerivce/internal/platform/db/migrations/0001_init.sql)
- [0008_identity_and_config_simplification.sql](/F:/OtherWork/BriskGameSerivce/internal/platform/db/migrations/0008_identity_and_config_simplification.sql)
服务启动时会自动执行未应用迁移。
## 根目录文档
- [Brisk API接口与示例文档.md](/F:/OtherWork/BriskGameSerivce/Brisk%20API%E6%8E%A5%E5%8F%A3%E4%B8%8E%E7%A4%BA%E4%BE%8B%E6%96%87%E6%A1%A3.md)
- [Brisk Unity SDK接入文档.md](/F:/OtherWork/BriskGameSerivce/Brisk%20Unity%20SDK%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3.md)
- [openapi.yaml](/F:/OtherWork/BriskGameSerivce/openapi.yaml)
## 目录说明
- `cmd/`:启动入口
- `internal/`:内部实现
- `deployments/`:部署配置
- `docs/`:历史设计文档与补充资料
- `scripts/`:脚本

File diff suppressed because it is too large Load Diff