Files
quyun-v2/docs/todo_list.md

202 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
# 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/DTO`string``int64`,补齐字段级中文注释。
- Service移除 `cast.ToInt64`,使用 `int64``model` 注入。
- 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 等非数字标识)。
## 里程碑建议
- M1完成 P0
- M2完成 P1
- M3完成 P2