release: cut v2.1
This commit is contained in:
402
reports/PRODUCT_TECH_REVIEW_2026-06-12.md
Normal file
402
reports/PRODUCT_TECH_REVIEW_2026-06-12.md
Normal file
@@ -0,0 +1,402 @@
|
||||
# 高考志愿填报系统 产品规划与技术实施评审报告(历史快照)
|
||||
|
||||
> 该文档是 2026-06-12 的评审快照;其中部分判断已被后续代码与验证结果更新。当前真相源请以 `reports/PROJECT_SYSTEM_REVIEW_2026-06-13.md` 为准。
|
||||
|
||||
**项目**: `gaokao-volunteer-system`
|
||||
**评审日期**: 2026-06-12
|
||||
**评审范围**: 产品规划、市场调研、业务场景、技术架构、实施计划、核心实现代码、CI 与测试结构
|
||||
**评审方法**: 文档交叉核对 + 代码抽样核验 + 静态分析 + 本地测试验证
|
||||
|
||||
---
|
||||
|
||||
## 1. 结论摘要
|
||||
|
||||
### 1.1 总体结论
|
||||
|
||||
项目的**产品方向是成立的**,核心差异化也清楚:`27省政策检查`、`反扎堆`、`真人服务`、`数据透明`、`AI审核` 这条产品线在产品层面形成了闭环。
|
||||
|
||||
但从**产品规划 -> 技术设计 -> 实施计划 -> 代码现状**四层链路看,当前存在明显的**文档状态漂移**与**实施范围收缩**:
|
||||
|
||||
- 核心产品能力已经部分落地,但并未完全覆盖 PRD 中的全部关键路径。
|
||||
- `README.md`、`PRD.md`、`ROADMAP.md`、`IMPLEMENTATION_PLAN_v2.md` 对“已完成 / 规划中 / 待实现”的标注存在不一致。
|
||||
- 业务场景中的 **Web 自助流程** 仍然缺少完整实现路径。
|
||||
- AI 审核链路已经具备解析器、扎堆检测、模板等局部模块,但距离技术架构里定义的 `audit_service -> checker_integration -> crowd_detector -> report_generator` 端到端服务还有缺口。
|
||||
|
||||
### 1.2 评审评级
|
||||
|
||||
| 维度 | 评级 | 说明 |
|
||||
| ------------------ | ---- | ------------------------------------------------ |
|
||||
| 产品定位 | A- | 目标用户、价值主张、付费路径明确 |
|
||||
| 行业差异化 | A | 反扎堆 + 政策合规 + 真人服务,差异点成立 |
|
||||
| 业务场景设计 | B | 闲鱼/微信场景较完整,Web 场景未闭环 |
|
||||
| 技术规划对齐 | B- | 方向对齐,但模块落地不完整,文档与代码不同步 |
|
||||
| 实施计划可执行性 | B- | 任务拆分合理,但范围较大,且部分任务状态滞后 |
|
||||
| 行业最佳实践符合度 | B- | 安全、CI、测试、审计方向对了,但门槛尚未完全达标 |
|
||||
|
||||
**综合判断**: 产品规划可用,技术实施计划需要按当前代码事实重新校准,不能直接按现有文档状态视为“全量已完成”。
|
||||
|
||||
---
|
||||
|
||||
## 2. 评审依据
|
||||
|
||||
### 2.1 产品与业务文档
|
||||
|
||||
- `product/PRD.md`
|
||||
- `product/ROADMAP.md`
|
||||
- `product/MARKET_RESEARCH.md`
|
||||
- `docs/BUSINESS_SCENE.md`
|
||||
- `docs/TECH_ARCHITECTURE.md`
|
||||
- `docs/IMPLEMENTATION_PLAN_v2.md`
|
||||
- `docs/AUDIT_REPORT_2026-06-11.md`
|
||||
|
||||
### 2.2 代码与运行时证据
|
||||
|
||||
- `README.md`
|
||||
- `admin/app.py`
|
||||
- `admin/routes/orders.py`
|
||||
- `admin/routes/users.py`
|
||||
- `admin/routes/stats.py`
|
||||
- `data/orders/schema.py`
|
||||
- `data/orders/crypto.py`
|
||||
- `data/crowd_db/loader.py`
|
||||
- `data/crowd_db/crowd_detector.py`
|
||||
- `data/share/short_link.py`
|
||||
- `data/share/permission.py`
|
||||
- `skills/gaokao-audit/SKILL.md`
|
||||
- `skills/gaokao-audit/scripts/plan_parser.py`
|
||||
- `.github/workflows/ci.yml`
|
||||
|
||||
### 2.3 静态分析结果
|
||||
|
||||
- 深度分析报告:`reports/code-analysis-review-input-2026-06-12.md`
|
||||
- 统计结果:107 个核心文件,25,582 行,123 个数据模型/DTO,218 条业务规则,66 个外部依赖
|
||||
|
||||
---
|
||||
|
||||
## 3. 产品规划审核
|
||||
|
||||
### 3.1 产品定位是否符合行业最佳实践
|
||||
|
||||
结论:**基本符合**。
|
||||
|
||||
`PRD.md` 中的定位不是泛 AI,而是“高考志愿填报的垂直决策支持”。这符合教育咨询类产品的最佳实践,因为它避免了通用聊天机器人最常见的两个问题:
|
||||
|
||||
1. 只给信息,不给行动建议。
|
||||
2. 给建议但缺少政策约束与责任边界。
|
||||
|
||||
文档里给出的四维主张也合理:
|
||||
|
||||
- 兴趣
|
||||
- 能力
|
||||
- 家庭条件
|
||||
- 就业导向
|
||||
|
||||
这四项和高考志愿的真实决策逻辑基本一致,不是拍脑袋的功能堆砌。
|
||||
|
||||
### 3.2 目标用户与场景是否匹配
|
||||
|
||||
结论:**匹配度高**。
|
||||
|
||||
`PRD.md` 中定义的三类用户画像,以及 `BUSINESS_SCENE.md` 中的两种核心交付路径,符合高考志愿填报服务的真实市场形态:
|
||||
|
||||
- 闲鱼 / 微信 / 学校渠道,适合低摩擦成交和人工深度服务。
|
||||
- Web 自助路径,适合标准化、规模化和未来增长。
|
||||
|
||||
这个分层是合理的,且与 `MARKET_RESEARCH.md` 里“免费大厂工具负责流量教育,专业服务负责转化” 的市场判断一致。
|
||||
|
||||
### 3.3 产品优先级是否合理
|
||||
|
||||
结论:**核心优先级合理,但当前文档状态存在冲突**。
|
||||
|
||||
`PRD.md` 里把 `反扎堆推荐`、`AI方案审核` 作为核心差异化功能,这和当前市场竞争态势是一致的。
|
||||
但同一文档里,`管理后台`、`报告分享`、`数据溯源`、`AI审核`、`反扎堆` 等状态标记混杂了“规划中”和“已落地”的语义,说明产品文档没有和实现进度同步更新。
|
||||
|
||||
这会带来两个问题:
|
||||
|
||||
- 对外部读者来说,不知道哪些是已交付能力,哪些只是规划。
|
||||
- 对实施团队来说,无法据此准确排期。
|
||||
|
||||
### 3.4 产品层面的主要问题
|
||||
|
||||
#### 问题 1: PRD 和当前实现状态不同步
|
||||
|
||||
`PRD.md` 第 144-155 行仍把 `F011-F020` 多个功能标成“规划中”,但 `README.md` 已明确写出管理后台、仪表盘、用户管理、订单管理、分享能力、渠道兜底等内容已进入落地阶段。
|
||||
|
||||
这不是功能本身的问题,而是**产品文档治理问题**。
|
||||
如果不修正,后续会直接影响排期、验收与商业交付口径。
|
||||
|
||||
#### 问题 2: Web 自助服务的产品路径没有真正闭环
|
||||
|
||||
`BUSINESS_SCENE.md` 第 15-23 行定义了 Web 自助流程,但 `IMPLEMENTATION_PLAN_v2.md` 的任务主线仍然围绕 AI 审核、反扎堆、数据溯源、订单管理展开,没有形成一个可直接上线的 Web 交易闭环。
|
||||
|
||||
也就是说:
|
||||
|
||||
- 产品层已经定义了 Web 场景。
|
||||
- 代码层已经有管理后台和订单能力。
|
||||
- 但**前台自助购买、资料填写、交付浏览、支付闭环**尚未形成完整产品。
|
||||
|
||||
这意味着场景 B 目前仍是规划态,而不是可交付态。
|
||||
|
||||
---
|
||||
|
||||
## 4. 技术规划审核
|
||||
|
||||
### 4.1 技术架构是否与产品方向对齐
|
||||
|
||||
结论:**方向对齐,落地不完全**。
|
||||
|
||||
`TECH_ARCHITECTURE.md` 的分层设计是合理的:
|
||||
|
||||
- Channels
|
||||
- Gateway
|
||||
- Services
|
||||
- Data
|
||||
- Infra
|
||||
|
||||
并且它明确了 4 个核心技术面:
|
||||
|
||||
- AI 审核服务
|
||||
- 反扎堆检测
|
||||
- 数据溯源
|
||||
- 订单管理
|
||||
|
||||
这些都与 PRD 的核心卖点一致,说明技术规划没有偏题。
|
||||
|
||||
### 4.2 技术选型是否符合行业最佳实践
|
||||
|
||||
结论:**符合“务实型最佳实践”**。
|
||||
|
||||
当前选型没有过度复杂化:
|
||||
|
||||
- Python 3.10+
|
||||
- SQLite
|
||||
- FastAPI
|
||||
- 本地优先
|
||||
- 文件 / JSON / Markdown 为主
|
||||
|
||||
这对于一个以文档化规则、轻量交付和低并发为主的高考志愿辅助系统是合适的。
|
||||
它避免了不必要的微服务、消息队列或过重前端框架,这一点符合 KISS 和 YAGNI。
|
||||
|
||||
### 4.3 技术规划的主要偏差
|
||||
|
||||
#### 问题 1: AI 审核服务的模块结构与代码现状不完全一致
|
||||
|
||||
技术架构里定义的 AI 审核服务包含:
|
||||
|
||||
- `audit_service.py`
|
||||
- `checker_integration.py`
|
||||
- `crowd_detector.py`
|
||||
- `report_generator.py`
|
||||
|
||||
但当前代码层已核验到的实际实现是:
|
||||
|
||||
- `skills/gaokao-audit/scripts/plan_parser.py`
|
||||
- `data/crowd_db/crowd_detector.py`
|
||||
- `skills/gaokao-audit/templates/audit_report.html`
|
||||
|
||||
也就是说,**解析器、检测器、模板已经有了,但“编排服务层”仍然不完整**。
|
||||
这使 AI 审核能力更像“若干模块拼装”,还不是完全闭环的服务产品。
|
||||
|
||||
#### 问题 2: 数据溯源的设计比实现更完整
|
||||
|
||||
`TECH_ARCHITECTURE.md` 要求数据溯源字段扩展、来源链接、置信度管理。
|
||||
`data/crowd_db/SCHEMA.md` 与 `loader.py` 确实已经定义了 `source / source_url / source_type / confidence / last_updated / data_year` 等字段,并提供了 `confidence < 0.5` 的低置信度警告机制。
|
||||
|
||||
这说明数据溯源不是空谈,已经进入实现层。
|
||||
但是从整体产品体验看,它仍然主要存在于数据结构和审核文档里,还没有在终端用户报告中形成足够强的可视化表达。
|
||||
|
||||
---
|
||||
|
||||
## 5. 实施计划审核
|
||||
|
||||
### 5.1 实施计划是否与产品规划对齐
|
||||
|
||||
结论:**部分对齐,且存在“计划超前/文档滞后”并存现象**。
|
||||
|
||||
`IMPLEMENTATION_PLAN_v2.md` 是在补齐先前审计缺口后修订的,这一版对齐意识很强,特别是新增了:
|
||||
|
||||
- T6 管理后台 MVP
|
||||
- T7 分享功能 MVP
|
||||
- T8 渠道 SDK 集成
|
||||
- T9 错误处理体系
|
||||
- T10 CI/CD 基础
|
||||
- T11 性能与安全加固
|
||||
|
||||
这说明实施计划已经开始向行业化工程实践靠拢。
|
||||
|
||||
但存在两个现实问题:
|
||||
|
||||
1. 文档里仍然保留大量“待开始 / 规划中”的标记。
|
||||
2. 代码仓库实际已经有部分 T6/T7/T8/T9 能力落地,计划文档没有完全反映现实。
|
||||
|
||||
这会导致一种典型风险:**研发推进速度快于文档治理速度**。
|
||||
|
||||
### 5.2 当前最关键的实施差距
|
||||
|
||||
#### 差距 1: Web 产品闭环未形成
|
||||
|
||||
业务场景文档定义了 Web 购买、资料填写、生成方案、站内交付,但实施计划没有把它作为一个独立可交付的主线任务。
|
||||
|
||||
对业务来说,这意味着:
|
||||
|
||||
- 无法真正形成标准化产品入口。
|
||||
- 规模化能力被限制在人工渠道。
|
||||
|
||||
#### 差距 2: 核心服务的端到端编排层缺失
|
||||
|
||||
技术规划中的 AI 审核要成为商业卖点,必须有一个完整的服务编排层。
|
||||
当前看,`plan_parser`、`crowd_detector`、`audit_report.html` 已存在,但主服务编排、规范检查集成、PDF/HTML 输出组合还没有形成统一入口。
|
||||
|
||||
#### 差距 3: CI / 测试门槛没有完全兑现
|
||||
|
||||
`IMPLEMENTATION_PLAN_v2.md` 明确提出:
|
||||
|
||||
- 核心覆盖率 ≥ 80%
|
||||
- 整体覆盖率 ≥ 60%
|
||||
- CI 通过
|
||||
|
||||
但 `.github/workflows/ci.yml` 现在只是生成覆盖率报告,并没有在工作流中强制 `--cov-fail-under` 门槛。
|
||||
也就是说,**测试门槛在计划里有,在流水线里还没真正硬化**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 代码现状与文档一致性审核
|
||||
|
||||
### 6.1 已对齐部分
|
||||
|
||||
以下能力已经能从代码中看到真实实现,不是纯文档:
|
||||
|
||||
- 管理后台 FastAPI 入口:`admin/app.py`
|
||||
- 用户管理:`admin/routes/users.py`
|
||||
- 仪表盘统计:`admin/routes/stats.py`
|
||||
- 订单管理:`admin/routes/orders.py`
|
||||
- 订单加密与状态审计:`data/orders/schema.py`、`data/orders/crypto.py`
|
||||
- 分享短链接与权限策略:`data/share/short_link.py`、`data/share/permission.py`
|
||||
- 反扎堆数据加载与检测:`data/crowd_db/loader.py`、`data/crowd_db/crowd_detector.py`
|
||||
- AI 审核解析器:`skills/gaokao-audit/scripts/plan_parser.py`
|
||||
|
||||
这说明项目已经不是“只停留在规划文档”的状态。
|
||||
|
||||
### 6.2 仍需警惕的部分
|
||||
|
||||
`README.md`、`PRD.md`、`ROADMAP.md` 与 `IMPLEMENTATION_PLAN_v2.md` 的状态描述存在明显不一致。
|
||||
这类不一致本身就是产品与实施失配的信号,尤其在这种带有商业交付和合规风险的项目里,会直接影响:
|
||||
|
||||
- 交付验收
|
||||
- 团队排期
|
||||
- 商业对外口径
|
||||
- 风险边界
|
||||
|
||||
---
|
||||
|
||||
## 7. 行业最佳实践符合度
|
||||
|
||||
### 7.1 符合的部分
|
||||
|
||||
- 产品定位清晰,不是泛 AI。
|
||||
- 技术栈克制,没有引入多余复杂度。
|
||||
- 核心功能围绕真实高考决策场景展开。
|
||||
- 数据脱敏、加密、审计的方向正确。
|
||||
- CI / 覆盖率 / TDD 的工程意识已经建立。
|
||||
|
||||
### 7.2 不足的部分
|
||||
|
||||
- 测试门槛尚未真正硬化。
|
||||
- 文档状态治理不足。
|
||||
- Web 自助闭环缺失。
|
||||
- AI 审核端到端编排层未完全落地。
|
||||
- 产品文档与实施计划没有统一“真相源”。
|
||||
|
||||
### 7.3 结论
|
||||
|
||||
按行业最佳实践标准,这个项目已经进入**可用的工程化阶段**,但还不能说已经达到**成熟的产品化交付阶段**。
|
||||
最需要补的不是“再加功能”,而是**把已经实现的能力、正在做的能力、尚未做的能力分层讲清楚,并让计划与代码同步**。
|
||||
|
||||
---
|
||||
|
||||
## 8. 风险分级
|
||||
|
||||
### 8.1 高风险
|
||||
|
||||
1. **文档状态漂移**
|
||||
影响:排期、验收、对外口径都可能出错。
|
||||
|
||||
2. **Web 自助闭环缺失**
|
||||
影响:规模化能力不足,场景 B 不能独立运行。
|
||||
|
||||
3. **AI 审核链路未完全端到端**
|
||||
影响:核心差异化卖点的交付完整性不足。
|
||||
|
||||
### 8.2 中风险
|
||||
|
||||
1. **CI 没有硬性覆盖率门槛**
|
||||
2. **测试依赖未在当前系统环境可直接运行**
|
||||
3. **部分数据集仍以骨架或低置信度形式存在**
|
||||
|
||||
### 8.3 低风险
|
||||
|
||||
1. 技术栈过重风险低
|
||||
2. 数据模型扩展性尚可
|
||||
3. 本地优先策略符合当前业务体量
|
||||
|
||||
---
|
||||
|
||||
## 9. 建议
|
||||
|
||||
### 9.1 立即修正
|
||||
|
||||
1. 统一 `PRD / ROADMAP / TECH_ARCHITECTURE / IMPLEMENTATION_PLAN_v2 / README` 的状态口径,先建立单一事实源。
|
||||
2. 给 `AI审核服务` 补齐端到端编排层,明确输入、校验、检测、出报告的主入口。
|
||||
3. 把 `Web 自助流程` 单独列为可交付范围,不要继续和人工渠道混在一个抽象里。
|
||||
4. 在 CI 中强制覆盖率门槛,避免“只生成报告不阻断失败”。
|
||||
|
||||
### 9.2 短期优化
|
||||
|
||||
1. 给 `README.md` 增加“已完成 / 进行中 / 规划中”三态表,并明确更新时间。
|
||||
2. 给 `data/crowd_db` 的骨架省份补充完整度分级,不要只靠目录存在代表能力存在。
|
||||
3. 给 AI 审核报告增加更强的数据来源展示和修正建议链路。
|
||||
|
||||
### 9.3 中期优化
|
||||
|
||||
1. 把 Web 端做成真正的自助产品,而不是后台能力展示页。
|
||||
2. 统一订单、用户、分享、报告的领域模型。
|
||||
3. 建立基于真实用户案例的持续回归测试集。
|
||||
|
||||
---
|
||||
|
||||
## 10. 最终结论
|
||||
|
||||
**结论一句话**:
|
||||
这个项目的产品规划是专业且有市场逻辑的,技术路线也整体正确,但当前最大问题不是方向,而是**规划、实施和代码现状之间的同步失真**。
|
||||
|
||||
如果按“产品是否值得继续推进”来判断,答案是**值得**。
|
||||
如果按“实施计划是否已经与产品规划完全对齐”来判断,答案是**还没有**。
|
||||
|
||||
最准确的判断是:
|
||||
|
||||
> **核心产品方向成立,核心差异化成立,已有工程落地可见,但实施计划与产品文档仍需重新对齐,尤其是 Web 闭环、AI 审核编排、CI 门槛和文档状态治理。**
|
||||
|
||||
---
|
||||
|
||||
## 11. 验证记录
|
||||
|
||||
### 11.1 已完成验证
|
||||
|
||||
- 已执行代码目录扫描与核心文档抽样阅读。
|
||||
- 已执行 `code-analyzer` 静态分析,输出到 `reports/code-analysis-review-input-2026-06-12.md`。
|
||||
- 已核验评审报告文件存在,当前报告共 400 行。
|
||||
|
||||
### 11.2 未完成验证
|
||||
|
||||
本地测试套件未能执行,原因是当前系统 Python 环境缺少 `pytest`:
|
||||
|
||||
```bash
|
||||
pytest -q
|
||||
# /bin/bash: line 1: pytest: command not found
|
||||
|
||||
python3 -m pytest -q
|
||||
# /usr/bin/python3: No module named pytest
|
||||
```
|
||||
|
||||
仓库存在 `requirements-dev.txt`,其中包含 `pytest`、`pytest-cov`、`pytest-timeout`、`pytest-xdist`、`httpx`、`locust` 等测试/性能依赖。
|
||||
因此,本报告对代码健康度的判断基于静态分析和代码抽样,不声明当前测试套件通过。
|
||||
322
reports/PROJECT_SYSTEM_REVIEW_2026-06-13.md
Normal file
322
reports/PROJECT_SYSTEM_REVIEW_2026-06-13.md
Normal file
@@ -0,0 +1,322 @@
|
||||
# gaokao-volunteer-system 系统性评审报告
|
||||
|
||||
**评审日期**: 2026-06-13
|
||||
**评审对象**: `/home/long/project/gaokao-volunteer-system`
|
||||
**评审方法**: 文档交叉核对 + 关键代码抽样 + 工程门禁实跑 + 两阶段 review(规格对齐 / 代码质量)
|
||||
|
||||
---
|
||||
|
||||
## 1. 一句话结论
|
||||
|
||||
> 项目已经从“纯规划/纯 skill 仓库”演进为“运营后台 + 订单/分享/渠道同步 + AI 审核链路”的可运行系统,但**文档真相严重漂移、用户端 Web 自助闭环仍未落地、CI/类型/安全门禁未形成可信闭环**。当前更准确的项目标签是:**内部运营与人工服务增强系统已成形,面向用户的完整产品化交付仍未完成**。
|
||||
|
||||
---
|
||||
|
||||
## 2. 本次新鲜证据
|
||||
|
||||
### 2.1 工程门禁
|
||||
|
||||
```bash
|
||||
git status --short
|
||||
python3 -m pytest -q
|
||||
python3 -m ruff check . --exclude .worktrees
|
||||
python3 -m mypy .
|
||||
python3 -m bandit -r admin data skills scripts -x .worktrees,tests,admin/tests,data/channel_sync/tests,data/orders/tests,data/share/tests,data/crowd_db/tests,skills/gaokao-audit/tests,scripts/legacy
|
||||
pytest --cov=admin --cov=data --cov=skills --cov=scripts --cov-report=term-missing -q
|
||||
pytest -q admin/tests
|
||||
```
|
||||
|
||||
### 2.2 当前结果
|
||||
|
||||
- `git status --short`:**大量未提交修改/新增文件**,当前真实状态主要存在于 working tree,而不是稳定交付基线
|
||||
- `python3 -m pytest -q`:**459 passed, 2 warnings**
|
||||
- `python3 -m ruff check . --exclude .worktrees`:**All checks passed**
|
||||
- `python3 -m mypy .`:**97 errors / 19 files**
|
||||
- `python3 -m bandit ...`:原始输出噪声很高;聚焦后仍有若干真实问题
|
||||
- `pytest --cov=admin --cov=data --cov=skills --cov=scripts --cov-report=term-missing -q`:**TOTAL 61%**
|
||||
- `pytest -q admin/tests`:**115 passed**
|
||||
|
||||
### 2.3 CI 干净环境复核事实
|
||||
|
||||
- `.github/workflows/ci.yml` 只安装 `requirements-dev.txt`
|
||||
- `requirements-dev.txt` **不包含** `fastapi / uvicorn / PyJWT / cryptography / pydantic`
|
||||
- 因此 CI 对 `admin/*` 的 clean env 可复现性并不成立
|
||||
- 这意味着“本地 pytest 通过”≠“CI 对完整产品可复现”
|
||||
|
||||
---
|
||||
|
||||
## 3. 当前真相源排序
|
||||
|
||||
当前建议按以下顺序理解项目状态:
|
||||
|
||||
1. **代码与实跑结果**(最高优先级)
|
||||
- `admin/`
|
||||
- `data/orders/`
|
||||
- `data/share/`
|
||||
- `data/channel_sync/`
|
||||
- `skills/gaokao-audit/`
|
||||
- 当前 pytest / ruff / mypy / bandit / coverage 输出
|
||||
2. **README + CHANGELOG(部分可信)**
|
||||
3. **IMPLEMENTATION_PLAN_v2 / CHANNEL_INTEGRATION(部分过时,需结合代码)**
|
||||
4. **PRODUCT_TECH_REVIEW_2026-06-12 / AUDIT_REPORT_2026-06-11 / REMEDIATION_TASK_BOARD_2026-06-11(历史快照,不能直接继承为当前结论)**
|
||||
|
||||
---
|
||||
|
||||
## 4. Stage 1:规格/规划对齐审查
|
||||
|
||||
### 4.1 已对齐的主线
|
||||
|
||||
| 领域 | 当前状态 | 证据 |
|
||||
| ----------------------------------------------------- | ------------ | ----------------------------------------------------------------------------- |
|
||||
| 场景A:闲鱼/微信/学校 → 管理端录单 → 顾问交付 | **基本对齐** | `docs/BUSINESS_SCENE.md` + `admin/routes/orders.py` + `data/channel_sync/*` |
|
||||
| 管理后台(认证/用户/订单/案例/仪表盘) | **已落地** | `admin/app.py`、`admin/routes/*`、`README.md` |
|
||||
| AI 审核主链(解析/规则检查/扎堆/报告/CLI) | **已落地** | `skills/gaokao-audit/scripts/*.py` |
|
||||
| 分享能力(短链/权限/公开分享) | **已落地** | `data/share/short_link.py`、`data/share/permission.py`、`admin/share_page.py` |
|
||||
| 渠道同步(闲鱼 webhook/poller、微信/企微最小 client) | **已落地** | `data/channel_sync/*` |
|
||||
| crowd_db 溯源与风险展示 | **已落地** | `data/crowd_db/*`、`scripts/gaokao-data-trace` |
|
||||
|
||||
### 4.2 关键漂移
|
||||
|
||||
#### A. 最严重范围错位:用户端 Web 自助产品未形成闭环
|
||||
|
||||
文档定义的场景B是:
|
||||
|
||||
- 用户访问 Web
|
||||
- 站内先付费
|
||||
- 付费后填写资料
|
||||
- 自动/人工生成方案
|
||||
- 站内查看 + 邮件 PDF 交付
|
||||
|
||||
当前代码现实:
|
||||
|
||||
- 仓库中**没有** `package.json`、`*.tsx`、用户端前台 Web 应用
|
||||
- 只有:
|
||||
- 管理后台 FastAPI
|
||||
- 公开分享页
|
||||
- 管理端仪表盘页面 `admin/static/dashboard.html`
|
||||
- **未见用户注册/下单/支付/资料填写/邮件交付闭环**
|
||||
|
||||
结论:
|
||||
|
||||
- 当前系统更像“运营后台 + 人工服务增强链路”
|
||||
- 不是“文档中描述的双流程完整产品”
|
||||
|
||||
#### B. PRD / ROADMAP / README / IMPLEMENTATION_PLAN_v2 状态互相冲突
|
||||
|
||||
- `PRD.md` 仍把 F016-F020(分享/管理后台/反扎堆/数据溯源/AI审核)标成“规划中”
|
||||
- `ROADMAP.md` 仍把多项已实现能力放在后续阶段
|
||||
- `IMPLEMENTATION_PLAN_v2.md` 顶层总览大量任务仍是 `📋`,但局部又写“已实现”
|
||||
- `README.md` 写入了较新能力,但目录树和整体叙事仍偏旧
|
||||
|
||||
结论:
|
||||
|
||||
- 当前没有单一文档可以单独代表真实现状
|
||||
- **文档真相层已经失效**
|
||||
|
||||
#### C. 旧报告已过时
|
||||
|
||||
| 文档 | 当前判断 |
|
||||
| ------------------------------------------- | ---------------------------------- |
|
||||
| `docs/AUDIT_REPORT_2026-06-11.md` | **严重过时** |
|
||||
| `docs/REMEDIATION_TASK_BOARD_2026-06-11.md` | **严重过时** |
|
||||
| `reports/PRODUCT_TECH_REVIEW_2026-06-12.md` | **部分仍有效,但若直接继承会失真** |
|
||||
|
||||
仍有效的旧判断:
|
||||
|
||||
- Web 自助闭环缺失
|
||||
- 文档状态漂移
|
||||
- 覆盖率/CI 硬门槛未闭环
|
||||
|
||||
已失真的旧判断:
|
||||
|
||||
- “AI 审核编排层未形成”
|
||||
- “pytest 环境不可运行”
|
||||
- “测试规模极低”
|
||||
|
||||
---
|
||||
|
||||
## 5. Stage 2:代码质量 / 工程门禁审查
|
||||
|
||||
### 5.1 总体判断
|
||||
|
||||
| 维度 | 状态 | 结论 |
|
||||
| --------- | ---- | ------------------------------- |
|
||||
| pytest | ✅ | 功能回归层当前可通过 |
|
||||
| ruff | ✅ | 代码风格/显性低级错误当前可通过 |
|
||||
| mypy | ❌ | 类型门禁不可用 |
|
||||
| bandit | ⚠️ | 噪声很大,但存在真实问题 |
|
||||
| coverage | ⚠️ | 总覆盖率仅 61%,结构性短板明显 |
|
||||
| CI 完整性 | ❌ | 不是可信质量门禁 |
|
||||
|
||||
### 5.2 真实高风险问题
|
||||
|
||||
#### H1. Webhook 来源 IP 信任边界错误
|
||||
|
||||
- `data/channel_sync/webhook_server.py` 定义了 `_trust_x_forwarded_for()`
|
||||
- 但 `_client_ip()` 实际**始终优先信任** `X-Forwarded-For`
|
||||
- 结果:
|
||||
- 限流可被伪造头绕过
|
||||
- 审计 `remote_addr` 可被污染
|
||||
|
||||
这是**真实安全问题**,不是 bandit 噪声。
|
||||
|
||||
#### H2. 默认管理员弱口令 + 登录无节流
|
||||
|
||||
- `admin/config.py` 默认:`GAOKAO_ADMIN_USER=admin`, `GAOKAO_ADMIN_PASS=admin123`
|
||||
- 空库会 bootstrap 管理员
|
||||
- 登录接口未见失败次数限制 / 限流 / 锁定
|
||||
|
||||
虽然 prod 对 JWT secret 有强校验,但**admin 密码强度没有同级保护**。
|
||||
|
||||
#### H3. CI 无法代表完整产品可构建/可测试
|
||||
|
||||
- `.github/workflows/ci.yml` 只装 `requirements-dev.txt`
|
||||
- 未安装 admin 运行依赖
|
||||
- clean env 下 `admin/tests` 不可保证可运行
|
||||
|
||||
### 5.3 中风险问题
|
||||
|
||||
#### M1. 类型系统失控
|
||||
|
||||
`mypy .` 失败 97 个错误,集中在:
|
||||
|
||||
- `data/share/short_link.py`
|
||||
- `data/cases/dao.py`
|
||||
- `skills/gaokao-audit/*`
|
||||
- `scripts/*`
|
||||
- tests/legacy 噪声
|
||||
|
||||
含义不是“仓库不能跑”,而是:
|
||||
|
||||
- 类型门禁当前没有工程可信度
|
||||
- 也无法直接接入 CI 做阻断
|
||||
|
||||
#### M2. 覆盖率不达计划标准
|
||||
|
||||
新鲜证据:
|
||||
|
||||
- TOTAL: **61%**
|
||||
- admin 核心模块覆盖率明显偏低:
|
||||
- `admin/routes/orders.py` 57%
|
||||
- `admin/routes/ui.py` 55%
|
||||
- `admin/users.py` 38%
|
||||
- `admin/share_page.py` 14%
|
||||
- `admin/errors/exceptions.py` 33%
|
||||
- `admin/logging_utils.py` 23%
|
||||
- skills 审核链路也有薄弱点:
|
||||
- `checker_integration.py` 63%
|
||||
- `report_generator.py` 67%
|
||||
|
||||
说明:
|
||||
|
||||
- `channel_sync`、`orders`、`crowd_db` 测试成熟度较高
|
||||
- `admin`、`report_generator`、集成胶水层明显偏弱
|
||||
|
||||
#### M3. CSV 导出公式注入风险
|
||||
|
||||
`admin/routes/orders.py` 直接导出用户可控文本字段到 CSV,未做 Excel 公式注入防护。
|
||||
|
||||
#### M4. 异常吞噬导致审计可观测性下降
|
||||
|
||||
`data/channel_sync/webhook_server.py` 多处 `except Exception: pass`,虽然提高了兜底可用性,但也会削弱取证与排障能力。
|
||||
|
||||
### 5.4 低风险与噪声
|
||||
|
||||
#### L1. Bandit B608 大量动态 SQL 报警,多数是 false positive
|
||||
|
||||
例如:
|
||||
|
||||
- `data/orders/dao.py`
|
||||
- `data/cases/dao.py`
|
||||
- `data/share/short_link.py`
|
||||
- `admin/stats.py`
|
||||
|
||||
这些位置多数是:
|
||||
|
||||
- 拼接**白名单列名/固定 where 片段**
|
||||
- 值仍通过参数绑定传入
|
||||
|
||||
需要人工甄别,**不能直接按 SQL 注入漏洞上报**。
|
||||
|
||||
#### L2. 开发占位 JWT secret 是 intentional false positive
|
||||
|
||||
- `admin/config.py` 的 `_DEV_JWT_SECRET` 在 prod 启动时会被阻止
|
||||
- 它本身不是生产漏洞,但会污染 bandit 输出
|
||||
|
||||
---
|
||||
|
||||
## 6. 模块真实状态表
|
||||
|
||||
| 模块 | 真实状态 | 说明 |
|
||||
| ---------------------- | ------------------------------------ | --------------------------------------------------------- |
|
||||
| `admin/` | **Partial / 可运行但质量门禁不闭环** | 后台功能已明显成形;CI 依赖、类型、覆盖率仍薄弱 |
|
||||
| `data/orders/` | **Done-ish / 质量较好** | DAO、状态机、加密、CLI、测试都比较成熟 |
|
||||
| `data/channel_sync/` | **Done-ish / 质量较好** | webhook/poller/adapter/monitor 已成形,存在 XFF 安全缺口 |
|
||||
| `data/share/` | **Partial / 能用但有安全与类型债** | 功能全,但密码哈希策略偏弱,类型门禁差 |
|
||||
| `data/cases/` | **Partial** | CRUD 有了,但类型安全与工程化不足 |
|
||||
| `data/crowd_db/` | **Done-ish / 数据能力较强** | loader/trace/risk/report 成熟,但骨架省份仍有低置信度数据 |
|
||||
| `skills/gaokao-audit/` | **Partial to Good** | 主链已落地,集成胶水层覆盖率与类型质量不足 |
|
||||
| 用户端 Web 产品 | **Not started / Missing main chain** | 只有管理端与分享页,没有用户端自助闭环 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 当前最准确的项目标签
|
||||
|
||||
### 不准确标签
|
||||
|
||||
- “完整产品”
|
||||
- “双流程(人工 + Web 自助)已完成”
|
||||
- “工程门禁完善、可稳定交付”
|
||||
|
||||
### 更准确标签
|
||||
|
||||
> **高考志愿填报运营与审核增强系统(已具备后台、订单、分享、渠道同步、AI审核主链),但用户端 Web 自助产品与工程化质量门禁仍未闭环。**
|
||||
|
||||
---
|
||||
|
||||
## 8. 当前 Gate 结论
|
||||
|
||||
### 代码层 Gate
|
||||
|
||||
- `pytest`: ✅
|
||||
- `ruff`: ✅
|
||||
- `mypy`: ❌
|
||||
- `bandit`: ⚠️(有噪声,但存在真实中高风险)
|
||||
- `coverage`: ⚠️(总量与关键模块均未达理想值)
|
||||
|
||||
### 产品/范围 Gate
|
||||
|
||||
- 场景A(人工服务): ✅ 基本闭环
|
||||
- 场景B(用户端 Web 自助): ❌ 未闭环
|
||||
- 文档真相: ❌ 漂移严重
|
||||
|
||||
### 综合 Gate
|
||||
|
||||
**结论: REQUEST_CHANGES / 条件通过,不可宣称整体完成。**
|
||||
|
||||
---
|
||||
|
||||
## 9. 最短整改路径
|
||||
|
||||
1. **先修真相层**
|
||||
- 统一 README / PRD / ROADMAP / IMPLEMENTATION_PLAN_v2 状态口径
|
||||
- 旧报告降级为历史快照
|
||||
2. **再补工程门禁**
|
||||
- 修 CI 依赖装配
|
||||
- 设定 mypy 可执行范围与配置
|
||||
- 在 CI 中加入 ruff / mypy / bandit / coverage fail-under
|
||||
3. **再修真实安全问题**
|
||||
- X-Forwarded-For 信任边界
|
||||
- 默认 admin 口令与登录节流
|
||||
- CSV 公式注入
|
||||
4. **最后再决定产品方向**
|
||||
- 要么收缩对外口径,承认当前是运营系统
|
||||
- 要么继续把用户端 Web 自助闭环真正落地
|
||||
|
||||
---
|
||||
|
||||
## 10. 本报告与旧报告的关系
|
||||
|
||||
- 本报告是 **2026-06-13 的新鲜实跑结论**
|
||||
- `docs/AUDIT_REPORT_2026-06-11.md`、`docs/REMEDIATION_TASK_BOARD_2026-06-11.md`、`reports/PRODUCT_TECH_REVIEW_2026-06-12.md` 仅保留历史参考价值
|
||||
- 之后若继续推进,应以本报告与新的整改任务板作为当前真相源
|
||||
261
reports/code-analysis-review-input-2026-06-12.md
Normal file
261
reports/code-analysis-review-input-2026-06-12.md
Normal file
@@ -0,0 +1,261 @@
|
||||
# 🔍 Deep Code Analysis Report
|
||||
|
||||
**Generated:** 2026-06-12T19:18:10.577328
|
||||
|
||||
**Path:** /home/long/project/gaokao-volunteer-system
|
||||
|
||||
|
||||
## 📋 Executive Summary
|
||||
|
||||
- **Total Files:** 107
|
||||
- **Total Lines:** 25,582
|
||||
- **Architecture Style:** MVC
|
||||
- **Entry Points:** 1
|
||||
- **Data Models:** 123
|
||||
- **Business Rules:** 218
|
||||
- **External Dependencies:** 66
|
||||
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
**Style:** MVC
|
||||
|
||||
**Layers/Modules:**
|
||||
|
||||
- `admin/`
|
||||
- `data/`
|
||||
- `scripts/`
|
||||
- `tests/`
|
||||
- `skills/`
|
||||
|
||||
## 🚀 Entry Points & Execution Flow
|
||||
|
||||
|
||||
### main
|
||||
|
||||
- **Location:** `admin/app.py`
|
||||
- **Parameters:** argv
|
||||
- **Business Logic:** ❌ No
|
||||
- **Calls:** ArgumentParser, add_argument, add_argument, add_argument, add_argument
|
||||
|
||||
## 📊 Data Models
|
||||
|
||||
|
||||
### Core Entities
|
||||
|
||||
|
||||
**UserOrderRecord** (`admin/users.py`)
|
||||
|
||||
|
||||
**CaseRecord** (`data/cases/models.py`)
|
||||
|
||||
|
||||
### DTOs/Value Objects
|
||||
|
||||
- **OrderSummaryResponse** - admin/routes/orders.py
|
||||
- **OrderMutationResponse** - admin/routes/orders.py
|
||||
- **CreateOrderRequest** - admin/routes/orders.py
|
||||
- **UpdateOrderRequest** - admin/routes/orders.py
|
||||
- **UserSummaryResponse** - admin/routes/users.py
|
||||
|
||||
## 📜 Business Rules
|
||||
|
||||
|
||||
### Validation Rules (200)
|
||||
|
||||
**rule_1:** Validation in login
|
||||
|
||||
- Location: `locustfile.py:login`
|
||||
- Priority: medium
|
||||
- Condition: `if not token:
|
||||
resp.failure("login response missing access_token")
|
||||
se...`
|
||||
|
||||
**rule_2:** Validation in hash_password
|
||||
|
||||
- Location: `admin/password.py:hash_password`
|
||||
- Priority: high
|
||||
- Condition: `if not plain:
|
||||
raise ValueError("password cannot be empty")
|
||||
salt = secrets.token_bytes(_S...`
|
||||
|
||||
**rule_3:** Validation in verify_password
|
||||
|
||||
- Location: `admin/password.py:verify_password`
|
||||
- Priority: high
|
||||
- Condition: `if not plain or not stored or _STORED_SEPARATOR not in stored:
|
||||
return False
|
||||
salt_hex, ha...`
|
||||
|
||||
**rule_4:** Validation in authenticate
|
||||
|
||||
- Location: `admin/db.py:authenticate`
|
||||
- Priority: medium
|
||||
- Condition: `if result is None:
|
||||
return None
|
||||
user, password_hash = result
|
||||
if not user.is_active:
|
||||
...`
|
||||
|
||||
**rule_5:** Validation in authenticate
|
||||
|
||||
- Location: `admin/db.py:authenticate`
|
||||
- Priority: medium
|
||||
- Condition: `if not user.is_active:
|
||||
return None
|
||||
if not verify_password(password, password_hash):
|
||||
...`
|
||||
|
||||
|
||||
### Constraint Rules (18)
|
||||
|
||||
**rule_9:** Business constraint in log_event
|
||||
|
||||
- Location: `admin/logging_utils.py:log_event`
|
||||
- Priority: critical
|
||||
- Condition: `if not event:
|
||||
raise ValueError("log_event: 'event' is required")
|
||||
|
||||
safe_fields: Dict[str,...`
|
||||
|
||||
**rule_12:** Business constraint in log_event_exc
|
||||
|
||||
- Location: `admin/logging_utils.py:log_event_exc`
|
||||
- Priority: critical
|
||||
- Condition: `if not event:
|
||||
raise ValueError("log_event_exc: 'event' is required")
|
||||
safe_fields: Dict[s...`
|
||||
|
||||
**rule_54:** Business constraint in main
|
||||
|
||||
- Location: `skills/gaokao-audit/scripts/validate_template.py:main`
|
||||
- Priority: critical
|
||||
- Condition: `if needle not in text:
|
||||
print(f"FAIL: placeholder missing: {needle!r}")
|
||||
retur...`
|
||||
|
||||
**rule_55:** Business constraint in main
|
||||
|
||||
- Location: `skills/gaokao-audit/scripts/validate_template.py:main`
|
||||
- Priority: critical
|
||||
- Condition: `if needle not in rendered:
|
||||
print(f"FAIL: rendered output missing: {needle!r}")
|
||||
...`
|
||||
|
||||
**rule_68:** Business constraint in base62_encode
|
||||
|
||||
- Location: `data/share/short_link.py:base62_encode`
|
||||
- Priority: critical
|
||||
- Condition: `if num < 0:
|
||||
raise ValueError("num must be >= 0")
|
||||
if num == 0:
|
||||
return BASE62_ALPH...`
|
||||
|
||||
|
||||
## 🔗 External Dependencies
|
||||
|
||||
|
||||
### Other Dependencies
|
||||
|
||||
- locust
|
||||
- datetime
|
||||
- secrets
|
||||
- dataclasses
|
||||
- argparse
|
||||
- urllib
|
||||
- xianyu_adapter
|
||||
- admin
|
||||
- fastapi
|
||||
- tempfile
|
||||
- uuid
|
||||
- collections
|
||||
- schema
|
||||
- json
|
||||
- jinja2
|
||||
|
||||
## 💧 Data Flows
|
||||
|
||||
- **external** → **admin/password.py:verify_password**
|
||||
- Data: plain, stored
|
||||
- Trigger: function_call
|
||||
- **external** → **admin/db.py:create**
|
||||
- Data: username, password, role
|
||||
- Trigger: function_call
|
||||
- **external** → **admin/db.py:update_last_login**
|
||||
- Data: user_id
|
||||
- Trigger: function_call
|
||||
- **external** → **admin/app.py:_validate_and_log_settings**
|
||||
- Data: settings
|
||||
- Trigger: function_call
|
||||
- **external** → **admin/app.py:create_app**
|
||||
- Data: settings
|
||||
- Trigger: function_call
|
||||
- **external** → **admin/stats.py:generate_day_series**
|
||||
- Data: db_path
|
||||
- Trigger: function_call
|
||||
- **external** → **scripts/gaokao-quick-3min.py:generate_quick_summary**
|
||||
- Data: info
|
||||
- Trigger: function_call
|
||||
- **external** → **scripts/gaokao-quick-3min.py:generate_quick_recommendation**
|
||||
- Data: info
|
||||
- Trigger: function_call
|
||||
- **external** → **scripts/gaokao-visual-report-v2.py:generate_student_radar**
|
||||
- Data: student_profile
|
||||
- Trigger: function_call
|
||||
- **external** → **scripts/gaokao-visual-report-v2.py:generate_school_comparison**
|
||||
- Data: volunteer_list
|
||||
- Trigger: function_call
|
||||
|
||||
## 🛤️ Key Execution Paths
|
||||
|
||||
|
||||
### main
|
||||
|
||||
Entry point: admin/app.py
|
||||
|
||||
**Steps:**
|
||||
|
||||
1. `main`
|
||||
|
||||
### main
|
||||
|
||||
Entry point: scripts/gaokao-quick-3min.py
|
||||
|
||||
**Steps:**
|
||||
|
||||
1. `main`
|
||||
|
||||
### run
|
||||
|
||||
Entry point: scripts/gaokao-collect-info.py
|
||||
|
||||
**Steps:**
|
||||
|
||||
1. `run`
|
||||
2. `main`
|
||||
3. `_git`
|
||||
4. `_run_cli`
|
||||
5. `_remote_head`
|
||||
6. `test_supports_async_function`
|
||||
7. `test_audit_report_template_renders`
|
||||
8. `_init_repo`
|
||||
... and 2 more
|
||||
|
||||
## 💡 Recommendations
|
||||
|
||||
|
||||
### For Understanding This Codebase
|
||||
|
||||
1. Start with entry points listed above
|
||||
2. Review core entities and their relationships
|
||||
3. Trace execution paths for key features
|
||||
4. Review business rules for domain logic
|
||||
5. Check external dependencies for integration points
|
||||
|
||||
|
||||
### For Code Quality
|
||||
|
||||
1. Add documentation to entry points
|
||||
2. Document business rules explicitly
|
||||
3. Create architecture decision records (ADRs)
|
||||
4. Add data flow diagrams
|
||||
89
reports/perf/T11.1_PERF_REPORT.md
Normal file
89
reports/perf/T11.1_PERF_REPORT.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# T11.1 性能基准报告
|
||||
|
||||
日期:2026-06-12
|
||||
仓库:`/home/long/project/gaokao-volunteer-system`
|
||||
目标:T6.1 FastAPI 管理后台骨架
|
||||
|
||||
## 1. 测试范围
|
||||
|
||||
使用 `locustfile.py` 对以下端点进行 10 并发基准:
|
||||
|
||||
- `POST /api/auth/login`
|
||||
- `GET /api/auth/me`
|
||||
- `GET /api/meta`
|
||||
- `GET /api/orders`
|
||||
- `GET /api/orders/{id}`(404 视为成功路径)
|
||||
- `GET /api/stats/orders`
|
||||
- `GET /health`
|
||||
|
||||
用户模型:
|
||||
|
||||
- `AdminBrowseUser`:已登录后台浏览用户
|
||||
- `LoginBurstUser`:登录高峰用户
|
||||
|
||||
## 2. 测试环境
|
||||
|
||||
- Python: 3.11.13
|
||||
- Locust: 2.42.4
|
||||
- 服务启动命令:`python3 -m admin.app --host 127.0.0.1 --port 18081`
|
||||
- 测试命令:`locust -f locustfile.py --host http://127.0.0.1:18081 --headless -u 10 -r 2 -t 30s --csv reports/perf/t11_1`
|
||||
- 数据库:`/home/long/project/gaokao-volunteer-system/.tmp/t11_1_admin.db`
|
||||
- JWT secret:本地临时测试值(64 个 `x`)
|
||||
|
||||
## 3. 发现与修复
|
||||
|
||||
首次执行失败,根因是 `AuthenticatedHttpUser` 作为基类未标记为抽象类,Locust 会把它当成可实例化用户,导致:
|
||||
|
||||
- 异常:`No tasks defined on AuthenticatedHttpUser`
|
||||
- 结果:进程退出码 1,压测结果不可信
|
||||
|
||||
已修复:
|
||||
|
||||
- `locustfile.py` 中为 `AuthenticatedHttpUser` 增加 `abstract = True`
|
||||
|
||||
修复后重新执行,压测正常结束,`failures.csv` 与 `exceptions.csv` 均为空。
|
||||
|
||||
## 4. 结果摘要
|
||||
|
||||
总体:
|
||||
|
||||
- 总请求数:327
|
||||
- 失败数:0
|
||||
- 错误率:0.00%
|
||||
- 平均吞吐:11.27 req/s
|
||||
- 聚合中位延迟:2 ms
|
||||
- 聚合平均延迟:4.62 ms
|
||||
- 聚合 P95:27 ms
|
||||
- 聚合 P99:36 ms
|
||||
- 聚合最大值:43.53 ms
|
||||
|
||||
分端点:
|
||||
|
||||
| 端点 | 请求数 | 失败 | 平均延迟(ms) | P95(ms) | 最大(ms) | 吞吐(req/s) |
|
||||
| -------------------------- | -----: | ---: | -----------: | ------: | -------: | ----------: |
|
||||
| POST /api/auth/login | 27 | 0 | 28.53 | 38 | 43.53 | 0.93 |
|
||||
| GET /api/auth/me | 71 | 0 | 2.52 | 3 | 4.49 | 2.45 |
|
||||
| GET /api/meta | 55 | 0 | 2.38 | 3 | 3.37 | 1.90 |
|
||||
| GET /api/orders | 105 | 0 | 2.51 | 3 | 4.44 | 3.62 |
|
||||
| GET /api/orders/{id} [404] | 15 | 0 | 2.61 | 4 | 3.98 | 0.52 |
|
||||
| GET /api/stats/orders | 44 | 0 | 2.51 | 3 | 4.19 | 1.52 |
|
||||
| GET /health | 10 | 0 | 1.77 | 2 | 2.04 | 0.34 |
|
||||
|
||||
## 5. 结论
|
||||
|
||||
结论:在本地单机、10 并发、30 秒 headless Locust 基准下,T6.1 管理后台骨架表现稳定,0 失败,所有 GET 路由 P95 ≤ 4ms,登录接口 P95 为 38ms,满足“先建立可压测基线”的 T11.1 目标。
|
||||
|
||||
当前限制:
|
||||
|
||||
- 这是本地 SQLite + 单进程 uvicorn 基线,不代表生产容量上限。
|
||||
- 当前业务仍是 T6.1 骨架,`/api/orders`、`/api/stats/orders` 返回占位数据;后续真实业务逻辑接入后需重跑基准。
|
||||
- 当前测试时长为 30 秒,适合基线验证;若要做发布前容量评估,建议补 5 分钟持续压测与更高并发阶梯测试。
|
||||
|
||||
## 6. 产物
|
||||
|
||||
- `locustfile.py`
|
||||
- `reports/perf/T11.1_PERF_REPORT.md`
|
||||
- `reports/perf/t11_1_stats.csv`
|
||||
- `reports/perf/t11_1_stats_history.csv`
|
||||
- `reports/perf/t11_1_failures.csv`
|
||||
- `reports/perf/t11_1_exceptions.csv`
|
||||
1
reports/perf/t11_1_exceptions.csv
Normal file
1
reports/perf/t11_1_exceptions.csv
Normal file
@@ -0,0 +1 @@
|
||||
Count,Message,Traceback,Nodes
|
||||
|
1
reports/perf/t11_1_failures.csv
Normal file
1
reports/perf/t11_1_failures.csv
Normal file
@@ -0,0 +1 @@
|
||||
Method,Name,Error,Occurrences
|
||||
|
9
reports/perf/t11_1_stats.csv
Normal file
9
reports/perf/t11_1_stats.csv
Normal file
@@ -0,0 +1,9 @@
|
||||
Type,Name,Request Count,Failure Count,Median Response Time,Average Response Time,Min Response Time,Max Response Time,Average Content Size,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%
|
||||
GET,GET /api/auth/me,71,0,2,2.523277889081264,1.5841139829717577,4.48689199401997,144.0,2.4466548941768274,0.0,2,3,3,3,3,3,4,4,4,4,4
|
||||
GET,GET /api/meta,55,0,2,2.3830690172458575,1.2161129852756858,3.3656150044407696,461.0,1.8952960447848664,0.0,2,3,3,3,3,3,3,3,3,3,3
|
||||
GET,GET /api/orders,105,0,2,2.5105509222374254,1.2903409951832145,4.43644801271148,2.0,3.618292449134745,0.0,2,3,3,3,3,3,4,4,4,4,4
|
||||
GET,GET /api/orders/{id} [404],15,0,2,2.613766002468765,1.9536199979484081,3.9837899967096746,231.0,0.5168989213049635,0.0,2,3,3,3,3,4,4,4,4,4,4
|
||||
GET,GET /api/stats/orders,44,0,2,2.507629911468195,1.0961600055452436,4.19115400291048,109.0,1.516236835827893,0.0,2,3,3,3,3,3,4,4,4,4,4
|
||||
GET,GET /health,10,0,2,1.7654583003604785,1.2791189947165549,2.0439459767658263,145.0,0.3445992808699757,0.0,2,2,2,2,2,2,2,2,2,2,2
|
||||
POST,POST /api/auth/login,27,0,28,28.52843043985087,22.156253980938345,43.52652397938073,254.0,0.9304180583489343,0.0,28,28,29,29,38,38,44,44,44,44,44
|
||||
,Aggregated,327,0,2,4.621693528836183,1.0961600055452436,43.52652397938073,160.11620795107032,11.268396484448205,0.0,2,3,3,3,4,27,29,36,44,44,44
|
||||
|
27
reports/perf/t11_1_stats_history.csv
Normal file
27
reports/perf/t11_1_stats_history.csv
Normal file
@@ -0,0 +1,27 @@
|
||||
Timestamp,User Count,Type,Name,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%,Total Request Count,Total Failure Count,Total Median Response Time,Total Average Response Time,Total Min Response Time,Total Max Response Time,Total Average Content Size
|
||||
1781251791,0,,Aggregated,0.000000,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,0,0,0,0.0,0,0,0
|
||||
1781251792,2,,Aggregated,0.000000,0.000000,2,2,38,38,44,44,44,44,44,44,44,6,0,2,14.866700997420898,1.2903409951832145,43.52652397938073,180.33333333333334
|
||||
1781251793,4,,Aggregated,0.000000,0.000000,3,3,36,38,38,44,44,44,44,44,44,13,0,3,13.504982072985372,1.2903409951832145,43.52652397938073,144.92307692307693
|
||||
1781251794,6,,Aggregated,4.000000,0.000000,2,3,29,31,38,38,44,44,44,44,44,24,0,2,11.799663666655155,1.2903409951832145,43.52652397938073,177.29166666666666
|
||||
1781251795,8,,Aggregated,4.500000,0.000000,3,3,23,28,36,38,44,44,44,44,44,34,0,2,10.288498705074957,1.2903409951832145,43.52652397938073,171.85294117647058
|
||||
1781251796,10,,Aggregated,5.666667,0.000000,3,3,23,26,31,38,44,44,44,44,44,48,0,3,9.592486706120932,1.2903409951832145,43.52652397938073,178.9375
|
||||
1781251797,10,,Aggregated,6.750000,0.000000,2,3,4,24,29,38,38,44,44,44,44,60,0,2,8.91246349880627,1.2903409951832145,43.52652397938073,185.55
|
||||
1781251798,10,,Aggregated,7.600000,0.000000,3,3,3,4,28,36,38,44,44,44,44,71,0,3,7.98847935118214,1.2903409951832145,43.52652397938073,186.50704225352112
|
||||
1781251799,10,,Aggregated,8.166667,0.000000,3,3,3,4,28,31,38,44,44,44,44,83,0,3,7.185863492959908,1.2903409951832145,43.52652397938073,171.78313253012047
|
||||
1781251800,10,,Aggregated,8.571429,0.000000,2,3,3,3,28,31,38,44,44,44,44,94,0,2,6.878889744179918,1.2791189947165549,43.52652397938073,178.29787234042553
|
||||
1781251801,10,,Aggregated,8.875000,0.000000,2,3,3,3,28,29,38,38,44,44,44,110,0,2,6.229009380595843,1.2791189947165549,43.52652397938073,171.1818181818182
|
||||
1781251802,10,,Aggregated,9.555556,0.000000,2,3,3,3,27,29,38,38,44,44,44,120,0,2,6.133288874116261,1.2791189947165549,43.52652397938073,179.81666666666666
|
||||
1781251803,10,,Aggregated,9.700000,0.000000,2,3,3,3,24,29,38,38,44,44,44,131,0,2,5.826537418916807,1.2791189947165549,43.52652397938073,179.35114503816794
|
||||
1781251804,10,,Aggregated,10.700000,0.000000,2,3,3,3,23,28,38,38,44,44,44,145,0,2,5.491272874923166,1.2791189947165549,43.52652397938073,168.82758620689654
|
||||
1781251805,10,,Aggregated,11.100000,0.000000,2,3,3,3,23,28,36,38,44,44,44,154,0,2,5.473512369049289,1.2791189947165549,43.52652397938073,165.54545454545453
|
||||
1781251806,10,,Aggregated,11.400000,0.000000,2,3,3,3,23,28,36,38,44,44,44,165,0,2,5.437436156595747,1.2791189947165549,43.52652397938073,168.8
|
||||
1781251807,10,,Aggregated,11.900000,0.000000,2,3,3,3,23,28,36,38,44,44,44,179,0,2,5.3285276193715445,1.2791189947165549,43.52652397938073,162.72625698324023
|
||||
1781251808,10,,Aggregated,11.800000,0.000000,2,3,3,3,23,28,36,38,44,44,44,190,0,2,5.157791936040954,1.2791189947165549,43.52652397938073,161.5157894736842
|
||||
1781251809,10,,Aggregated,11.900000,0.000000,2,3,3,3,23,28,31,38,44,44,44,201,0,2,5.251868059354792,1.2791189947165549,43.52652397938073,160.5870646766169
|
||||
1781251810,10,,Aggregated,12.000000,0.000000,2,3,3,3,23,28,31,38,44,44,44,210,0,2,5.14158705232798,1.2791189947165549,43.52652397938073,160.3761904761905
|
||||
1781251811,10,,Aggregated,11.900000,0.000000,2,3,3,3,4,28,31,38,44,44,44,223,0,2,5.090079448450014,1.2791189947165549,43.52652397938073,159.96860986547085
|
||||
1781251812,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,31,38,44,44,44,235,0,2,4.947939795625218,1.0961600055452436,43.52652397938073,158.68085106382978
|
||||
1781251813,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,31,38,44,44,44,247,0,2,4.933227951188764,1.0961600055452436,43.52652397938073,160.04453441295547
|
||||
1781251814,10,,Aggregated,11.200000,0.000000,2,3,3,3,4,28,29,38,44,44,44,258,0,2,4.820793891251593,1.0961600055452436,43.52652397938073,157.42635658914728
|
||||
1781251815,10,,Aggregated,11.500000,0.000000,2,3,3,3,4,28,29,38,44,44,44,273,0,2,4.69094451266126,1.0961600055452436,43.52652397938073,159.91575091575092
|
||||
1781251816,10,,Aggregated,11.800000,0.000000,2,3,3,3,4,27,29,38,44,44,44,283,0,2,4.613383886833797,1.0961600055452436,43.52652397938073,162.8939929328622
|
||||
|
Reference in New Issue
Block a user