Files
quyun-v2/docs/todo_list.md

7.3 KiB
Raw Blame History

TODOlist需求梳理 + 技术方案)

目标:作为后续开发与测试的对照清单,明确范围、方案、接口、数据与测试策略。

当前范围与约束

  • 认证仅使用 JWT不做 OAuth/Cookie 方案)。
  • 支付集成暂不做,订单/退款仅按既有数据结构做流程与统计。
  • 存储仅使用本地 FS 模拟,真实 Provider 延后统一接入。
  • 多租户路由强隔离(/t/:tenantCode/v1 + TenantResolver暂缓后续统一优化。

统一原则

  • 所有后端改动遵循 backend/llm.txt 规范与 GORM-Gen 访问方式。
  • 分层约束Controller 仅做绑定与调用,业务与 DB 仅在 services
  • 每个需求至少配套:接口说明 + 数据变更(如有)+ 关键业务校验 + 单元测试。

P0必须先做

1) 租户成员体系(加入/邀请/审核)

需求目标

  • 完成租户成员生命周期:申请加入、审核通过/拒绝、邀请加入。
  • tenant_only 内容在“成员审核通过”后可访问;未审核需前置引导。

技术方案(后端)

  • API
    • 申请加入:POST /t/:tenantCode/v1/tenants/:id<int>/join
    • 取消申请:DELETE /t/:tenantCode/v1/tenants/:id<int>/join
    • 接受邀请:POST /t/:tenantCode/v1/tenants/:id<int>/invites/accept
    • 管理员审核:POST /t/:tenantCode/v1/creator/members/:id<int>/review
    • 邀请成员:POST /t/:tenantCode/v1/creator/members/invite
  • DB
    • 使用现有 tenant_join_requests / tenant_invites 表(如已存在则复用;缺失则通过迁移新增)。
  • Service
    • 校验:用户是否已是成员/是否已申请;审核流转合法性;邀请有效期。
    • 申请成功后写 tenant_join_requests;审核通过写 tenant_users
    • tenant_only 内容访问:需要 tenant_users.status=verified 或已购买。

测试方案

  • 申请加入:重复申请拦截。
  • 审核通过后tenant_only 可访问;未通过不可访问。
  • 邀请链接过期/重复使用处理。

2) 鉴权与权限收口(必需)

需求目标

  • 受保护接口强制鉴权,超管接口增加 super_admin 角色校验。
  • 补齐 Super.Login / CheckToken 逻辑。

技术方案(后端)

  • 中间件:拆分 AuthOptional / AuthRequired,路由按需使用。
  • 超管接口:校验 JWT roles 含 super_admin
  • 服务补齐登录、token 续期/失效逻辑。

