# gongxue-base 全库 OCR 审查汇总

> 模型：deepseek-v4-flash（opencode.ai，Responses API）｜工具：OCR v1.8.10（open-codereview.ai）｜日期：2026-08-09

## 覆盖范围

- **apps/admin/src**：192 个文件（排除测试），两轮扫描，去重后 **336** 条评论，约 1060 万 token，61 分钟
- **apps/server/src**：366 个文件（排除测试），两轮扫描，去重后 **775** 条评论，约 2060 万 token，105 分钟
- **根级/CI/配置**（deploy.sh、migrate.sh、serve-proxy.js、ecosystem.config.cjs、oxlint.config.ts、turbo.json、WATCHDOG.yml、.gitea/workflows、packages/typescript-config）：13 个文件，**22** 条评论
- **合计**：571 个文件，OCR 语义去重后约 **1133** 条评论（文件精确去重 1626 条，含近似重复），约 **3180 万 token**，约 2.9 小时

## 严重度分布（精确去重）

| 严重度 | 数量 |
|---|---|
| low | 840 |
| medium | 698 |
| high | 88 |

## 分类分布

| 分类 | 数量 |
|---|---|
| bug | 737 |
| maintainability | 580 |
| performance | 116 |
| security | 108 |
| style | 65 |
| other | 18 |
| documentation | 2 |

## 区域分布

| 区域 | 数量 |
|---|---|
| server | 1035 |
| admin | 568 |
| misc | 23 |

## 评论最多的文件 TOP 20

| 评论数 | 其中 high | 文件 |
|---|---|---|
| 9 | 1 | apps/server/src/imports/imports.workbook-fallback.ts |
| 8 | 0 | apps/admin/src/components/AiChat/useAiChatMessageActions.tsx |
| 8 | 0 | apps/server/src/attendance/attendance-generation.service.ts |
| 8 | 0 | apps/server/src/classroom-rentals/rental-schedule.service.ts |
| 8 | 0 | apps/server/src/dashboard/dashboard.service.ts |
| 8 | 1 | apps/server/src/occupancies/occupancy-operations.service.ts |
| 7 | 0 | apps/admin/src/pages/Occupancies/index.tsx |
| 7 | 0 | apps/admin/src/pages/RoomVisual/index.tsx |
| 7 | 0 | apps/admin/src/pages/Wallets/index.tsx |
| 7 | 1 | apps/server/src/archive/archive.service.ts |
| 7 | 0 | apps/server/src/ai-config/ai-config.helpers.ts |
| 7 | 3 | apps/server/src/classes/classes.controller.ts |
| 7 | 0 | apps/server/src/integration/dingtalk-student-sync.ts |
| 7 | 1 | apps/server/src/occupancies/occupancies.controller.ts |
| 7 | 1 | apps/server/src/occupancies/occupancy-import.service.ts |
| 7 | 2 | migrate.sh |
| 6 | 0 | apps/admin/src/store/middleware/persist.ts |
| 6 | 0 | apps/admin/src/components/AiChat/DynamicReview.tsx |
| 6 | 0 | apps/admin/src/components/AiChat/AiChatDrawer.tsx |
| 6 | 0 | apps/admin/src/components/StudentProfileContent/index.tsx |

## 部署/运维高危问题（根级文件）

1. **`serve-proxy.js`**：`API_TARGET` 环境变量被读取但从未使用，硬编码 `127.0.0.1:3000`；catch-all 对所有缺失文件返回 index.html(200)，掩盖资源缺失；`readFileSync` 阻塞事件循环；透传 hop-by-hop 头。
2. **`migrate.sh`**：明文/硬编码数据库密码、固定 `sleep 8` 竞态、SQL 无事务（部分迁移）、无 trap 清理。
3. **`deploy.sh` + `.gitea/workflows/deploy.yml`**：`rsync --delete` 可能删掉服务器端 `.env`；`npm ci` 被 node_modules 存在性跳过导致新依赖永不安装；远程命令块无 `set -e`，失败仍 reload PM2 且退出码 0；workflow 无 concurrency 并发控制。
4. **`ecosystem.config.cjs`**：缺 `kill_timeout`（SIGKILL 约 1.6s 后强杀，请求/DB 连接被切断）；相对日志路径按启动目录解析。
5. **`oxlint.config.ts`**：React 硬编码 `19.0.0`（仓库无对应依赖）；全局禁用 `no-explicit-any`。

