Commit Graph

182 Commits

Author SHA1 Message Date
28033bc432 refactor: 清理is_paid/paid_expires_at旧字段引用(scripts+service文件) 2026-05-26 10:02:10 +08:00
c9c9cc04de refactor: config.rs去掉TOML文件加载,统一走systemd Environment 2026-05-25 16:39:46 +08:00
83f51d349c fix: dev服务切换到milkydata_dev数据库(隔离生产) 2026-05-25 16:35:03 +08:00
da4af50b45 fix: mock_login支持X-Mock-Key请求头鉴权 + deploy自动配置随机密钥 2026-05-25 16:27:01 +08:00
a9be70aabc fix: deploy工具service文件命名对齐 + 重命名dev服务文件 2026-05-25 15:37:53 +08:00
722ab837d0 refactor: is_paid→is_member, paid_expires_at→membership_expires_at 全局重命名 2026-05-25 15:33:31 +08:00
94ad9ba190 fix: payment_page支持resume参数复用已有待支付订单 2026-05-25 14:59:33 +08:00
ae46e0b0fc fix: sync-order仅查询状态不确认订单(防止误激活) 2026-05-25 14:50:43 +08:00
4240bb6970 refactor: deploy工具适配systemd service模式-移除.env依赖 2026-05-25 14:46:07 +08:00
216dd365f6 fix: dev数据库连接改用内网127.0.0.1 2026-05-25 14:31:34 +08:00
61e8b5aab7 docs: 添加systemd service文件备份(deploy/) 2026-05-25 14:19:06 +08:00
d5f87d3d85 fix: rsa2_sign后备逻辑改为from_pkcs8_der(支持裸Base64私钥) 2026-05-25 14:13:32 +08:00
e6e04979dc fix: get_user_quota 返回 was_paid 字段 2026-05-25 13:45:55 +08:00
fed95531fe fix: 维护模式使用500条临时限额而非完全跳过(防滥用) 2026-05-25 13:34:40 +08:00
f82dd8d5de feat: 添加PAYMENT_MAINTENANCE_MODE维护模式 + ServiceUnavailable错误 2026-05-25 13:32:16 +08:00
72cbb8ff28 fix: 添加用户取消订单 + 管理员手动退款端点 2026-05-25 13:09:54 +08:00
5f3b919e92 fix: 添加后台定时重试 + 管理员强制确认 + 审计日志 + mock守卫 2026-05-25 13:04:19 +08:00
af2837e15e fix: 修复付费机制失效处理的5个后端缺口
- 新增POST /payment/refund-notify支付宝退款Webhook
- 新增待支付订单自动清理(超过24h→cancelled, 含启动清理)
- 新增web登录码过期启动清理
- 永久会员用NULL替代硬编码2099-12-31
- 修复缺失的is_paid_active数据库函数(改用内联SQL)
2026-05-25 12:07:15 +08:00
f9f1ffeff6 refactor: deploy.sh 拆分为模块化结构
- deploy.sh: 从 1574 行精简至 141 行,仅保留主流程编排
- lib/common.sh: 基础设施(日志/SSH复用/备份/上传/迁移/服务管理)
- lib/test.sh: 6 项部署后测试函数
- 迁移系统改用 _migrations 追踪表替代文件名模式匹配
- 所有 SSH 操作复用 ControlMaster socket
2026-05-18 10:09:40 +08:00
2616bcc69e ci: 添加 Gitea Actions workflow(推送自动构建/部署)
- .gitea/workflows/deploy.yaml
- 支持 master/production 和 beta/development 分支
- 自动构建→测试→备份→部署→迁移→重启→健康检查
2026-05-18 10:02:11 +08:00
41b3aa6177 docs: 更新 weather_data 表文档(spotcheckcount 字段) 2026-05-18 09:53:08 +08:00
54484482c3 feat: 抽测风速改为用户可自定义次数(增删按钮)
- models.rs:新增 spot_check_count 字段(默认 5)
- db.rs:INSERT/SELECT 添加 spotcheckcount 列
- migrations/007:ALTER TABLE weather_data ADD spotcheckcount
- afterbody.js:使用 data.spotCheckCount 动态渲染抽测数据
2026-05-18 09:51:43 +08:00
5dce0e3332 fix: sentry init 日志从 info! 改为 eprintln!(tracing 初始化前不输出) 2026-05-14 10:59:48 +08:00
moira
f8a95c7417 feat: 集成 Sentry 错误监控 + 前端错误上报中继
后端:
  - Cargo.toml 添加 sentry/sentry-actix/sentry-tracing (v0.48)
  - main.rs 条件初始化 Sentry(SENTRY_DSN 环境变量控制)
  - 新增 handlers/sentry.rs — POST /api/sentry/events 前端中继端点
  - sentry-actix 全局中间件 + sentry-tracing 自动捕获 tracing::error!
  - .env.example 添加 SENTRY_DSN / SENTRY_TRACES_SAMPLE_RATE 配置

前端:
  - 新增 utils/sentryReporter.ts (批量上报/防抖/开发环境跳过)
  - app.ts 全局错误处理接入 Sentry (wx.onError/onUnhandledRejection/onPageNotFound)

