# 全项目页面逐按钮测试矩阵(落盘存档) 更新日期:2026-02-07(Asia/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) 失败/阻塞项复现 ### F1(高)Portal tenants 接口 404 - 现象:首页/频道/探索页出现 `ok=false`,并在后端日志出现 404。 - 复现:登录 Portal 后访问 `/t/meipai_990` 或 `/t/meipai_990/channel`。 - 后端日志:`GET /v1/t/meipai_990/tenants?limit=5` -> 404。 - 影响:门户首页顶部/频道信息可能缺失或报错。 - 建议优先级:**P1**(核心入口页异常)。 ### F2(中)Portal 外链图片走 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:00(Asia/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 200;like 记录 1 -> 1(幂等) | ✅ Pass | | 收藏内容 | `content_id=2` favorite 记录 0 条 | `POST /v1/t/meipai_157/contents/2/favorite` | HTTP 200;favorite 记录 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 200;code: 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(非功能结论,环境前置不足)**。 ### F1(高)Portal 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_access(F3)。 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:07(Asia/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 接口 404(F1):✅ **已修复并复测通过** - P2 外链图片拼接 storage 前缀(F2):✅ **已修复并复测通过** - Blocked(群发通知异步落库):⚠️ 仍依赖 worker/JOB_INLINE 环境前置 ## 14) 2026-02-07 Creator 路由恢复验证(回归补录) - 执行时间:2026-02-07 19:28 ~ 19:31(Asia/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` | `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` | `Creator.UpdateContent` | `services.Creator.UpdateContent` | | `deleteContent` | `DELETE /v1/t/:tenantCode/creator/contents/:id` | `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/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` | `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` | `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/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` | `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` | `Creator.UpdateCoupon` | `services.Coupon.Update` | | `grantCoupon` | `POST /v1/t/:tenantCode/creator/coupons/:id/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` | 买家 token(13800138000) | `403` | 命中路由,权限校验 `非创作者`(非 404) | | `GET /v1/t/meipai_569/creator/orders` | 创作者 token(13800000001) | `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 闭环,建议在下一轮专项回归补齐。