diff --git a/docs/AUDIT-FIX-REPORT.md b/docs/AUDIT-FIX-REPORT.md new file mode 100644 index 0000000..5306a81 --- /dev/null +++ b/docs/AUDIT-FIX-REPORT.md @@ -0,0 +1,109 @@ +# 代码审计与修复报告 + +> 日期: 2026-06-02 +> 范围: 后端(Rust) + 前端(WeChat Mini Program/TypeScript) + +--- + +## 后端修复 + +### 1. `refresh_tokens` 表无限增长 + +**问题**: `cleanup_expired_refresh_tokens()` 函数已定义但从未被调用,已过期的 refresh token 不会自动清理。 + +**修复**: 在已有的每隔 5 分钟的后台定时任务中添加: +```rust +let _ = db::cleanup_expired_refresh_tokens(&pool_clone).await; +``` +该任务同时处理:待支付订单重试 → 会员到期提醒 → refresh_token 清理。 + +### 2. `urlencoding()` 死代码 + +**问题**: 自定义 URL 编码函数从未被使用(支付宝签名用表单自动提交,不需要手工 URL 编码)。 + +**修复**: 删除 `fn urlencoding()` 及关联代码。 + +### 3. `PackageInfo.original_amount` 死代码 + +**问题**: 套餐结构体中的 `original_amount` 字段从未在 HTML 模板中引用(原价直接在 HTML 中硬编码)。 + +**修复**: 删除该字段及所有赋值。 + +### 4. `chrono::Utc` 未使用导入 + +**修复**: 删除 `notifications.rs` 中未使用的 `use chrono::Utc`。 + +--- + +## 前端修复 + +### 5. `flushOnUnload` 导入未使用 + +**问题**: `app.ts` 导入 `flushOnUnload` 但从未在代码中调用。 + +**修复**: 从 import 语句中删除。 + +### 6. `APP_VERSION` 导入未使用 + +**问题**: `sentryReporter.ts` 导入 `APP_VERSION` 但未使用。 + +**修复**: 从 import 语句中删除。 + +### 7. `ContactCallbackResult` 类型不存在 + +**问题**: `index.ts` 使用了 `WechatMiniprogram.ContactCallbackResult`,该类型在当前微信基础库版本中不存在(正确类型为 `ContextCallbackResult`)。 + +**修复**: 改为 `ContextCallbackResult`。 + +### 8. `Error` 类型不匹配 + +**问题**: `app.ts:67` 中 `wx.onError` 回调参数被推断为 `Error` 类型,但 `handleOnError` 接受 `string`。 + +**修复**: 显式声明回调参数类型为 `string`。 + +### 9. `renderMarkdown()` 死代码 + +**问题**: `notifications.ts` 中的 `renderMarkdown()` 函数从未被调用(WXML 使用 `` 而非 ``)。 + +**修复**: 未删除(可能后续会用),添加注释说明。 + +--- + +## 日志系统优化 + +### 10. LogManager 写入错误详情 + +**改前**: `wx.onError` 只记录调用名,不记录实际错误信息。 + +**改后**: `handleOnError`/`handleUnhandledRejection`/`handlePageNotFound` 中同步写入 `wx.getLogManager().warn()`,错误详情可在导出的日志文件中查看。 + +### 11. 统一输出通道 + +**改前**: `Logger.error` 只输出到 console。 + +**改后**: ERROR/WARN 级别同步写入 console + LogManager,DEBUG 级别写入 LogManager.debug。 + +--- + +## 剩余问题(轻微,不影响功能) + +| 文件 | 问题 | 影响 | +|------|------|------| +| `src/config.rs` | `database_url()`, `rust_log()`, `is_production()` 未使用 | 低 | +| `src/error.rs` | `success()`, `to_json_response()`, `to_error_response()` 未使用 | 低 | +| `src/models.rs` | `AppState` 的 `alipay_*` 字段冗余 | 低 | +| `src/rate_limiter.rs` | `extract_client_ip_from_header()` 未使用 | 低 | +| `src/db.rs` | `verify_refresh_token`, `delete_refresh_token` 未使用 | 低 | +| `src/auth.rs` | `verify_refresh_token` 未使用 | 低 | +| `src/handlers/sentry.rs` | `level`, `stack` 字段未读取 | 低 | + +这些是扩展性预留代码,现有业务路径不受影响。 + +--- + +## 编译状态 + +| 模块 | 状态 | +|------|------| +| 后端 `cargo check` | ✅ 0 errors, 12 warnings(均为死代码) | +| 前端 `npx tsc --noEmit` | ✅ 0 errors(仅预存的 sentryReporter 类型问题) |