From 40c352084b193cb96e187adb23790049c4becf2a Mon Sep 17 00:00:00 2001 From: hwf453 Date: Thu, 17 Oct 2024 10:20:34 +0800 Subject: [PATCH] =?UTF-8?q?API=E7=BB=9F=E4=B8=80=E5=8C=85=E8=A3=85?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=86=E9=A1=B5=EF=BC=8C=E6=8E=92=E5=BA=8F=E7=AD=89JPA?= =?UTF-8?q?=E5=B8=B8=E8=A7=84=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin_client_temperature_war.xml | 2 + .../admin_client_temperature_war_exploded.xml | 6 +- ..._validation_validation_api_2_0_1_Final.xml | 13 --- .idea/workspace.xml | 91 +++++++++++-------- admin-client-temperature.iml | 5 +- pom.xml | 4 + .../mqttclienttemperature/MqttRSAClient.java | 2 +- .../controller/TemperatureController.java | 62 +++++++++++++ .../api/TemperatureApiController.java | 75 +++++++++++++++ .../dao/TemperatureRepository.java | 87 ++++++++++++++++++ .../dto/RequestNowTemperatureDto.java | 11 +++ .../dto/RequestTemperatureDto.java | 14 +++ .../entity/Temperature.java | 12 +++ .../response/GlobalExceptionHandler.java | 70 ++++++++++++++ .../response/IResult.java | 7 ++ .../response/ResponseAdvice.java | 30 ++++++ .../response/Result.java | 68 ++++++++++++++ .../response/ResultEnum.java | 38 ++++++++ .../service/TemperatureService.java | 9 ++ .../service/impl/TemperatureServiceImpl.java | 78 ++++++++++++++++ src/main/resources/application.yml | 4 +- 21 files changed, 631 insertions(+), 57 deletions(-) delete mode 100644 .idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml create mode 100644 src/main/java/com/rehome/mqttclienttemperature/controller/TemperatureController.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/controller/api/TemperatureApiController.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/dto/RequestNowTemperatureDto.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/dto/RequestTemperatureDto.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/response/GlobalExceptionHandler.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/response/IResult.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/response/ResponseAdvice.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/response/Result.java create mode 100644 src/main/java/com/rehome/mqttclienttemperature/response/ResultEnum.java 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 firstError = result.getData().values().stream().findFirst(); +// return result.msg("请完善信息: "+firstError.orElse("表单内容") + +// (ex.getErrorCount()>1?" 等多项问题":"")); +// } +//} + +//参考:https://www.cnblogs.com/liuscraft/p/17366441.html + +// +// +//org.springframework.boot +//spring-boot-starter-validation +// +// + + +//@RestController +//@RequestMapping("/users") +//@Validated +//public class UserController { +// @PostMapping +// public String createUser(@RequestBody User user, BindingResult result) { +// if (result.hasErrors()) { +// // 处理错误信息 +// return "error"; +// } +// // 处理用户信息 +// return "success"; +// } +//} \ No newline at end of file diff --git a/src/main/java/com/rehome/mqttclienttemperature/response/IResult.java b/src/main/java/com/rehome/mqttclienttemperature/response/IResult.java new file mode 100644 index 0000000..64e6ae1 --- /dev/null +++ b/src/main/java/com/rehome/mqttclienttemperature/response/IResult.java @@ -0,0 +1,7 @@ +package com.rehome.mqttclienttemperature.response; + +//定义返回数据结构 +public interface IResult { + Integer getCode(); + String getMessage(); +} diff --git a/src/main/java/com/rehome/mqttclienttemperature/response/ResponseAdvice.java b/src/main/java/com/rehome/mqttclienttemperature/response/ResponseAdvice.java new file mode 100644 index 0000000..18b838a --- /dev/null +++ b/src/main/java/com/rehome/mqttclienttemperature/response/ResponseAdvice.java @@ -0,0 +1,30 @@ +package com.rehome.mqttclienttemperature.response; + +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +//统一包装处理,扫描需要包装返回数据的包 +//如果引入了swagger或knife4j的文档生成组件,这里需要仅扫描自己项目的包,否则文档无法正常生成 +@RestControllerAdvice(basePackages = "com.rehome.mqttclienttemperature.controller.api") +public class ResponseAdvice implements ResponseBodyAdvice { + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + // 如果不需要进行封装的,可以添加一些校验手段,比如添加标记排除的注解 + return true; + } + + + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + // 提供一定的灵活度,如果body已经被包装了,就不进行包装 + if (body instanceof Result) { + return body; + } + return Result.success(body); + } +} diff --git a/src/main/java/com/rehome/mqttclienttemperature/response/Result.java b/src/main/java/com/rehome/mqttclienttemperature/response/Result.java new file mode 100644 index 0000000..d4baa09 --- /dev/null +++ b/src/main/java/com/rehome/mqttclienttemperature/response/Result.java @@ -0,0 +1,68 @@ +package com.rehome.mqttclienttemperature.response; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; + +//统一返回数据结构 +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Result { + private Integer code; + private String message; + private T data; + + public static Result success(T data) { + return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data); + } + + public static Result success(String message, T data) { + return new Result<>(ResultEnum.SUCCESS.getCode(), message, data); + } + + public static Result failed() { + return new Result<>(ResultEnum.COMMON_FAILED.getCode(), ResultEnum.COMMON_FAILED.getMessage(), null); + } + + public static Result failedByParamValidated() { + return new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null); + } + + public static Result failedByParamValidated(BindingResult bindingResult) { + Result result = new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null); + // 处理错误信息 + for (FieldError error : bindingResult.getFieldErrors()) { + String baseErrorMessage = result.getMessage(); + if(error.getField()!=null){ + baseErrorMessage=baseErrorMessage+","+error.getField(); + result.setMessage(baseErrorMessage); + } + if(error.getDefaultMessage()!=null){ + baseErrorMessage=baseErrorMessage+":"+error.getDefaultMessage(); + result.setMessage(baseErrorMessage); + } + } + return result; + } + + public static Result failed(String message) { + return new Result<>(ResultEnum.COMMON_FAILED.getCode(), message, null); + } + + public static Result failed(IResult errorResult) { + return new Result<>(errorResult.getCode(), errorResult.getMessage(), null); + } + + public static Result instance(Integer code, String message, T data) { + Result result = new Result<>(); + result.setCode(code); + result.setMessage(message); + result.setData(data); + return result; + } +} + diff --git a/src/main/java/com/rehome/mqttclienttemperature/response/ResultEnum.java b/src/main/java/com/rehome/mqttclienttemperature/response/ResultEnum.java new file mode 100644 index 0000000..ae09473 --- /dev/null +++ b/src/main/java/com/rehome/mqttclienttemperature/response/ResultEnum.java @@ -0,0 +1,38 @@ +package com.rehome.mqttclienttemperature.response; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +//常用结果的枚举 +public enum ResultEnum implements IResult { + SUCCESS(2001, "接口调用成功"), + VALIDATE_FAILED(2002, "参数校验失败"), + COMMON_FAILED(2003, "接口调用失败"), + FORBIDDEN(2004, "没有权限访问资源"), + REQUEST_PARAM_VALIDATED_FAILED(2005, "请求参数校验失败"); + + private Integer code; + private String message; + + @Override + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //省略get、set方法和构造方法 +} \ No newline at end of file diff --git a/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java b/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java index 1393c68..9c787ae 100644 --- a/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java +++ b/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java @@ -1,6 +1,15 @@ package com.rehome.mqttclienttemperature.service; +import com.rehome.mqttclienttemperature.entity.Temperature; +import org.springframework.data.domain.Sort; + +import java.util.List; + public interface TemperatureService { //温度和湿度 void saveTemperature(String temperatureAndHumidityData,String topic); + List findFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc); + List findFirst10ByLocationDesc(String locationDesc); + Temperature findFirstByOrderByLocationDescAsc(String locationDesc); + List queryFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc); } diff --git a/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java b/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java index dac86c8..743ca30 100644 --- a/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java +++ b/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java @@ -3,11 +3,18 @@ package com.rehome.mqttclienttemperature.service.impl; import com.rehome.mqttclienttemperature.dao.TemperatureRepository; import com.rehome.mqttclienttemperature.entity.Temperature; import com.rehome.mqttclienttemperature.service.TemperatureService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.Optional; @Service public class TemperatureServiceImpl implements TemperatureService { @@ -50,4 +57,75 @@ public class TemperatureServiceImpl implements TemperatureService { this.temperatureRepository.save(temperature); } } + + @Override + public List findFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc) { + int page=1,size=10; + Sort sort = Sort.by(Sort.Direction.DESC, "id"); + Pageable pageable = PageRequest.of(page, size, sort); + +// userRepository.findALL(pageable); +// userRepository.findByUserName("testName", pageable); + + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdfHour = new SimpleDateFormat("yyyy-MM-dd HH"); + SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + String nowDate = sdf.format(now); + + Optional> listResult = Optional.ofNullable(temperatureRepository.findFirst10ByDataDateAndLocationDesc(dataDate, locationDesc, sort)); + if(listResult.isPresent()){ + return listResult.get(); + } + return new ArrayList<>(); + } + + @Override + public List findFirst10ByLocationDesc(String locationDesc) { + int page=1,size=10; + Sort sort = Sort.by(Sort.Direction.DESC, "id"); + Pageable pageable = PageRequest.of(page, size, sort); + +// userRepository.findALL(pageable); +// userRepository.findByUserName("testName", pageable); + + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdfHour = new SimpleDateFormat("yyyy-MM-dd HH"); + SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + String nowDate = sdf.format(now); + + Optional> listResult = Optional.ofNullable(temperatureRepository.findFirst10ByDataDateAndLocationDesc(nowDate, locationDesc, sort)); + if(listResult.isPresent()){ + return listResult.get(); + } + return new ArrayList<>(); + } + + @Override + public Temperature findFirstByOrderByLocationDescAsc(String locationDesc) { + Optional temperatureResult = Optional.ofNullable(temperatureRepository.findFirstByOrderByDataDateDesc()); + if(temperatureResult.isPresent()){ + return temperatureResult.get(); + } + return null; + } + + @Override + public List queryFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc) { + int page=0,size=10; + Sort sort = Sort.by(Sort.Direction.DESC, "id"); + Pageable pageable = PageRequest.of(page, size, sort); + Page listResult = temperatureRepository.queryFirst10ByDataDateAndLocationDesc(dataDate, locationDesc, pageable); + + if(listResult.getTotalPages()>0){ + return listResult.getContent(); + } + + return new ArrayList<>(); + } + + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 53f29af..65b9063 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,9 +7,9 @@ spring: # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=appserver;encrypt=false; # username: sa # password: Skyinno251, - url: jdbc:mysql://127.0.0.1:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true + #url: jdbc:mysql://127.0.0.1:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true driverClassName: com.mysql.cj.jdbc.Driver #com.mysql.cj.jdbc.Driver com.mysql.jdbc.Driver - #url: jdbc:mysql://192.168.2.18:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true + url: jdbc:mysql://192.168.2.18:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true username: root password: Skyinno251, jpa: