# ASD Rust Backend

大气稳定度判定系统的后端服务，基于 Rust + actix-web 4。

## 快速开始

```bash
# 1. 复制环境配置模板
cp .env.example .env
# 编辑 .env 填入实际值（数据库连接、微信凭证等）

# 2. 运行开发服务器
APP_ENV=development cargo run

# 3. 运行测试
cargo test
```

## 技术栈

| 技术 | 用途 |
|------|------|
| Rust (edition 2024) | 主力语言 |
| actix-web 4.11 | Web 框架 |
| sqlx 0.8.6 | PostgreSQL 数据库驱动 |
| jsonwebtoken 9.3 | JWT 认证 |
| reqwest 0.12 | HTTP 客户端 |
| chrono 0.4 | 时间处理 |

## 项目结构

```
src/
├── main.rs            # 入口、服务器配置、路由注册
├── auth.rs            # JWT 中间件、令牌生成/验证
├── db.rs              # 数据库操作
├── models.rs          # 数据结构
├── config.rs          # 多环境配置加载
├── error.rs           # 错误处理
├── rate_limiter.rs    # 滑动窗口 Rate Limiter
└── handlers/          # 路由处理器
    ├── mod.rs
    ├── meta.rs        # 服务状态页
    ├── auth.rs        # 登录/注册
    ├── weather.rs     # 天气数据 CRUD
    ├── user.rs        # 用户信息
    ├── admin.rs       # 管理员功能
    ├── payment.rs     # 支付（支付宝/Mock）
    ├── favorites.rs   # 收藏
    ├── health.rs      # 健康检查
    └── static_files.rs # 静态文件服务

config/                # 环境配置文件
migrations/            # 数据库迁移
scripts/               # 运维脚本
tests/                 # 集成测试
```

## 环境管理

### 配置文件

通过 `APP_ENV` 环境变量选择配置：

```bash
APP_ENV=development cargo run   # 本地开发
APP_ENV=production cargo run    # 生产环境
```

### 环境变量（.env）

**敏感信息仅通过 `.env` 文件加载**，不出现在 Git 跟踪的配置文件中：

```env
DATABASE_URL=postgres://user:pass@host:5432/dbname
WECHAT_APPID=wx...
WECHAT_SECRET=xxx
JWT_SECRET=openssl rand -base64 32 生成的随机密钥
```

## 部署

```bash
# 部署到开发服务器
./deploy.sh development

# 部署到生产服务器
./deploy.sh production

# 初始化服务器 .env（生成随机 JWT_SECRET）
./deploy.sh production --init-env

# 更多选项
./deploy.sh --help
```

## 关键 API

| 端点 | 说明 |
|------|------|
| `GET /health` | 健康检查 |
| `POST /api/login` | 微信登录 |
| `POST /api/post-weather-data` | 上传天气数据 |
| `GET /weather` | 分页查询天气数据 |
| `GET /payment` | 套餐选择页 |
| `POST /api/payment/sync-order` | 同步会员状态 |

完整 API 文档见 [AGENTS.md](./AGENTS.md)。

## 运维

```bash
# 数据库备份
./scripts/backup-db.sh

# 清理过期 refresh_token
./scripts/cleanup_refresh_tokens.sh

# 查看日志
journalctl -u rust-backend.service -n 100
```

## 开发规范

- 所有提交使用 `jj`（jujutsu v0.41+），详见 AGENTS.md
- 支付宝沙箱测试使用 `MOCK_LOGIN_ENABLED=true`
- 无支付宝配置时自动启用 Mock 支付模式
