From d62e4d71b8515404678eed56920026c3bcf5635f Mon Sep 17 00:00:00 2001
From: Mathis
Date: Sun, 13 Apr 2025 18:42:08 +0200
Subject: [PATCH] Ajout info meteo home page
---
.../com/example/starter/MainVerticle.java | 2 +
.../com/example/starter/QueryObjects.java | 27 +++++
.../com/example/starter/QueryWeatherData.java | 98 +++++++++++++------
Front-end/src/pages/Home.jsx | 96 ++++++++++++++----
4 files changed, 174 insertions(+), 49 deletions(-)
diff --git a/Back-end/src/main/java/com/example/starter/MainVerticle.java b/Back-end/src/main/java/com/example/starter/MainVerticle.java
index 66b020c..839e041 100644
--- a/Back-end/src/main/java/com/example/starter/MainVerticle.java
+++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java
@@ -69,6 +69,8 @@ public class MainVerticle extends AbstractVerticle {
router.post("/changePassword").handler(setUser::changeUserPassword);
router.post("/publicUser").handler(queryUsers::getPublicUser);
router.get("/getCategories").handler(queryObjects::getCategories);
+ router.get("/getLocations").handler(queryObjects::getLocations);
+ router.post("/getMeteoHome").handler(queryWeather::getMeteoInfosHomePage);
router.post("/addCategories").handler(setObjects::newCategorie);
router.post("/deleteCategories").handler(setObjects::deleteCategories);
router.post("/requestDeleteObject").handler(RequestDeleteObject::deleteObject);
diff --git a/Back-end/src/main/java/com/example/starter/QueryObjects.java b/Back-end/src/main/java/com/example/starter/QueryObjects.java
index 61d60dc..e30f2a2 100644
--- a/Back-end/src/main/java/com/example/starter/QueryObjects.java
+++ b/Back-end/src/main/java/com/example/starter/QueryObjects.java
@@ -40,6 +40,33 @@ public class QueryObjects {
});
}
+ public void getLocations(RoutingContext context) {
+ databaseService.pool
+ .query("SELECT DISTINCT location FROM weather_objects;")
+ .execute()
+ .onFailure(e -> {
+ System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
+ context.response()
+ .setStatusCode(500)
+ .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
+ })
+ .onSuccess(rows -> {
+ if (!rows.iterator().hasNext()) {
+ context.response()
+ .setStatusCode(404)
+ .end(new JsonObject().put("error", "Aucun lieu trouvé dans la base de données").encode());
+ return;
+ }
+
+ JsonArray types = new JsonArray();
+ rows.forEach(row -> types.add(row.getString("location")));
+
+ context.response()
+ .putHeader("content-type", "application/json; charset=UTF-8")
+ .end(types.encode());
+ });
+ }
+
public void getCategories(RoutingContext context) {
databaseService.pool
.query("SELECT name FROM categories;")
diff --git a/Back-end/src/main/java/com/example/starter/QueryWeatherData.java b/Back-end/src/main/java/com/example/starter/QueryWeatherData.java
index 4a0dbb6..ee07190 100644
--- a/Back-end/src/main/java/com/example/starter/QueryWeatherData.java
+++ b/Back-end/src/main/java/com/example/starter/QueryWeatherData.java
@@ -48,6 +48,42 @@ public class QueryWeatherData {
.end((convertRowsToJson(rows)).encode());
});
}
+
+ public void getMeteoInfosHomePage(RoutingContext context) {
+ JsonObject body = context.body().asJsonObject();
+ String location = body.getString("location");
+ if (location == null) {
+ context.response()
+ .setStatusCode(400)
+ .end(new JsonObject().put("error", "Paramètre 'location' manquant").encode());
+ return;
+ }
+ System.out.println("Paramètre passé à la requête : '" + location + "'");
+ databaseService.pool
+ .query("SELECT wd.wind_speed, wd.temperature, wd.humidity, wd.pressure FROM weather_data wd " +
+ "JOIN weather_objects s ON wd.station_id = s.id WHERE s.location = '" + location +
+ "' ORDER BY wd.timestamp DESC LIMIT 1;")
+ .execute()
+ .onFailure(e -> {
+ System.err.println("Erreur de récupération de la BDD : " + e.getMessage());
+ context.response()
+ .setStatusCode(500)
+ .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
+ })
+ .onSuccess(rows -> {
+ if (rows.size() == 0) {
+ context.response()
+ .setStatusCode(404)
+ .end(new JsonObject().put("error", "Aucune donnée trouvée pour cette location").encode());
+ return;
+ }
+
+ context.response()
+ .putHeader("content-type", "application/json; charset=UTF-8")
+ .end(convertRowsToJson(rows).encode());
+ });
+ }
+
public void getMeteoInfos(RoutingContext context) {
String id = context.request().getParam("id");
if (id == null) {
@@ -78,35 +114,37 @@ public class QueryWeatherData {
.end((convertRowsToJson(rows)).encode());
});
}
- public void getRangeData(RoutingContext context){
- String id= context.request().getParam("id");
- if(id==null){
+
+ public void getRangeData(RoutingContext context) {
+ String id = context.request().getParam("id");
+ if (id == null) {
context.response()
- .setStatusCode(400)
- .end(new JsonObject().put("error","Paramètre 'id' manquant").encode());
+ .setStatusCode(400)
+ .end(new JsonObject().put("error", "Paramètre 'id' manquant").encode());
return;
}
databaseService.pool
- .preparedQuery("SELECT temperature_min,temperature_max,pressure_min,pressure_max,humidity_min,humidity_max FROM range_data WHERE station_id=?")
- .execute(Tuple.of(Integer.parseInt(id)))
- .onFailure(e->{
- System.err.println("Erreur de récupération de la BDD: "+e.getMessage());
- context.response()
- .setStatusCode(500)
- .end(new JsonObject().put("error","Erreur de récupération de la BDD").encode());
- return;
- })
- .onSuccess(rows->{
- if(rows.size() == 0){
- context.response()
- .setStatusCode(404)
- .end(new JsonObject().put("error","Objet non trouvé").encode());
- return;
- }
- context.response()
- .putHeader("content-type","application/json:charset=UTF-8")
- .end((convertRowsToJson(rows)).encode());
- });
+ .preparedQuery(
+ "SELECT temperature_min,temperature_max,pressure_min,pressure_max,humidity_min,humidity_max FROM range_data WHERE station_id=?")
+ .execute(Tuple.of(Integer.parseInt(id)))
+ .onFailure(e -> {
+ System.err.println("Erreur de récupération de la BDD: " + e.getMessage());
+ context.response()
+ .setStatusCode(500)
+ .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
+ return;
+ })
+ .onSuccess(rows -> {
+ if (rows.size() == 0) {
+ context.response()
+ .setStatusCode(404)
+ .end(new JsonObject().put("error", "Objet non trouvé").encode());
+ return;
+ }
+ context.response()
+ .putHeader("content-type", "application/json:charset=UTF-8")
+ .end((convertRowsToJson(rows)).encode());
+ });
}
private JsonArray convertRowsToJson(RowSet rows) {
@@ -116,14 +154,14 @@ public class QueryWeatherData {
JsonObject jsonObject = new JsonObject();
for (int i = 0; i < row.size(); i++) {
String column = row.getColumnName(i);
- if(column.compareTo("timestamp") == 0){
- jsonObject.put("timestamp",row.getLocalDateTime("timestamp").format(formatter));
- }else{
+ if (column.compareTo("timestamp") == 0) {
+ jsonObject.put("timestamp", row.getLocalDateTime("timestamp").format(formatter));
+ } else {
jsonObject.put(column, row.getValue(column));
}
}
- jsonArray.add(jsonObject);
+ jsonArray.add(jsonObject);
}
return jsonArray;
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/Front-end/src/pages/Home.jsx b/Front-end/src/pages/Home.jsx
index 5e1499f..937bbd2 100644
--- a/Front-end/src/pages/Home.jsx
+++ b/Front-end/src/pages/Home.jsx
@@ -20,13 +20,17 @@ import {
TowerControl,
} from "lucide-react";
import { useAuth } from "../AuthContext";
+import axios from "axios";
+import { API_BASE_URL } from "../config";
function EnhancedWeatherHome() {
const [searchQuery, setSearchQuery] = useState("");
+ const [locations, setLocations] = useState([]);
+ const [infoMeteo,setInfoMeteo] = useState([]);
const [activeFilter, setActiveFilter] = useState("all");
const [currentTime, setCurrentTime] = useState(new Date());
const { user, token } = useAuth();
-
+ const [ville, setVille] = useState("Paris, France");
const isDayTime = currentTime.getHours() > 6 && currentTime.getHours() < 20;
useEffect(() => {
@@ -36,7 +40,41 @@ function EnhancedWeatherHome() {
return () => clearInterval(timer);
}, []);
-
+ useEffect(() => {
+ axios
+ .post(`${API_BASE_URL}/getMeteoHome`, {
+ location:ville,
+ })
+ .then((response) => {
+ if (response.data.length === 0) {
+ console.warn("Aucun infos disponible.");
+ } else {
+ console.log(response.data[0]);
+ setInfoMeteo(response.data[0]);
+ }
+ })
+ .catch((error) => {
+ console.error("Erreur lors de la récupération des infos :", error);
+ });
+ }, [ville]);
+ useEffect(() => {
+ axios
+ .get(`${API_BASE_URL}/getLocations`)
+ .then((response) => {
+ if (response.data.length === 0) {
+ console.warn("Aucun lieu disponible.");
+ } else {
+ console.log(response.data);
+ setLocations(response.data);
+ }
+ })
+ .catch((error) => {
+ console.error("Erreur lors de la récupération des catégories :", error);
+ });
+ }, []);
+ const filteredLocations = locations.filter((loc) =>
+ loc.toLowerCase().includes(searchQuery.toLowerCase())
+ );
const formatDate = (date) => {
const options = { weekday: "long", day: "numeric", month: "long" };
return date.toLocaleDateString("fr-FR", options);
@@ -45,7 +83,7 @@ function EnhancedWeatherHome() {
const hourlyForecast = [
{
time: "Maintenant",
- temp: "21°",
+ temp: infoMeteo.temperature+"°",
icon: ,
},
{
@@ -166,7 +204,7 @@ function EnhancedWeatherHome() {
/>
setSearchQuery(e.target.value)}
/>
-
- Rechercher
-
+ {searchQuery.length > 0 && (
+
+ {filteredLocations.length > 0 ? (
+ filteredLocations.map((loc, idx) => (
+ {
+ setVille(loc);
+ setSearchQuery("");
+ }}
+ >
+ {loc}
+
+ ))
+ ) : (
+
+ Aucune ville trouvée.
+
+ )}
+
+ )}
@@ -204,7 +261,7 @@ function EnhancedWeatherHome() {
isDayTime ? "text-gray-700" : "text-gray-200"
}`}
>
- Paris, France
+ {ville}
- 21°C
+ {infoMeteo.temperature}°C
- 23°C
+ {infoMeteo.temperature-2}°C
@@ -292,7 +349,7 @@ function EnhancedWeatherHome() {
isDayTime ? "text-gray-900" : "text-white"
}`}
>
- 68%
+ {infoMeteo.humidity}%
@@ -320,7 +377,7 @@ function EnhancedWeatherHome() {
isDayTime ? "text-gray-900" : "text-white"
}`}
>
- 12 km/h
+ {infoMeteo.wind_speed} km/h
@@ -721,8 +778,7 @@ function EnhancedWeatherHome() {
: "text-indigo-400 hover:text-indigo-300"
}`}
>
- Ajouter un objet{" "}
-
+ Ajouter un objet
@@ -757,7 +813,8 @@ function EnhancedWeatherHome() {
isDayTime ? "text-gray-600" : "text-gray-300"
} mb-4`}
>
- Vous pourrez gérer les utilisateurs du site mais aussi les objets connectés
+ Vous pourrez gérer les utilisateurs du site mais aussi les
+ objets connectés
- Tableau d'Administration
+ Tableau d'Administration{" "}
+
@@ -799,7 +857,8 @@ function EnhancedWeatherHome() {
isDayTime ? "text-gray-600" : "text-gray-300"
} mb-4`}
>
- Ce module vous permet de gérer les capteurs et stations connectés de France de manière simple et efficace.
+ Ce module vous permet de gérer les capteurs et stations
+ connectés de France de manière simple et efficace.
- Gestion des objets{" "}
-
+ Gestion des objets