From 16f49a47e93982a4fa94033143358bad475fef9c Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 15 May 2025 21:00:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9ERAW=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dao/sensor.go | 53 ++ internal/handler/sensor.go | 29 +- static/index.html | 1369 ++++++++++++++++++------------------ 3 files changed, 756 insertions(+), 695 deletions(-) diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index 220b2ab..b11e9cd 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -249,3 +249,56 @@ func (dao *SensorDAO) GetLatestSensorData() (*model.SensorData, error) { return &data, nil } + +// GetRawData 获取指定时间范围内的原始传感器数据 +func (dao *SensorDAO) GetRawData(start, end time.Time) ([]model.AggregatedData, error) { + query := ` + SELECT + timestamp, + temperature/10 AS temperature, + rainfall, + humidity/10 AS humidity, + wind_speed/100 AS wind_speed, + atm_pressure/10 AS atm_pressure, + solar_radiation + FROM sensor_data + WHERE timestamp BETWEEN ? AND ? + ORDER BY timestamp DESC + ` + + // 执行查询 + rows, err := dao.db.Query(query, start, end) + if err != nil { + logger.Logger.Printf("查询原始数据失败: %v (开始=%s, 结束=%s)", + err, start.Format(time.RFC3339), end.Format(time.RFC3339)) + return nil, err + } + defer rows.Close() + + var result []model.AggregatedData + for rows.Next() { + var data model.AggregatedData + err := rows.Scan( + &data.Timestamp, + &data.AvgTemperature, + &data.Rainfall, + &data.AvgHumidity, + &data.AvgWindSpeed, + &data.AvgAtmPressure, + &data.AvgSolarRadiation) + if err != nil { + logger.Logger.Printf("扫描数据行失败: %v", err) + continue + } + result = append(result, data) + } + + // 检查是否有游标错误 + if err = rows.Err(); err != nil { + logger.Logger.Printf("查询游标错误: %v", err) + return nil, err + } + + logger.Logger.Printf("原始数据查询成功: 返回%d条记录", len(result)) + return result, nil +} diff --git a/internal/handler/sensor.go b/internal/handler/sensor.go index dacab1b..e90fb7e 100644 --- a/internal/handler/sensor.go +++ b/internal/handler/sensor.go @@ -7,6 +7,7 @@ import ( "time" "go_rain_dtu/internal/dao" + "go_rain_dtu/internal/model" "go_rain_dtu/internal/tcp" "go_rain_dtu/pkg/logger" ) @@ -39,9 +40,18 @@ func (h *SensorHandler) GetAggregatedData(w http.ResponseWriter, r *http.Request } } - data, err := h.dao.GetAggregatedData(startTime, endTime, interval) + var data []model.AggregatedData + var err error + + // 判断是否获取原始数据 + if interval == "raw" { + data, err = h.dao.GetRawData(startTime, endTime) + } else { + data, err = h.dao.GetAggregatedData(startTime, endTime, interval) + } + if err != nil { - logger.Logger.Printf("获取聚合数据失败: %v", err) + logger.Logger.Printf("获取数据失败: %v", err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } @@ -112,10 +122,19 @@ func (h *SensorHandler) GetLatestData(w http.ResponseWriter, r *http.Request) { } } - // 查询数据库获取最新数据 - data, err := h.dao.GetAggregatedData(startTime, endTime, interval) + // 查询数据库获取数据 + var data []model.AggregatedData + var err error + + // 判断是否获取原始数据 + if interval == "raw" { + data, err = h.dao.GetRawData(startTime, endTime) + } else { + data, err = h.dao.GetAggregatedData(startTime, endTime, interval) + } + if err != nil { - logger.Logger.Printf("获取最新聚合数据失败: %v", err) + logger.Logger.Printf("获取数据失败: %v", err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } diff --git a/static/index.html b/static/index.html index 3ca48a4..36da218 100644 --- a/static/index.html +++ b/static/index.html @@ -1,691 +1,680 @@ - - - - - - 雨量计数据 - - - - -
-

雨量计数据

-
- 未连接 -
-
- -
-
-
- - -
- -
- - -
- -
- - -
- -
- - - -
-
- - -
-

最新传感器数据

-
-
-
温度
-
--
-
-
-
-
湿度
-
--
-
%
-
-
-
风速
-
--
-
m/s
-
-
-
风向
-
--
-
°
-
-
-
大气压
-
--
-
kPa
-
-
-
太阳辐射
-
--
-
W/m²
-
-
-
累计雨量
-
--
-
mm
-
-
-
- -
- -
- -
- - - - - - - - - - - - - -
时间降雨量(mm)温度(℃)湿度(%)风速(m/s)大气压(kPa)太阳辐射(W/m²)
-
-
- - - + + + + + + 雨量计数据 + + + + +
+

雨量计数据

+
+ 未连接 +
+
+ +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+
+ + +
+

最新传感器数据

+
+
+
温度
+
--
+
+
+
+
湿度
+
--
+
%
+
+
+
风速
+
--
+
m/s
+
+
+
风向
+
--
+
°
+
+
+
大气压
+
--
+
kPa
+
+
+
太阳辐射
+
--
+
W/m²
+
+
+
累计雨量
+
--
+
mm
+
+
+
+ +
+ +
+ +
+ + + + + + + + + + + + + +
时间降雨量(mm)温度(℃)湿度(%)风速(m/s)大气压(kPa)太阳辐射(W/m²)
+
+
+ + + \ No newline at end of file