Sentry 未配置 DSN 时完全无操作,无性能开销
2026-05-14 10:12:09 +08:00
moira
27c8979690 fix: 全量代码审计修复—安全/死代码/错误处理/配置净化
P0 安全修复:
  - 支付宝回调验签 (alipay_notify BTreeMap + rsa2_verify)
  - JWT fallback 'default_secret' 改为 .expect() (panic保底)
  - 安全响应头中间件 (CSP/X-Frame-Options/HSTS)

P1 死代码清理:
  - 移除孤儿文件 src/alipay.rs (284行, 无mod注册)
  - 移除Cargo未使用依赖 (actix-files/error/log/hex/digest)
  - log::info! → tracing::info! (auth.rs)
  - 移除 config.rs server_host + 3个TOML定义

P1 质量修复:
  - 修复 weather.rs unwrap() → unwrap_or
  - 修复 auth.rs+payment.rs 错误吞咽 (add tracing::warn)
  - 修复 main.rs 3x parse().unwrap → unwrap_or

P3 运维:
  - 新增 scripts/backup-db.sh (定时备份用)
  - 新增 README.md (快速入门文档)
  - deploy.sh 集成 backup-db.sh 上传
2026-05-13 17:20:31 +08:00
moira
cb483298d5 feat: 新增deploy.sh --init-env一键初始化.env+完善JWT_SECRET管理文档
新增 --init-env 功能:
  - 自动生成 256 位随机 JWT_SECRET (openssl rand -base64 32)
  - 推送完整.env模板到服务器,设置权限600
  - 文件已存在时先备份再覆盖,有确认提示
  - dry-run 模式下安全预览

JWT_SECRET 管理方案:
  - dev/prod 使用不同密钥
  - 仅在服务器.env中存储(不进入Git/TOML)
  - deploy.sh check_env_file() 部署前自动验证
  - AGENTS.md 新增完整管理文档(生成/存储/验证/轮换)

deploy.sh 帮助文档同步更新 --init-env 说明
2026-05-13 15:31:23 +08:00
moira
0ffe2065e1 feat: 部署脚本添加.env文件健康检查
新增 check_env_file() 函数,在编译前自动检查:
1. .env 文件是否存在
2. 必需变量是否定义(生产环境额外要求SSL_KEY_PATH/SSL_CERT_PATH)
3. 变量值是否为占位符(your_/placeholder/xxx等)
4. 变量行是否被注释(# VAR=)

检查失败时终止部署,防止因缺少密钥导致服务无法启动
2026-05-13 15:21:22 +08:00
moira
bded0113ee refactor: 配置安全加固-从TOML移除密钥+去除死代码+统一端口
P0: 从config/production.toml和config/development.toml移除wechat_secret/jwt_secret
    这些密钥现在仅通过.env(EnvironmentFile)加载,不再进入Git历史
    config.rs: 新增直接环境变量名回退(JWT_SECRET而非仅APP_JWT_SECRET)
    
P1: - 移除config.rs中的server_ports字段(死代码,未被任何代码使用)
    - 简化main.rs端口fallback: 生产环境仅4433,开发环境仅8080/3000
    - .env.example版本号0.2.3→0.3.0
    
Docs: - AGENTS.md测试域名xmclassmate.top/dev→dev.xmclassmate.top
2026-05-13 15:17:45 +08:00
moira
d879b65662 docs: 添加版本控制约束-使用jj提交变更 2026-05-13 14:52:08 +08:00
061c2bbb5a fix: 修复多处代码质量问题-移除unwrap/println/dead-code/重复代码/错误吞咽 2026-05-11 13:38:41 +08:00
0cba52f545 docs: 更新后端AGENTS.md-补齐auto-confirm/sync-order/orders API/修复支付流程和部署表 2026-05-11 09:40:39 +08:00
2c66528205 fix: goPay 加载状态、轮询 5min 超时;成功页已有小程序引导 2026-05-07 17:33:30 +08:00
df64877a5d fix: 推荐标签移到包年;清理永久套餐的残留 CSS 2026-05-07 17:30:11 +08:00
e074171d44 fix: 网页端套餐只保留包月和包年,移除永久 2026-05-07 17:26:16 +08:00
28dc46ad95 feat: 添加 expire-paid-user.sh 脚本,使用户付费时间过期 2026-05-07 17:20:43 +08:00
228a9f3b3b feat: 添加 GET /api/payment/orders 接口,返回用户订单记录 2026-05-07 17:12:31 +08:00
a05b46dfe2 feat: 添加 POST /api/payment/sync-order 接口,用于强制同步订单会员状态 2026-05-07 16:58:55 +08:00
c82bb303f7 fix: payment/success 同步确认订单(防止异步回调未到) 2026-05-07 16:52:41 +08:00
aab0377b3a fix: 支付宝表单 method 改为 GET(沙箱 page.pay 不支持 POST) 2026-05-07 16:39:31 +08:00
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
4aece40a58 docs: 修复 AGENTS.md 文档过时问题
- 项目结构图添加 rate_limiter.rs 文件
- 修复 systemd 说明:实际使用 EnvironmentFile= 而非 Environment=
2026-05-06 09:37:37 +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