feat: 添加用户信息存储功能
- 添加 avatar_url 和 nickname 字段到 users 表 - 修改 get_user_by_id 查询包含新字段 - 添加 save_user_profile API - 优化 deploy.sh 默认使用 release 模式
This commit is contained in:
72
src/db.rs
72
src/db.rs
@@ -57,7 +57,7 @@ pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user
|
||||
.bind(&weather_data.overall_cloudiness)
|
||||
.bind(&weather_data.low_cloudiness)
|
||||
.bind(&weather_data.cloud_index)
|
||||
.bind(weather_data.solar_radiation_level as i32)
|
||||
.bind(weather_data.solar_radiation_level)
|
||||
.bind(weather_data.has_measured_wind_speed)
|
||||
.bind(weather_data.measured_wind_speed) // <-- 修改: 直接绑定 Option<f64>
|
||||
.bind(weather_data.converted_wind_speed) // <-- 修改: 直接绑定 Option<i32>,并移除 `as i32`
|
||||
@@ -99,11 +99,6 @@ pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user
|
||||
}
|
||||
|
||||
pub async fn create_pool() -> Result<PgPool, Box<dyn Error>> {
|
||||
// 加载环境变量,非致命错误处理
|
||||
if let Err(e) = dotenvy::dotenv() {
|
||||
eprintln!("警告: 无法加载.env文件 - {}", e);
|
||||
}
|
||||
|
||||
// 获取数据库URL并提供友好错误信息
|
||||
let database_url =
|
||||
env::var("DATABASE_URL").map_err(|_| "环境变量DATABASE_URL未设置,请在.env文件中配置")?;
|
||||
@@ -201,55 +196,36 @@ pub async fn get_weather_list(
|
||||
Ok(WeatherListResponse { list, total })
|
||||
}
|
||||
|
||||
// 删除天气数据
|
||||
pub async fn delete_weather_data(
|
||||
pool: &PgPool,
|
||||
weather_id: i32,
|
||||
user_id: i32,
|
||||
) -> Result<(), String> {
|
||||
// 先检查数据是否存在且属于当前用户
|
||||
let query_check = r#"
|
||||
SELECT id FROM weather_data
|
||||
WHERE id = $1 AND user_id = $2
|
||||
"#;
|
||||
|
||||
let exists = match sqlx::query_as::<_, (i32,)>(query_check)
|
||||
.bind(weather_id)
|
||||
.bind(user_id)
|
||||
.fetch_optional(pool)
|
||||
.await
|
||||
{
|
||||
Ok(Some(_)) => true,
|
||||
Ok(None) => return Err(format!("未找到ID为 {} 的天气数据或无权限删除", weather_id)),
|
||||
Err(e) => return Err(format!("检查天气数据失败: {}", e)),
|
||||
};
|
||||
|
||||
if !exists {
|
||||
return Err(format!("未找到ID为 {} 的天气数据或无权限删除", weather_id));
|
||||
}
|
||||
|
||||
// 执行删除操作
|
||||
let query_delete = r#"
|
||||
let query = r#"
|
||||
DELETE FROM weather_data
|
||||
WHERE id = $1 AND user_id = $2
|
||||
"#;
|
||||
|
||||
match sqlx::query(query_delete)
|
||||
let result = sqlx::query(query)
|
||||
.bind(weather_id)
|
||||
.bind(user_id)
|
||||
.execute(pool)
|
||||
.await
|
||||
{
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(format!("删除天气数据失败: {}", e)),
|
||||
.map_err(|e| format!("删除天气数据失败: {}", e))?;
|
||||
|
||||
if result.rows_affected() == 0 {
|
||||
return Err(format!("未找到ID为 {} 的天气数据或无权限删除", weather_id));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// 根据用户ID获取用户信息
|
||||
pub async fn get_user_by_id(pool: &PgPool, user_id: i32) -> Result<User, String> {
|
||||
let query = r#"
|
||||
SELECT
|
||||
id, name, openid, phone, type, "desc", is_paid, is_admin, paid_expires_at
|
||||
id, name, openid, phone, type, "desc", is_paid, is_admin, paid_expires_at,
|
||||
avatar_url, nickname
|
||||
FROM users
|
||||
WHERE id = $1
|
||||
"#;
|
||||
@@ -309,3 +285,29 @@ pub async fn update_user_payment_status(
|
||||
Err(e) => Err(format!("更新用户付费状态失败: {}", e)),
|
||||
}
|
||||
}
|
||||
|
||||
// 更新用户个人信息
|
||||
pub async fn update_user_profile(
|
||||
pool: &PgPool,
|
||||
user_id: i32,
|
||||
nickname: &Option<String>,
|
||||
avatar_url: &Option<String>,
|
||||
) -> Result<(), String> {
|
||||
let query = r#"
|
||||
UPDATE users
|
||||
SET nickname = COALESCE($1, nickname),
|
||||
avatar_url = COALESCE($2, avatar_url)
|
||||
WHERE id = $3
|
||||
"#;
|
||||
|
||||
match sqlx::query(query)
|
||||
.bind(nickname)
|
||||
.bind(avatar_url)
|
||||
.bind(user_id)
|
||||
.execute(pool)
|
||||
.await
|
||||
{
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(format!("更新用户个人信息失败: {}", e)),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user