|
|
05b6520140
|
fix: 支付宝表单添加 HTML 转义,防止 JSON 双引号破坏属性
|
2026-05-07 16:27:27 +08:00 |
|
|
|
a588478ab0
|
fix: 修复付费会员累加逻辑和迁移误判问题
- 修复 confirm_payment_order 累加逻辑:GREATEST(COALESCE(paid_expires_at, NOW()), NOW()) + days
- 永久会员改为 2099-12-31 而非 NULL,避免与未付费用户的 NULL 混淆
- 禁用 003_set_all_users_paid.sql 迁移(将所有已有用户设为永久付费)
- 后端部署后已回滚 Dev 数据库中 73 个被误设为付费的用户
|
2026-05-07 15:55:37 +08:00 |
|
|
|
d884914338
|
fix: 支付宝表单使用原始值,浏览器自动处理URL编码
修复 double-encoding 问题:表单 hidden input 不应预先 URL 编码,
浏览器提交时会自动编码,预编码会导致二次编码(如空格变 %2520)
|
2026-05-07 15:37:51 +08:00 |
|
|
|
7a194251be
|
fix: 支付宝签名使用原始值,改用表单自动提交方式
- 修复签名源:使用原始参数值(不进行 URL 编码)
- 改用 HTML 表单自动提交方式代替服务器端 API 调用
- 避免 nginx 代理大响应体的问题
|
2026-05-07 15:19:34 +08:00 |
|
|
|
2046638721
|
feat: 实现 Mock 支付功能,修复支付激活会员问题
- 当未配置 ALIPAY_* 环境变量时,自动启用 Mock 支付模式
- Mock 支付页面点击按钮后调用 /api/payment/mock-confirm 激活会员
- 更新 AGENTS.md 文档说明 Mock 支付配置和使用方法
|
2026-04-28 10:17:26 +08:00 |
|
|
|
ef246db31c
|
fix: 修复支付宝 RSA2 签名问题
- 支持 base64 编码的 PEM 格式私钥(systemd 环境变量)
- 使用 Digest + Pkcs1v15Sign::new() 进行签名(自动哈希)
- 修复 rsa2_sign 和 rsa2_verify 函数实现
|
2026-04-27 14:27:14 +08:00 |
|
|
|
00fea53a4c
|
fix: 修复支付宝 RSA 签名失败问题
- 支持 base64 编码的 PEM 格式私钥(用于 systemd 环境变量)
- RSA 签名/验证前需先用 Sha256::digest() 哈希输入
- 添加 Digest trait 导入
|
2026-04-27 13:53:18 +08:00 |
|
|
|
580e68b58c
|
feat(payment): 支持 URL 参数直接传递 JWT 登录
|
2026-04-27 13:13:32 +08:00 |
|
|
|
48ed2ca9ea
|
fix(main): 修正 create_server_config 函数结构
|
2026-04-27 09:26:51 +08:00 |
|
|
|
bb20d82d49
|
fix(auth): 修复 web::scope("") 路由顺序导致 web-login 被 JWT 拦截的问题
|
2026-04-27 09:25:14 +08:00 |
|
|
|
aa84bbc4e6
|
feat(auth): 修复网页端登录流程,移除 web_generate_login_code 的 JWT 依赖
|
2026-04-27 09:08:25 +08:00 |
|
|
|
e6048ea010
|
feat(auth): 实现登录限流和性能优化
性能优化:
- 添加数据库索引优化查询性能 (006)
- weather_data: user_id, date, is_favorite 索引
- users: openid 索引
- payment_orders: status 索引
- 新增 refresh_tokens 表支持双 Token 机制 (004)
- 新增 web_login_codes 表支持网页端扫码登录 (005)
安全增强:
- 实现基于 IP 的登录限流 (rate_limiter.rs)
- 滑动窗口算法: 5次/分钟/IP
- 自动清理过期记录
- 429 TooManyRequests 响应
新模块:
- src/rate_limiter.rs: 限流模块
- src/alipay.rs: 支付宝签名模块 (RSA2)
- src/error.rs: 统一错误类型 (含 TooManyRequests)
- src/handlers/meta.rs: 元数据处理器
代码清理:
- 修复 .gitignore 规则,正确跟踪 src/ 和 migrations/
|
2026-04-24 16:13:49 +08:00 |
|
|
|
693075a30c
|
fix(auth): 将 web_login_confirm 移出 JWT scope,无需认证
登录码本身就是认证凭证,小程序确认时可能无有效 JWT。
改为无需 JWT,登录码 + openid 验证即可。
|
2026-04-24 14:48:30 +08:00 |
|
|
|
3bcfd9a4e6
|
fix(auth): web_login_confirm 加日志排查 + 精确匹配code
|
2026-04-24 14:27:26 +08:00 |
|
|
|
92fb4e3687
|
fix(auth): web_login_confirm 查询改为精确匹配 code,修复 unwrap_or(None) 问题
|
2026-04-24 11:01:16 +08:00 |
|
|
|
c66d1303ef
|
fix(auth): 统一登录码参数名为 code(与前端保持一致)
|
2026-04-24 10:56:33 +08:00 |
|
|
|
034aa66ed8
|
feat(payment): 实现网页端登录码流程(无需微信登录)
- 新增 GET /payment/generate-code:网页端生成 ASD-XXXXXX 登录码
- 新增 GET /payment/login-status:网页轮询查询登录码确认状态
- web_generate_login_code 和 web_login_confirm 增加 JWT 保护
- payment_index JS 改为真实调用 generate-code 并轮询
- 添加 rand crate 依赖
|
2026-04-24 10:51:06 +08:00 |
|
|
|
31bafee0ab
|
feat(payment): 重构网页端支付登录流程——小程序生成临时码、网页端扫码确认
- 后端新增 /api/web-login/code (生成临时登录码) 和 /api/web-login/confirm (确认登录)
- 后端新增 /payment/login-status (GET, 轮询登录状态)
- payment_index 页面完全重写:未登录时显示微信扫码登录入口;登录后显示套餐或会员信息
- 沙箱环境下 /payment 通过 mock-login 跳过真实微信认证,方便测试
|
2026-04-24 09:43:18 +08:00 |
|
|
|
ea705f0917
|
feat(auth): 添加沙箱测试用 mock_login 接口 (GET /api/mock-login)
|
2026-04-23 13:11:10 +08:00 |
|
|
|
502ae8babb
|
fix(payment): payment_page支持URL参数传递JWT,payment_index页面跳转时携带JWT
|
2026-04-23 12:34:39 +08:00 |
|
|
|
e8286310ea
|
feat(payment): 接入支付宝沙箱环境 (alipay.trade.page.pay)
|
2026-04-23 12:23:53 +08:00 |
|
|
|
8c9552fbfc
|
feat: 新增支付页面接口,为接入支付宝做准备
- GET /payment: 套餐选择页(无需认证,外部浏览器打开)
- GET /payment/page: 支付引导页(需 JWT,创建订单)
- GET /payment/pay: 支付宝电脑网站支付占位页(需 JWT)
- AppState 新增支付宝配置字段(可选)
- afterbody.js: PDF下载增加状态提示和重试按钮
|
2026-04-23 10:48:31 +08:00 |
|
|
|
9974bfbf58
|
fix(config): 移除代码中的 app_version 引用,完成版本管理统一
- config.rs: 移除 AppConfig.app_version 字段和日志输出
- main.rs: 移除 APP_VERSION 环境变量设置
- models.rs: 移除 AppState.app_version 字段
版本号现统一使用 Cargo.toml 中的 env!("CARGO_PKG_VERSION")
|
2026-04-19 20:50:56 +08:00 |
|
|
|
14c2ef25de
|
fix(auth): /weather/details 端点自己验证 JWT(修复静默刷新后仍 401 问题)
问题:/weather/details 不在 jwt_middleware 保护范围内,导致即使前端发送 Authorization header,后端也不会验证 JWT。
修复:使用 HttpRequest 直接从 Authorization header 提取并验证 JWT,而非依赖 middleware 注入的 Claims。
验证:curl 测试确认 /weather/details?id=2 返回正确数据
|
2026-04-19 17:34:35 +08:00 |
|
|
|
e14c85436b
|
feat(auth): 添加 Refresh Token 双 Token 机制
- 添加 /api/refresh-token 接口支持 Token 续期
- 登录接口返回 access_token 和 refresh_token
- 新增 refresh_tokens 表存储 refresh_token
- 部署脚本添加数据库备份和迁移功能
- deploy.sh 添加 4 项 API 测试
- 更新 AGENTS.md 文档
|
2026-04-19 16:01:41 +08:00 |
|
|
|
52991dcfd5
|
fix(api): 优化 /health 端点错误提示
|
2026-04-19 00:38:13 +08:00 |
|
|
|
9d452c4e75
|
feat: 统一前后端日志和错误处理
|
2026-04-19 00:14:22 +08:00 |
|
|
|
fd21e641a2
|
fix: 将 get_weather_details 和 health_check 移出 JWT 保护作用域作为公开接口
|
2026-04-18 14:04:49 +08:00 |
|
|
|
61b1174b30
|
fix: 统一字段命名为 camelCase 并修复详情 API
- models.rs: 将 inspectiontype/assignmentnumber 的 serde rename 改为
inspectionType/assignmentNumber,与前端 TypeScript 接口保持一致
- models.rs: 为 WeatherDataBrief 添加 isFavorite 字段支持
- models.rs: WeatherData.is_favorite 添加 skip_deserializing 避免 POST
请求解析失败,同时使用 default 处理数据库 NULL 值
- handlers/weather.rs: get_weather_details 支持 string 和 number 类型的
id 参数解析
- IMPROVEMENTS.md: 新增第十三章记录本次对话经验(serde 配置、config
路径解析、TOML 结构等)
|
2026-04-17 20:47:00 +08:00 |
|
|
|
bdbba2cd60
|
feat: 添加收藏功能 API
- models.rs: 添加 is_favorite 字段到 WeatherData 和 WeatherDataBrief
- db.rs: 添加 get_favorites_list 和 set_weather_favorite 函数
- handlers/favorites.rs: 新建收藏 API 处理器
- handlers/mod.rs: 导出 favorites 模块
- main.rs: 注册收藏 API 路由
|
2026-04-17 17:40:58 +08:00 |
|
|
|
562528a1f0
|
feat: implement payment order system (create-order, mock-confirm, get-quota)
|
2026-04-17 12:45:53 +08:00 |
|
|
|
da4e6f557e
|
feat: 实现后端多环境配置机制
- 使用 toml crate 替代 config crate 直接读取配置文件
- 创建 config/default.toml、config/development.toml、config/production.toml
- 重写 config.rs 支持多环境配置加载
- 增强 deploy.sh 支持 development/production 环境参数
- 更新 IMPROVEMENTS.md 标记环境区分完成
|
2026-04-17 11:11:13 +08:00 |
|
|
|
ef47232b1e
|
feat: 添加图片 Content-Type 支持 (png/jpg/gif/svg/webp)
|
2026-04-15 13:18:43 +08:00 |
|
|
|
a819a0db91
|
fix: 调整路由顺序,修复静态文件被JWT拦截的问题
- 将 /static/{tail:.*} 路由移到受保护 scope 之前
- 确保静态文件无需认证即可访问
|
2026-04-15 11:51:59 +08:00 |
|
|
|
e8990f7771
|
fix: 隐藏内部错误信息,防止敏感数据泄露
- 移除 ErrorResponse.errmsg 中的 e.to_string() 调用
- 将详细的内部错误信息改为 None,用户看不到内部详情
- 错误详情仍然记录到 JSON 日志,供开发者排查
- 健康检查端点也使用友好的错误信息
- 更新 IMPROVEMENTS.md 标记 1.3 完成
影响范围:
- src/main.rs: login handler (2处)
- src/main.rs: health_check handler (1处)
|
2026-04-15 11:11:16 +08:00 |
|
|
|
6b871ca4d6
|
refactor: 整理路由配置,分离公开接口与受保护接口
- 登录和天气详情接口移至公开区域
- 其他接口统一在 web::scope("") 下受 JWT middleware 保护
- 静态文件和健康检查移至最后
- 为 actix-ratelimit 兼容性问题做准备(当前无法在 actix-web 4.x 使用)
注意:Rate Limiting 功能暂未实现(actix-ratelimit 与 actix-web 4.x 不兼容)
|
2026-04-15 11:05:21 +08:00 |
|
|
|
338871796a
|
feat: 添加 /health 健康检查端点
- 新增 GET /health 端点,公开无需认证
- 检查 PostgreSQL 数据库连接状态
- 健康时返回: {"status": "healthy", "database": "connected"}
- 不健康时返回 HTTP 503 + {"status": "unhealthy", "database": "disconnected", "error": "..."}
- 失败时记录错误到 JSON 日志
- 用于负载均衡器、Kubernetes、1Panel 健康探针
- 更新 IMPROVEMENTS.md 标记 6.3 完成
|
2026-04-15 10:49:15 +08:00 |
|
|
|
741d6acff1
|
feat: 升级日志系统为 tracing 结构化日志
- 替换 env_logger 为 tracing + tracing-subscriber
- 统一使用 tracing::{debug, error, info, warn} 日志宏
- 消除所有 eprintln!/println 调用
- 添加 JSON 格式日志输出便于 ELK Stack 收集
- 添加文件日志轮转(每天一个新文件 ./logs/rust-backend-{date}.log)
- 日志等级过滤:rust_backend=info, actix_web=info, sqlx=warn
- 更新 IMPROVEMENTS.md 标记 6.1 日志系统两项完成
|
2026-04-15 10:39:30 +08:00 |
|
|
|
ce34896525
|
fix: 修复calculatedwindspeed字段命名不匹配问题
- 后端serde添加alias以接受camelCase、snake_case和原始数据库字段名
- 前端移除调试日志
- 修复afterbody.js中引用calculatedwindspeed→calculatedWindSpeed
|
2026-04-14 10:55:56 +08:00 |
|
|
|
6d2824589c
|
feat: 添加用户信息存储功能
- 添加 avatar_url 和 nickname 字段到 users 表
- 修改 get_user_by_id 查询包含新字段
- 添加 save_user_profile API
- 优化 deploy.sh 默认使用 release 模式
|
2026-03-26 14:28:46 +08:00 |
|
|
|
fe514ebfc4
|
fix: 修复 desc 保留关键字导致的 SQL 语法错误
desc 是 PostgreSQL 保留关键字,需要加双引号转义
|
2026-03-25 17:15:17 +08:00 |
|
|
|
34f698ded2
|
feat: 添加获取当前用户信息 API
新增 GET /api/user/profile 接口
- 返回用户付费状态和管理员标识
- 计算付费是否有效(考虑过期时间)
|
2026-03-25 16:08:39 +08:00 |
|
|
|
fa34e6597f
|
添加管理员API端点
- .env 添加 FREE_USER_DATA_LIMIT 配置
- 新增 GET /api/admin/users/{id} 管理员获取用户信息
- 新增 PUT /api/admin/users/{id}/payment 更新用户付费状态
- post_weather_data 集成 JWT 认证,使用 claims.user_id
- 管理员接口通过数据库查询验证 is_admin
|
2026-03-25 13:17:53 +08:00 |
|
|
|
484146aba9
|
支付系统核心:配额限制与用户付费状态管理
- 添加 tokio 依赖用于异步测试
- 启用 User 结构体,添加 is_paid/is_admin/paid_expires_at 字段
- 添加 UpdatePaymentRequest 请求体
- insert_weather_data 集成配额检查逻辑
- 新增 get_user_by_id、count_user_weather_data、update_user_payment_status
- 添加 payment_fields 数据库迁移脚本
|
2026-03-25 13:17:36 +08:00 |
|
|
|
67c3be3c9e
|
在数据库中添加了Version字段,并修改前端,不再使用指定的Version
|
2026-01-08 14:12:34 +08:00 |
|
|
|
f7450bce7f
|
修改了服务只监听本地端口
|
2025-10-21 10:07:32 +08:00 |
|
|
|
9e76976a56
|
修改了端口
|
2025-10-21 09:28:42 +08:00 |
|
|
|
a99fb905ec
|
修改了point_height以支持可选值
|
2025-10-18 10:21:59 +08:00 |
|
|
|
edf6200acd
|
修改了不规范的temp_token返回
|
2025-10-17 23:59:49 +08:00 |
|
|
|
9ff20c16c3
|
删除了多余的info
|
2025-10-17 22:51:49 +08:00 |
|