# 后端代码改进工作记录

> 基于 2026-06-23 的代码审查，记录所有发现的问题及处理状态。
> 注：问题编号与分析报告一致。

---

## 一、暂不处理（鉴权相关，后续配合主系统调整）

| 编号 | 问题 | 原因 |
|------|------|------|
| #1 | `auto_login()` 完全绕过认证 | 鉴权在主系统完成，我们是补充子系统 |
| #2 | 未认证接口泄露敏感数据 | 同上 |
| #4 | CSRF 防护全局失效 | 同上 |

---

## 二、已处理

### #8 recording.py 下载接口重复代码抽取
- **状态**: ✅ 已完成
- **文件**: `src/services/document_service.py`、`src/api/recording.py`
- **修复**: 抽取 `add_unicode_paragraph()` / `create_docx_with_unicode_title()` / `save_and_send_docx()` 到 document_service.py，4 个下载接口共减少约 280 行重复代码

### #9 recording.py 大文件拆分
- **状态**: ✅ 已完成
- **文件**: `src/api/recording_download.py`（新建）
- **修复**: 下载路由拆分到独立蓝图 `recording_download_bp`，recording.py 从 1610 行降至约 1330 行；在 `api/__init__.py` 统一注册

### #3 字段名不匹配 Bug：`error_msg` vs `error_message`
- **状态**: ✅ 已完成
- **文件**: `src/services/transcription_service.py:202, :581`
- **问题**: 模型字段是 `error_message`，service 写入 `recording.error_msg`（不存在的属性），错误信息丢失
- **修复**: 两处 `error_msg` 改为 `error_message`

### #10 错误处理不一致且泄露内部异常
- **状态**: 🔴 已还原（撤销全局错误处理器和 `api_response.py`）
- **文件**: `src/api/` 下所有蓝图文件
- **问题**: 51 处 `return jsonify({'error': str(e)}), 500` 把内部异常暴露给客户端
- **处理**: 曾创建 `api_response.py` 和全局错误处理器替换，但用户认为全局错误处理器不需要，已还原
- **后续**: 等 #11 统一返回和日志方案重新设计后再处理

### #5 硬编码默认密钥（仅警告）
- **状态**: ✅ 已完成（报警告，不阻止启动）
- **文件**: `src/config.py:17, :73`
- **处理**: `validate_config()` 已有警告逻辑，`get_app_config()` 中保留默认值但启动时打印警告

### #15 LLM/Voiceprint 客户端无超时和重试
- **状态**: ✅ 已完成
- **文件**: `src/clients/llm_client.py`、`src/clients/voiceprint_client.py`
- **修复**:
  - llm_client: 添加 `httpx.Timeout(connect=10, read=300, write=60, pool=30)`，`print()` 改为 `logging`
  - voiceprint_client: 改用持久化 `httpx.Client` 复用连接池，添加指数退避重试（3次），细化异常类型

### #16 双入口文件端口不一致
- **状态**: ✅ 已完成
- **文件**: `src/app.py`
- **修复**: 端口和 debug 模式从环境变量 `FLASK_PORT` / `FLASK_DEBUG` 读取，默认 5000 / false

### #20 config.py 循环依赖风险
- **状态**: ✅ 已完成
- **文件**: `src/config.py`、`src/app.py`、`src/services/register.py`
- **修复**: `get_app_config()` 移除对 `src.clients` 的导入；新增 `init_early_services()` 在蓝图注册前初始化 `chunking_service` 和 `EMBEDDINGS_AVAILABLE`

### #21 admin.py 绕过 config 直接读 os.environ
- **状态**: ✅ 已完成
- **文件**: `src/api/admin.py:466-470`、`src/config.py`
- **修复**: 自动处理配置项（`ENABLE_AUTO_PROCESSING` 等 5 项）移入 config.py；admin.py 从 `current_app.config` 读取

---

## 三、标记待做（高优先级）

### #11 统一错误返回格式
- **状态**: 🔴 已还原（撤销全局错误处理器和 `api_response.py`）
- **处理**: 曾创建 `api_response.py` 和全局错误处理器，但已还原；后续需重新设计统一返回和日志方案
- **优先级**: 高（在 #6/#7/#12 之前）

