diff --git a/PROGRESS_AGI_ITERATION_6.md b/PROGRESS_AGI_ITERATION_6.md index 562edb5..8c3f338 100644 --- a/PROGRESS_AGI_ITERATION_6.md +++ b/PROGRESS_AGI_ITERATION_6.md @@ -63,6 +63,33 @@ seed_demo/demo 幂等兜底、两个测试侧 membership 修补、exceptions 去 4. **日志清理**:删 `backend/g8060/g8070/g8080/g8090.log`(P0-4 现场 g8070 已无保留价值, `*.log` 已在 `.gitignore`)。 +## 本轮新增(2026-09-12 续-2 · 诚实性修复 + P0-3 真 bug) + +1. **P0-3 真 bug**:`frontend/src/router/index.js` 的 `PUBLIC_ROUTES` + 只放行 `login/storefront`,匿名进 `/register` 被守卫踢回 `/login`—— + 注册页存在但不可达,闭环是断的。修法:`PUBLIC_ROUTES` 加 `register`。 + Playwright 真机(dev :18099 + 新 build): + 空表单提交被拦(4 条必填标红)/ 非法值被拦(手机号格式/密码至少8位/ + 两次密码不一致)/ 合法值 201 并跳 `#/dashboard` / 0 console errors。 +2. **P0-5 缺头**:`check_apikey_rate_limit` 抛 `Throttled` 未传 `wait`, + DRF 无 `wait` 不回 `Retry-After`(`views.py::exception_handler` 实测)。 + 修法:`wait=APIKEY_WINDOW_SECONDS` + 回归断言 `Retry-After in 429`。 +3. **P1-3 定时接线**:`apps/core/tasks.py`(新建,`purge_expired_audit_logs` + + dramatiq actor)+ `config/dramatiq.py` 每日 04:00 cron + + `test_purge_actor_registered_and_runs`。此前 command 存在但无人调度。 +4. **P1-2 Channel 补校验**:`Channel.vue` 的 `el-form` 挂了不存在的 + `formRef/rules`(模板引用了未定义的变量,保存直调 API)。 + 补 `rules`(平台/店铺ID/店铺名必填,App Key 留空合法)+ 保存前 validate。 +5. **文档数字**:README PG 口径 `499` → `514`(实跑)。 + +## 最终验证(2026-09-12) + +- 后端 SQLite:**510 passed / 4 skipped**(PG 专用并发用例) +- 后端 PostgreSQL 5433:**514 passed / 0 skipped** +- 前端:`npm run build` ✅ 6.50s;`npm test` ✅ 11/11 +- `manage.py check` 0 issues;`makemigrations --check` No changes +- Playwright Register 真机:空/非法被拦、合法 201 跳 dashboard、0 console errors + ## 遗留(诚实记录) - §附录 A #4–#10(库存流水/预警规则/打印模板/自定义报表/库存大盘/科目管理/价格等级页) diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 4e7bf50..bef99db 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -33,7 +33,7 @@ const routes = [ const router = createRouter({ history: createWebHashHistory(), routes }) -const PUBLIC_ROUTES = new Set(['login', 'storefront']) +const PUBLIC_ROUTES = new Set(['login', 'register', 'storefront']) router.beforeEach((to) => { const token = localStorage.getItem('token')