diff --git a/IMPROVEMENTS.md b/IMPROVEMENTS.md new file mode 100644 index 0000000..de6a480 --- /dev/null +++ b/IMPROVEMENTS.md @@ -0,0 +1,330 @@ +# Rust 后端 - 改进计划 + +## 一、代码质量与架构改进 + +### 1.1 代码组织问题 +- [ ] **所有路由处理器都在 main.rs 中** + - 现状:`main.rs` 包含所有路由处理器,文件过大(800+ 行) + - 改进:按功能模块拆分到独立文件 + - `handlers/auth.rs` - 登录相关 + - `handlers/weather.rs` - 天气数据相关 + - `handlers/user.rs` - 用户相关 + - `handlers/admin.rs` - 管理员相关 + - 影响:提高代码可维护性 + +- [ ] **config.rs 是死代码** + - 现状:AGENTS.md 中提到 config.rs 未被使用 + - 改进:要么启用配置管理,要么删除该文件 + - 影响:减少代码混淆 + +### 1.2 数据库操作优化 +- [ ] **重复查询问题** + - 位置:`insert_weather_data` 中多次查询用户信息 + - 改进:合并查询或使用缓存 + - 影响:减少数据库负载 + +- [ ] **缺少数据库索引** + - 现状:未见索引定义 + - 改进:添加常用查询字段索引 + ```sql + CREATE INDEX idx_weather_data_user_id ON weather_data(user_id); + CREATE INDEX idx_weather_data_date ON weather_data(date); + CREATE INDEX idx_users_openid ON users(openid); + ``` + +### 1.3 错误处理改进 +- [ ] **错误响应格式不统一** + - 现状:部分返回 `ErrorResponse`,部分返回 JSON 字符串 + - 改进:统一使用 `ErrorResponse` 结构体 + - 彰响:前端解析更一致 + +- [ ] **错误信息暴露过多** + - 现状:部分错误直接返回数据库错误信息 + - 改进:区分用户友好错误和开发者错误 + - 影响:安全性提升 + +## 二、安全性改进 + +### 2.1 认证安全 +- [ ] **缺少请求频率限制** + - 风险:API 可能被滥用或遭受暴力攻击 + - 改进:添加 Rate Limiting 中间件 + - 实现:使用 `actix-limitation` 或自定义中间件 + - 配置: + - 登录接口:5 次/分钟 + - 数据上传:30 次/分钟 + - 查询接口:100 次/分钟 + +- [ ] **缺少 CSRF 防护** + - 风险:跨站请求伪造攻击 + - 改进:添加 CSRF Token 验证 + - 实现:对于状态变更操作验证 Token + +- [ ] **JWT Secret 管理** + - 现状:明文存储在环境变量 + - 改进:使用密钥管理服务(如 AWS Secrets Manager) + - 影响:提高密钥安全性 + +### 2.2 数据安全 +- [ ] **数据库连接字符串明文存储** + - 位置:`.env` 文件 + - 改进:使用连接字符串加密或密钥管理 + - 影响:防止凭证泄露 + +- [ ] **缺少敏感数据加密** + - 现状:用户信息明文存储 + - 改进:对敏感字段加密存储 + - 字段:手机号、姓名等 + +- [ ] **缺少审计日志** + - 需求:记录关键操作日志 + - 实现:添加审计日志表和中间件 + - 记录:登录、数据修改、管理员操作 + +### 2.3 输入验证 +- [ ] **后端输入验证不完整** + - 现状:部分依赖前端验证 + - 改进:添加完整的请求验证 + - 实现:使用 `validator` crate + +## 三、性能优化 + +### 3.1 数据库性能 +- [ ] **缺少连接池监控** + - 现状:连接池配置固定 + - 改进:添加连接池监控和动态调整 + - 指标:连接数、等待时间、超时次数 + +- [ ] **缺少查询缓存** + - 场景:用户信息、配置数据 + - 改进:添加 Redis 缓存层 + - 策略:用户信息缓存 5 分钟,配置数据缓存 1 小时 + +- [ ] **无读写分离支持** + - 需求:高并发场景下的性能优化 + - 改进:支持主从数据库配置 + - 实现:使用 sqlx 的多数据源支持 + +### 3.2 API 性能 +- [ ] **无响应压缩** + - 现状:响应未压缩 + - 改进:添加 gzip 压缩中间件 + - 实现:使用 `actix-web` 的压缩功能 + +- [ ] **缺少 API 缓存** + - 场景:天气数据列表查询 + - 改进:添加 HTTP 缓存头 + - 实现:`Cache-Control`、`ETag` 等 + +- [ ] **无 CDN 支持** + - 场景:静态资源分发 + - 改进:配置 CDN 加速 + - 资源:CSS、JS、图片、字体 + +## 四、功能完整性改进 + +### 4.1 API 功能扩展 +- [ ] **缺少批量操作接口** + - 需求:批量删除、批量查询 + - 实现:添加批量操作端点 + - 接口:`POST /weather/batch-delete`、`POST /weather/batch-query` + +- [ ] **无数据导出格式支持** + - 需求:支持 CSV、Excel 导出 + - 实现:添加导出端点 + - 接口:`GET /weather/export?format=csv` + +- [ ] **缺少搜索和过滤功能** + - 需求:按日期、标题、地点搜索 + - 实现:添加搜索参数 + - 参数:`?keyword=xxx&startDate=xxx&endDate=xxx` + +### 4.2 用户功能 +- [ ] **缺少用户活动统计** + - 需求:用户使用情况分析 + - 实现:添加统计接口 + - 数据:登录次数、数据上传量、最后活跃时间 + +- [ ] **无用户偏好设置** + - 需求:保存用户偏好(如默认区域类型) + - 实现:添加用户设置表 + - 接口:`GET/PUT /api/user/preferences` + +## 五、开发体验改进 + +### 5.1 测试覆盖 +- [ ] **仅有一个基础编译测试** + - 现状:`tests/integration_test.rs` 只有 `assert_eq!(2 + 2, 4)` + - 改进:添加完整的测试套件 + - 类型: + - 单元测试:工具函数、数据结构 + - 集成测试:API 端点 + - 数据库测试:CRUD 操作 + +- [ ] **缺少 API 测试** + - 需求:验证 API 行为 + - 实现:使用 `actix-web` 的测试工具 + - 覆盖:正常流程、异常情况、边界条件 + +### 5.2 文档完善 +- [ ] **无 API 文档** + - 需求:接口文档 + - 实现:使用 OpenAPI/Swagger + - 工具:`utoipa` crate + +- [ ] **缺少部署文档** + - 内容:环境要求、配置说明、部署步骤 + - 形式:`DEPLOYMENT.md` 文件 + +- [ ] **无变更日志** + - 内容:版本更新记录 + - 形式:`CHANGELOG.md` 文件 + +### 5.3 开发工具 +- [ ] **缺少代码质量工具** + - 工具:`clippy`、`rustfmt` + - 配置:`.clippy.toml`、`rustfmt.toml` + - 集成:CI/CD 流程 + +- [ ] **无热重载开发** + - 需求:开发时自动重载 + - 实现:使用 `cargo-watch` + - 命令:`cargo watch -x run` + +## 六、监控与运维 + +### 6.1 日志系统 +- [ ] **日志格式不统一** + - 现状:部分使用 `log` 宏,部分使用 `println` + - 改进:统一使用结构化日志 + - 实现:使用 `tracing` crate + +- [ ] **无日志聚合** + - 需求:集中式日志管理 + - 实现:配置日志收集器(如 ELK Stack) + - 格式:JSON 格式便于解析 + +- [ ] **缺少性能指标收集** + - 需求:API 响应时间、错误率等 + - 实现:添加 Prometheus 指标 + - 工具:`actix-web-prom` + +### 6.2 告警机制 +- [ ] **无异常告警** + - 需求:系统异常时通知 + - 实现:集成告警服务 + - 渠道:邮件、钉钉、企业微信 + +- [ ] **缺少资源监控** + - 需求:CPU、内存、磁盘监控 + - 实现:使用系统监控工具 + - 工具:Prometheus + Grafana + +### 6.3 健康检查 +- [ ] **缺少健康检查接口** + - 需求:负载均衡器健康检查 + - 实现:添加 `/health` 端点 + - 检查:数据库连接、服务状态 + +## 七、部署改进 + +### 7.1 部署流程 +- [ ] **部署脚本功能简单** + - 现状:仅支持基本的编译、上传、重启 + - 改进:添加回滚、备份、验证功能 + - 实现:增强 `deploy.sh` 脚本 + +- [ ] **无蓝绿部署或滚动更新** + - 需求:零停机部署 + - 实现:使用 Docker + Kubernetes + - 或者:Nginx 负载均衡 + 多实例 + +### 7.2 容器化 +- [ ] **缺少 Docker 支持** + - 需求:容器化部署 + - 实现:添加 `Dockerfile` 和 `docker-compose.yml` + - 优势:环境一致性、易于扩展 + +### 7.3 CI/CD +- [ ] **无自动化流程** + - 需求:自动测试、构建、部署 + - 实现:配置 GitHub Actions 或 Gitea Actions + - 流程:代码提交 → 测试 → 构建 → 部署 + +## 八、技术债务 + +### 8.1 高优先级 +1. [ ] **拆分 main.rs 中的路由处理器** + - 影响:代码可维护性 + - 工作量:中等 + +2. [ ] **添加请求频率限制** + - 影响:安全性 + - 工作量:小 + +3. [ ] **统一错误响应格式** + - 影响:前后端对接 + - 工作量:小 + +4. [ ] **添加数据库索引** + - 影响:性能 + - 工作量:小 + +### 8.2 中优先级 +1. [ ] **添加单元测试和集成测试** + - 影响:代码质量 + - 工作量:大 + +2. [ ] **实现 API 文档(OpenAPI)** + - 影响:开发体验 + - 工作量:中等 + +3. [ ] **添加结构化日志** + - 影响:运维 + - 工作量:中等 + +4. [ ] **优化数据库查询** + - 影响:性能 + - 工作量:中等 + +### 8.3 低优先级 +1. [ ] **实现 Redis 缓存** + - 影响:性能 + - 工作量:大 + +2. [ ] **容器化部署** + - 影响:部署流程 + - 工作量:中等 + +3. [ ] **添加监控告警** + - 影响:运维 + - 工作量:大 + +4. [ ] **实现 CI/CD** + - 影响:开发效率 + - 工作量:中等 + +## 九、检查清单 + +### 代码提交前检查 +- [ ] 通过 `cargo clippy` 检查 +- [ ] 通过 `cargo fmt` 格式化 +- [ ] 单元测试通过 +- [ ] 无硬编码的敏感信息 + +### 部署前检查 +- [ ] 数据库迁移脚本准备 +- [ ] 环境变量配置检查 +- [ ] 备份当前版本 +- [ ] 健康检查接口正常 + +### 安全检查 +- [ ] 输入验证完整 +- [ ] 错误信息不暴露敏感数据 +- [ ] 认证和授权正确 +- [ ] 日志不记录敏感信息 + +--- + +**最后更新**:2026-04-13 +**维护者**:开发团队 \ No newline at end of file diff --git a/src/models.rs b/src/models.rs index 05281e3..d06e136 100644 --- a/src/models.rs +++ b/src/models.rs @@ -149,7 +149,7 @@ pub struct WeatherData { #[sqlx(rename = "averagewindspeed")] pub average_wind_speed: f64, - #[serde(rename = "calculatedwindspeed")] + #[serde(rename = "calculatedWindSpeed", alias = "calculated_wind_speed", alias = "calculatedwindspeed")] #[sqlx(rename = "calculatedwindspeed")] pub calculated_wind_speed: Option, // 这个已经是 Option,很好 diff --git a/static/js/afterbody.js b/static/js/afterbody.js index d3ff3f4..4fb2838 100644 --- a/static/js/afterbody.js +++ b/static/js/afterbody.js @@ -299,7 +299,7 @@ ${data.hasSpotCheckWindSpeed ? `
推算风速:
-
${data.calculatedwindspeed} m/s
+
${data.calculatedWindSpeed} m/s
` } @@ -388,4 +388,4 @@ function showNotification(message, type = 'success') { setTimeout(() => { notification.style.display = 'none'; }, 3000); -} \ No newline at end of file +}