## 后端（server）突出问题主题

- **认证/授权**：登录失败锁定可被永久锁定、用户名枚举、密码策略过弱（最短 4 位无上限）、JWT/审计相关风险。
- **SQL LIKE 通配符未转义**：`%`/`_` 可扩大搜索范围（classes/students/deposits/rooms 等多个 service）。
- **DTO 校验矛盾**：`@Matches` + `@IsISO8601({strict:true})` 同时存在导致任何值都无法通过（dashboard-query/schedule-sync/occupancy dto）。
- **非原子多步写入**：imports/rooms/students/exams/attendance 多处无事务，失败留半截状态。
- **审计/副作用写入在请求路径中可导致操作失败**（with-audit-log、auth.controller 等）。
- **check-then-act 竞态**：ai-chat.conversations、ai-form.service、classroom-rentals.service、attendance-leave-sync 等。
- **N+1 / 循环内顺序 await**：attendance-import、bills、dashboard-queries、archive-report 等。
- **无界输入**：records 数组、values、密码、notes、page/limit 无上限。
- **时区混用**：本地时间与 UTC+8 混用（约 8 处重复模式），`common/dayjs.ts` 注释声称引入 tz 插件但实际没有。

## 前端（admin）突出问题主题

- **A11y**：`.ai-chat-hover-actions` opacity:0 但仍在 Tab 序中；`:focus-visible` 被移除；可编辑单元格无焦点样式；对比度不足（#ff4d4f）。
- **crypto.randomUUID() 无降级**：provider.ts、operation-id.ts、LiteMermaid.tsx、EditableCell/index.tsx 在非安全上下文会抛错。
- **错误处理反模式**：空 catch、unhandled promise rejection（prefetchQuery、validateFields）、成功提示实际失败、catch 范围过大。
- **渲染期写 ref / 缺 cleanup**：useSubmissionState、usePageVisible、DynamicReview、ECharts 等 8 处。
- **重复逻辑**：useLockerMutations≈useBedMutations、persist.ts 3 个 migrate、message-mappers 4 个 history 提取等。
- **严格相等规则违反**：schedule-visibility.ts、DepositModals.tsx、AiChatDrawer.tsx 的 `==`/`!=`。
- **跨字段校验缺失**：日期区间倒置、跨零点课表、金额符号未与操作类型绑定、whitespace-only required。

## 快速修复清单（Quick Wins 摘选）

1. **LIKE 通配符转义**：classes/students/deposits/rooms 的 `Like("%"+keyword+"%")` 加转义 helper。
2. **上传空文件防护**：archive/expenses/classrooms/rooms/occupancies/students/imports 控制器对 `@UploadedFile()` 加 null 判断，500→400。
3. **修复矛盾校验器**：`@Matches`+`@IsISO8601({strict:true})` 二选一（3 个 dto）。
4. **加输入上限**：deposits.studentIds、notifications dto、bed/locker count、sync limit 等。
5. **替换废弃 `findByIds`**：ai-attachment.service、rbac-user.service 改用 `In(ids)`。
6. **fire-and-forget 通知 promise 补 await/.catch**：bills/deposits/occupancies controller。
7. **审计日志 best-effort**：with-audit-log 及日志后置控制器，避免成功操作被日志拖成 500。
8. **部署面**：deploy 加 `--exclude=.env*`、固定跑 npm ci、远程块 `set -e`、workflow 加 concurrency、PM2 `kill_timeout:5000`、serve-proxy 用 `API_TARGET` 并改流式读文件。
9. **时区统一**：抽 `CHINA_TZ`/`CN_UTC_OFFSET=8` 常量替换约 8 处重复的 UTC+8 逻辑。
10. **oxlint**：React `version: "detect"`，去掉全局 no-explicit-any，改为定点禁用。

## 数据文件

- `ocr-reports/all-comments.jsonl` — 全部 1626 条评论（精确去重，JSONL）
- `ocr-reports/high-severity-comments.md` — 88 条 high 级问题全文
- `ocr-reports/admin-scan-comments.jsonl` / `server-scan-comments.jsonl` / `misc-scan-comments.jsonl` — 各分区原始评论

## 复查方式

```bash
cd /Users/tiku1/code/gongxue-base
ocr session list            # 查看会话
ocr session comments <id>   # 查看某个会话评论
ocr review --commit <sha>   # 以后每次提交后审改动
```