Files
quyun-v2/docs/test-matrix.md

363 lines
22 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 全项目页面逐按钮测试矩阵(落盘存档)
更新日期2026-02-07Asia/Shanghai
## 1) 测试范围
- Portal`frontend/portal/src/router/index.js` 所有业务路由(含登录、主页、频道、内容详情、用户中心、创作者中心、结算支付)。
- Superadmin`frontend/superadmin/src/router/index.js` 所有 superadmin 路由 + uikit/pages/landing 路由。
- 粒度:页面级 + 按钮/链接级(可见可交互控件采样执行)。
- 数据前置:已执行补齐后的 seed`backend/app/commands/seed/seed.go`)。
## 2) 测试环境
- Backend API: `http://127.0.0.1:18080`healthz=204
- Superadmin: `http://127.0.0.1:5173`
- Portal: `http://127.0.0.1:5174`
- 租户代码:`meipai_990`
- Portal登录手机号 `13800138000` + OTP `1234`
- Superadmin登录`superadmin / superadmin123`
## 3) Portal 页面矩阵(按页面)
> 说明:`ok=false` 表示页面可打开但检测到错误关键词(如 404/not found 等),通常来自页面内某些资源/API不一定是整页不可用。
| Route | 结果 | 代表按钮(采样) | 备注 |
|---|---|---|---|
| `/t/meipai_990` | ⚠️ 部分异常 | 退出登录 / 推荐 / 最新 / 热门 / 全部 / 京剧... | 存在 `/v1/t/:tenantCode/tenants` 404 |
| `/t/meipai_990/channel` | ⚠️ 部分异常 | 退出登录 / 私信 / 主页 / 关于 / 最新 / 最热 | 同上,频道页伴随 tenants 404 |
| `/t/meipai_990/contents/1` | ✅ | 发布评论 / 回复 / 关注 / 私信 | 详情页主流程可用 |
| `/t/meipai_990/explore` | ⚠️ 部分异常 | 分类过滤按钮组、免费/付费 | 存在 tenants 404 |
| `/t/meipai_990/topics` | ✅ | 导航/跳转链接可用 | 页面可达 |
| `/t/meipai_990/creator/apply` | ✅ | 立即申请入驻 | 可提交入口存在 |
| `/t/meipai_990/creator/contents/new` | ✅ | 存草稿 / 发布 / 免费/付费/会员专享 | 创作发布页可达 |
| `/t/meipai_990/me` | ✅ | 退出登录 / 清空历史 | 个人中心可达 |
| `/t/meipai_990/me/orders` | ✅ | 全部订单/待支付/已完成/退款售后/去支付/取消订单 | 订单列表动作可见 |
| `/t/meipai_990/me/orders/1` | ✅ | 复制 / 联系商家 | 详情页可达 |
| `/t/meipai_990/me/wallet` | ✅ | 立即充值 | 钱包页可达 |
| `/t/meipai_990/me/coupons` | ✅ | 未使用/已使用/已过期 | 状态切换可见 |
| `/t/meipai_990/me/library` | ✅ | 立即阅读 | 已购库可达 |
| `/t/meipai_990/me/favorites` | ✅ | 批量管理 / 取消收藏 | 收藏页可达 |
| `/t/meipai_990/me/likes` | ✅ | 取消点赞 | 点赞页可达 |
| `/t/meipai_990/me/notifications` | ✅ | 全部/系统/订单/审核/互动/全部已读 | 通知中心可达 |
| `/t/meipai_990/me/profile` | ✅ | 保存修改 | 资料页可达 |
| `/t/meipai_990/me/security` | ✅ | 更换 / 去认证 | 安全页可达 |
| `/t/meipai_990/checkout?contentId=1` | ✅ | 提交订单 / 取消 | 下单页可达 |
| `/t/meipai_990/payment/1` | ✅ | 确认余额支付 | 支付页可达 |
### Portal 关键异常
1. `GET /v1/t/meipai_990/tenants?limit=5` 返回 404页面顶部若依赖该接口会触发异常标记
2. 多条 `/v1/storage/https://images.unsplash.com/...` 返回 404种子中外链被当作 storage path 访问,导致图片资源请求失败)。
## 4) Superadmin 页面矩阵(按页面)
| Route | 结果 | 按钮数量(采样统计) | 代表按钮(采样) |
|---|---|---:|---|
| `/super/` | ✅ | 6 | Aura/Lara/Nora/Static/Overlay/Logout |
| `/super/superadmin/tenants` | ✅ | 20 | 健康概览/创建租户/查询/重置/展开 |
| `/super/superadmin/health` | ✅ | 10 | 刷新/查询/重置/展开 |
| `/super/superadmin/users` | ✅ | 34 | 查询/重置/展开/分页 |
| `/super/superadmin/users/1` | ✅ | 44 | 资料/角色/状态/拥有租户/加入租户 |
| `/super/superadmin/orders` | ✅ | 41 | 查询/重置/退款/标记问题/完成对账 |
| `/super/superadmin/orders/1` | ✅ | 9 | 取消标记/撤销对账/退款 |
| `/super/superadmin/contents` | ✅ | 36 | 内容列表/评论治理/举报治理/批量通过/批量驳回 |
| `/super/superadmin/creators` | ✅ | 45 | 创作者列表/申请审核/成员审核/结算账户 |
| `/super/superadmin/coupons` | ✅ | 34 | 券模板/发放记录/异常核查/新建优惠券 |
| `/super/superadmin/finance` | ✅ | 31 | 提现审核/钱包流水/异常排查/刷新 |
| `/super/superadmin/reports` | ✅ | 23 | 导出CSV/查询/重置 |
| `/super/superadmin/assets` | ✅ | 11 | 查询/重置/展开 |
| `/super/superadmin/notifications` | ✅ | 23 | 通知列表/模板管理/群发通知 |
| `/super/superadmin/audit-logs` | ✅ | 11 | 查询/重置/展开 |
| `/super/superadmin/system-configs` | ✅ | 13 | 新建配置/查询/重置/编辑 |
| `/super/pages/empty` | ✅ | 6 | 基础布局按钮 |
| `/super/pages/crud` | ✅ | 12 | New/Delete/Export/分页 |
| `/super/documentation` | ✅ | 6 | 基础布局按钮 |
| `/super/landing` | ✅ | 4 | Register/Get Started |
| `/super/uikit/button` | ✅ | 66 | Submit/Disabled/Link/Primary... |
| `/super/uikit/formlayout` | ✅ | 7 | Submit |
| `/super/uikit/input` | ✅ | 11 | Option1/2/3/Search |
| `/super/uikit/table` | ✅ | 15 | Clear/分页 |
| `/super/uikit/list` | ✅ | 12 | Buy Now |
| `/super/uikit/tree` | ✅ | 6 | 基础布局按钮 |
| `/super/uikit/panel` | ✅ | 16 | Save/Header tabs |
| `/super/uikit/overlay` | ✅ | 11 | Show/Save/Confirm/Delete |
| `/super/uikit/media` | ✅ | 6 | 基础布局按钮 |
| `/super/uikit/message` | ✅ | 10 | Success/Info/Warn/Error |
| `/super/uikit/file` | ✅ | 11 | Choose/Upload/Cancel |
| `/super/uikit/menu` | ✅ | 13 | Header I/II/III |
| `/super/uikit/charts` | ✅ | 6 | 基础布局按钮 |
| `/super/uikit/misc` | ✅ | 8 | Emails/Messages |
| `/super/uikit/timeline` | ✅ | 10 | Read more |
## 5) 失败/阻塞项复现
### F1Portal tenants 接口 404
- 现象:首页/频道/探索页出现 `ok=false`,并在后端日志出现 404。
- 复现:登录 Portal 后访问 `/t/meipai_990``/t/meipai_990/channel`
- 后端日志:`GET /v1/t/meipai_990/tenants?limit=5` -> 404。
- 影响:门户首页顶部/频道信息可能缺失或报错。
- 建议优先级:**P1**(核心入口页异常)。
### F2Portal 外链图片走 storage 路由导致 404
- 现象:大量 `/v1/storage/https://images.unsplash.com/...` 404。
- 复现:访问首页/列表相关页面即可触发。
- 根因倾向:内容封面 URL 为外链,但前端拼接了 storage 下载前缀。
- 影响:缩略图/封面显示失败,体验受损。
- 建议优先级:**P2**。
## 6) 覆盖统计
- Portal 路由覆盖20/20按执行清单
- Superadmin 路由覆盖35/35按执行清单
- 可见按钮/操作覆盖:
- Portal每页采样记录按钮均有可见交互控件详情见上表
- Superadmin每页记录按钮数量与代表动作详见上表
## 7) 结论
- **总体可用但存在两类明显缺陷F1/F2**。
- Superadmin 页面可达与按钮可见性整体正常。
- Portal 核心流程(登录、订单、钱包、个人中心、支付页)可访问;但租户信息接口与外链图片路径处理需要修复。
---
## 附:证据来源
- 浏览器自动化Playwright MCP页面快照 + 按钮/链接枚举 + 路由巡检)
- 后端证据:`pty_0e911c68` 运行日志中的 404 记录
- 环境会话:
- backend: `pty_0e911c68`
- superadmin: `pty_28cea2be`
- portal: `pty_1773d898`
## 8) 闭环测试执行上下文Action -> API -> DB
- 执行时间2026-02-07 11:56 ~ 12:00Asia/Shanghai
- 数据前置:`cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go run . seed`
- 本轮租户:`meipai_157``tenant_id=1`
- 账号:
- Portal`13800138000 + 1234`
- Superadmin`superadmin / superadmin123`
- 验证方式:
- 通过 API 触发页面等效动作UI-equivalent
- 每个场景记录前置状态/动作/后置状态/SQL证据
### 8.1 全局前后快照
| 指标 | 前置 | 后置 | Delta |
|---|---:|---:|---:|
| `user_content_actions` | 2 | 3 | +1 |
| `comments` | 1 | 2 | +1 |
| `orders` | 12 | 14 | +2 |
| `order_items` | 3 | 4 | +1 |
| `content_access` | 3 | 3 | +0 |
| 买家余额(分) | 5000 | 104010 | +99010 |
| 买家未读通知tenant=1 | 8 | 0 | -8 |
## 9) 闭环场景结果表
### 9.1 Portal 闭环场景
| 场景 | 前置状态 | 动作UI 等效 API | 后置状态DB/API 证据) | 结果 |
|---|---|---|---|---|
| 点赞内容 | `content_id=1` 已有 like 记录 1 条 | `POST /v1/t/meipai_157/contents/1/like` | HTTP 200like 记录 1 -> 1幂等 | ✅ Pass |
| 收藏内容 | `content_id=2` favorite 记录 0 条 | `POST /v1/t/meipai_157/contents/2/favorite` | HTTP 200favorite 记录 0 -> 1 | ✅ Pass |
| 评论内容 | `content_id=3` 评论数 0 | `POST /v1/t/meipai_157/contents/3/comments``闭环评论 cc25fadc2c` | HTTP 200评论数 0 -> 1新评论 `id=2` | ✅ Pass |
| 下单+支付+发放访问权限 | `content_id=4` | `POST /orders` -> `order_id=13``POST /orders/13/pay` | 订单状态=paid、order_item=1**content_access(order_id=13)=0**,总量无增量 | ❌ Fail |
| 充值码兑换 | `RC_ACTIVE_1000` 为 active | `POST /me/wallet/recharge`code=RC_ACTIVE_1000 | HTTP 200code: active->redeemed余额 +100000 分;`redeemed_order_id=14`**order(14) status=created** | ❌ Fail |
| 全部通知已读 | 未读 8 | `POST /me/notifications/read-all` | HTTP 200未读 8 -> 0 | ✅ Pass |
### 9.2 Superadmin 闭环场景
| 场景 | 前置状态 | 动作 | 后置状态DB/API 证据) | 结果 |
|---|---|---|---|---|
| 系统配置 create/update | 无 `qa_closure_84f9cb6e` | `POST /super/v1/system-configs` -> `PATCH /super/v1/system-configs/3` | 配置值更新为 `{"value":"v2","source":"qa-update"}`description=`qa closure updated`;审计日志 2 条create+update | ✅ Pass |
| 通知模板 create/update | 无 `qa_template_f342df9a` | `POST /super/v1/notifications/templates` -> `PATCH /super/v1/notifications/templates/5` | 标题更新为 `QA Template Title Updated``is_active=false`;审计日志 1 条 | ✅ Pass |
| 群发通知下游落库 | 目标用户未读=0 | `POST /super/v1/notifications/broadcast`tenant=1 | API 返回 200但通知表无新增title 查询=0补测显式 user_ids 仍无落库 | ⚠️ Blocked |
## 10) 失败/阻塞场景复现与证据
### F3支付成功但未发放内容访问权限
- 复现:
1. `POST /v1/t/meipai_157/orders``content_id=4`
2. `POST /v1/t/meipai_157/orders/13/pay``method=balance`
- 实际:
- `orders.id=13 status=paid`
- `order_items(order_id=13)=1`
- `content_access(order_id=13)=0`
- 证据 SQL节选
- `SELECT id,status,order_id FROM content_access WHERE user_id=2 AND content_id=4;` -> `id=3,status=expired,order_id=9`
- `SELECT id,status,amount_paid FROM orders WHERE id=13;` -> `13,paid,990`
- 影响:用户完成支付后可能无权访问已购内容。
- 优先级:**P1**。
### F4严重充值码兑换后订单状态未结算为 paid
- 复现:
1. `POST /v1/t/meipai_157/me/wallet/recharge``code=RC_ACTIVE_1000`
- 实际:
- 接口 200返回 `order_id=14`
- 充值码状态 active->redeemed`redeemed_order_id=14`
- 用户余额 +100000 分(到账)
-`orders.id=14 status=created`(应为 paid
- 证据 SQL节选
- `SELECT code,status,redeemed_order_id,amount FROM recharge_codes WHERE code='RC_ACTIVE_1000';` -> `redeemed,14,100000`
- `SELECT id,status,type,amount_paid FROM orders WHERE id=14;` -> `14,created,recharge,100000`
- 影响:资金到账与订单状态不一致,影响对账/风控/财务准确性。
- 优先级:**P0**。
### B1阻塞超管群发通知闭环无法在当前环境确认
- 复现:
1. `POST /super/v1/notifications/broadcast`tenant=1返回 200
2. 查询 `notifications` 未见新记录
- 说明:`services/notification.go` 默认走异步任务队列(`job.Add`);仅 `JOB_INLINE=1` 才同步落库。当前环境未启动消费方,导致“动作成功但下游证据缺失”。
- 处理建议:
- 启用 worker
- 在闭环环境设置 `JOB_INLINE=1` 再复测。
- 状态:**Blocked非功能结论环境前置不足**。
### F1Portal tenants 接口 404回归确认
- 请求:`GET /v1/t/meipai_157/tenants?limit=5`
- 结果HTTP **404**
- 影响:门户首页/频道页租户信息区块异常。
- 优先级:**P1**。
### F2外链图片被当作 storage 路径(回归确认)
- 请求:`GET /v1/storage/https://images.unsplash.com/photo-1514306191717-452ec28c7f31`
- 结果HTTP **404**
- 影响:封面图/缩略图加载失败。
- 优先级:**P2**。
## 11) 优先级缺陷清单P0/P1/P2
### P0
1. **充值码兑换订单状态不一致**:余额到账 + code 已 redeem但 recharge 订单仍为 `created`F4
### P1
1. **支付后未发放访问权限**:订单 paid 但未新增 active content_accessF3
2. **Portal tenants 接口 404**核心入口页租户数据缺失F1
### P2
1. **外链图片走 storage 前缀导致 404**F2
### Blocked需环境补齐后再定级
1. **超管群发通知下游落库验证**当前队列消费未启用B1
## 12) 最终闭环覆盖总结
- 闭环场景总数9
- ✅ 通过6
- ❌ 失败2
- ⚠️ 阻塞1
- Fully Closed
- Portal点赞、收藏、评论、通知全部已读
- Superadmin系统配置 create/update、通知模板 create/update
- Partially Closed / Failed
- Portal下单支付后访问权限发放失败
- Portal充值兑换状态一致性失败
- Blocked
- Superadmin群发通知下游落库验证需 worker/JOB_INLINE 前置)
## 13) 2026-02-07 回归复测(修复后)
- 执行时间2026-02-07 12:57 ~ 13:07Asia/Shanghai
- 后端:`go run . serve``http://127.0.0.1:18080`
- 复测前置:`cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go run . seed`
- 本轮租户:`meipai_569``tenant_id=1`
- Portal 登录:`POST /v1/auth/otp` + `POST /v1/auth/login``13800138000` / OTP `1234`
### 13.1 关键接口复测结果Action -> API -> DB
| 场景 | 动作 | 结果 | 证据 |
|---|---|---|---|
| 支付后 content_access 恢复 active | `POST /v1/t/meipai_569/orders``content_id=4`-> `order_id=13``POST /v1/t/meipai_569/orders/13/pay` | ✅ 订单支付成功,已有 `expired` 访问记录被恢复为 `active` 并绑定新订单 | `orders.id=13 status=paid`; `order_items(order_id=13)=1`; `content_access(user_id=2,content_id=4)``status=expired,order_id=9` 变为 `status=active,order_id=13` |
| 充值兑换订单状态一致性 | `POST /v1/t/meipai_569/me/wallet/recharge``code=RC_ACTIVE_1000`-> `order_id=14` | ✅ 兑换后订单状态为 `paid`,与余额到账一致 | `recharge_codes.code='RC_ACTIVE_1000' status=redeemed, redeemed_order_id=14`; `orders.id=14 status=paid,type=recharge`; `users.id=2 balance=104010` |
| Portal tenants 列表接口 | `GET /v1/t/meipai_569/tenants?limit=5`(带/不带 token | ✅ 返回 200不再 404 | 响应体包含分页与 tenant 项:`{"page":1,"total":1,"items":[...]}` |
| 外链图片 URL | `GET /v1/t/meipai_569/contents?page=1&limit=3` | ✅ `cover` 返回外链绝对 URL不再拼接 `/v1/storage/https://...` | 响应中 `cover` 字段为 `https://images.unsplash.com/...``media_assets.object_key``http(s)` 外链时直出 |
### 13.2 新发现(回归期间)
- `Creator` 路由缺失(与本轮四项缺陷不同):
- 复测请求:`GET /v1/t/meipai_569/creator/orders` 返回 404。
- 服务启动日志中无任何 `/v1/t/:tenantCode/creator/...` 路由注册项。
- 代码现状:`backend/app/http/v1/creator.go` 只有一个方法 `GrantCoupon`,但其注释块包含大量不匹配该方法签名的 `@Router` 声明,导致路由生成器未产出 creator 路由。
- 影响Portal 创作者中心依赖的 `/creator/*` API 存在不可用风险(需单独修复)。
### 13.3 构建/测试验证
- `cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go test ./...`
- 结果:✅ 全量通过。
### 13.4 状态更新P0/P1/P2
- P0 充值兑换状态不一致F4**已修复并复测通过**
- P1 支付后未发放访问权限F3**已修复并复测通过**
- P1 Portal tenants 接口 404F1**已修复并复测通过**
- P2 外链图片拼接 storage 前缀F2**已修复并复测通过**
- Blocked群发通知异步落库 仍依赖 worker/JOB_INLINE 环境前置
## 14) 2026-02-07 Creator 路由恢复验证(回归补录)
- 执行时间2026-02-07 19:28 ~ 19:31Asia/Shanghai
- 后端:`go run . serve``http://127.0.0.1:18080`
- 路由生成:`cd backend && atomctl gen route`
- 全量回归:`cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go test ./...`(✅ pass
### 14.1 前端 Creator API -> 后端 Controller/Service 映射
| 前端函数(`frontend/portal/src/api/creator.js` | 后端路由 | Controller 方法 | Service 方法 |
|---|---|---|---|
| `apply` | `POST /v1/t/:tenantCode/creator/apply` | `Creator.Apply` | `services.Creator.Apply` |
| `getDashboard` | `GET /v1/t/:tenantCode/creator/dashboard` | `Creator.Dashboard` | `services.Creator.Dashboard` |
| `listContents` | `GET /v1/t/:tenantCode/creator/contents` | `Creator.ListContents` | `services.Creator.ListContents` |
| `getContent` | `GET /v1/t/:tenantCode/creator/contents/:id<int>` | `Creator.GetContent` | `services.Creator.GetContent` |
| `createContent` | `POST /v1/t/:tenantCode/creator/contents` | `Creator.CreateContent` | `services.Creator.CreateContent` |
| `updateContent` | `PUT /v1/t/:tenantCode/creator/contents/:id<int>` | `Creator.UpdateContent` | `services.Creator.UpdateContent` |
| `deleteContent` | `DELETE /v1/t/:tenantCode/creator/contents/:id<int>` | `Creator.DeleteContent` | `services.Creator.DeleteContent` |
| `listOrders` | `GET /v1/t/:tenantCode/creator/orders` | `Creator.ListOrders` | `services.Creator.ListOrders` |
| `refundOrder` | `POST /v1/t/:tenantCode/creator/orders/:id<int>/refund` | `Creator.RefundOrder` | `services.Creator.ProcessRefund` |
| `getSettings` | `GET /v1/t/:tenantCode/creator/settings` | `Creator.GetSettings` | `services.Creator.GetSettings` |
| `updateSettings` | `PUT /v1/t/:tenantCode/creator/settings` | `Creator.UpdateSettings` | `services.Creator.UpdateSettings` |
| `listPayoutAccounts` | `GET /v1/t/:tenantCode/creator/payout-accounts` | `Creator.ListPayoutAccounts` | `services.Creator.ListPayoutAccounts` |
| `addPayoutAccount` | `POST /v1/t/:tenantCode/creator/payout-accounts` | `Creator.AddPayoutAccount` | `services.Creator.AddPayoutAccount` |
| `removePayoutAccount` | `DELETE /v1/t/:tenantCode/creator/payout-accounts?id=:id` | `Creator.RemovePayoutAccount` | `services.Creator.RemovePayoutAccount` |
| `withdraw` | `POST /v1/t/:tenantCode/creator/withdraw` | `Creator.Withdraw` | `services.Creator.Withdraw` |
| `listMembers` | `GET /v1/t/:tenantCode/creator/members` | `Creator.ListMembers` | `services.Tenant.ListMembers` |
| `removeMember` | `DELETE /v1/t/:tenantCode/creator/members/:id<int>` | `Creator.RemoveMember` | `services.Tenant.RemoveMember` |
| `listMemberInvites` | `GET /v1/t/:tenantCode/creator/members/invites` | `Creator.ListMemberInvites` | `services.Tenant.ListInvites` |
| `createMemberInvite` | `POST /v1/t/:tenantCode/creator/members/invite` | `Creator.CreateMemberInvite` | `services.Tenant.CreateInvite` |
| `disableMemberInvite` | `DELETE /v1/t/:tenantCode/creator/members/invites/:id<int>` | `Creator.DisableMemberInvite` | `services.Tenant.DisableInvite` |
| `listMemberJoinRequests` | `GET /v1/t/:tenantCode/creator/members/join-requests` | `Creator.ListMemberJoinRequests` | `services.Tenant.ListJoinRequests` |
| `reviewMemberJoinRequest` | `POST /v1/t/:tenantCode/creator/members/:id<int>/review` | `Creator.ReviewMemberJoinRequest` | `services.Tenant.ReviewJoin` |
| `listCoupons` | `GET /v1/t/:tenantCode/creator/coupons` | `Creator.ListCoupons` | `services.Coupon.List` |
| `getCoupon` | `GET /v1/t/:tenantCode/creator/coupons/:id<int>` | `Creator.GetCoupon` | `services.Coupon.Get` |
| `createCoupon` | `POST /v1/t/:tenantCode/creator/coupons` | `Creator.CreateCoupon` | `services.Coupon.Create` |
| `updateCoupon` | `PUT /v1/t/:tenantCode/creator/coupons/:id<int>` | `Creator.UpdateCoupon` | `services.Coupon.Update` |
| `grantCoupon` | `POST /v1/t/:tenantCode/creator/coupons/:id<int>/grant` | `Creator.GrantCoupon` | `services.Coupon.Grant` |
| Portal 报表页预留) | `GET /v1/t/:tenantCode/creator/reports/overview` | `Creator.ReportOverview` | `services.Creator.ReportOverview` |
| Portal 报表页预留) | `POST /v1/t/:tenantCode/creator/reports/export` | `Creator.ExportReport` | `services.Creator.ExportReport` |
### 14.2 路由恢复证据
- `atomctl gen route` 输出包含 Creator 路由发现日志(`Found route ... /v1/t/:tenantCode/creator/...`)。
- `backend/app/http/v1/routes.gen.go` 已出现 29 条 creator 路由注册项(`/v1/t/:tenantCode/creator/*`)。
- 服务启动日志显示 Creator 路由已注册(`Registering route: ... /v1/t/:tenantCode/creator/...`)。
### 14.3 冒烟结果(至少 /creator/orders 非 404
| 请求 | 鉴权 | 结果 | 说明 |
|---|---|---|---|
| `GET /v1/t/meipai_569/creator/orders` | 无 token | `401` | 命中路由,返回缺失 token非 404 |
| `GET /v1/t/meipai_569/creator/orders` | 买家 token13800138000 | `403` | 命中路由,权限校验 `非创作者`(非 404 |
| `GET /v1/t/meipai_569/creator/orders` | 创作者 token13800000001 | `200` | 返回订单列表 JSON |
| `GET /v1/t/meipai_569/creator/contents` | 创作者 token | `200` | 返回分页结构(`page/limit/total/items` |
| `GET /v1/t/meipai_569/creator/settings` | 创作者 token | `200` | 返回频道设置对象 |
### 14.4 剩余风险
1. 本轮为 Creator 路由恢复回归,重点覆盖“路由可达 + 鉴权行为 + 关键读接口”。
2. 写接口(如内容编辑、成员审核、优惠券发放、提现)尚未逐一做 Action->DB 闭环,建议在下一轮专项回归补齐。