feat(app-api): E1 补全 5 个 C 端接口(创作者入驻/作品/看板 + 启动配置/公告)
为什么:联调 10-19 开始,前端照 api-phase1.md §1.9 写会 404,需要先把这 5 个补齐。 契约先行(12-上线检查清单 §一):先重写 api-phase1.md §1.9 —— 把 commerce 三条移出本节标"已实现", 补齐 5 个接口的请求/响应字段、错误码、分页口径、幂等矩阵,并新增 200007 CREATOR_NOT_ACTIVE。 - GET /app/config(匿名):硬编码白名单 6 键 + 契约默认值兜底,绝不整表下发 - GET /app/notices(匿名):ops_notice 只读分页(status/target/发布与过期时间),无数据返回空列表 - POST /app/creator/apply:幂等,防重靠 DB 唯一索引 uk_creator_user,并发冲突读回既有记录 - GET /app/creator/works:非生效创作者报 200007 + 分状态提示,不返回空数组冒充成功 - GET /app/creator/stats:与后台 07 看板同口径(字段/notes 逐条一致),null + notes 语义保留 - 冻结模块零改动:module-creator 仅新增 CreatorAppService/两个 VO 与 1 个公开方法 pageMyDramasOf, 既有 pageMyDramas 一行未动;module-system 仅新增 OpsNotice 实体与 Mapper - Swagger 中文注解按 S1 规范补齐;白名单与 /app/notices 加进安全白名单 - 实测:mvn test 98 条全过(app-api 41→56);package 通过;端到端五接口全部符合预期 (重复 apply 同 id + created:false、pending 看 works/stats 报 200007、approved 后正常)
This commit is contained in:
1 parent
4c3d524eff
commit
14b5e4137f
19 files changed
+1355
-11
No files matched your search
+126
-10
@@ -260,18 +260,134 @@ B1-2 的退款/拒付复验依赖它。服务端凭据(`packageName` + service
|
||||
服务端按 `(platform, storeTransactionId)` 识别"权益已发过",**返回既有订单、不重复发币**;
|
||||
若商店侧有购买而本地没有订单(例如换机前没同步),会**按校验结果补单落库**再发放,不需要人工介入。
|
||||
|
||||
### 1.9 创作者(下一批)
|
||||
### 1.9 创作者(C 端,已实现)
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
> 说明:本节原来把 `/app/orders`、`/app/wallet`、`/app/episodes/{id}/unlock` 也列在这里,
|
||||
> 那三条**属「金币与订单」,已在 §1.8 实现并冻结**,因此已从本节移出(本节只讲创作者 + 启动配置 + 公告)。
|
||||
|
||||
| 方法 | 路径 | 鉴权 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| POST | `/app/creator/apply` | 登录 | 创作者入驻申请(**幂等**:重复提交返回当前状态,不重复建档) |
|
||||
| GET | `/app/creator/works` | 登录 | 我的作品与审核状态(**非生效创作者直接报错**,不返回空列表) |
|
||||
| GET | `/app/creator/stats` | 登录 | 创作者数据看板(与后台 07 看板同口径,只读、仅本人作品) |
|
||||
| GET | `/app/config` | **匿名** | 启动配置(协议版本、最低版本、开关;**只下发白名单键**) |
|
||||
| GET | `/app/notices` | **匿名** | 系统公告(无数据返回空列表,不是 404) |
|
||||
|
||||
#### 1.9.1 `GET /app/config`(匿名)
|
||||
|
||||
客户端**登录前**就要拿,用于:协议版本校验、强制更新判断、功能开关。
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0, "message": "ok",
|
||||
"data": {
|
||||
"agreementVersion": "2026-10-01",
|
||||
"minAppVersion": "1.0.0",
|
||||
"forceUpdate": false,
|
||||
"noticeEnabled": true,
|
||||
"coinUnlockEnabled": true,
|
||||
"downloadEnabled": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| 键(对客户端字段) | 后台配置键 | 契约默认值 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `agreementVersion` | `app.agreement.version` | `2026-10-01` | 当前协议版本;`/app/creator/apply` 必须与它一致 |
|
||||
| `minAppVersion` | `app.min.version` | `1.0.0` | 低于它客户端应提示升级 |
|
||||
| `forceUpdate` | `app.force.update` | `false` | 是否强制更新 |
|
||||
| `noticeEnabled` | `app.notice.enabled` | `true` | 公告入口开关 |
|
||||
| `coinUnlockEnabled` | `app.coin.unlock.enabled` | `true` | 金币解锁开关 |
|
||||
| `downloadEnabled` | `app.download.enabled` | `true` | 离线下载开关 |
|
||||
|
||||
**口径**:**只下发上述白名单键**(服务端硬编码白名单),后台配置里的其它键(可能含内部开关)
|
||||
**一律不下发**;库里缺键时用「契约默认值」兜底,**不返回 null 让客户端自己猜默认值**。
|
||||
|
||||
#### 1.9.2 `GET /app/notices`(匿名)
|
||||
|
||||
```
|
||||
GET /app/notices?pageIndex=1&pageSize=20
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `pageIndex` | int | 否 | 默认 1 |
|
||||
| `pageSize` | int | 否 | 默认 20,最大 50 |
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0, "message": "ok",
|
||||
"data": {
|
||||
"total": 1,
|
||||
"list": [
|
||||
{ "id": 2110123456789, "title": "开服公告", "content": "…", "type": "SYSTEM",
|
||||
"publishAt": "2026-10-16 10:00:00", "expireAt": null }
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**口径**:只返回 `status=1`(启用)且 `target ∈ {ALL, USER}`、`publish_at <= 现在`、
|
||||
`expire_at` 为空或未过期的公告;按 `publish_at desc, id desc` 排序。
|
||||
**表里没有数据时返回 `total=0, list=[]`(HTTP 与 code 都是成功),不是 404。**
|
||||
|
||||
#### 1.9.3 `POST /app/creator/apply`(登录)
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "星野工作室", "type": "COMPANY",
|
||||
"contactName": "张三", "contactMobile": "08123456789", "contactEmail": "creator@example.com",
|
||||
"countryCode": "ID", "agreementVersion": "2026-10-01"
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 必填 | 校验 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/app/orders` | 我的订单 |
|
||||
| GET | `/app/wallet` | 金币余额与流水 |
|
||||
| POST | `/app/episodes/{id}/unlock` | 金币解锁分集 |
|
||||
| POST | `/app/creator/apply` | 创作者入驻 |
|
||||
| GET | `/app/creator/works` | 我的作品与审核状态 |
|
||||
| GET | `/app/creator/stats` | 创作者数据看板 |
|
||||
| GET | `/app/config` | 启动配置(协议版本、开关、最低版本) |
|
||||
| GET | `/app/notices` | 系统公告 |
|
||||
| `name` | ✅ | 1–128 字 |
|
||||
| `type` | 否 | `INDIVIDUAL`(默认)/ `COMPANY` |
|
||||
| `contactName` / `contactMobile` / `contactEmail` | 否 | 只是联系方式,不参与鉴权 |
|
||||
| `countryCode` | 否 | 默认 `ID` |
|
||||
| `agreementVersion` | ✅ | **必须等于 `/app/config` 的 `agreementVersion`**,否则 `400` |
|
||||
|
||||
**幂等口径(硬要求)**:以「**C 端账号唯一**」防重(DB 唯一索引 `uk_creator_user(user_id) where user_id > 0`):
|
||||
|
||||
| 情况 | 行为 |
|
||||
| --- | --- |
|
||||
| 首次申请 | 建档,`status=pending`,返回 `{id, code, status, statusText, auditNote, appliedAt}` |
|
||||
| 已申请(pending) | **返回当前状态**,不重复建档、不改动已有记录 |
|
||||
| 已通过(approved) | 返回 `status=approved`(客户端据此直接进创作者中心) |
|
||||
| 被驳回 / 冻结 | 返回当前状态与 `auditNote`(是否允许重新申请由运营在后台处理,本期不做二次申请) |
|
||||
| 并发重复提交 | 唯一索引兜底:捕获冲突后**读回已有记录返回**,不报 500 |
|
||||
|
||||
#### 1.9.4 `GET /app/creator/works`(登录)
|
||||
|
||||
```
|
||||
GET /app/creator/works?pageIndex=1&pageSize=10&keyword=&status=
|
||||
```
|
||||
|
||||
分页与筛选口径**与管理端 `/admin/creator-center/dramas/page` 完全一致**(同一套查询与 VO 形状:
|
||||
`id/code/title/subtitle/genre/description/cover/trailerUrl/language/status/statusText/episodes/views/updatedAt`)。
|
||||
|
||||
**归属与鉴权**:`creator.user_id = 当前登录的 C 端账号`,**接口不接收 creatorId**;
|
||||
所有查询都收敛到"我的作品",因此天然不会返回他人作品。
|
||||
|
||||
**非生效创作者必须报错(不返回空数组)**:
|
||||
|
||||
| 状态 | `code` | 提示 |
|
||||
| --- | --- | --- |
|
||||
| 未申请 | `200007` | 尚未提交创作者入驻申请 |
|
||||
| `pending` | `200007` | 入驻申请审核中,请耐心等待 |
|
||||
| `rejected` | `200007` | 入驻申请未通过:{auditNote} |
|
||||
| `frozen` | `200007` | 创作者账号已冻结,请联系运营 |
|
||||
|
||||
> `200007 CREATOR_NOT_ACTIVE`:C 端专用「当前账号不是生效中的创作者」。
|
||||
> 与后台的 `200004 CREATOR_NOT_BOUND`(当前账号未绑定创作者主体)区分开,客户端据此决定"引导申请"还是"提示等待"。
|
||||
|
||||
#### 1.9.5 `GET /app/creator/stats`(登录)
|
||||
|
||||
**指标口径与后台 07 创作者中心数据看板完全一致**(实现上共用同一份计算:`CreatorDashboardQueryService`),
|
||||
字段与语义见 §2.7 创作者数据看板说明;**只读、且只统计本人作品**。
|
||||
非生效创作者同样返回 `200007`。
|
||||
|
||||
## 2. 后台管理接口(/admin/**)
|
||||
|
||||
|
||||
Reference in new issue
Block a user