diff --git a/.idea/artifacts/admin_client_temperature_war.xml b/.idea/artifacts/admin_client_temperature_war.xml
index feb2b44..008131e 100644
--- a/.idea/artifacts/admin_client_temperature_war.xml
+++ b/.idea/artifacts/admin_client_temperature_war.xml
@@ -3,8 +3,10 @@
$PROJECT_DIR$/target
+ false
admin-client-temperature
war
+ false
diff --git a/.idea/artifacts/admin_client_temperature_war_exploded.xml b/.idea/artifacts/admin_client_temperature_war_exploded.xml
index 716e962..f17d5f1 100644
--- a/.idea/artifacts/admin_client_temperature_war_exploded.xml
+++ b/.idea/artifacts/admin_client_temperature_war_exploded.xml
@@ -6,6 +6,7 @@
true
admin-client-temperature
war
+ false
@@ -63,7 +64,6 @@
-
@@ -92,6 +92,10 @@
+
+
+
+
diff --git a/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
deleted file mode 100644
index 6978c0b..0000000
--- a/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index bdf192b..27e7952 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,15 +1,46 @@
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -36,6 +67,11 @@
+
+
+
+
+
@@ -45,6 +81,7 @@
+
@@ -67,48 +104,24 @@
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/admin-client-temperature.iml b/admin-client-temperature.iml
index 46db95d..d8e3cad 100644
--- a/admin-client-temperature.iml
+++ b/admin-client-temperature.iml
@@ -86,7 +86,6 @@
-
@@ -138,6 +137,10 @@
+
+
+
+
diff --git a/pom.xml b/pom.xml
index a3aef7f..94891e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,6 +101,10 @@
validation-api
2.0.1.Final
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
com.oracle
ojdbc6
diff --git a/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java b/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java
index 8a199f3..d810743 100644
--- a/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java
+++ b/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java
@@ -103,7 +103,7 @@ public class MqttRSAClient {
System.out.println("topic:"+s);
System.out.println("Qos:"+mqttMessage.getQos());
System.out.println("message RSA:"+strData);
- temperatureService.saveTemperature(strData,s);
+ //temperatureService.saveTemperature(strData,s);
}
@Override
diff --git a/src/main/java/com/rehome/mqttclienttemperature/controller/TemperatureController.java b/src/main/java/com/rehome/mqttclienttemperature/controller/TemperatureController.java
new file mode 100644
index 0000000..819b3ab
--- /dev/null
+++ b/src/main/java/com/rehome/mqttclienttemperature/controller/TemperatureController.java
@@ -0,0 +1,62 @@
+package com.rehome.mqttclienttemperature.controller;
+
+
+import com.rehome.mqttclienttemperature.dto.RequestNowTemperatureDto;
+import com.rehome.mqttclienttemperature.dto.RequestTemperatureDto;
+import com.rehome.mqttclienttemperature.entity.Temperature;
+import com.rehome.mqttclienttemperature.response.Result;
+import com.rehome.mqttclienttemperature.service.TemperatureService;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author HuangWenfei
+ * App自动更新
+ * 2024-10-16 11:11
+ */
+@RestController
+@CrossOrigin
+@RequestMapping("/web/temperature")
+public class TemperatureController {
+ @Resource
+ private TemperatureService temperatureService;
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/getHistoryTemperatureByTen")
+ private List getHistoryTemperatureByTen(@RequestBody @Validated RequestTemperatureDto dto) {
+ return temperatureService.findFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
+ }
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/getRealTemperatureByTen")
+ private List getRealTemperatureByTen(@RequestBody @Validated RequestNowTemperatureDto dto) {
+ return temperatureService.findFirst10ByLocationDesc(dto.getLocationDesc());
+ }
+
+ /**
+ *
+ */
+ @PostMapping("/findFirstByOrderByLocationDescAsc")
+ private Temperature findFirstByOrderByLocationDescAsc(@RequestBody @Validated RequestNowTemperatureDto dto) {
+ return temperatureService.findFirstByOrderByLocationDescAsc(dto.getLocationDesc());
+ }
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/queryFirst10ByDataDateAndLocationDesc")
+ private List queryFirst10ByDataDateAndLocationDesc(@RequestBody @Validated RequestTemperatureDto dto) {
+ return temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
+ }
+
+
+}
diff --git a/src/main/java/com/rehome/mqttclienttemperature/controller/api/TemperatureApiController.java b/src/main/java/com/rehome/mqttclienttemperature/controller/api/TemperatureApiController.java
new file mode 100644
index 0000000..b3bdbfa
--- /dev/null
+++ b/src/main/java/com/rehome/mqttclienttemperature/controller/api/TemperatureApiController.java
@@ -0,0 +1,75 @@
+package com.rehome.mqttclienttemperature.controller.api;
+
+
+import com.rehome.mqttclienttemperature.dto.RequestNowTemperatureDto;
+import com.rehome.mqttclienttemperature.dto.RequestTemperatureDto;
+import com.rehome.mqttclienttemperature.entity.Temperature;
+import com.rehome.mqttclienttemperature.response.Result;
+import com.rehome.mqttclienttemperature.service.TemperatureService;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author HuangWenfei
+ * App自动更新
+ * 2024-10-16 11:11
+ */
+@RestController
+@CrossOrigin
+@RequestMapping("/api/temperature")
+public class TemperatureApiController {
+ @Resource
+ private TemperatureService temperatureService;
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/getHistoryTemperatureByTen")
+ private List getHistoryTemperatureByTen(@RequestBody @Validated RequestTemperatureDto dto) {
+ return temperatureService.findFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
+ }
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/getRealTemperatureByTen")
+ private List getRealTemperatureByTen(@RequestBody @Validated RequestNowTemperatureDto dto) {
+ return temperatureService.findFirst10ByLocationDesc(dto.getLocationDesc());
+ }
+
+ /**
+ *
+ */
+ @PostMapping("/findFirstByOrderByLocationDescAsc")
+ private Temperature findFirstByOrderByLocationDescAsc(@RequestBody @Validated RequestNowTemperatureDto dto) {
+ return temperatureService.findFirstByOrderByLocationDescAsc(dto.getLocationDesc());
+ }
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/queryFirst10ByDataDateAndLocationDesc")
+ private List queryFirst10ByDataDateAndLocationDesc(@RequestBody @Validated RequestTemperatureDto dto) {
+ return temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
+ }
+
+ /**
+ * APP更新版本号
+ */
+ @PostMapping("/queryFirst10ByDataDateAndLocationDescBindingResult")
+ private Result queryFirst10ByDataDateAndLocationDescBindingResult(@RequestBody @Validated RequestTemperatureDto dto, BindingResult bindingResult) {
+ if (bindingResult.hasErrors()) {
+ //处理参数校验失败错误信息,有种处理方式。
+ //1.通过捕获异常处理校验结果,详情见 com.rehome.mqttclienttemperature.response.GlobalExceptionHandler
+ //2.通过在方法形参里加入BindingResult
+ return Result.failedByParamValidated(bindingResult);
+ }
+ List listResult = temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
+ return Result.success(listResult);
+ }
+}
diff --git a/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java b/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java
index 8d47d95..25c1b61 100644
--- a/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java
+++ b/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java
@@ -2,7 +2,13 @@ package com.rehome.mqttclienttemperature.dao;
import com.rehome.mqttclienttemperature.entity.Temperature;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
/**
@@ -16,4 +22,85 @@ public interface TemperatureRepository extends JpaRepository {
Temperature findByDataDate(String dataDate);
Temperature findByDataHour(String dataHour);
Temperature findByDataMinute(String dataMinute);
+ @Query(value = "select * from temperature t where t.data_date=?1 and t.location_desc=?2", nativeQuery = true)
+ List findByDataDateAndLocationDesc(String dataDate,String locationDesc);
+
+ List findFirst10ByDataDateAndLocationDesc(String dataDate,String locationDesc, Sort sort);
+
+ Page queryFirst10ByDataDateAndLocationDesc(String dataDate,String locationDesc, Pageable pageable);
+
+ Temperature findFirstByOrderByDataDateDesc();
+
+
+
+
+
+
+
+
+// 五、分页查询
+//
+// Page findALL(Pageable pageable);
+// Page findByUserName(String userName,Pageable pageable);
+//
+// 在查询的方法中,需要传入参数Pageable ,
+// 当查询中有多个参数的时候Pageable建议做为最后一个参数传入 。
+// Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则。
+//
+// int page=1,size=10;
+// Sort sort = new Sort(Direction.DESC, "id");
+// Pageable pageable = new PageRequest(page, size, sort);
+// userRepository.findALL(pageable);
+// userRepository.findByUserName("testName", pageable);
+//
+//
+// 六、限制查询
+//
+// 查询前 N 个元素
+//
+// User findFirstByOrderByLastnameAsc();
+// User findTopByOrderByAgeDesc();
+// Page queryFirst10ByLastname(String lastname, Pageable pageable);
+// List findFirst10ByLastname(String lastname, Sort sort);
+// List findTop10ByLastname(String lastname, Pageable pageable);
+//
+
+
+
+// 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序【专题】
+//
+// 首先来说一下分页和排序所用到的Page、Pageable接口和Sort类都是什么
+//
+// JpaRepository提供了两个和分页和排序有关的查询
+//
+// List findAll(Sort sort) 返回所有实体,按照指定顺序排序返回
+//
+// List findAll(Pageable pageable) 返回实体列表,实体的offest和limit通过pageable来指定
+//
+// Sort对象用来指示排序,最简单的Sort对象构造可以传入一个属性名列表(不是数据库列名,是属性名),默认采用升序排序。例:
+//
+// Sort sort = new Sort("id");
+// //或 Sort sort = new Sort(Direction.ASC,"id");
+// return userDao.findAll(sort);
+// 程序将查询所有user并按照id进行生序排序。Sort还包括其他一些构造方法,在这里就不一一赘述。
+//
+// Pageable接口用于构造翻页查询,PageRequest是其实现类,可以通过提供的工厂方法创建PageRequest:
+//
+// public static PageRequest of(int page, int size)
+// 也可以在PageRequest中加入排序:
+//
+// public static PageRequest of(int page, int size, Sort sort)
+// 方法中的参数,page总是从0开始,表示查询页,size指每页的期望行数。
+//
+// Page接口可以获得当前页面的记录、总页数、总记录数、是否有上一页或下一页等。Spring Data翻页查询总是返回Page对象,Page对象提供了以下常用的方法:
+//
+// int getTotalPages() 总的页数
+// long getTotalElements() 返回总数
+// List getContent() 返回此次查询的结果集
+// ————————————————
+
+
+
+
+
}
\ No newline at end of file
diff --git a/src/main/java/com/rehome/mqttclienttemperature/dto/RequestNowTemperatureDto.java b/src/main/java/com/rehome/mqttclienttemperature/dto/RequestNowTemperatureDto.java
new file mode 100644
index 0000000..2e5adf5
--- /dev/null
+++ b/src/main/java/com/rehome/mqttclienttemperature/dto/RequestNowTemperatureDto.java
@@ -0,0 +1,11 @@
+package com.rehome.mqttclienttemperature.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class RequestNowTemperatureDto {
+ @NotBlank(message = "位置描述不能为空")
+ private String locationDesc;
+}
diff --git a/src/main/java/com/rehome/mqttclienttemperature/dto/RequestTemperatureDto.java b/src/main/java/com/rehome/mqttclienttemperature/dto/RequestTemperatureDto.java
new file mode 100644
index 0000000..055e151
--- /dev/null
+++ b/src/main/java/com/rehome/mqttclienttemperature/dto/RequestTemperatureDto.java
@@ -0,0 +1,14 @@
+package com.rehome.mqttclienttemperature.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+
+@Data
+public class RequestTemperatureDto {
+ @NotEmpty(message = "查询日期不能为空")
+ private String dataDate;
+ @NotEmpty(message = "位置描述不能为空")
+ private String locationDesc;
+}
diff --git a/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java b/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java
index ee03ebb..8c66dab 100644
--- a/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java
+++ b/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java
@@ -12,6 +12,18 @@ import java.util.Date;
@Proxy(lazy = false)
@Data
@Entity
+//普通索引,不指定索引名,表自动创建索引名
+//@Table(indexes = {@Index(columnList = "dataDate"),@Index(columnList = "locationDesc")})
+//普通索引,指定索引名,创建单个索引
+//在这个例子中,Temperature实体类通过@Table注解的indexes属性定义了一个名为idx_dataDate的索引,它覆盖了dataDate字段。这意味着在数据库层面,针对dataDate字段的查询将会利用这个索引,从而提高查询效率。
+//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate")})
+//同时创建多个普通索引,注意每个索引名都不同
+//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc")})
+//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute")})
+//创建组合索引,注意每个索引名都相同
+//@Table(indexes = {@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
+//同时创建普通索引和组合索引,注意普通索引每个索引名都不同,注意组合索引每个索引名都相同
+@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute"),@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
public class Temperature implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
diff --git a/src/main/java/com/rehome/mqttclienttemperature/response/GlobalExceptionHandler.java b/src/main/java/com/rehome/mqttclienttemperature/response/GlobalExceptionHandler.java
new file mode 100644
index 0000000..bce539e
--- /dev/null
+++ b/src/main/java/com/rehome/mqttclienttemperature/response/GlobalExceptionHandler.java
@@ -0,0 +1,70 @@
+package com.rehome.mqttclienttemperature.response;
+
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.Optional;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+ @ExceptionHandler(BindException.class)
+ public Result handleValidationException(BindException ex) {
+ Result result = Result.failedByParamValidated();
+ for (FieldError error : ex.getBindingResult().getFieldErrors()) {
+ System.out.println(error.getField());
+ System.out.println(error.getDefaultMessage());
+ String baseErrorStr = result.getMessage();
+ if(error.getField()!=null){
+ baseErrorStr=baseErrorStr+","+error.getField();
+ result.setMessage(baseErrorStr);
+ }
+ if(error.getDefaultMessage()!=null){
+ baseErrorStr=baseErrorStr+":"+error.getDefaultMessage();
+ result.setMessage(baseErrorStr);
+ }
+ }
+ return result;
+ }
+}
+
+
+//@RestControllerAdvice
+//public class GlobalExceptionHandler {
+// @ExceptionHandler(BindException.class)
+// public R handleValidationException(BindException ex) {
+// R result = R.error();
+// for (FieldError error : ex.getBindingResult().getFieldErrors()) {
+// result.data(error.getField(), error.getDefaultMessage());
+// }
+// Optional