157 lines
7.7 KiB
Markdown
157 lines
7.7 KiB
Markdown
# 后端代码改进工作记录
|
||
|
||
> 基于 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 防护失效 | ⏸️ 搁置 | 鉴权相关,暂不处理 |
|