添加了weatherlistresponse并进行了一些修改

This commit is contained in:
2025-09-27 16:21:04 +08:00
parent 051cad1c7a
commit 6d680260a2
3 changed files with 316 additions and 11 deletions

130
src/db.rs
View File

@@ -3,7 +3,7 @@ use std::env;
use std::error::Error;
// 从 models 模块引入 WeatherData 结构体
use crate::models::WeatherData;
use crate::models::{WeatherData, WeatherDataBrief, WeatherListResponse};
// 这个函数封装了所有与数据库交互的逻辑
pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData) -> Result<i32, String> {
@@ -118,3 +118,131 @@ pub async fn create_pool() -> Result<PgPool, Box<dyn Error>> {
Ok(pool)
}
// 在db.rs中添加以下函数
// 获取天气数据详情
pub async fn get_weather_details(pool: &PgPool, weather_id: i32) -> Result<WeatherData, String> {
let query = r#"
SELECT
wd.id, wd.title, wd.date, wd.hour, wd.min,
wd.longitude::float8 as longitude, wd.latitude::float8 as latitude,
wd.daysincejanfirst, wd.theta, wd.solardeclination,
wd.sunaltitude, wd.overallcloudiness, wd.lowcloudiness,
wd.cloudindex, wd.solarradiationlevel, wd.hasmeasuredwindspeed,
wd.measuredwindspeed, wd.convertedwindspeed, wd.measurementheight,
wd.areatype, wd.pointwindspeed, wd.atmosphericstability,
wd.suitabilitydegree, wd.winddirection, wd.averagewinddirection,
wd.winddirectionstandarddeviation, wd.windspeed, wd.averagewindspeed,
wd.windspeedsuitability, wd.winddirectionsuitability, wd.overallsuitability,
wd.inspectiontype, wd.assignmentnumber, wd.calculatedwindspeed,
u.openid
FROM weather_data wd
JOIN users u ON wd.user_id = u.id
WHERE wd.id = $1
"#;
let row = match sqlx::query_as::<_, WeatherData>(query)
.bind(weather_id)
.fetch_optional(pool)
.await
{
Ok(Some(row)) => row,
Ok(None) => return Err(format!("未找到ID为 {} 的天气数据", weather_id)),
Err(e) => return Err(format!("查询天气数据失败: {}", e)),
};
Ok(row)
}
// 替换db.rs中的get_weather_list函数
pub async fn get_weather_list(
pool: &PgPool,
user_id: i32,
page: i32,
limit: i32,
) -> Result<WeatherListResponse, String> {
let offset = (page - 1) * limit;
// 1. 查询符合条件的总条数
let total_query = r#"
SELECT COUNT(*) as total
FROM weather_data
WHERE user_id = $1
"#;
let total = match sqlx::query_as::<_, (i64,)>(total_query)
.bind(user_id)
.fetch_one(pool)
.await
{
Ok((count,)) => count,
Err(e) => return Err(format!("查询总条数失败: {}", e)),
};
// 2. 查询当前页数据列表
let list_query = r#"
SELECT
wd.id, wd.title, wd.date, wd.hour, wd.min, wd.longitude, wd.latitude
FROM weather_data wd
WHERE wd.user_id = $1
ORDER BY wd.date DESC, wd.hour DESC, wd.min DESC
LIMIT $2 OFFSET $3
"#;
let list = match sqlx::query_as::<_, WeatherDataBrief>(list_query)
.bind(user_id)
.bind(limit)
.bind(offset)
.fetch_all(pool)
.await
{
Ok(data) => data,
Err(e) => return Err(format!("查询天气数据列表失败: {}", e)),
};
// 3. 包装结果并返回
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#"
DELETE FROM weather_data
WHERE id = $1 AND user_id = $2
"#;
match sqlx::query(query_delete)
.bind(weather_id)
.bind(user_id)
.execute(pool)
.await
{
Ok(_) => Ok(()),
Err(e) => Err(format!("删除天气数据失败: {}", e)),
}
}