Files
tiku-backend.net/docs/development-plan.md

336 lines
17 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.

# TIKU Backend 后续开发计划
## 1. 计划目标
后续开发围绕教育业务闭环、SaaS 产品化、可靠性、性能和可运营性推进。每个阶段必须形成可独立验收的业务结果,不以接口数量或数据表数量作为完成标准。
总体目标:
- 建立服务端可信的练习、评分、报告和学习分析链路。
- 完成内容生产、教学组织、学生学习和教师干预闭环。
- 打通套餐、权益、商品、订单、支付和教育资源访问。
- 提供平台端、租户端、教师端和学生端可实际使用的工作流。
- 建立真实 PostgreSQL、Redis 和对象存储路径下的质量与性能门禁。
- 保持模块化单体边界,在明确出现独立扩缩容需求前不拆分微服务。
## 2. 实施原则
- PostgreSQL 是业务状态、权限、权益、余额、订单和任务状态的权威来源。
- Redis 只用于缓存、限流和可重建的加速数据,不作为授权或交易事实来源。
- 客户端提交的用户、租户、角色、正确性、价格、权益和状态均不可信,必须由服务端解析或计算。
- 所有可能被网络重试的写操作必须具备幂等语义。
- 所有状态转换必须定义合法前置状态,并通过事务或比较并交换更新保证并发安全。
- 所有租户数据访问必须同时满足租户隔离、操作权限、DataScope、套餐权益和资源可见性规则。
- 导入、导出、聚合、提醒、扫描等长任务统一进入 `background_jobs`
- 前端接口以实时 OpenAPI 为唯一契约来源,不维护第二套手写接口模型。
- 每个行为变更都要有回归测试PostgreSQL 特有约束必须使用真实 PostgreSQL 验证。
## 3. 阶段总览
| 阶段 | 主题 | 建议周期 | 主要结果 |
| --- | --- | ---: | --- |
| P0 | 学习核心链路可信化 | 2 个迭代 | 服务端判分、幂等答题、并发安全交卷、不可变报告 |
| P1 | 内容生产与练习编排 | 2 个迭代 | 题目生命周期、题集、练习蓝图、导入发布闭环 |
| P2 | 教学组织与教师运营 | 23 个迭代 | 班级、任务、提醒、学情和学生干预 |
| P3 | 学生学习与个性化 | 23 个迭代 | 错题复习、间隔学习、自适应练习和成长激励 |
| P4 | SaaS 权益与商业闭环 | 2 个迭代 | 套餐权益、教育商品、支付、退款和激活码联动 |
| P5 | 产品界面与契约交付 | 持续并行 | 四类用户拥有完整可操作工作流 |
| P6 | 性能、扩展与可观测性 | 持续并行 | 业务压测、聚合读模型、多实例安全和 SLO 告警 |
周期用于安排依赖关系,不作为压缩验收范围的依据。阶段可以并行准备,但不得越过前置发布门禁。
## 4. P0学习核心链路可信化
### 4.1 题目与评分快照
- 为练习会话题目保存题目 ID、版本 ID、题型、题干、选项、标准答案、解析、分值和评分规则快照。
- 会话创建后不得因题库后续编辑而改变本次练习的评分结果。
- 学生会话详情只能返回安全投影,不返回标准答案、解析或选项正确标记。
- 为单选、多选、判断、填空建立独立服务端评分器。
- 主观题支持 `PendingReview``TeacherReviewed``SelfPractice` 等明确状态。
- 自评结果只能用于练习反馈,不计入权威成绩、积分和排行榜。
### 4.2 答题幂等与并发控制
- 答题 DTO 增加 `IdempotencyKey``ExpectedSessionVersion``ClientSequence`
- 建立答题幂等记录,保存操作类型、请求哈希、响应快照和完成状态。
- 相同幂等键与相同请求体必须重放原响应。
- 相同幂等键与不同请求体必须返回明确冲突。
- 练习会话增加并发版本和最后客户端序列。
- 使用数据库唯一约束和比较并交换更新阻止重复答案、乱序写入和多设备并发覆盖。
- 明确答案修改策略:允许覆盖时保留版本历史;不允许覆盖时返回稳定错误码。
### 4.3 交卷与报告状态机
- 定义 `Active → Scoring → Submitted``Active → Expired``Active → Cancelled` 状态转换。
- 交卷请求增加幂等键,并保证同一会话只能生成一份权威报告。
- 评分、错题更新、积分事件和报告生成在同一事务边界内提交,或通过同事务创建的后台任务可靠续办。
- 报告发布后保持不可变;重新评分必须生成新版本并记录原因、操作者和审计事件。
- 处理评分中断、任务重试和超时租约回收。
### 4.4 P0 测试与发布门禁
- 覆盖重复答题、幂等冲突、旧版本、乱序序列、双设备并发和重复交卷。
- 覆盖跨租户、非本人会话、过期会话、已提交会话和未授权题目。
- 覆盖学生响应不泄露答案及解析。
- 覆盖各客观题型的服务端判分和边界输入。
- 使用真实 PostgreSQL 验证唯一约束、事务竞争和失败回滚。
- 完成迁移首次执行及幂等第二次执行验证。
完成标准:客户端无法伪造成绩;网络重试不会产生重复答案、重复报告、重复积分或重复错题计数。
## 5. P1内容生产与练习编排
### 5.1 内容生命周期
- 统一题目、目录节点、题集和练习蓝图的 `Draft → Review → Published → Archived` 生命周期。
- 增加乐观版本、状态前置校验、发布审计和归档恢复规则。
- 支持题目版本对比、引用关系查看和安全回滚。
- 发布前校验题干、选项、答案、解析、分类、资源和题型结构完整性。
- 已被历史练习引用的版本不得物理删除。
### 5.2 题集与练习蓝图
- 支持人工题集、动态规则题集和固定快照题集。
- 练习蓝图支持知识点、题型、难度、题量、分值、随机种子和去重规则。
- 创建练习时记录蓝图版本、抽题结果和随机种子,确保结果可重放。
- 增加题量不足、资源不可见、跨租户引用和已归档内容的失败关闭规则。
### 5.3 导入与批量运营
- 导入流程拆分为上传、解析、预检、确认、执行和结果下载。
- 预检结果精确到行、字段和错误代码。
- 导入支持幂等键、来源哈希和重复内容策略。
- 批量发布、归档和分类必须提供影响范围预览。
- 大批量任务进入后台任务系统,并支持进度、取消、重试和结果资产。
### 5.4 内容质量指标
- 记录题目使用次数、作答人数、正确率、平均耗时、跳过率和争议率。
- 为低质量、异常高正确率、异常低正确率和长期未使用题目提供运营筛选。
- 质量指标采用异步增量聚合,不在学生提交请求中执行大范围统计。
完成标准:运营人员可以从草稿创建到发布、组卷、导入和质量复盘完成完整工作流。
## 6. P2教学组织与教师运营
### 6.1 班级与成员
- 完善班级、教师、助教、学生和分组模型。
- 支持邀请、批量导入、转班、退班、冻结和历史成员查询。
- 所有成员变更记录操作者、原因、时间和前后状态。
- DataScope 支持按校区、部门、班级和本人范围过滤。
### 6.2 学习任务
- 支持练习、每日一练、作业和考试任务。
- 支持目标班级、分组、指定学生、发布时间、截止时间、补交和重做策略。
- 发布任务时固定内容或蓝图版本,避免后续编辑改变已发布任务。
- 学生任务列表明确返回未开始、进行中、已提交、已逾期和已批改状态。
### 6.3 提醒与通知
- 支持任务发布、即将截止、逾期、批改完成和权益到期提醒。
- 提醒任务使用幂等键和领取租约,防止多实例重复发送。
- 通知记录渠道、模板版本、发送状态、失败原因和重试次数。
- 支持租户级通知策略、免打扰时段和渠道开关。
### 6.4 学情与干预
- 建立学生、班级、知识点和任务维度的学习统计。
- 支持未完成、连续退步、薄弱知识点和异常作答行为规则。
- 风险命中后生成教师待办,可记录联系、备注、处理结果和下次跟进时间。
- 教师只能查看 DataScope 允许的学生和班级。
完成标准:教师能够发布任务、查看进度、完成批改、识别风险并记录干预结果。
## 7. P3学生学习与个性化
### 7.1 错题复习
- 错题记录包含知识点、错误次数、最近错误、最近复习、掌握状态和下一次复习时间。
- 区分未掌握、学习中、待巩固和已掌握状态。
- 复习结果更新间隔,不以单次答对立即永久解决。
- 错题复习生成稳定会话,并记录生成规则版本。
### 7.2 词汇与间隔学习
- 定义明确的间隔重复算法、等级、下次复习时间和遗忘重置规则。
- 复习计划按到期时间、掌握程度和每日上限生成。
- 算法版本和关键输入写入学习事件,保证结果可解释。
### 7.3 自适应练习
- 建立用户知识点掌握度读模型。
- 根据最近表现、题目难度、重复间隔和任务目标选择题目。
- 推荐结果保存输入快照、算法版本、候选集合和最终选择。
- 提供固定规则回退,推荐服务异常时仍可生成可用练习。
### 7.4 成长与激励
- 徽章、连续学习、积分和阶段目标使用可配置规则。
- 奖励发放必须幂等,并记录触发事件和规则版本。
- 排行榜支持租户、班级、时间范围和隐私开关。
- 防止通过重复提交、回放请求或自评结果刷取奖励。
完成标准:学生可以获得稳定、可解释且不会重复奖励的个性化学习计划。
## 8. P4SaaS 权益与商业闭环
### 8.1 统一权益判定
- 建立统一权益服务组合操作权限、DataScope、套餐 Feature、额度、区域策略和灰度状态。
- 统一返回拒绝原因和可观测诊断信息。
- 前端 bootstrap 只展示最终可用能力,但后端仍独立执行完整判定。
- 权益变更后可靠失效本地缓存和 Redis 缓存。
### 8.2 教育商品与权益发放
- 商品可绑定课程、题库、练习次数、有效期和会员等级。
- 支付成功后幂等发放权益。
- 退款、撤销、订单关闭和订阅到期执行明确的权益回收或冻结策略。
- 保留每次权益变更的来源订单、规则、操作者和审计记录。
### 8.3 激活码
- 支持批次、渠道、数量、有效期、领取限制和适用租户。
- 激活过程使用事务和唯一约束,防止重复核销。
- 激活结果与权益服务联动,并支持撤销审计。
- 提供批次使用率、渠道效果和异常核销报表。
### 8.4 租户自助运营
- onboarding 使用可恢复状态机覆盖租户、Owner、域名、品牌、套餐和支付配置。
- 域名验证、证书和网关配置进入后台任务并保留诊断信息。
- 主题、导航和模块配置支持草稿、预览、发布、版本和回滚。
- 平台支持面向指定租户查看能力、用量、账务、任务和配置异常。
完成标准:租户能够完成开通、配置、购买、使用、续费和故障诊断,不依赖人工修改数据库。
## 9. P5产品界面与契约交付
### 9.1 平台端
- 完成租户 onboarding、域名、套餐、账务、用量、题库和运营任务工作台。
- 所有长任务显示进度、失败原因、重试和结果下载入口。
- 提供租户能力诊断和配置版本回滚入口。
### 9.2 租户管理端与教师端
- 完成员工、角色、学生、班级、内容、任务、学情、商品和订单工作流。
- 页面操作权限与后端权限清单保持一致。
- 批量操作必须先展示影响范围和失败明细。
### 9.3 学生端
- 完成运行时 bootstrap、登录、任务、练习、错题、词汇、视频、权益和订单闭环。
- 网络重试统一携带幂等键和客户端序列。
- 明确处理会话过期、版本冲突、权益不足和任务已结束状态。
### 9.4 契约门禁
- 每次 Controller 变更后重新生成 OpenAPI 和前端类型。
- CI 检查 OpenAPI operation、DTO 和前端生成产物是否同步。
- 禁止前端手写后端枚举值、权限代码和请求模型。
完成标准:每类用户都可以在界面中完成对应业务闭环,且不存在仅有 API、没有可操作入口的已发布能力。
## 10. P6性能、扩展与可观测性
### 10.1 查询与读模型
- 将学习统计的多次顺序查询改为条件聚合或专用汇总读模型。
- 将趋势按日期、知识点和班级的聚合下推 PostgreSQL。
- 为高频筛选建立与实际查询匹配的复合索引,并使用真实执行计划验证。
- 控制分页上限,避免无界列表和大对象图加载。
- 为核心端点建立单请求数据库命令数预算。
### 10.2 缓存策略
- 缓存目录、运行时配置、Feature 快照、公共内容和稳定聚合结果。
- 缓存键必须包含租户、资源版本和影响结果的策略版本。
- 写操作提交成功后再执行缓存失效;失效失败必须可重试。
- 记录缓存命中率、回源率、失效延迟和热键。
### 10.3 后台处理与多实例
- 所有任务领取继续使用 PostgreSQL 租约和 `FOR UPDATE SKIP LOCKED`
- 生命周期扫描和周期性调度增加跨实例互斥或唯一调度记录。
- 任务处理器必须幂等,并区分可重试和永久失败。
- 记录任务排队时间、执行时间、重试次数、租约过期和死任务数量。
### 10.4 业务性能测试
- 保留公共缓存读和依赖就绪场景。
- 增加带 JWT、权限、租户解析和 DataScope 的认证分页读。
- 增加创建练习、并发答题、交卷、报告和排行榜场景。
- 增加下单、支付回调、退款和权益发放场景。
- 增加导入、导出和提醒后台任务积压恢复场景。
- 结果必须报告目标速率、实际 QPS、状态分布、错误率、p95、p99、丢弃迭代和依赖指标。
- 稳态容量测试至少持续 30 分钟,并使用接近生产的数据量和独立发压端。
### 10.5 可观测性与 SLO
- 建立 API 延迟、错误率、数据库命令数、连接池等待和慢 SQL 指标。
- 建立 Redis 延迟、命中率、连接失败和缓存失效指标。
- 建立答题冲突、重复交卷、评分失败、支付回调失败和权益补偿指标。
- 日志统一包含请求 ID、租户 ID、用户 ID、操作、任务 ID 和业务对象 ID敏感值必须脱敏。
- 为认证、练习、支付、后台任务和数据库连接池设置发布告警门槛。
完成标准:核心业务拥有可重复的容量基线,扩容不会导致重复任务、重复发放或状态竞争。
## 11. 每阶段统一交付物
每个阶段合并前必须同时交付:
- Domain、Application、Infrastructure 和 API 边界清晰的实现。
- 可审查的 EF Core Migration特殊 PostgreSQL 约束使用手写 SQL。
- DTO、OpenAPI operation、错误码和生成的前端类型。
- 单元测试、API 集成测试和真实 PostgreSQL 集成测试。
- 跨租户、越权、重复请求、并发竞争和失败回滚负向测试。
- 必要的指标、结构化日志和运维配置。
- 对应平台端、租户端、教师端或学生端工作流。
- 发布、回滚、数据兼容和缓存失效说明。
## 12. 统一发布门禁
发布候选必须满足:
```bash
dotnet restore TIKU-BACKEND.slnx
dotnet build TIKU-BACKEND.slnx --no-restore
dotnet test TIKU-BACKEND.slnx --no-build
dotnet format TIKU-BACKEND.slnx --verify-no-changes --no-restore
dotnet ef migrations script --project Tiku.Infrastructure --startup-project Tiku.DbMigrator
git diff --check
```
涉及数据库或种子数据时还必须:
- 在 Development 环境运行真实 `Tiku.DbMigrator`
- 再运行一次迁移器验证幂等性。
- 验证迁移前后关键数据兼容性。
- 验证真实 PostgreSQL 下的租户隔离、约束和并发行为。
涉及性能敏感路径时还必须:
- 运行对应业务场景压测。
- 对照最近一次有效基线检查吞吐、p95、p99、错误率和数据库命令数。
- 性能退化未解释或超过阶段门槛时不得发布。
## 13. 建议执行顺序
严格按以下顺序启动开发:
1. 服务端评分与题目快照。
2. 答题幂等、会话版本和客户端序列。
3. 并发安全交卷与不可变报告。
4. 内容生命周期、题集和练习蓝图。
5. 班级、任务、提醒、学情和教师干预。
6. 错题间隔复习、词汇学习和自适应练习。
7. 套餐权益、教育商品、支付和激活码联动。
8. 完成各角色产品界面及 OpenAPI 契约门禁。
9. 聚合读模型、业务压测、多实例安全和 SLO 告警。
P0 未通过发布门禁前,不应上线积分奖励、排行榜或基于正确率的推荐;这些能力依赖可信评分结果。