添加了weatherlistresponse并进行了一些修改
This commit is contained in:
130
src/db.rs
130
src/db.rs
@@ -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)),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user