Files
bishe-STM32/docs/07_后续优化路线.md
T
2026-05-01 20:29:02 +08:00

7.8 KiB

后续优化路线

本文档记录当前项目在“可继续优化但非当前阻塞”的方向,方便后续开发、答辩扩展或二次重构时逐项推进。

1. 当前架构状态

当前项目已经完成以下核心升级:

  • API 已统一到 /api/v1/...,旧 /api/... 仅作为服务端内部兼容层。
  • 服务端使用 attendance.db 作为主存储,旧 CSV/JSON 文件仅作为首次迁移来源。
  • 服务端维护全局同步版本,Qt、STM32、K210 按 last_version 增量同步。
  • K210 删除人脸使用待删除任务和 ACK 确认。
  • K210 新增人脸照片先保存到本地 /sd/face_photos/,再补传服务端。
  • Qt 端照片由 ApiClient 携带鉴权头下载并缓存为本地 file:// 地址显示。
  • 服务端提供 /api/v1/system/storage 和 /api/v1/sync/version 用于调试存储和同步状态。

结论:当前架构已经适合联调、演示和毕业设计答辩。后续优化以工程质量、稳定性和可维护性为主,不建议在演示前集中大改。

2. 优化优先级

优先级 方向 当前是否建议立即做 主要收益
P1 服务端 JSON 解析换成 nlohmann/json 暂缓 降低手写解析风险,提升维护性
P1 数据库自动备份与恢复文档 可做 防止误删或调试破坏数据
P2 同步版本按模块拆分 暂缓 降低无关数据重复同步
P2 删除任务 task_id 化 暂缓 删除同步更严谨,避免 ID 歧义
P2 设备同步 ACK 状态表 暂缓 可追踪每台设备同步进度
P2 外部配置文件/环境变量统一管理 可做 降低硬编码凭据风险
P3 HTTPS/反向代理部署 视部署环境 公网安全性更好
P3 自动化测试脚本 可做 回归验证更方便
P3 Qt 同步状态面板 可做 调试体验更好

3. 服务端 JSON 库化

当前状态:

  • 服务端部分请求解析和响应构造仍使用字符串查找和手写 JSON 拼接。
  • 已有 jsonEscape(),可以避免大多数响应字符串破坏。
  • SQLite 已解决 CSV/多 JSON 文件存储不一致问题。

建议方案:

  • 引入 nlohmann/json 单头文件版本。
  • 文件建议放到:
server/third_party/json.hpp
  • 服务端引用方式:
#include "third_party/json.hpp"
using json = nlohmann::json;

建议分阶段替换:

  1. 替换签到请求体解析:/api/v1/attendance/checkins
  2. 替换时间段保存校验:/api/v1/config/time-slots
  3. 替换人脸映射保存:/api/v1/faces/mappings
  4. 替换同步 ACK 解析:/api/v1/sync/ack
  5. 最后替换大型响应构造:/api/v1/sync/state

注意事项:

  • nlohmann/json 不需要额外链接库,只需要头文件。
  • 引入后编译命令通常不变。
  • 不建议一次性替换所有 JSON 逻辑,容易引入新问题。

4. 同步版本拆分

当前状态:

  • 服务端维护一个全局同步版本。
  • 任何数据变化都会让 Qt、STM32、K210 看到版本变化。
  • 对当前规模足够清晰,也方便调试。

后续可升级为:

records_version
config_version
faces_version
delete_tasks_version

收益:

  • STM32 只关心 config_version。
  • K210 只关心 faces_version 和 delete_tasks_version。
  • Qt 可按模块决定是否刷新记录、配置、照片。

代价:

  • 服务端同步响应结构要调整。
  • Qt、STM32、K210 都要保存多个版本号。
  • 调试复杂度会上升。

建议:当前不急,除非后续记录量明显变大或同步频率变高。

5. 删除任务 task_id 化

当前状态:

  • 待删除任务以 face_id 列表形式保存。
  • K210 删除成功后通过 ACK 返回已删除 ID。

后续可升级为:

{
  "task_id": "delete_20260501_0001",
  "face_id": "1",
  "student_id": "20210001",
  "created_at": "2026-05-01 14:30:00",
  "status": "pending"
}

