feat: 添加用户信息存储功能

- 添加 avatar_url 和 nickname 字段到 users 表
- 修改 get_user_by_id 查询包含新字段
- 添加 save_user_profile API
- 优化 deploy.sh 默认使用 release 模式
This commit is contained in:
2026-03-26 14:28:46 +08:00
parent fcf358f990
commit 6d2824589c
6 changed files with 162 additions and 276 deletions

View File

@@ -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)),
}
}