From 941a8e53501225da812dfe21cd63c58659f7c475 Mon Sep 17 00:00:00 2001 From: milky0217 Date: Sun, 19 Jul 2026 09:52:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20insert=5Fweather=5Fdata=20=E9=85=8D?= =?UTF-8?q?=E9=A2=9D=E6=9F=A5=E8=AF=A2=E4=BD=BF=E7=94=A8=E5=B7=B2=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=9A=84=20membership=5Fexpires=5Fat=20?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/db.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/db.rs b/src/db.rs index 811f0bc..a5c09f7 100644 --- a/src/db.rs +++ b/src/db.rs @@ -11,17 +11,18 @@ use crate::error::AppError; pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user_id: i32) -> Result { // 单次查询获取用户会员状态和数据条数(原 N+1:get_user_by_id + count_user_weather_data → 合并为 1 次) #[derive(FromRow)] - struct UserQuota { - is_member: bool, - paid_expires_at: Option>, - data_count: i64, - } +struct UserQuota { + is_member: bool, + #[sqlx(rename = "membership_expires_at")] + membership_expires_at: Option>, + data_count: i64, +} let quota = sqlx::query_as::<_, UserQuota>( r#" SELECT u.is_member, - u.paid_expires_at, + u.membership_expires_at, (SELECT COUNT(*) FROM weather_data w WHERE w.user_id = $1)::BIGINT AS data_count FROM users u WHERE u.id = $1 @@ -33,7 +34,7 @@ pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user .map_err(|e| AppError::Database(format!("查询用户配额失败: {}", e)))? .ok_or_else(|| AppError::NotFound("用户不存在".to_string()))?; - let is_active_member = quota.is_member && quota.paid_expires_at.is_none_or(|expires| expires > Utc::now()); + let is_active_member = quota.is_member && quota.membership_expires_at.is_none_or(|expires| expires > Utc::now()); // 维护模式:非会员使用更高的临时限额,防止资源滥用 let is_maintenance = std::env::var("PAYMENT_MAINTENANCE_MODE").ok() == Some("true".to_string());