### #19 统一日志格式
- **状态**: ✅ 已完成
- **修复**:
  - `src/config.py`: `print()` 改为 `logging.warning()`
  - `src/clients/llm_client.py`: `print()` 改为 `logging.info()` / `logging.error()`
  - `src/api/draft_api.py`: 约 20 条英文日志全部改为中文
  - `src/services/llm_service.py`: 约 15 条英文/混杂日志全部改为中文，语义更清晰
  - `src/services/audio_chunking.py`: 约 40 条英文日志全部改为中文，统计和建议部分语义优化
  - 所有日志语言统一为中文，语义表达便于调试

---

## 四、标记待做（性能优化，有空再处理）

### #6 N+1 查询优化
- **文件**: `src/api/admin.py:81-93, :645-652`、`src/models/recording.py:38-64`
- **问题**: admin 接口和 to_dict 列表场景存在 N+1 查询
- **处理**: 标记，当前系统规模无性能问题，有空再优化
- **优先级**: 中

### #7 后台线程管理优化
- **文件**: `src/api/recording.py` 多处 `threading.Thread`
- **问题**: 无线程池、无任务队列、无重试
- **处理**: 标记，当前无并发压力，后续引入 ThreadPoolExecutor 或 Celery
- **优先级**: 中（与 #6 一致）

### #12 缺少输入校验
- **问题**: POST/PUT 接口缺少 email 格式、密码强度、字段长度等校验
- **处理**: 标记，后续引入 marshmallow/pydantic
- **优先级**: 中（与 #6/#7 一致）

### #13 sync_service.py 每轮循环重建 engine（PostgreSQL）
- **文件**: `src/services/sync_service.py:78`
- **问题**: `create_engine` 在循环内每次重建，连接泄漏
- **优先级**: 高（与 #11 一致，数据库返工）

### #14 数据库迁移仅支持 SQLite（PostgreSQL）
- **文件**: `src/services/register.py:130-161`
- **问题**: `PRAGMA table_info` 是 SQLite 专有，PostgreSQL 上不执行
- **优先级**: 高（与 #11 一致，数据库返工）

### #17 缺失数据库索引（PostgreSQL）
- **文件**: `src/models/recording.py` 等
- **问题**: 关键列无 `index=True`，PostgreSQL 不会自动建索引
- **优先级**: 高（与 #11 一致，数据库返工）

### #18 datetime 时区不一致（PostgreSQL）
- **文件**: 多模型和 API 混用 `datetime.now` / `datetime.utcnow`
- **问题**: 跨时区部署时时间错乱
- **优先级**: 高（与 #11 一致，数据库返工）

---

## 进度追踪

| 编号 | 问题 | 状态 | 备注 |
|------|------|------|------|
| #8 | 下载接口重复代码抽取 | ✅ 已完成 | 优先级最高，已处理 |
| #9 | 大文件拆分 | ✅ 已完成 | 优先级最高，已处理 |
| #3 | error_msg 字段名修复 | ✅ 已完成 | 可改，已处理 |
| #10 | 错误处理统一 | 🔴 已还原 | 全局错误处理器不需要，已撤销 |
| #5 | 硬编码密钥警告 | ✅ 已完成 | 仅警告，已处理 |
| #15 | 客户端超时和重试 | ✅ 已完成 | 同 #3/#10 优先级 |
| #16 | 双入口文件端口 | ✅ 已完成 | 同 #3/#10 优先级 |
| #20 | config.py 循环依赖 | ✅ 已完成 | 同 #3/#10 优先级 |
| #21 | admin.py 绕过 config | ✅ 已完成 | 同 #3/#10 优先级 |
| #11 | 统一错误返回格式 | 🟡 部分完成 | 高优先级，需完善日志 |
| #19 | 统一日志格式 | ✅ 已完成 | 高优先级，已处理 |
| #13 | sync_service engine 复用 | 📋 待做 | 中优先级，数据库返工 |
| #14 | 数据库迁移跨库兼容 | 📋 待做 | 中优先级，数据库返工 |
| #17 | 数据库索引 | 📋 待做 | 中优先级，数据库返工 |
| #18 | 时区统一 | 📋 待做 | 中优先级，数据库返工 |
| #6 | N+1 查询优化 | 📋 待做 | 中优先级，优化 |
| #7 | 后台线程管理 | 📋 待做 | 中优先级，优化 |
| #12 | 输入校验 | 📋 待做 | 中优先级，优化 |
| #1 | 认证绕过 | ⏸️ 搁置 | 鉴权相关，暂不处理 |
| #2 | 未认证接口泄露数据 | ⏸️ 搁置 | 鉴权相关，暂不处理 |
| #4 | CSRF 防护失效 | ⏸️ 搁置 | 鉴权相关，暂不处理 |