测试方案

  • 未登录访问受保护接口被拒绝。
  • 非超管访问 /super/v1/* 被拒绝。

3) 上传会话归属测试补齐

需求目标

  • 覆盖上传会话归属校验的服务测试(防止越权)。

技术方案(后端)

  • Common.UploadPart 增加服务测试,验证 owner mismatch 返回 ErrForbidden

测试方案

  • owner 与非 owner 上传分支。

P1高优先

4) ID 类型统一int64 / model 注入)

需求目标

  • 所有业务 ID 使用 int64,路由参数统一 :id<int>

技术方案(后端)

  • Controller/DTOstringint64,补齐字段级中文注释。
  • Service移除 cast.ToInt64,使用 int64model 注入。
  • Swagger/Route补齐 <int> 约束。

测试方案

  • 关键接口:正常请求 + 参数类型错误时返回明确错误。

5) 内容访问策略完善(资源权限与预览差异化)

需求目标

  • 媒体资源访问遵循:未购仅预览,已购全量,作者/管理员全量。
  • 签名 URL 或下载地址生成前进行权限校验。

技术方案(后端)

  • Service
    • Content.Get 根据 visibility + status + access 决定 MediaUrls
    • Common.GetAssetURL 或资源下载接口增加权限校验参数通过内容ID校验
  • 规则
    • public + 未购:仅 preview + cover
    • tenant_only + 已购/成员/作者/管理员:完整
    • private仅作者/管理员

测试方案

  • 未登录/未购/已购/作者/管理员的可见资源集合一致性。

6) 审计参数传递规范化

需求目标

  • 审计服务禁止自行读取 ctx,改为显式传入操作者信息。

技术方案(后端)

  • 调整 services.Audit 方法签名与调用方传参。
  • 关键操作补齐操作者字段。

测试方案

  • 审计记录落库含 operator_id,并覆盖缺参错误。

P2中优先

7) 运营统计报表(曝光/转化/订单/退款)

需求目标

  • 提供租户维度与时间范围的核心指标统计与导出。

技术方案(后端)

  • API
    • 总览:GET /t/:tenantCode/v1/creator/dashboard(已有,需扩展)
    • 明细统计:GET /t/:tenantCode/v1/creator/reports/overview
    • 导出:POST /t/:tenantCode/v1/creator/reports/export
  • Service
    • 聚合订单、退款、内容曝光views/likes、转化率访问->成交)。
    • 导出:异步任务 + 结果下载。

测试方案

  • 统计口径一致性;筛选组合;导出任务可用性。

8) 超管后台治理能力(健康度/异常监控/内容审核)

需求目标

  • 提供超管对租户的健康指标、异常趋势、内容合规审核。

技术方案(后端)

  • API
    • 租户健康度统计:GET /super/v1/tenants/health
    • 内容审核流:POST /super/v1/contents/:id<int>/review
  • Service
    • 指标聚合 + 异常阈值定义。
    • 审核状态流转与通知。

测试方案

  • 审核状态流转有效性;异常阈值命中结果。

9) 性能优化(避免 N+1

需求目标

  • 列表/统计场景避免逐条查询。

技术方案(后端)

  • 引入批量查询/聚合 SQL替换逐条查询。
  • 重点:订单列表、租户列表统计。

测试方案

  • 对比查询次数/耗时(可选) + 数据正确性。

P3延后

10) 多租户强隔离(路由 + TenantResolver

需求目标

  • /t/:tenantCode/v1 作为唯一入口,服务层强制 tenant_id 过滤。

技术方案(后端/前端)

  • 中间件解析 tenant_code → tenant_id 并注入 ctx locals。
  • 前端 Router/API base 从 URL 解析 tenantCode。

测试方案

  • 跨租户访问被拒绝;错租户路由返回 404。

11) 真实存储 Provider 接入

需求目标

  • 接入 OSS/云存储,统一上传/访问路径策略。

技术方案(后端)

  • 通过配置注入 Provider保留本地 FS 作为 dev fallback。

测试方案

  • 本地 FS + 真实 Provider 两套配置可用性。

12) 支付集成

需求目标

  • 最终阶段对接真实支付。

技术方案(后端)

  • 接入支付网关并补齐回调/退款逻辑。

测试方案

  • 沙箱支付 + 回调验签。

已完成

  • 内容可见性与 tenant_only 访问控制。
  • OTP 登录流程与租户成员校验(未加入拒绝登录)。
  • ID 类型已统一为 int64仅保留 upload_id/external_id/uuid 等非数字标识)。
  • 内容资源权限与预览差异化(未购预览、已购/管理员/成员全量)。
  • 审计操作显式传入操作者信息(服务层不再依赖 ctx 读取)。
  • 运营统计报表overview + CSV 导出基础版)。
  • 超管后台治理能力(健康度/异常监控/内容审核)。
  • 性能优化(避免 N+1topics 聚合批量查询)。
  • 多租户强隔离(/t/:tenantCode/v1 + TenantResolver

里程碑建议

  • M1完成 P0
  • M2完成 P1
  • M3完成 P2