收益:

  • 删除任务可追踪。
  • 重复删除、重新添加同 ID 时更不容易混淆。
  • 可以在 Qt 端显示待删除任务状态。

建议表结构:

CREATE TABLE delete_tasks (
    task_id TEXT PRIMARY KEY,
    face_id TEXT NOT NULL,
    student_id TEXT,
    status TEXT NOT NULL,
    created_at TEXT NOT NULL,
    ack_at TEXT
);

建议:如果后续要增强多设备同步审计,再做。

6. 设备同步状态表

当前状态:

  • 各设备本地保存自己的 last_version。
  • 服务端不记录每台设备最后同步到哪个版本。

后续可增加:

CREATE TABLE device_sync_state (
    client TEXT PRIMARY KEY,
    last_seen_version INTEGER,
    last_ack_version INTEGER,
    last_seen_at TEXT
);

收益:

  • 可以知道 K210、STM32、Qt 是否长期未同步。
  • 服务端可以在 /api/v1/system/storage 中显示设备同步状态。
  • 方便做 Qt 同步状态面板。

建议:当前不是必须,适合作为后续展示增强。

7. 数据库备份与恢复

当前手动备份命令:

sqlite3.exe attendance.db ".backup attendance_backup.db"

后续可增加:

  • 服务端启动时自动备份前一天数据库。
  • Qt 端提供“导出数据库备份”按钮。
  • 文档中增加恢复步骤。

恢复示例:

Copy-Item attendance_backup.db attendance.db

注意:恢复前应先停止服务端,避免写入冲突。

8. 配置外部化

当前仍存在部分硬编码配置:

  • K210 WiFi 名称和密码。
  • K210 服务端 IP 和端口。
  • STM32 服务端 IP、WiFi、班级 ID。
  • 默认 X-Api-Token。
  • AES Key/IV。

建议方向:

  • 服务端继续使用环境变量管理:
ATTENDANCE_API_TOKEN
ATTENDANCE_CORS_ORIGIN
  • K210 可使用 /sd/config.txt 保存 WiFi、服务端和 token。
  • STM32 可集中放在 User/main.c 顶部,并在文档中标记部署必改项。
  • Qt 可在设置页保存服务端地址,token 可后续加入设置项。

建议:真实公网部署前必须轮换默认 token、WiFi 密码和 AES Key/IV。

9. Qt 同步状态面板

后续可在 Qt 管理端增加一个调试/状态区域,展示:

  • 服务器连接状态。
  • 当前服务端同步版本。
  • 最近同步时间。
  • records 数量。
  • face_mappings 数量。
  • face_photos 数量。
  • pending_deletes 数量。

数据来源:

GET /api/v1/system/storage
GET /api/v1/sync/version

收益:

  • 联调时不用一直看服务端日志。
  • 演示时可以直观看到多端同步状态。

10. 自动化测试

当前已有手动 curl 文档:

docs/06_后端接口Windows测试命令.md

后续可增加脚本化测试,但不要替代手动文档:

  • Windows PowerShell 测试脚本。
  • Linux shell 测试脚本。
  • 服务端启动后自动测试 health、storage、records、time-slots、sync/state。

建议先保持手动命令文档为主,因为硬件联调环境经常变化。

11. 暂不建议立刻做的优化

以下方向有价值,但当前阶段不建议马上做:

  • 删除旧 /api/... 兼容层:会降低调试容错,建议答辩后再考虑。
  • 全量重写同步协议:当前全局版本方案已经足够。
  • 把照片二进制直接存 SQLite:会让数据库变大,当前文件系统存照片、SQLite 存元数据更合适。
  • 一次性替换所有 JSON 逻辑:风险高,建议分阶段。
  • 引入复杂权限系统:当前 X-Api-Token 已满足演示需求,公网正式部署再细分权限。

12. 推荐后续开发顺序

  1. 先完成 SQLite 版服务端手动编译和接口验证。
  2. 用 /api/v1/system/storage 验证记录、映射、照片、待删除任务数量。
  3. 如需继续提升服务端质量,先引入 nlohmann/json 替换请求解析。
  4. 如需继续提升演示体验,再做 Qt 同步状态面板。
  5. 如需继续提升同步严谨性,再做 task_id 删除任务和设备同步状态表。