diff --git a/Cargo.lock b/Cargo.lock index 0976151..b602ba0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -593,7 +593,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.0", +] + +[[package]] +name = "error" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e606f14042bb87cc02ef6a14db6c90ab92ed6f62d87e69377bc759fd7987cc" +dependencies = [ + "traitobject", + "typeable", ] [[package]] @@ -1812,6 +1822,7 @@ dependencies = [ "actix-web", "chrono", "dotenvy", + "error", "reqwest", "serde", "serde_json", @@ -1834,7 +1845,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -2349,7 +2360,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -2567,12 +2578,24 @@ dependencies = [ "once_cell", ] +[[package]] +name = "traitobject" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a79e25382e2e852e8da874249358d382ebaf259d0d34e75d8db16a7efabbc7" + [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeable" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" + [[package]] name = "typenum" version = "1.18.0" diff --git a/Cargo.toml b/Cargo.toml index 0aacf7f..a261e73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2024" actix-web = "4.11.0" chrono = {version = "0.4.41", features=["serde"]} dotenvy = "0.15.7" +error = "0.1.9" reqwest = { version = "0.12.23", features=["json"]} serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.143" diff --git a/src/main.rs b/src/main.rs index a63e6e0..8dff99a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use actix_web::{App, HttpResponse, HttpServer, Responder, post, web}; +use actix_web::{App, HttpResponse, HttpServer, Responder, Result, post, web}; use db::create_pool; use reqwest::Client; use serde::{Deserialize, Serialize}; @@ -7,6 +7,118 @@ use sqlx::postgres::PgPool; mod db; mod models; +#[derive(Debug, Deserialize, Serialize)] +pub struct WeatherData { + #[serde(rename = "areaType")] + area_type: String, + + #[serde(rename = "assignmentnumber")] + assignment_number: String, + + #[serde(rename = "atmosphericStability")] + atmospheric_stability: String, + + #[serde(rename = "averageWindDirection")] + average_wind_direction: f64, + + #[serde(rename = "averageWindSpeed")] + average_wind_speed: f64, + + #[serde(rename = "calculatedwindspeed")] + calculated_wind_speed: f64, + + #[serde(rename = "cloudIndex")] + cloud_index: String, + + #[serde(rename = "convertedWindSpeed")] + converted_wind_speed: f64, + + date: String, + + #[serde(rename = "daySinceJanFirst")] + day_since_jan_first: i32, + + #[serde(rename = "hasMeasuredWindSpeed")] + has_measured_wind_speed: bool, + + hours: i32, + + #[serde(rename = "inspectiontype")] + inspection_type: String, + + latitude: f64, + longitude: f64, + + #[serde(rename = "lowCloudiness")] + low_cloudiness: String, + + #[serde(rename = "measuredWindSpeed")] + measured_wind_speed: f64, + + #[serde(rename = "measurementHeight")] + measurement_height: f64, + + min: i32, + openid: String, + + #[serde(rename = "overallCloudiness")] + overall_cloudiness: String, + + #[serde(rename = "overallSuitability")] + overall_suitability: String, + + #[serde(rename = "pointWindSpeed")] + point_wind_speed: f64, + + #[serde(rename = "solarDeclination")] + solar_declination: f64, + + #[serde(rename = "solarRadiationLevel")] + solar_radiation_level: f64, + + #[serde(rename = "suitabilityDegree")] + suitability_degree: String, + + #[serde(rename = "sunAltitude")] + sun_altitude: f64, + + theta: f64, + title: String, + + #[serde(rename = "windDirection")] + wind_direction: Vec, + + #[serde(rename = "windDirectionStandardDeviation")] + wind_direction_standard_deviation: f64, + + #[serde(rename = "windDirectionSuitability")] + wind_direction_suitability: String, + + #[serde(rename = "windSpeed")] + wind_speed: Vec, + + #[serde(rename = "windSpeedSuitability")] + wind_speed_suitability: String, +} + +#[post("/weather-test")] +async fn post_weather_data(data: web::Json) -> impl Responder { + // 在这里处理接收到的数据 + println!("Received weather data: {:#?}", data); + + // 示例:访问特定字段 + println!("Area Type: {}", data.area_type); + println!("Wind Speeds: {:?}", data.wind_speed); + println!("Location: ({}, {})", data.latitude, data.longitude); + + // 返回成功响应 + web::Json(serde_json::json!({ + "status": "success", + "message": "Weather data received successfully", + "received_assignment": data.assignment_number + })) +} + // 定义请求体结构 #[derive(Debug, Deserialize)] struct OpenIdRequest { @@ -214,6 +326,7 @@ fn create_server_config( .app_data(web::Data::new(http_client)) .service(get_user_id) .service(get_openid) + .service(post_weather_data) } #[actix_web::main] diff --git a/src/models.rs b/src/models.rs index 981c19a..04c117b 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,5 +1,5 @@ use chrono::NaiveDate; -use serde::Serialize; +use serde::{Serialize}; use sqlx::FromRow; // 处理日期类型 #[derive(Debug, Serialize, FromRow)]