添加了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

View File

@@ -1,8 +1,7 @@
use actix_web::middleware::from_fn;
use actix_web::{App, HttpResponse, HttpServer, Responder, Result, post, web};
use actix_web::{App, HttpResponse, HttpServer, Responder, Result, delete, get, post, web};
use reqwest::Client;
use sqlx::postgres::PgPool;
mod auth;
mod db;
mod models;
@@ -11,6 +10,8 @@ use auth::{generate_token, jwt_middleware};
use db::{create_pool, insert_weather_data};
use models::{ErrorResponse, WeChatApiResponse, WeChatLoginRequest, WeatherData};
use crate::models::Claims;
// 登录的API端点
#[post("/api/login")]
async fn login(
@@ -199,6 +200,120 @@ async fn post_weather_data(
}
}
// 在main.rs中添加以下处理函数
// 获取天气数据详情
#[get("/weather/details/{id}")]
async fn get_weather_details(
path: web::Path<i32>,
pool: web::Data<PgPool>,
claims: web::ReqData<Claims>,
) -> impl Responder {
let weather_id = path.into_inner();
println!("获取天气数据详情, ID: {}", weather_id);
match db::get_weather_details(pool.get_ref(), weather_id).await {
Ok(weather_data) => {
// 检查数据是否属于当前用户
if weather_data.openid != claims.openid {
return HttpResponse::Forbidden().json(ErrorResponse {
error: "无权限访问该数据".to_string(),
errcode: Some(403),
errmsg: None,
});
}
HttpResponse::Ok().json(serde_json::json!({
"success": true,
"data": weather_data
}))
}
Err(error_msg) => {
eprintln!("获取天气数据详情失败: {}", error_msg);
let errcode = if error_msg.starts_with("未找到") {
404
} else {
500
};
HttpResponse::Ok().json(serde_json::json!({
"success": false,
"errcode": errcode,
"errmsg": error_msg
}))
}
}
}
// 修改main.rs中的get_weather函数
#[get("/weather")]
async fn get_weather(
query: web::Query<serde_json::Value>,
pool: web::Data<PgPool>,
claims: web::ReqData<Claims>,
) -> impl Responder {
let page = query.get("page").and_then(|v| v.as_i64()).unwrap_or(1) as i32;
let limit = query.get("limit").and_then(|v| v.as_i64()).unwrap_or(10) as i32;
println!("获取天气数据列表, 页码: {}, 每页条数: {}", page, limit);
match db::get_weather_list(pool.get_ref(), claims.user_id, page, limit).await {
Ok(response) => {
// 这里的response是WeatherListResponse类型
// 打印获取到的天气列表和总数
println!(
"获取到的天气列表: {:?}, 总条数: {}",
response.list, response.total
);
HttpResponse::Ok().json(serde_json::json!({
"success": true,
"data": response.list, // 分页数据
"page": page,
"limit": limit,
"total": response.total // 总条数(关键修改)
}))
}
Err(error_msg) => {
eprintln!("获取天气数据列表失败: {}", error_msg);
HttpResponse::Ok().json(serde_json::json!({
"success": false,
"errcode": 500,
"errmsg": error_msg
}))
}
}
}
// 删除天气数据
#[delete("/weather/delete/{id}")]
async fn delete_weather(
path: web::Path<i32>,
pool: web::Data<PgPool>,
claims: web::ReqData<Claims>,
) -> impl Responder {
let weather_id = path.into_inner();
println!("删除天气数据, ID: {}", weather_id);
match db::delete_weather_data(pool.get_ref(), weather_id, claims.user_id).await {
Ok(_) => HttpResponse::Ok().json(serde_json::json!({
"success": true,
"message": format!("天气数据 {} 已成功删除", weather_id)
})),
Err(error_msg) => {
eprintln!("删除天气数据失败: {}", error_msg);
let errcode = if error_msg.starts_with("未找到") {
404
} else {
500
};
HttpResponse::Ok().json(serde_json::json!({
"success": false,
"errcode": errcode,
"errmsg": error_msg
}))
}
}
}
// 创建服务器配置的函数
fn create_server_config(
pool: PgPool,
@@ -221,7 +336,10 @@ fn create_server_config(
.service(
web::scope("")
.wrap(from_fn(jwt_middleware)) // 关键修改:用 from_fn 包装
.service(post_weather_data),
.service(post_weather_data)
.service(get_weather_details) // 新增
.service(get_weather) // 新增
.service(delete_weather), // 新增
)
}