From dd206ae84d31a6a3b0f16e69cf1be0e36151d9d3 Mon Sep 17 00:00:00 2001 From: lijie Date: Thu, 4 Aug 2022 11:43:06 +0800 Subject: [PATCH] first --- uartBackend/.idea/.gitignore | 0 uartBackend/.idea/compiler.xml | 18 +++ uartBackend/.idea/encodings.xml | 7 + uartBackend/.idea/jarRepositories.xml | 20 +++ uartBackend/.idea/misc.xml | 14 ++ uartBackend/.idea/vcs.xml | 6 + uartBackend/.idea/workspace.xml | 141 +++++++++++++++++ uartBackend/README.md | 1 + uartBackend/pom.xml | 125 +++++++++++++++ .../com/topsail/uartBackend/CodeGenerator.java | 163 +++++++++++++++++++ .../uartBackend/UartBackendApplication.java | 18 +++ .../uartBackend/config/GlobalException.java | 51 ++++++ .../topsail/uartBackend/config/Interceptor.java | 37 +++++ .../uartBackend/config/InterceptorConfig.java | 26 +++ .../uartBackend/config/MybatisObjectHandler.java | 31 ++++ .../java/com/topsail/uartBackend/core/CodeMsg.java | 90 +++++++++++ .../java/com/topsail/uartBackend/core/JwtUtil.java | 55 +++++++ .../java/com/topsail/uartBackend/core/Result.java | 91 +++++++++++ .../controller/CommandCollectionController.java | 66 ++++++++ .../uart/controller/CommandDetailController.java | 74 +++++++++ .../uart/controller/CommandTypeController.java | 72 +++++++++ .../uart/controller/DeviceCommandController.java | 66 ++++++++ .../controller/DeviceConfigDetailController.java | 73 +++++++++ .../uartBackend/uart/entity/CommandCollection.java | 137 ++++++++++++++++ .../uartBackend/uart/entity/CommandDetail.java | 175 +++++++++++++++++++++ .../uartBackend/uart/entity/CommandType.java | 49 ++++++ .../uartBackend/uart/entity/DeviceCommand.java | 49 ++++++ .../uart/entity/DeviceConfigDetail.java | 89 +++++++++++ .../uart/mapper/CommandCollectionMapper.java | 18 +++ .../uart/mapper/CommandDetailMapper.java | 18 +++ .../uartBackend/uart/mapper/CommandTypeMapper.java | 20 +++ .../uart/mapper/DeviceCommandMapper.java | 20 +++ .../uart/mapper/DeviceConfigDetailMapper.java | 18 +++ .../uart/service/CommandCollectionService.java | 21 +++ .../uart/service/CommandDetailService.java | 21 +++ .../uart/service/CommandTypeService.java | 23 +++ .../uart/service/DeviceCommandService.java | 31 ++++ .../uart/service/DeviceConfigDetailService.java | 21 +++ .../service/Impl/CommandCollectionServiceImpl.java | 42 +++++ .../service/Impl/CommandDetailServiceImpl.java | 42 +++++ .../uart/service/Impl/CommandTypeServiceImpl.java | 47 ++++++ .../service/Impl/DeviceCommandServiceImpl.java | 83 ++++++++++ .../Impl/DeviceConfigDetailServiceImpl.java | 42 +++++ .../user/controller/UserController.java | 106 +++++++++++++ .../com/topsail/uartBackend/user/entity/User.java | 83 ++++++++++ .../uartBackend/user/mapper/UserMapper.java | 18 +++ .../user/service/Impl/UserServiceImpl.java | 42 +++++ .../uartBackend/user/service/UserService.java | 21 +++ .../src/main/resources/application-prod.properties | 5 + .../src/main/resources/application.properties | 19 +++ .../resources/mapper/CommandCollectionMapper.xml | 5 + .../main/resources/mapper/CommandDetailMapper.xml | 5 + .../main/resources/mapper/CommandTypeMapper.xml | 10 ++ .../main/resources/mapper/DeviceCommandMapper.xml | 9 ++ .../resources/mapper/DeviceConfigDetailMapper.xml | 5 + .../src/main/resources/mapper/UserMapper.xml | 5 + .../src/main/resources/templates/controller.ftl | 66 ++++++++ .../src/main/resources/templates/entity.ftl | 170 ++++++++++++++++++++ .../src/main/resources/templates/mapper.ftl | 22 +++ .../src/main/resources/templates/service.ftl | 25 +++ .../src/main/resources/templates/serviceImpl.ftl | 48 ++++++ .../target/classes/application-prod.properties | 5 + uartBackend/target/classes/application.properties | 19 +++ .../com/topsail/uartBackend/CodeGenerator$1.class | Bin 0 -> 556 bytes .../com/topsail/uartBackend/CodeGenerator$2.class | Bin 0 -> 1297 bytes .../com/topsail/uartBackend/CodeGenerator$3.class | Bin 0 -> 1304 bytes .../com/topsail/uartBackend/CodeGenerator.class | Bin 0 -> 7367 bytes .../uartBackend/UartBackendApplication.class | Bin 0 -> 768 bytes .../uartBackend/config/GlobalException.class | Bin 0 -> 2749 bytes .../topsail/uartBackend/config/Interceptor.class | Bin 0 -> 1968 bytes .../uartBackend/config/InterceptorConfig.class | Bin 0 -> 1571 bytes .../uartBackend/config/MybatisObjectHandler.class | Bin 0 -> 1165 bytes .../com/topsail/uartBackend/core/CodeMsg.class | Bin 0 -> 3917 bytes .../com/topsail/uartBackend/core/JwtUtil.class | Bin 0 -> 3193 bytes .../com/topsail/uartBackend/core/Result.class | Bin 0 -> 3923 bytes .../controller/CommandCollectionController.class | Bin 0 -> 3296 bytes .../uart/controller/CommandDetailController.class | Bin 0 -> 3597 bytes .../uart/controller/CommandTypeController.class | Bin 0 -> 3491 bytes .../uart/controller/DeviceCommandController.class | Bin 0 -> 3224 bytes .../controller/DeviceConfigDetailController.class | Bin 0 -> 3607 bytes .../uart/entity/CommandCollection.class | Bin 0 -> 10934 bytes .../uartBackend/uart/entity/CommandDetail.class | Bin 0 -> 14163 bytes .../uartBackend/uart/entity/CommandType.class | Bin 0 -> 3225 bytes .../uartBackend/uart/entity/DeviceCommand.class | Bin 0 -> 3571 bytes .../uart/entity/DeviceConfigDetail.class | Bin 0 -> 6726 bytes .../uart/mapper/CommandCollectionMapper.class | Bin 0 -> 446 bytes .../uart/mapper/CommandDetailMapper.class | Bin 0 -> 434 bytes .../uart/mapper/CommandTypeMapper.class | Bin 0 -> 668 bytes .../uart/mapper/DeviceCommandMapper.class | Bin 0 -> 549 bytes .../uart/mapper/DeviceConfigDetailMapper.class | Bin 0 -> 449 bytes .../uart/service/CommandCollectionService.class | Bin 0 -> 766 bytes .../uart/service/CommandDetailService.class | Bin 0 -> 738 bytes .../uart/service/CommandTypeService.class | Bin 0 -> 842 bytes .../uart/service/DeviceCommandService.class | Bin 0 -> 1244 bytes .../uart/service/DeviceConfigDetailService.class | Bin 0 -> 773 bytes .../Impl/CommandCollectionServiceImpl.class | Bin 0 -> 2588 bytes .../service/Impl/CommandDetailServiceImpl.class | Bin 0 -> 2524 bytes .../uart/service/Impl/CommandTypeServiceImpl.class | Bin 0 -> 2758 bytes .../service/Impl/DeviceCommandServiceImpl.class | Bin 0 -> 5292 bytes .../Impl/DeviceConfigDetailServiceImpl.class | Bin 0 -> 2604 bytes .../user/controller/UserController.class | Bin 0 -> 4430 bytes .../com/topsail/uartBackend/user/entity/User.class | Bin 0 -> 6066 bytes .../uartBackend/user/mapper/UserMapper.class | Bin 0 -> 407 bytes .../user/service/Impl/UserServiceImpl.class | Bin 0 -> 2380 bytes .../uartBackend/user/service/UserService.class | Bin 0 -> 675 bytes .../classes/mapper/CommandCollectionMapper.xml | 5 + .../target/classes/mapper/CommandDetailMapper.xml | 5 + .../target/classes/mapper/CommandTypeMapper.xml | 10 ++ .../target/classes/mapper/DeviceCommandMapper.xml | 9 ++ .../classes/mapper/DeviceConfigDetailMapper.xml | 5 + uartBackend/target/classes/mapper/UserMapper.xml | 5 + .../target/classes/templates/controller.ftl | 66 ++++++++ uartBackend/target/classes/templates/entity.ftl | 170 ++++++++++++++++++++ uartBackend/target/classes/templates/mapper.ftl | 22 +++ uartBackend/target/classes/templates/service.ftl | 25 +++ .../target/classes/templates/serviceImpl.ftl | 48 ++++++ uartBackend/target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 42 +++++ .../compile/default-compile/inputFiles.lst | 39 +++++ .../default-testCompile/createdFiles.lst | 0 .../testCompile/default-testCompile/inputFiles.lst | 0 .../target/uartBackend-1.0.0-SNAPSHOT.jar.original | Bin 0 -> 66452 bytes uartBackend/uartBackend.iml | 2 + uartPage/read.txt | 0 124 files changed, 3355 insertions(+) create mode 100644 uartBackend/.idea/.gitignore create mode 100644 uartBackend/.idea/compiler.xml create mode 100644 uartBackend/.idea/encodings.xml create mode 100644 uartBackend/.idea/jarRepositories.xml create mode 100644 uartBackend/.idea/misc.xml create mode 100644 uartBackend/.idea/vcs.xml create mode 100644 uartBackend/.idea/workspace.xml create mode 100644 uartBackend/README.md create mode 100644 uartBackend/pom.xml create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/CodeGenerator.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/UartBackendApplication.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/config/GlobalException.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/config/Interceptor.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/config/InterceptorConfig.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/config/MybatisObjectHandler.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/core/CodeMsg.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/core/JwtUtil.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/core/Result.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandCollectionController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandDetailController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandTypeController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceCommandController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandCollection.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandDetail.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandType.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceCommand.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandTypeMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandCollectionService.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandDetailService.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandTypeService.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceCommandService.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceConfigDetailService.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandDetailServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandTypeServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceCommandServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceConfigDetailServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/user/controller/UserController.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/user/entity/User.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/user/mapper/UserMapper.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.java create mode 100644 uartBackend/src/main/java/com/topsail/uartBackend/user/service/UserService.java create mode 100644 uartBackend/src/main/resources/application-prod.properties create mode 100644 uartBackend/src/main/resources/application.properties create mode 100644 uartBackend/src/main/resources/mapper/CommandCollectionMapper.xml create mode 100644 uartBackend/src/main/resources/mapper/CommandDetailMapper.xml create mode 100644 uartBackend/src/main/resources/mapper/CommandTypeMapper.xml create mode 100644 uartBackend/src/main/resources/mapper/DeviceCommandMapper.xml create mode 100644 uartBackend/src/main/resources/mapper/DeviceConfigDetailMapper.xml create mode 100644 uartBackend/src/main/resources/mapper/UserMapper.xml create mode 100644 uartBackend/src/main/resources/templates/controller.ftl create mode 100644 uartBackend/src/main/resources/templates/entity.ftl create mode 100644 uartBackend/src/main/resources/templates/mapper.ftl create mode 100644 uartBackend/src/main/resources/templates/service.ftl create mode 100644 uartBackend/src/main/resources/templates/serviceImpl.ftl create mode 100644 uartBackend/target/classes/application-prod.properties create mode 100644 uartBackend/target/classes/application.properties create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$1.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$2.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$3.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/UartBackendApplication.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/config/GlobalException.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/config/Interceptor.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/config/InterceptorConfig.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/config/MybatisObjectHandler.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/core/CodeMsg.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/core/JwtUtil.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/core/Result.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandCollectionController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandDetailController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandTypeController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/controller/DeviceCommandController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandCollection.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandDetail.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandType.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/entity/DeviceCommand.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandTypeMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/CommandCollectionService.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/CommandDetailService.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/CommandTypeService.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/DeviceCommandService.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/DeviceConfigDetailService.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/CommandDetailServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/CommandTypeServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/DeviceCommandServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/DeviceConfigDetailServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/user/controller/UserController.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/user/entity/User.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/user/mapper/UserMapper.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.class create mode 100644 uartBackend/target/classes/com/topsail/uartBackend/user/service/UserService.class create mode 100644 uartBackend/target/classes/mapper/CommandCollectionMapper.xml create mode 100644 uartBackend/target/classes/mapper/CommandDetailMapper.xml create mode 100644 uartBackend/target/classes/mapper/CommandTypeMapper.xml create mode 100644 uartBackend/target/classes/mapper/DeviceCommandMapper.xml create mode 100644 uartBackend/target/classes/mapper/DeviceConfigDetailMapper.xml create mode 100644 uartBackend/target/classes/mapper/UserMapper.xml create mode 100644 uartBackend/target/classes/templates/controller.ftl create mode 100644 uartBackend/target/classes/templates/entity.ftl create mode 100644 uartBackend/target/classes/templates/mapper.ftl create mode 100644 uartBackend/target/classes/templates/service.ftl create mode 100644 uartBackend/target/classes/templates/serviceImpl.ftl create mode 100644 uartBackend/target/maven-archiver/pom.properties create mode 100644 uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 uartBackend/target/uartBackend-1.0.0-SNAPSHOT.jar.original create mode 100644 uartBackend/uartBackend.iml create mode 100644 uartPage/read.txt diff --git a/uartBackend/.idea/.gitignore b/uartBackend/.idea/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/uartBackend/.idea/compiler.xml b/uartBackend/.idea/compiler.xml new file mode 100644 index 0000000..604c38c --- /dev/null +++ b/uartBackend/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/uartBackend/.idea/encodings.xml b/uartBackend/.idea/encodings.xml new file mode 100644 index 0000000..0e1c064 --- /dev/null +++ b/uartBackend/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/uartBackend/.idea/jarRepositories.xml b/uartBackend/.idea/jarRepositories.xml new file mode 100644 index 0000000..be5f5c6 --- /dev/null +++ b/uartBackend/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/uartBackend/.idea/misc.xml b/uartBackend/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/uartBackend/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/uartBackend/.idea/vcs.xml b/uartBackend/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/uartBackend/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/uartBackend/.idea/workspace.xml b/uartBackend/.idea/workspace.xml new file mode 100644 index 0000000..216043e --- /dev/null +++ b/uartBackend/.idea/workspace.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1658211017210 + + + 1658716154918 + + + 1659584068592 + + + + + + + + + \ No newline at end of file diff --git a/uartBackend/README.md b/uartBackend/README.md new file mode 100644 index 0000000..9d07aa0 --- /dev/null +++ b/uartBackend/README.md @@ -0,0 +1 @@ +111 \ No newline at end of file diff --git a/uartBackend/pom.xml b/uartBackend/pom.xml new file mode 100644 index 0000000..4e0059d --- /dev/null +++ b/uartBackend/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + spring-boot-starter-parent + org.springframework.boot + 2.4.5 + + com.topsail + uartBackend + 1.0.0-SNAPSHOT + uartBackend + Demo project for Spring Boot + + + + org.springframework.boot + spring-boot-starter-web + + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + runtime + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.0 + + + + + + org.projectlombok + lombok + 1.18.16 + + + + com.baomidou + mybatis-plus-boot-starter + 3.3.2 + + + mybatis-plus-extension + com.baomidou + + + + + com.baomidou + mybatis-plus-generator + 3.3.0 + + + jsqlparser + com.github.jsqlparser + + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-validation + + + + + + cn.hutool + hutool-all + 5.7.20 + + + + + + org.freemarker + freemarker + 2.3.30 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.3.0 + + + org.mybatis + mybatis + + + org.mybatis + mybatis-spring + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/CodeGenerator.java b/uartBackend/src/main/java/com/topsail/uartBackend/CodeGenerator.java new file mode 100644 index 0000000..a7d03b6 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/CodeGenerator.java @@ -0,0 +1,163 @@ +package com.topsail.uartBackend; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.FileType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * 代码生成启动类 + */ +public class CodeGenerator { + + /** + *

+ * 读取控制台内容 + *

+ */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入" + tip + ":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotEmpty(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("请输入正确的" + tip + "!"); + } + + + + public static void main(String[] args) { + + + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + String projectPath = System.getProperty("user.dir"); + //String projectPath="E:\\topsail_new_git\\test\\sxhy\\sxhyrl";//此处可以编写绝对路径直接到项目 + gc.setOutputDir(projectPath + "/src/main/java"); + gc.setAuthor("lj"); + gc.setOpen(false); //默认true ,是否打开输出目录 + //gc.setFileOverride(false); //默认false ,是否覆盖已生成文件 + gc.setMapperName("%sMapper"); + gc.setXmlName("%sMapper"); + gc.setServiceName("%sService"); + gc.setServiceImplName("%sServiceImpl"); + gc.setControllerName("%sController"); + //gc.setSwagger2(true); //实体属性 Swagger2 注解 + mpg.setGlobalConfig(gc); + + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl("jdbc:mysql://rm-2ze77qng1ddlfur9g4o.mysql.rds.aliyuncs.com:3306/bluetooth_uart?useUnicode=true&useSSL=false&characterEncoding=utf8"); + //dsc.setSchemaName("public"); + dsc.setDriverName("com.mysql.jdbc.Driver"); + dsc.setUsername("topsail"); + dsc.setPassword("Topsail2020"); + mpg.setDataSource(dsc); + + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setParent("com.topsail.uartBackend.uart"); + pc.setController("controller"); + pc.setEntity("entity"); + pc.setService("service"); + pc.setServiceImpl("service.Impl"); + pc.setMapper("mapper"); + mpg.setPackageInfo(pc); + + // 自定义配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + // to do nothing + } + }; + + // 如果模板引擎是 freemarker + String templatePath = "/templates/mapper.xml.ftl"; + // 如果模板引擎是 velocity + // String templatePath = "/templates/mapper.xml.vm"; + + // 自定义输出配置 + List focList = new ArrayList<>(); + // 自定义配置会被优先输出 + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! + return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; + } + }); + + cfg.setFileCreate(new IFileCreate() { + @Override + public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { + // 判断自定义文件夹是否需要创建 + //checkDir("调用默认方法创建的目录,自定义目录用"); + //if (fileType == FileType.MAPPER ||FileType.ENTITY==fileType) { + File file = new File(filePath); + boolean exist = file.exists(); + if(exist){ + if (FileType.ENTITY==fileType) {//重新生成实体类 + // 已经生成 mapper,entity文件判断存在,返回true重新生成 + return new File(filePath).exists(); + }else { + return false;//其他存在的都不重复生成 + } + } + // 不存在的都生成 + return true; + } + }); + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + // 配置模板 + TemplateConfig templateConfig = new TemplateConfig(); + //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 + // templateConfig.setEntity("templates/entity2.java"); + // templateConfig.setService(); + templateConfig.setController("/templates/controller"); + //templateConfig.setService("");//这样配置指的是不生成此文件 + templateConfig.setService("/templates/service"); + templateConfig.setServiceImpl("/templates/serviceImpl"); + templateConfig.setEntity("/templates/entity"); + templateConfig.setMapper("/templates/mapper"); + //templateConfig.setXml( "/templates/mapper.xml"); + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setEntityLombokModel(true); + strategy.setRestControllerStyle(true); + //strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); + strategy.setInclude(new String[]{"command_collection","command_type","device_command","device_config_detail","command_detail"}); + strategy.setControllerMappingHyphenStyle(true); + strategy.setTablePrefix(pc.getModuleName() + "_"); + mpg.setStrategy(strategy); + mpg.setTemplateEngine(new FreemarkerTemplateEngine()); + mpg.execute(); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/UartBackendApplication.java b/uartBackend/src/main/java/com/topsail/uartBackend/UartBackendApplication.java new file mode 100644 index 0000000..4ed1200 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/UartBackendApplication.java @@ -0,0 +1,18 @@ +package com.topsail.uartBackend; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +/** + * <描述> + * + * @author lj + * @date 2022/07/19 14:15 + */ +@SpringBootApplication +public class UartBackendApplication { + public static void main(String[] args) { + SpringApplication.run(UartBackendApplication.class,args); + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/config/GlobalException.java b/uartBackend/src/main/java/com/topsail/uartBackend/config/GlobalException.java new file mode 100644 index 0000000..6f77f8b --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/config/GlobalException.java @@ -0,0 +1,51 @@ +package com.topsail.uartBackend.config; + +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.core.Result; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.validation.BindException; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.ParseException; +import java.util.List; + +/** + * <描述> + * + * @author lj + * @date 2022/07/21 10:09 + */ +@ControllerAdvice +@ResponseBody +public class GlobalException { + + @ExceptionHandler(value = Exception.class)//拦截所有异常 + public Result exceptionHandler(HttpServletRequest request, Exception e){ + e.printStackTrace(); + if(e instanceof BindException) { + BindException ex = (BindException)e; + List errors = ex.getAllErrors();//绑定错误返回很多错误,是一个错误列表,只需要第一个错误 + ObjectError error = errors.get(0); + String msg = error.getDefaultMessage(); + return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));//给状态码填充参数 + }else if(e instanceof ParseException){ + return Result.error(CodeMsg.TIME_ERROR); + }else if(e instanceof DuplicateKeyException){ + return Result.error(CodeMsg.DUPLICATEKEY_ERROR); + }else if(e instanceof IllegalStateException){ + return Result.error(CodeMsg.TOKEN_INVALID); + }else { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + return Result.error(new CodeMsg(500,sw.toString().substring(0,300)));//输出错误的堆栈信息 + } + + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/config/Interceptor.java b/uartBackend/src/main/java/com/topsail/uartBackend/config/Interceptor.java new file mode 100644 index 0000000..32b38ae --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/config/Interceptor.java @@ -0,0 +1,37 @@ +package com.topsail.uartBackend.config; + +import com.topsail.uartBackend.core.JwtUtil; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * <描述> + * + * @author lj + * @date 2022/07/20 9:47 + */ +public class Interceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!(request.getRequestURI().contains("/user/login"))){ + String token = request.getHeader("Authorization"); + JwtUtil.validateToken(token); + } + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/config/InterceptorConfig.java b/uartBackend/src/main/java/com/topsail/uartBackend/config/InterceptorConfig.java new file mode 100644 index 0000000..d98b4fb --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/config/InterceptorConfig.java @@ -0,0 +1,26 @@ +package com.topsail.uartBackend.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * <描述> + * + * @author lj + * @date 2022/07/20 10:09 + */ +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + @Bean + public Interceptor interceptor(){ + return new Interceptor(); + } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(interceptor()) +// .addPathPatterns("/**") + .excludePathPatterns("/user/login","/user/logout"); + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/config/MybatisObjectHandler.java b/uartBackend/src/main/java/com/topsail/uartBackend/config/MybatisObjectHandler.java new file mode 100644 index 0000000..2b66900 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/config/MybatisObjectHandler.java @@ -0,0 +1,31 @@ +package com.topsail.uartBackend.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.util.Date; + +/** + * <描述> + * + * @author lj + * @date 2022/07/20 9:40 + */ +public class MybatisObjectHandler implements MetaObjectHandler { + @Override + public void insertFill(MetaObject metaObject) { + if (metaObject.hasSetter("createTime")){ + setFieldValByName("createTime",new Date(),metaObject); + } + if (metaObject.hasSetter("updateTime")){ + setFieldValByName("updateTime",new Date(),metaObject); + } + } + + @Override + public void updateFill(MetaObject metaObject) { + if(metaObject.hasSetter("updateTime")){ + setFieldValByName("updateTime",new Date(),metaObject); + } + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/core/CodeMsg.java b/uartBackend/src/main/java/com/topsail/uartBackend/core/CodeMsg.java new file mode 100644 index 0000000..0a6f0a5 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/core/CodeMsg.java @@ -0,0 +1,90 @@ +package com.topsail.uartBackend.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * <描述> + * + * @author lj + * @date 2022/07/19 14:34 + */ +public class CodeMsg { + + private int code; + private String msg; + + //通用的错误码 + public static CodeMsg SUCCESS = new CodeMsg(0, "success"); + public static CodeMsg FAILED = new CodeMsg(502, "failed"); + public static CodeMsg TOKEN_EXPIRED = new CodeMsg(400, "token过期"); + public static CodeMsg TOKEN_INVALID = new CodeMsg(502, "token解析异常"); + public static CodeMsg USER_NOT_LOGGED_IN = new CodeMsg(402, "未登录,请登录!"); + public static CodeMsg SIGNATURE_ERROR = new CodeMsg(506, "签名失败"); + public static CodeMsg SERVER_ERROR = new CodeMsg(500, "服务端异常"); + public static CodeMsg FILE_ERROR = new CodeMsg(501, "文件不存在"); + public static CodeMsg FILE_EXIST = new CodeMsg(5012, "文件已存在"); + public static CodeMsg TIME_ERROR = new CodeMsg(502, "时间格式错误,应为 yyyy-MM-dd HH:mm:ss"); + public static CodeMsg DUPLICATEKEY_ERROR = new CodeMsg(502, "IMEI已注册"); + public static CodeMsg TIMEMISS_ERROR = new CodeMsg(503, "查询时间缺失,应为 yyyy-MM-dd HH:mm:ss"); + public static CodeMsg BIND_ERROR = new CodeMsg(504, "参数绑定异常"); + public static CodeMsg CONTROL_ERROR = new CodeMsg(505, "命令下发失败,请检查设备相关信息是否存在或正确以及参数输入是否正确"); + + private CodeMsg() { + } + + public CodeMsg(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + /** + * 返回带参数的错误码 + * @param args + * @return + */ + public CodeMsg fillArgs(Object... args) { + int code = this.code; + String message = String.format(this.msg, args); + return new CodeMsg(code, message); + } + + @Override + public String toString() { + return "CodeMsg [code=" + code + ", msg=" + msg + "]"; + } + + public static void main(String[] args) { + //String regex="^[+-@=](.*?)\\d$"; + //String regex="^[\\u4e00-\\u9fa5]{0,}(.*?)\\d$"; + String regex="(.*?)\\d+(\\.\\d+)?(.*?)\\d+(\\.\\d+)?"; + String regex2="[\\u4e00-\\u9fa5](.*?:)[\\u4e00-\\u9fa5]?";//匹配所有汉字 + String a="北一层:17*7.5\n东房:6.3*3"; + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(a); + List result=new ArrayList(); + while(m.find()) { + System.out.println(m.group()); + result.add(m.group()); + } + System.out.println(result.toString()); + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/core/JwtUtil.java b/uartBackend/src/main/java/com/topsail/uartBackend/core/JwtUtil.java new file mode 100644 index 0000000..fceb070 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/core/JwtUtil.java @@ -0,0 +1,55 @@ +package com.topsail.uartBackend.core; + +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.exceptions.ValidateException; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.hutool.jwt.JWT; +import cn.hutool.jwt.JWTValidator; +import cn.hutool.jwt.signers.JWTSignerUtil; +import com.topsail.uartBackend.user.entity.User; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * <描述> + * + * @author lj + * @date 2022/07/19 14:45 + */ +public class JwtUtil { + private final static String TOKEN_KEY = "DJASNCSALKNASNNHAbvkslmm1161"; + + + public static String getToken(User user){ + DateTime newTime = DateTime.now().offsetNew(DateField.SECOND, 60 * 60 * 24); + Mapmap = new HashMap<>(); + map.put("user",user); + String token = JWT.create() + .addPayloads(map) + .setSigner(JWTSignerUtil.hs512(TOKEN_KEY.getBytes())) + .setExpiresAt(newTime) + .sign(); + return "Bearer "+token; + } + + public static User getUserFromToken(String token){ + return JSONUtil.toBean((JSONObject)JWT.of(token.split(" ")[1]).getPayloads().get("user"),User.class); + } + + public static void validateToken(String token){ + + try { + String newToken = token.split(" ")[1]; + JWTValidator.of(newToken) + .validateAlgorithm(JWTSignerUtil.hs512(TOKEN_KEY.getBytes())) + .validateDate(DateTime.now()); + }catch (ValidateException ex){ + throw new ValidateException("token异常!"); + } + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/core/Result.java b/uartBackend/src/main/java/com/topsail/uartBackend/core/Result.java new file mode 100644 index 0000000..b71940f --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/core/Result.java @@ -0,0 +1,91 @@ +package com.topsail.uartBackend.core; + +import com.github.pagehelper.PageInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * <描述> + * + * @author lj + * @date 2022/07/19 14:38 + */ +public class Result { + private int code; + private String msg = "success"; + private T data; + + + /** + * 成功时候的调用 + * */ + public static Result success(T data){ + return new Result(CodeMsg.SUCCESS,data); + } + + /** + * 失败时候的调用 + * */ + public static Result error(CodeMsg codeMsg){ + return new Result(codeMsg); + } + + public static Map returnPageMap(List t){ + PageInfo pageInfo=new PageInfo(t); + int count=(int)pageInfo.getTotal(); + Map map=new HashMap<>(); + map.put("list", new ArrayList(pageInfo.getList())); + map.put("count",count); + return map; + } + + private Result(CodeMsg codeMsg) { + if(codeMsg != null) { + this.code = codeMsg.getCode(); + this.msg = codeMsg.getMsg(); + } + } + + private Result(CodeMsg codeMsg,T data){ + this.code = codeMsg.getCode(); + this.msg = codeMsg.getMsg(); + this.data = data; + } + + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "Result{" + + "code=" + code + + ", msg='" + msg + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandCollectionController.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandCollectionController.java new file mode 100644 index 0000000..eb9a600 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandCollectionController.java @@ -0,0 +1,66 @@ + +package com.topsail.uartBackend.uart.controller; + + +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.uart.service.CommandCollectionService; +import com.topsail.uartBackend.uart.entity.CommandCollection; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + + + +/** +* +* Created by lj on '2022-08-01 14:14:15'. +*/ +@RestController +//@RequestMapping("/command-collection") +@RequestMapping("commandCollection") + +public class CommandCollectionController { + + @Autowired + private CommandCollectionService commandCollectionService; + + /** + * 新增 + */ + @PostMapping("/insertCommandCollection") + public Result insertCommandCollection( @RequestBody CommandCollection commandCollection){ + boolean rsp= commandCollectionService.save(commandCollection); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/deleteCommandCollection/{id}") + public Result deleteCommandCollection(@PathVariable Integer id){ + boolean rsp= commandCollectionService.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/updateCommandCollection") + public Result updateCommandCollection(@RequestBody CommandCollection commandCollection){ + boolean rsp= commandCollectionService.updateById(commandCollection); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getCommandCollectionList") + + public Result pageList(CommandCollection commandCollection,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(commandCollectionService.pageList(commandCollection,pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandDetailController.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandDetailController.java new file mode 100644 index 0000000..f11a6a1 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandDetailController.java @@ -0,0 +1,74 @@ + +package com.topsail.uartBackend.uart.controller; + + +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import com.topsail.uartBackend.uart.service.CommandDetailService; +import com.topsail.uartBackend.uart.entity.CommandDetail; +import com.topsail.uartBackend.uart.service.DeviceCommandService; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + +import javax.annotation.Resource; +import java.util.List; + + +/** +* +* Created by lj on '2022-08-01 14:14:15'. +*/ +@RestController +//@RequestMapping("/command-detail") +@RequestMapping("commandDetail") + +public class CommandDetailController { + + @Autowired + private CommandDetailService commandDetailService; + + @Resource + private DeviceCommandService deviceCommandService; + + /** + * 新增 + */ + @PostMapping("/insertCommandDetail") + public Result insertCommandDetail(@RequestBody DeviceCommand deviceCommand){ + deviceCommandService.insertList(deviceCommand); + return Result.success("成功"); + } + + /** + * 删除 + */ + @DeleteMapping("/deleteCommandDetail/{id}") + public Result deleteCommandDetail(@PathVariable Integer deviceDetailId){ + deviceCommandService.deleteByDevice(deviceDetailId); + + return Result.success("成功"); + } + + /** + * 更新 + */ + @PutMapping("/updateCommandDetail") + public Result updateCommandDetail(ListdeviceCommands){ + deviceCommandService.updateList(deviceCommands); + return Result.success("成功"); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getCommandDetailList") + + public Result pageList(CommandDetail commandDetail,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(commandDetailService.pageList(commandDetail,pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandTypeController.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandTypeController.java new file mode 100644 index 0000000..8ca9223 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/CommandTypeController.java @@ -0,0 +1,72 @@ + +package com.topsail.uartBackend.uart.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.uart.service.CommandTypeService; +import com.topsail.uartBackend.uart.entity.CommandType; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + + + +/** +* +* Created by lj on '2022-08-01 14:14:15'. +*/ +@RestController +//@RequestMapping("/command-type") +@RequestMapping("commandType") + +public class CommandTypeController { + + @Autowired + private CommandTypeService commandTypeService; + + /** + * 新增 + */ + @PostMapping("/insertCommandType") + public Result insertCommandType( @RequestBody CommandType commandType){ + + CommandType commandType1 = commandTypeService.selectByTypeId(commandType.getTypeId()); + if (null!=commandType1){ + return Result.error(new CodeMsg(502,"类型ID重复!")); + } + boolean rsp= commandTypeService.save(commandType); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/deleteCommandType/{id}") + public Result deleteCommandType(@PathVariable Integer id){ + boolean rsp= commandTypeService.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/updateCommandType") + public Result updateCommandType(@RequestBody CommandType commandType){ + boolean rsp= commandTypeService.updateById(commandType); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getCommandTypeList") + + public Result pageList(CommandType commandType,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(commandTypeService.pageList(commandType,pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceCommandController.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceCommandController.java new file mode 100644 index 0000000..ed78e44 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceCommandController.java @@ -0,0 +1,66 @@ + +package com.topsail.uartBackend.uart.controller; + + +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.uart.service.DeviceCommandService; +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + + + +/** +* +* Created by lj on '2022-08-01 14:14:15'. +*/ +@RestController +//@RequestMapping("/device-command") +@RequestMapping("deviceCommand") + +public class DeviceCommandController { + + @Autowired + private DeviceCommandService deviceCommandService; + + /** + * 新增 + */ + @PostMapping("/insertDeviceCommand") + public Result insertDeviceCommand( @RequestBody DeviceCommand deviceCommand){ + boolean rsp= deviceCommandService.save(deviceCommand); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/deleteDeviceCommand/{id}") + public Result deleteDeviceCommand(@PathVariable Integer id){ + boolean rsp= deviceCommandService.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/updateDeviceCommand") + public Result updateDeviceCommand(@RequestBody DeviceCommand deviceCommand){ + boolean rsp= deviceCommandService.updateById(deviceCommand); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getDeviceCommandList") + + public Result pageList(DeviceCommand deviceCommand,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(deviceCommandService.pageList(deviceCommand,pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.java new file mode 100644 index 0000000..2243915 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.java @@ -0,0 +1,73 @@ + +package com.topsail.uartBackend.uart.controller; + + +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import com.topsail.uartBackend.uart.service.DeviceCommandService; +import com.topsail.uartBackend.uart.service.DeviceConfigDetailService; +import com.topsail.uartBackend.uart.entity.DeviceConfigDetail; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + +import javax.annotation.Resource; + + +/** +* +* Created by lj on '2022-08-01 14:14:15'. +*/ +@RestController +//@RequestMapping("/device-config-detail") +@RequestMapping("deviceConfigDetail") + +public class DeviceConfigDetailController { + + @Autowired + private DeviceConfigDetailService deviceConfigDetailService; + + @Resource + private DeviceCommandService deviceCommandService; + /** + * 新增 + */ + @PostMapping("/insertDeviceConfigDetail") + public Result insertDeviceConfigDetail( @RequestBody DeviceConfigDetail deviceConfigDetail){ + boolean rsp= deviceConfigDetailService.save(deviceConfigDetail); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + + @DeleteMapping("/deleteDeviceConfigDetail/{id}") + public Result deleteDeviceConfigDetail(@PathVariable Integer id){ + deviceCommandService.deleteByDevice(id); + boolean rsp= deviceConfigDetailService.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/updateDeviceConfigDetail") + public Result updateDeviceConfigDetail(@RequestBody DeviceConfigDetail deviceConfigDetail){ + boolean rsp= deviceConfigDetailService.updateById(deviceConfigDetail); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getDeviceConfigDetailList") + + public Result pageList(DeviceConfigDetail deviceConfigDetail,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(deviceConfigDetailService.pageList(deviceConfigDetail,pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandCollection.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandCollection.java new file mode 100644 index 0000000..29c603e --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandCollection.java @@ -0,0 +1,137 @@ +package com.topsail.uartBackend.uart.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 指令集合表 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class CommandCollection implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id ; + + + /** + * 指令大类ID + */ + private Integer commandType ; + + + /** + * 大类名称 + */ + private String typeName ; + + + /** + * 指令名称 + */ + private String commandName ; + + + /** + * 具体指令(一般为四位) + */ + private String commandDetail ; + + + /** + * 指令参数格式 + */ + private String commandFormat ; + + + /** + * 指令示例 + */ + private String commandExample ; + + + /** + * 输入类型(btn(按钮),input(输入框),select(固定值选择)) + */ + private String inputType ; + + + /** + * 为固定值选择的时候,需要获取选择内容key,value形式 + */ + private String inputValue ; + + + /** + * 取值最小值 + */ + private String minValue ; + + + /** + * 取值最大值 + */ + private String maxValue ; + + + /** + * 取值单位 + */ + private String valueUnit ; + + + /** + * 取值范围描述(用于界面展示,文字不应过多) + */ + private String rangeDesc ; + + + /** + * 指令描述 + */ + private String commandDesc ; + + + /** + * 备注 + */ + private String commandMsg ; + + + /** + * 适用的设备描述 + */ + private String adaptDevice ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime ; + + + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandDetail.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandDetail.java new file mode 100644 index 0000000..45f7fc2 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandDetail.java @@ -0,0 +1,175 @@ +package com.topsail.uartBackend.uart.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * VIEW + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class CommandDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 指令ID + */ + private Integer commandId ; + + + /** + * 详细设备ID + */ + private Integer deviceDetailId ; + + + private Integer dcId ; + + + /** + * 指令大类ID + */ + private Integer commandType ; + + + /** + * 大类名称 + */ + private String typeName ; + + + /** + * 指令名称 + */ + private String commandName ; + + + /** + * 具体指令(一般为四位) + */ + private String commandDetail ; + + + /** + * 指令参数格式 + */ + private String commandFormat ; + + + /** + * 指令示例 + */ + private String commandExample ; + + + /** + * 输入类型(btn(按钮),input(输入框),select(固定值选择)) + */ + private String inputType ; + + + /** + * 为固定值选择的时候,需要获取选择内容key,value形式 + */ + private String inputValue ; + + + /** + * 取值最小值 + */ + private String minValue ; + + + /** + * 取值最大值 + */ + private String maxValue ; + + + /** + * 取值单位 + */ + private String valueUnit ; + + + /** + * 取值范围描述(用于界面展示,文字不应过多) + */ + private String rangeDesc ; + + + /** + * 指令描述 + */ + private String commandDesc ; + + + /** + * 备注 + */ + private String commandMsg ; + + + /** + * 适用的设备描述 + */ + private String adaptDevice ; + + + /** + * 该类型设备的详细名称 + */ + private String deviceName ; + + + /** + * 硬件版本号 + */ + private String hardVersion ; + + + /** + * 软件版本号 + */ + private String softVersion ; + + + /** + * 所属设备类型 + */ + private String deviceType ; + + + /** + * 是否为TOPOS 1(是),2(否) + */ + private String topOs ; + + + /** + * 通用蓝牙名称(蓝牙名称-前的内容) + */ + private String blueName ; + + + /** + * 蓝牙后数字位数 + */ + private Integer blueNumSize ; + + + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandType.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandType.java new file mode 100644 index 0000000..8180cd1 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/CommandType.java @@ -0,0 +1,49 @@ +package com.topsail.uartBackend.uart.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 指令大类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class CommandType implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id ; + + + /** + * 设备类型ID + */ + private Integer typeId ; + + + /** + * 设备类型名称 + */ + private String typeName ; + + + private String msg ; + + + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceCommand.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceCommand.java new file mode 100644 index 0000000..9ab15a4 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceCommand.java @@ -0,0 +1,49 @@ +package com.topsail.uartBackend.uart.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import java.util.List; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 设备-指令 关联表 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class DeviceCommand implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id ; + + + /** + * 指令ID + */ + private Integer commandId ; + + + /** + * 详细设备ID + */ + private Integer deviceDetailId ; + + + private Listids; + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.java new file mode 100644 index 0000000..8ff4b66 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.java @@ -0,0 +1,89 @@ +package com.topsail.uartBackend.uart.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 所有类型设备的详细配置表 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class DeviceConfigDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id ; + + + /** + * 该类型设备的详细名称 + */ + private String deviceName ; + + + /** + * 硬件版本号 + */ + private String hardVersion ; + + + /** + * 软件版本号 + */ + private String softVersion ; + + + /** + * 所属设备类型 + */ + private String deviceType ; + + + /** + * 是否为TOPOS 1(是),2(否) + */ + private String topOs ; + + + /** + * 通用蓝牙名称(蓝牙名称-前的内容) + */ + private String blueName ; + + + /** + * 蓝牙后数字位数 + */ + private Integer blueNumSize ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime ; + + + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.java new file mode 100644 index 0000000..384b94c --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.java @@ -0,0 +1,18 @@ +package com.topsail.uartBackend.uart.mapper; + +import com.topsail.uartBackend.uart.entity.CommandCollection; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 指令集合表 Mapper 接口 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Mapper +public interface CommandCollectionMapper extends BaseMapper { + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.java new file mode 100644 index 0000000..4c5624e --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.java @@ -0,0 +1,18 @@ +package com.topsail.uartBackend.uart.mapper; + +import com.topsail.uartBackend.uart.entity.CommandDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * VIEW Mapper 接口 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Mapper +public interface CommandDetailMapper extends BaseMapper { + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandTypeMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandTypeMapper.java new file mode 100644 index 0000000..e6147c1 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/CommandTypeMapper.java @@ -0,0 +1,20 @@ +package com.topsail.uartBackend.uart.mapper; + +import com.topsail.uartBackend.uart.entity.CommandType; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 指令大类 Mapper 接口 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Mapper +public interface CommandTypeMapper extends BaseMapper { + + CommandType selectByTypeId(@Param("typeId")Integer typeId); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.java new file mode 100644 index 0000000..c05d41d --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.java @@ -0,0 +1,20 @@ +package com.topsail.uartBackend.uart.mapper; + +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 设备-指令 关联表 Mapper 接口 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Mapper +public interface DeviceCommandMapper extends BaseMapper { + + //删除某个设备类型时调用 + Boolean deleteByDevice(Integer deviceDetailId); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.java new file mode 100644 index 0000000..ddd9416 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.java @@ -0,0 +1,18 @@ +package com.topsail.uartBackend.uart.mapper; + +import com.topsail.uartBackend.uart.entity.DeviceConfigDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 所有类型设备的详细配置表 Mapper 接口 + *

+ * + * @author lj + * @since 2022-08-01 + */ +@Mapper +public interface DeviceConfigDetailMapper extends BaseMapper { + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandCollectionService.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandCollectionService.java new file mode 100644 index 0000000..b77f500 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandCollectionService.java @@ -0,0 +1,21 @@ +package com.topsail.uartBackend.uart.service; + +import com.topsail.uartBackend.uart.entity.CommandCollection; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * 指令集合表 服务类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +public interface CommandCollectionService extends IService { + +/** +*分页查询 +*/ +public List pageList(CommandCollection commandCollection,Integer pageNo, Integer pageSize); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandDetailService.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandDetailService.java new file mode 100644 index 0000000..8b0467f --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandDetailService.java @@ -0,0 +1,21 @@ +package com.topsail.uartBackend.uart.service; + +import com.topsail.uartBackend.uart.entity.CommandDetail; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * VIEW 服务类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +public interface CommandDetailService extends IService { + +/** +*分页查询 +*/ +public List pageList(CommandDetail commandDetail,Integer pageNo, Integer pageSize); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandTypeService.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandTypeService.java new file mode 100644 index 0000000..e267a40 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/CommandTypeService.java @@ -0,0 +1,23 @@ +package com.topsail.uartBackend.uart.service; + +import com.topsail.uartBackend.uart.entity.CommandType; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * 指令大类 服务类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +public interface CommandTypeService extends IService { + +/** +*分页查询 +*/ +public List pageList(CommandType commandType,Integer pageNo, Integer pageSize); + + CommandType selectByTypeId(Integer typeId); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceCommandService.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceCommandService.java new file mode 100644 index 0000000..e0b1664 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceCommandService.java @@ -0,0 +1,31 @@ +package com.topsail.uartBackend.uart.service; + +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + *

+ * 设备-指令 关联表 服务类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +public interface DeviceCommandService extends IService { + +/** +*分页查询 +*/ +public List pageList(DeviceCommand deviceCommand,Integer pageNo, Integer pageSize); + + Boolean deleteByDevice(Integer deviceDetailId); + + @Transactional + Boolean insertList(DeviceCommand deviceCommand); + + @Transactional + Boolean updateList(List deviceCommands); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceConfigDetailService.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceConfigDetailService.java new file mode 100644 index 0000000..42621ed --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/DeviceConfigDetailService.java @@ -0,0 +1,21 @@ +package com.topsail.uartBackend.uart.service; + +import com.topsail.uartBackend.uart.entity.DeviceConfigDetail; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * 所有类型设备的详细配置表 服务类 + *

+ * + * @author lj + * @since 2022-08-01 + */ +public interface DeviceConfigDetailService extends IService { + +/** +*分页查询 +*/ +public List pageList(DeviceConfigDetail deviceConfigDetail,Integer pageNo, Integer pageSize); +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.java new file mode 100644 index 0000000..5ae43c3 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.java @@ -0,0 +1,42 @@ +package com.topsail.uartBackend.uart.service.Impl; + +import com.topsail.uartBackend.uart.entity.CommandCollection; +import com.topsail.uartBackend.uart.mapper.CommandCollectionMapper; +import com.topsail.uartBackend.uart.service.CommandCollectionService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * 指令集合表 服务实现类 + *

+* +* @author lj +* @since 2022-08-01 +*/ +@Service +@Slf4j +public class CommandCollectionServiceImpl extends ServiceImpl implements CommandCollectionService { + + + @Autowired + private CommandCollectionMapper commandCollectionMapper; + + /** + *分页查询 + */ + @Override + public List pageList(CommandCollection commandCollection,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(commandCollection); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandDetailServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandDetailServiceImpl.java new file mode 100644 index 0000000..5ebbffc --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandDetailServiceImpl.java @@ -0,0 +1,42 @@ +package com.topsail.uartBackend.uart.service.Impl; + +import com.topsail.uartBackend.uart.entity.CommandDetail; +import com.topsail.uartBackend.uart.mapper.CommandDetailMapper; +import com.topsail.uartBackend.uart.service.CommandDetailService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * VIEW 服务实现类 + *

+* +* @author lj +* @since 2022-08-01 +*/ +@Service +@Slf4j +public class CommandDetailServiceImpl extends ServiceImpl implements CommandDetailService { + + + @Autowired + private CommandDetailMapper commandDetailMapper; + + /** + *分页查询 + */ + @Override + public List pageList(CommandDetail commandDetail,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(commandDetail); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandTypeServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandTypeServiceImpl.java new file mode 100644 index 0000000..8a473cc --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/CommandTypeServiceImpl.java @@ -0,0 +1,47 @@ +package com.topsail.uartBackend.uart.service.Impl; + +import com.topsail.uartBackend.uart.entity.CommandType; +import com.topsail.uartBackend.uart.mapper.CommandTypeMapper; +import com.topsail.uartBackend.uart.service.CommandTypeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * 指令大类 服务实现类 + *

+* +* @author lj +* @since 2022-08-01 +*/ +@Service +@Slf4j +public class CommandTypeServiceImpl extends ServiceImpl implements CommandTypeService { + + + @Autowired + private CommandTypeMapper commandTypeMapper; + + /** + *分页查询 + */ + @Override + public List pageList(CommandType commandType,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(commandType); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } + + @Override + public CommandType selectByTypeId(Integer typeId){ + return this.commandTypeMapper.selectByTypeId(typeId); + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceCommandServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceCommandServiceImpl.java new file mode 100644 index 0000000..f3d2f44 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceCommandServiceImpl.java @@ -0,0 +1,83 @@ +package com.topsail.uartBackend.uart.service.Impl; + +import com.topsail.uartBackend.uart.entity.DeviceCommand; +import com.topsail.uartBackend.uart.mapper.DeviceCommandMapper; +import com.topsail.uartBackend.uart.service.DeviceCommandService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; + +/** +*

+ * 设备-指令 关联表 服务实现类 + *

+* +* @author lj +* @since 2022-08-01 +*/ +@Transactional +@Service +@Slf4j +public class DeviceCommandServiceImpl extends ServiceImpl implements DeviceCommandService { + + + @Autowired + private DeviceCommandMapper deviceCommandMapper; + + /** + *分页查询 + */ + @Override + public List pageList(DeviceCommand deviceCommand,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(deviceCommand); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } + + @Override + public Boolean deleteByDevice(Integer deviceDetailId){ + return this.deviceCommandMapper.deleteByDevice(deviceDetailId); + } + + + @Override + @Transactional + public Boolean insertList( DeviceCommand deviceCommand){ + DeviceCommand deviceCommand1 = new DeviceCommand(); + if (null!= deviceCommand.getDeviceDetailId()){ + deviceCommandMapper.deleteByDevice(deviceCommand.getDeviceDetailId()); + if (deviceCommand.getIds().size()!=0){ + deviceCommand.getIds().forEach(id->{ + deviceCommand1.setCommandId(id); + deviceCommand1.setDeviceDetailId(deviceCommand.getDeviceDetailId()); + deviceCommandMapper.insert(deviceCommand1); + }); + } + } + return true; + } + @Override + @Transactional + public Boolean updateList(List deviceCommands){ + + deviceCommands.forEach(deviceCommand -> { + deviceCommandMapper.deleteByDevice(deviceCommand.getDeviceDetailId()); + deviceCommandMapper.insert(deviceCommand); + }); + + return true; + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceConfigDetailServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceConfigDetailServiceImpl.java new file mode 100644 index 0000000..94efe57 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/uart/service/Impl/DeviceConfigDetailServiceImpl.java @@ -0,0 +1,42 @@ +package com.topsail.uartBackend.uart.service.Impl; + +import com.topsail.uartBackend.uart.entity.DeviceConfigDetail; +import com.topsail.uartBackend.uart.mapper.DeviceConfigDetailMapper; +import com.topsail.uartBackend.uart.service.DeviceConfigDetailService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * 所有类型设备的详细配置表 服务实现类 + *

+* +* @author lj +* @since 2022-08-01 +*/ +@Service +@Slf4j +public class DeviceConfigDetailServiceImpl extends ServiceImpl implements DeviceConfigDetailService { + + + @Autowired + private DeviceConfigDetailMapper deviceConfigDetailMapper; + + /** + *分页查询 + */ + @Override + public List pageList(DeviceConfigDetail deviceConfigDetail,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(deviceConfigDetail); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/user/controller/UserController.java b/uartBackend/src/main/java/com/topsail/uartBackend/user/controller/UserController.java new file mode 100644 index 0000000..f6c6f75 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/user/controller/UserController.java @@ -0,0 +1,106 @@ + +package com.topsail.uartBackend.user.controller; + + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.topsail.uartBackend.core.CodeMsg; +import com.topsail.uartBackend.core.JwtUtil; +import com.topsail.uartBackend.user.service.UserService; +import com.topsail.uartBackend.user.entity.User; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + +import java.util.HashMap; +import java.util.Map; + + +/** +* +* Created by pz on '2022-07-19 14:59:56'. +*/ +@RestController +//@RequestMapping("/user") +@RequestMapping("user") + +public class UserController { + + @Autowired + private UserService userService; + + /** + * 新增 + */ + @PostMapping("/insertUser") + public Result insertUser( @RequestBody User user){ + User newUser = new User(); + if (null != user.getId() ){ + newUser = userService.getOne(new QueryWrapper<>(user)); + + } + if (newUser == null){ + return Result.error(new CodeMsg(502,"用户重复!")); + } + boolean rsp= userService.save(user); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/deleteUser/{id}") + public Result deleteUser(@PathVariable Integer id){ + boolean rsp= userService.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/updateUser") + public Result updateUser(@RequestBody User user){ + boolean rsp= userService.updateById(user); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/getUserList") + + public Result pageList(User user,@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(userService.pageList(user,pageNo,pageSize))); + } + + /** + * 登录 + * */ + @PostMapping("/login") + public Result login(@RequestBody User user){ + User newUser = new User(); + if (null != user ){ + newUser = userService.getOne(new QueryWrapper<>(user)); + + }else { + return Result.error(new CodeMsg(502,"登录失败,请检查账号或密码!")); + } + + if (null == newUser){ + return Result.error(new CodeMsg(502,"登录失败,请检查账号或密码!")); + } + + String token = JwtUtil.getToken(user); + Map map = new HashMap<>(); + map.put("token",token); + map.put("user",newUser); + if (2 == newUser.getStatus()){ + return Result.error(new CodeMsg(502,"该账户暂停使用!")); + } + return Result.success(map); + } + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/user/entity/User.java b/uartBackend/src/main/java/com/topsail/uartBackend/user/entity/User.java new file mode 100644 index 0000000..d6d9aeb --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/user/entity/User.java @@ -0,0 +1,83 @@ +package com.topsail.uartBackend.user.entity; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 用户表 + *

+ * + * @author lj + * @since 2022-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id ; + + + /** + * 用户名 + */ + private String userName ; + + + /** + * 别名 + */ + private String anotherName ; + + + /** + * 密码 + */ + private String password ; + + + /** + * 所属公司 + */ + private String company ; + + + /** + * 角色ID + */ + private Integer roleId ; + + + /** + * 账号状态(1:正常,2:暂停使用) + */ + private Integer status ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private Date createTime ; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime ; + + + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/user/mapper/UserMapper.java b/uartBackend/src/main/java/com/topsail/uartBackend/user/mapper/UserMapper.java new file mode 100644 index 0000000..9e64dd0 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/user/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.topsail.uartBackend.user.mapper; + +import com.topsail.uartBackend.user.entity.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户表 Mapper 接口 + *

+ * + * @author lj + * @since 2022-07-19 + */ +@Mapper +public interface UserMapper extends BaseMapper { + +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.java b/uartBackend/src/main/java/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.java new file mode 100644 index 0000000..25cf277 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.java @@ -0,0 +1,42 @@ +package com.topsail.uartBackend.user.service.Impl; + +import com.topsail.uartBackend.user.entity.User; +import com.topsail.uartBackend.user.mapper.UserMapper; +import com.topsail.uartBackend.user.service.UserService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * 用户表 服务实现类 + *

+* +* @author lj +* @since 2022-07-19 +*/ +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl implements UserService { + + + @Autowired + private UserMapper userMapper; + + /** + *分页查询 + */ + @Override + public List pageList(User user,Integer pageNo, Integer pageSize) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.setEntity(user); + PageHelper.startPage(pageNo,pageSize); + List list=list(wrapper); + return list; + } +} diff --git a/uartBackend/src/main/java/com/topsail/uartBackend/user/service/UserService.java b/uartBackend/src/main/java/com/topsail/uartBackend/user/service/UserService.java new file mode 100644 index 0000000..f891362 --- /dev/null +++ b/uartBackend/src/main/java/com/topsail/uartBackend/user/service/UserService.java @@ -0,0 +1,21 @@ +package com.topsail.uartBackend.user.service; + +import com.topsail.uartBackend.user.entity.User; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * 用户表 服务类 + *

+ * + * @author lj + * @since 2022-07-19 + */ +public interface UserService extends IService { + +/** +*分页查询 +*/ +public List pageList(User user,Integer pageNo, Integer pageSize); +} diff --git a/uartBackend/src/main/resources/application-prod.properties b/uartBackend/src/main/resources/application-prod.properties new file mode 100644 index 0000000..4cebbb8 --- /dev/null +++ b/uartBackend/src/main/resources/application-prod.properties @@ -0,0 +1,5 @@ + +spring.datasource.url=jdbc:mysql://rm-2ze77qng1ddlfur9g4o.mysql.rds.aliyuncs.com:3306/bluetooth_uart?useUnicode=true&characterEncoding=UTF-8&useSSL=false +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.username=topsail +spring.datasource.password=Topsail2020 \ No newline at end of file diff --git a/uartBackend/src/main/resources/application.properties b/uartBackend/src/main/resources/application.properties new file mode 100644 index 0000000..82026ad --- /dev/null +++ b/uartBackend/src/main/resources/application.properties @@ -0,0 +1,19 @@ +server.port=7425 +spring.profiles.active=prod +spring.application.name=bluetooth-uart + +#mybatis-plus +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.global-config.db-config.update-strategy=not_empty +mybatis-plus.global-config.db-config.select-strategy=not_empty +mybatis-plus.mapper-locations=classpath:mapper/*.xml +mybatis-plus.configuration.call-setters-on-nulls=true + +#pagehelper + +pagehelper.helperDialect=mysql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true +pagehelper.params=count=countSql + +spring.jackson.time-zone=GMT+8 diff --git a/uartBackend/src/main/resources/mapper/CommandCollectionMapper.xml b/uartBackend/src/main/resources/mapper/CommandCollectionMapper.xml new file mode 100644 index 0000000..c59dc2b --- /dev/null +++ b/uartBackend/src/main/resources/mapper/CommandCollectionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/src/main/resources/mapper/CommandDetailMapper.xml b/uartBackend/src/main/resources/mapper/CommandDetailMapper.xml new file mode 100644 index 0000000..c9dd73a --- /dev/null +++ b/uartBackend/src/main/resources/mapper/CommandDetailMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/src/main/resources/mapper/CommandTypeMapper.xml b/uartBackend/src/main/resources/mapper/CommandTypeMapper.xml new file mode 100644 index 0000000..77c1772 --- /dev/null +++ b/uartBackend/src/main/resources/mapper/CommandTypeMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/uartBackend/src/main/resources/mapper/DeviceCommandMapper.xml b/uartBackend/src/main/resources/mapper/DeviceCommandMapper.xml new file mode 100644 index 0000000..149ea5e --- /dev/null +++ b/uartBackend/src/main/resources/mapper/DeviceCommandMapper.xml @@ -0,0 +1,9 @@ + + + + + + delete from device_command where device_detail_id = #{deviceDetailId} + + + diff --git a/uartBackend/src/main/resources/mapper/DeviceConfigDetailMapper.xml b/uartBackend/src/main/resources/mapper/DeviceConfigDetailMapper.xml new file mode 100644 index 0000000..4807edc --- /dev/null +++ b/uartBackend/src/main/resources/mapper/DeviceConfigDetailMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/src/main/resources/mapper/UserMapper.xml b/uartBackend/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..fe87e7b --- /dev/null +++ b/uartBackend/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/src/main/resources/templates/controller.ftl b/uartBackend/src/main/resources/templates/controller.ftl new file mode 100644 index 0000000..22a4e0f --- /dev/null +++ b/uartBackend/src/main/resources/templates/controller.ftl @@ -0,0 +1,66 @@ + +package ${package.Controller}; + + +import com.topsail.uartBackend.core.CodeMsg; +import ${package.Service}.${table.serviceName}; +import ${package.Entity}.${entity}; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + + + +/** +* +* Created by pz on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@RestController +//@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}") +@RequestMapping("${entity?uncap_first}") + +public class ${entity}Controller { + + @Autowired + private ${entity}Service ${entity?uncap_first}Service; + + /** + * 新增 + */ + @PostMapping("/insert${entity}") + public Result insert${entity}( @RequestBody ${entity} ${entity?uncap_first}){ + boolean rsp= ${entity?uncap_first}Service.save(${entity?uncap_first}); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/delete${entity}/{id}") + public Result delete${entity}(@PathVariable Integer id){ + boolean rsp= ${entity?uncap_first}Service.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/update${entity}") + public Result update${entity}(@RequestBody ${entity} ${entity?uncap_first}){ + boolean rsp= ${entity?uncap_first}Service.updateById(${entity?uncap_first}); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/get${entity}List") + + public Result pageList(${entity} ${entity?uncap_first},@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(${entity?uncap_first}Service.pageList(${entity?uncap_first},pageNo,pageSize))); + } + +} diff --git a/uartBackend/src/main/resources/templates/entity.ftl b/uartBackend/src/main/resources/templates/entity.ftl new file mode 100644 index 0000000..9d15051 --- /dev/null +++ b/uartBackend/src/main/resources/templates/entity.ftl @@ -0,0 +1,170 @@ +package ${package.Entity}; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + + +/** + *

+ * ${table.comment!} + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + <#if superEntityClass??> +@EqualsAndHashCode(callSuper = true) + <#else> +@EqualsAndHashCode(callSuper = false) + +@Accessors(chain = true) + +<#if table.convert> +@TableName("${table.name}") + +<#if swagger2> +@ApiModel(value="${entity}对象", description="${table.comment!}") + +<#if superEntityClass??> +public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity} extends Model<${entity}> { +<#else> +public class ${entity} implements Serializable { + + +<#if entitySerialVersionUID> + private static final long serialVersionUID = 1L; + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + <#if field.keyFlag> + <#assign keyPropertyName="${field.propertyName}"/> + + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + <#if field.keyFlag> + <#-- 主键 --> + <#if field.keyIdentityFlag> + @TableId(value = "${field.name}", type = IdType.AUTO) + <#elseif idType??> + @TableId(value = "${field.name}", type = IdType.${idType}) + <#elseif field.convert> + @TableId("${field.name}") + + <#-- 普通字段 --> + <#elseif field.fill??> + <#-- ----- 存在字段填充设置 -----> + <#if field.convert> + @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) + <#else> + @TableField(fill = FieldFill.${field.fill}) + + <#elseif field.convert> + @TableField("${field.name}") + +<#-- 乐观锁注解 --> + <#if (versionFieldName!"") == field.name> + @Version + +<#-- 逻辑删除注解 --> + <#if (logicDeleteFieldName!"") == field.name> + @TableLogic + +<#-- 时间类型处理--> + <#if (field.propertyType) == "LocalDateTime"> + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + <#if (field.propertyName) == "createTime"> + @TableField(fill = FieldFill.INSERT) + + <#if (field.propertyName) == "updateTime"> + @TableField(fill = FieldFill.INSERT_UPDATE) + + private Date ${field.propertyName} ; + <#else> + private ${field.propertyType} ${field.propertyName} ; + + + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if entityBuilderModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if entityBuilderModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/uartBackend/src/main/resources/templates/mapper.ftl b/uartBackend/src/main/resources/templates/mapper.ftl new file mode 100644 index 0000000..eaed5e2 --- /dev/null +++ b/uartBackend/src/main/resources/templates/mapper.ftl @@ -0,0 +1,22 @@ +package ${package.Mapper}; + +import ${package.Entity}.${entity}; +import ${superMapperClassPackage}; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * ${table.comment!} Mapper 接口 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +@Mapper +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + +} + diff --git a/uartBackend/src/main/resources/templates/service.ftl b/uartBackend/src/main/resources/templates/service.ftl new file mode 100644 index 0000000..94bbfa7 --- /dev/null +++ b/uartBackend/src/main/resources/templates/service.ftl @@ -0,0 +1,25 @@ +package ${package.Service}; + +import ${package.Entity}.${entity}; +import ${superServiceClassPackage}; +import java.util.List; + +/** + *

+ * ${table.comment!} 服务类 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.serviceName} : ${superServiceClass}<${entity}> +<#else> +public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { + +/** +*分页查询 +*/ +public List<${entity}> pageList(${entity} ${entity?uncap_first},Integer pageNo, Integer pageSize); +} + diff --git a/uartBackend/src/main/resources/templates/serviceImpl.ftl b/uartBackend/src/main/resources/templates/serviceImpl.ftl new file mode 100644 index 0000000..50fde8c --- /dev/null +++ b/uartBackend/src/main/resources/templates/serviceImpl.ftl @@ -0,0 +1,48 @@ +package ${package.ServiceImpl}; + +import ${package.Entity}.${entity}; +import ${package.Mapper}.${table.mapperName}; +import ${package.Service}.${table.serviceName}; +import ${superServiceImplClassPackage}; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * ${table.comment!} 服务实现类 + *

+* +* @author ${author} +* @since ${date} +*/ +@Service +<#if kotlin> +open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { + +} +<#else> +@Slf4j +public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { + + + @Autowired + private ${entity}Mapper ${entity?uncap_first}Mapper; + + /** + *分页查询 + */ + @Override + public List<${entity}> pageList(${entity} ${entity?uncap_first},Integer pageNo, Integer pageSize) { + QueryWrapper<${entity}> wrapper = new QueryWrapper<>(); + wrapper.setEntity(${entity?uncap_first}); + PageHelper.startPage(pageNo,pageSize); + List<${entity}> list=list(wrapper); + return list; + } +} + \ No newline at end of file diff --git a/uartBackend/target/classes/application-prod.properties b/uartBackend/target/classes/application-prod.properties new file mode 100644 index 0000000..4cebbb8 --- /dev/null +++ b/uartBackend/target/classes/application-prod.properties @@ -0,0 +1,5 @@ + +spring.datasource.url=jdbc:mysql://rm-2ze77qng1ddlfur9g4o.mysql.rds.aliyuncs.com:3306/bluetooth_uart?useUnicode=true&characterEncoding=UTF-8&useSSL=false +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.username=topsail +spring.datasource.password=Topsail2020 \ No newline at end of file diff --git a/uartBackend/target/classes/application.properties b/uartBackend/target/classes/application.properties new file mode 100644 index 0000000..82026ad --- /dev/null +++ b/uartBackend/target/classes/application.properties @@ -0,0 +1,19 @@ +server.port=7425 +spring.profiles.active=prod +spring.application.name=bluetooth-uart + +#mybatis-plus +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.global-config.db-config.update-strategy=not_empty +mybatis-plus.global-config.db-config.select-strategy=not_empty +mybatis-plus.mapper-locations=classpath:mapper/*.xml +mybatis-plus.configuration.call-setters-on-nulls=true + +#pagehelper + +pagehelper.helperDialect=mysql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true +pagehelper.params=count=countSql + +spring.jackson.time-zone=GMT+8 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$1.class b/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7569fd83ed26799e4d582b12ad7bde0815f89e54 GIT binary patch literal 556 zcma)3O;5r=5Pi#6v7#s{`U5nACaxN97!MLPCdCT|51f{=!eYBi+O3H{%ae%*e}F&A zIIU>Z6HT@=^Y*=&m)ZA^*Eaws*m99a&B2<3b%xTZ(#oDOG>w))=Xoe0-lJ-o(um$>LE{? zUrFK$YohI=7K4*c?}#ab+cin#%S)9_`@=k#h(|%DF0>z*Sm{wm+OZir*r=e6%?b)A zGVIPdmEkyL4ulES&?G#38VIZ6X^_Nx^lgq`>xuNOGP-T_y&5s>%+;PY7z(8s>W#ja z+U9}KBi^+U*={v^I7E)tpME(yWE}JclyQoTVsY;U>^Zx3=wHgfJCrG}d=apKMXG4+ lKjQtYChWhk|4Ybb!aSCUp2IS#6bo3vDqPB3YMFWh%AeYGezyPs literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$2.class b/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$2.class new file mode 100644 index 0000000000000000000000000000000000000000..f3465e7c3012100b666b21b19ee12d94e0bb0175 GIT binary patch literal 1297 zcmbVMZBG+H5Pr5TZ7GM;%8QEcf?UhXAtIm5O8{wU+@Q57vF#1Ea>nVp?yW}dlz`~LYWfLSbc!@>OmdNGp2XaQ+FuwpC^w}3J# zd5q^Uk;kOdZj!OaRa4eg>@|;S+{maE#F5wdna=Z7xFZ{0OL<9kYvGPsEO&Ov&~0oB_MTzk ze=}2wTPoJRI4!aCM{84-44UF<=m#nyGEN)J;h}>WJaTXeeGZD4Wf=OKx8+y{b)oI` zV+V7XXBhS(?R!lwLr;q+L5;|4wS=a9Sa9$JPl@gI#KSOc$A9jye5C~uqk?^D+H0~& z7STR+*bE#j+B{&DRA5N0(r(j0BjDl_!E=Wbx$sMC)W)AafG(mw$! z7VT2dDMh~`E|V_N={e~%>7L5OC$P%+2~r=DperP^U?g|YPjWDM*n zqjPtP4B!%BFkHuQJNG-%7R~*F^qUi8Dj&g)(N)Tl7(YhNp7T}|NF1Z*J;kQ*8+h*w mu=@+x#SPqS19vepKn>hVp5DeC(iz;vJ*pQdP?$p+$o~MEpH=+; literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$3.class b/uartBackend/target/classes/com/topsail/uartBackend/CodeGenerator$3.class new file mode 100644 index 0000000000000000000000000000000000000000..787ac987e481682075228bd46f7e9bc1e724f430 GIT binary patch literal 1304 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 aMiuTYj_<%L2#?_fY$v2(G+_YS0{DNm?cm}7 literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/UartBackendApplication.class b/uartBackend/target/classes/com/topsail/uartBackend/UartBackendApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..ada32bd615ca968eff1874977308b35c984c7aa6 GIT binary patch literal 768 zcmb7CyHeXg6g_JUHi~(fghzma&bVMHm^5aX0nelokBPx4s8;eK7NlLzY8CjcRAEx& z1M*Rs+!f4Ng(*;RSNE~!aizcie*Xb*h@Aj+d}?4Vz&bV>*kqVHQd+rVhMCUZkfGi; zBgwE7DlN~8ERyz0L@8C;p@~I06ju5CwODs|DrYzdW0P@b#<@@_FNAfcB7Ts1#IGms zC*yIdV&Rn0J>toP(hO^zoA6%z5Ihw+;R9!tPI{#dVG}}LoziAlK9lawj4p*0nRL?9 zU@$O+jpbM6wQfzP-Sb=-RNM`Is&WQ^mY za3(hTRwad%d{B;@Qlsjtg;~ro?7wdv4Sa543)^IDvWtu8UdE20`=+252^D(!hPI%k zMxDw|`>DwD-jp@&O|?o6oqTe<|LW9#>lwd%!UF$w$=KJJ+KpkM2rdBE#O+s8M>qN*X Q@oHAe*v2ZIp7tZ~A9xkYtpET3 literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/config/GlobalException.class b/uartBackend/target/classes/com/topsail/uartBackend/config/GlobalException.class new file mode 100644 index 0000000000000000000000000000000000000000..7c558e2313dac55f3a77c59ea8a586696b5b794d GIT binary patch literal 2749 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 a-z0#o1>WkMx4OVf?p6M!tx|simwy8iHy%X* literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/core/CodeMsg.class b/uartBackend/target/classes/com/topsail/uartBackend/core/CodeMsg.class new file mode 100644 index 0000000000000000000000000000000000000000..ba575028f18ca3e4d2ba07d6f0ec9bc33daa25fd GIT binary patch literal 3917 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 Q#PU;4Xa(QrT^nBe9|5k}C;$Ke literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/core/JwtUtil.class b/uartBackend/target/classes/com/topsail/uartBackend/core/JwtUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..408d95eb1c3a5933f3af3d4fd12302c2d22ca421 GIT binary patch literal 3193 zcmbVOSz8lV7=BL@m@o`3sft=Q0X2Xy;#OO%%36UC)F717)(*)4gOf};GhykfcHj5C zcDw0q?L|zhPwQ>_KfLZg=+o~^CS<~5Z66-a%$)Nr@Asbfd?$bY{p)W4j^GCo`!OhD z2*VYKV8jo0?lS+33K$hpj=>;~RN^eoi3s65A7TQ=g18`J91|iQ#U!76j1N-+9_P;| z1UxBX8~44)pHJ~Y31XW2#JNR+52}bd%m|njFegI8yogKC`Hq=@?j@hP`n(bn!>NQf9t)%R6MbD@Vr&V)Inbv706fxq8KCYM=|8^$>_MB!h?2E*Wq-+~$OVM;WqnLJ& z62GLT5^~%yRe5O9zF=!QB@fQ3_LxB{3@5`II%O=?l+~22*~{_;dhcpkuaE#YV`#ni zFbqOUT^!SrR8Czao|5M>wqfXbkO{?BB(eg=dn%!S0%iJmj%2c z;Z?jQ;dQ(r;Z3|nD2j5KU$o_+i7^Rp;~j?T)!WgN(ewmYrqH7*rfN1wco*+Uc%NG{ z`uYGLO85vLOZWtzO85+)Gwkw&w~UlL6dR4^wZRbHsI=ARM8FpkzQk7ozUB$8N%#ie zO85@nGqe>GIA`*1yT`D}5&4~4SMTI*k5wS(7uH1a(N;*w<616h#<`r7r8V~mzQ`n$w6gVxj(z-_Y_OBOWYE2As_8Bu9 zn6Jx2CAIwG=GT@=q_i_oa6eho_3H(5H|bS-m@mZ2?|HdxP`4uPN>0pt!Dy|*dv(RK zN-pLVf$#QY$+t@PelVyh9`s^e;eKNeDspS##_HB*4O6q{k_@N*m(EsjP*kZ9m8*-P z!^PzsvvmbWIxYHR4zVMZ~3zF zYbR*!VVWspYbb@WO&HQa2nlihHC`JM{^y843V}R_7u5lByO{4n)nf$h}!1K(B2!^_xtrc zDx#p-rK%A@9)-}$*i3u1lL)G(dKziJnrO$`i55;%1KC$#2YMV)G(jYy`kZJTF3^6m T65yK_Fd%wSGdw~oKAianx;A7w literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/core/Result.class b/uartBackend/target/classes/com/topsail/uartBackend/core/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..52d903e64640abf98083690907c40d53aea741f5 GIT binary patch literal 3923 zcmb7GYg-dn5Pna%goH&f2q; z75&imso0i2{n!uvQElJZvmpxzruuNs?#!H-cV^x*o4^10{Z9ag@qG|x2y;k;p)fCt z6~y&0s*sdrA&68MHMmiOn?a;Sv=~M$GPTGeSA&r-UWOgU9erzK}>*`Mknl)aT7R(LIsK zF2ENYWNj;c$;ubf;-lU=l@sMb+*N3XQs@gHEHG)I=mhi9JX^J zm3Nq@OCeW46K13wg$AG0HB+d`(aCt`dRC#`MVd@G3x&D3h!?DM&a&eYMl7VR~wd$rFUR&15y?`8TLAv?(SAgRrFqd58cX_7 z+cs|t-woWw$71$L5T6?O44(&a&%hV>(!f6KH*f({20F3Vz%*tIbRnwH;yUtm>0}|5 zp0_w;4W08HnT^K{e1)%N`G#HZZC}hMk9W!Ix9+QatXz}t3_On+j-HZN-4TVon-2>m!hz2~!k#phA_9KfLG z^AG+stfX#e8CBx5dZK3u!Mn$oQ8W7hq4Rx_@G@#=DKs9S?l)|yz}3D;{jOip;JuVm zZDq1x$wDkzJ+o+Gnmx>905KO>Oh>{Hj?peeXu~+pjOuAM!h#2Qq7zTz1hGkR+PM=M z|BtTNpQOFE8l%=rZis5#n^Sbcfy7lhbB}v~dm9tm8jD2kqp{~NG{%_Cw)<$3y_vF~ zXj18xQD@M{w+O;rMIXddAfAvaU)$T?0*I#tv-79sc8;IY8hv053 zF;`#GQ)S}5j4SJK_jo+gbn;PYi}zg>J5U;C&r!%vC|7BDfq{iV zgUi^?NwXu;x`ds=rX}o(Jf@!;xixexVRxiW3tE=Y-tYzmOXyfzh0DGw46b9HNQ4&w NZ&18|7u~m){sS(9P~ZRn literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandCollectionController.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandCollectionController.class new file mode 100644 index 0000000000000000000000000000000000000000..963dd5df5fbc5804db5ae391152787604013dfc6 GIT binary patch literal 3296 zcmbVP-%}e^6#i}!2o0f>U<+tbTB;IgyQLIbo3;q)579u8RBA!1H=9e?Hrb84cVVdG zn-7jpzWU^gj<0s6Go?D?AK?E{$G^ZQ$MM`vNVaB|rhUln-n-|X^WAg4^WDuK|Nigbwk`XOPYWU8h^N&{l-wmL-MmYbhPW z`Ovkhep+Zu%BAg88Q2;_PhL`;7kSmoSRA()4lN3~X%&~bDwGs9C2%^he%qp;6%3+? zuXM|nBgtEp3Qedxws_g4;tXn`nLGY0Z5mOZ;ZOVVSHu^taOAvI+))K9iZX2>pkNor za`*Ta*UH>1X$z(lC1JN+jEGTW=nrt9Y7)fspiEu$pfz(ftc8HpzBGzoG0e2>d6~=2 zy+%+;aH~Zgn1plfyL5e39n?ZSc2#*vomRXKliVO8lE%=k_9T!X1*>)NQm@#MX*M&n0{7#TXsQ&vfQaz81E%+KJFV!iWQHN=Vux-m`SPXAfe^J`j$Am2^ z)|QyxSsGymbnmBo2i>U!=z4@k8r_+i z9e)h=kRBo!psO+l84S`jSu?;8UZoMkYdDISw|Ix{N)p~4e}u@y6GS7peDr&Cr((P4 z_!+6+(0Qki{hf+GM%OM5{6eNt&wYZz03+xotSZDv%}qT7Im9qtr%>G#>J54uAv=Ip z{euCv6vuIl(zt_>8NAIMB;ynGdvhJk!CT}2h^w8A(E~#o;~|g}F9tbHkj6tGPv9hl zdM@M%ALLUF$fui-H4pNc&@6Yq8051AX(|NrOJsSn0r_kbaxKeK^cSE;jCH!lXdC?= zF;1R(f@BQ4=pkAt68Jeb>p@fHA@c?S`s)NxbJLVpMVEfe&{NbaeNWUY{WML_&`{u5nPEp literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandDetailController.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandDetailController.class new file mode 100644 index 0000000000000000000000000000000000000000..a3fd11e83fbf3eea8d2546861dffab73e4281300 GIT binary patch literal 3597 zcmbVO>sH)U6#mZ4z`zh%Zbh;6La{PHOQ5CP2B}F4yv> ztG|2$UqRP$En9#10KSJlhRc1DA(LPRL)WZHa!$_P=iA@j=iB-7pWpugFae%}gomwY z!)hDe#|JGa=CFo!F?b{{8{*xEZP>(?c=0%kkFwZi=uyqXL&eaRxufWnEp8p@DrYDZ zX!k``FbvaC9Njc*hUubd zm1VnX=|*|aQV#jCX&uNVt{Aqwr>Kr;oybaHATPL%d8}JpBey*o7wBr6UKHzcj4?UA zT70S;DPM>8+~l_DS}Lcv&2ze;JM#?b{1CB~Su!df8Tngq1N4IVe=T3xghMoNRt~q7FIgulg7lsLVv3oIetZ`@G)HW26YKL3I$KBWpIOZj}q*H-~lD}cv z&YDuKQmGK2rX!`|64yO)EE(6MMHlQCslMcUZ}P8PZaa&nb|U!Kc!l7f;eR&o6^~p| zjIz9HIK0fQ#Qa|J`SlOpsz!UnIAfSf%+|68vCdbY90OYZR@c5`m`v<-Lvi*`>sk=u zRyE~6L`>C)a2-;MqHa4EWuZnaRY!-{T_g_sJAnMxX4yBcl}NfjiD zh$L9Vv~DtZ!ENc^P?D0fw!%ZKU6IQ?s-Zqt$xlN~6+CgF!fCNcB}8{hQx^tyY5k{ z8-FhRe~Y7YFQWIA^ik<4SE+<&&UJeF4HD^Y!AC*P?-71}A0|5s5l^IGbwrD%S)nf! zqIjSYrcm=_$l9)|a+~CACfp+Yz%HVVqUkK2_`n$QVQ2Mz6NfYB>w_QvjkB88Ah=|N zN6I%K{2&>}5#z*q<3$*53GEgqxi&UP8mNXD`Wr>)8PSpg`so8$qEnip9~Cg2*2^?% zrhA7sOT{0W>!!IT8q>L;YcGvtx-&65{2SOWp2;h86%K&c@G4y;e*yYvEac!St|8+Y zuX@`8ox{H(HSz-K6rOZto}=k!T9|@xl%qQ^NGS83vtDo9S#w6FcpYz$(>G~V6QcpV z07M{f(Z7Ee%*J&L(0o=PeVZN_Zs45;5Skl77$XR`8$cK&Z~=tD5QL!s!f+kJhzH>& zZq*>{o?#&yhL8@iFiQ{$4IqqqnHVG2KHZ%d#dsamD80B%{}k>7{7eMk?$XmFrUE<} zdIGvBD=i~8Z@oZk2G5a;?d7RGO$$J; yK$G=+%>{Vg^~f3!?So;S?C3;##4hnq$ literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandTypeController.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/CommandTypeController.class new file mode 100644 index 0000000000000000000000000000000000000000..f5bb384bab44d8f9b9ba02ccdcfaa04d01c46718 GIT binary patch literal 3491 zcmb7G+jA3D82_ClZA!W=kVp{(Efk?Gm!*nO2p4I&SWHW8v2yXYNlw#+WH;p;+-{EkBJ1%;oWXzFd4^G7tSZpf$0R^!;BKncHx5Byx)a6wf{gpE~>{RCB7WT zl{h{WNapNP$*}Sls%1GVokcSz1rBE@)jhlH8fH+k)JEm2bcZ`y}VLR9KtTZfFpEq)z?NoK6 zsi2>%c=ip`k$IZ!JZf5|cU&MkI5Z~^8@KZWx;A54a;j3wO6P(>Z;U5n=ZxZ<;h1V) z7sk8=lkQJEJFJ{-d5&EyN+%fEcvDIg>rIQndx5|OE)G81tYkX8YS3hQsHH~EcBDQd z-Ad7;yY4`71V&nFsS4>Kegw3Dg%KvtamxbYvOv$Q$C6GOWj{r6d=$sW0_!HFw_xX| z4OJXZI!xMIp*6c9vwGHKLj=k-ZMz-~mRVe4?^ra76;%*DBxl=KH%Zgqs%~lD^NhS+ zk*+sp=c}qnd08a*RYf{7n7L{!8hX*N3i^cQ$%1s+Ed|%#wvm8CG`+nU1g&nGp6eaeDUHdGFEk58qCl`unR}%eQa+ z^Xr$&Xr4r)L1JD*0ShGdKfeBM`I{d#n7GQ_^6h(n-M^#Z8j2c9SkN#EOM?ya*0EN8 zeg1nMeUsf*DByhds?4#E^=F!Vnowc+B-i_u%_`=W1fB7k+)Q#W;5UAP_6acoCmvi0BxtKT-a#$02O{l6g? zK&?3GAzo8)x01_Am-o=&uoEqB#6U4P1qnx%>_s_NRpr=JH)Ps6KX^=|Xx>zx3ckBU zjrD2=&DNo|N?;&&jY}p(RBwlh$B!#THbmItNU!2p(53weK<6FN+cQUbr z?w^os9MkH@Xf5g^=p#^IJ9;s|Aa?M%6Z^2sM>JgXT1Q0x=x5OEejKI7HpZ}z{|!(p ziq~mn9ioph5Xa8P=o3?MS{bCYLr@KVZhEOa#NY502p7Athw`{e%wE0-TGQ(hSGg+o z-c=8$CxT;J+6gB?P%7Kq*zbqXUo+DTVHf2ibk$u49`S)w>oGR2g1nz*R5=yoH~6bT zescx#0shI4vu2T=gxvdLkVgsWa0|$_tUniWe*p5qCgejakZV~UrJq_~UE!+wD&=Q+ z&)$bv8^aRTv1RU39Bk3kfrdymvze+l1Wn)w^Qv;6LYi+;zw|v(zw}2aPV?8u=g}s( qV?MY6Rce9b)IV_^_y_oZ;P@B#y?!7tpobR0T-S6%n|Ni<4~<22bKD98TP1(XlKMH%D}Hs7xXo~AUdRpGSmdfHQaDts@z7pvi@csUi3))> zE!wUmZxw1Pp>5mZC65}>tA|$VWHUYL5u13@dh8|fr6*iDZ5unPIff_^{AZeTWhi%# zZ*jfEt)f0>Nl_F|%f*kG2Kfzfz;LnU3eEbk8a3+ILxAdEna0-)6D@mP{6@R1TGweu`cF4wdf)lR1;amL^wMSMBz39_$2#1sSNW%*5kQV>>?SrS^ z{Xoj0;bYuoI2Cna_(Ge3d3SYn=C6`Fo;3bRCRx8qivX%TZQ-=>2X!x{_SJMLp~bs!cU|HbbhLbiG1B zxTLI?!z>~-J%Eq;cw}fUaA20Dx=FL@LTnR`V>=A<(Z@2_jF$B;<%qJqC8l@gNC*3C z$W2?PuLYBr%=_w=_47+r1*2-X8I2Dxq|Q7TH8Bc$h8i=+lb zTZR)gm<^lYCNjz51bsMl`v)_oxJ?H%O|y0yduVKRuDv#D7pKm~}R(Xs*-K)e{qcK5g^!UU$edYBe`OU}Ty=5nnfZ14Z<4HHc*l2>rnf1YPuE=?`wzXUX}kac literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/controller/DeviceConfigDetailController.class new file mode 100644 index 0000000000000000000000000000000000000000..e1d47e171b117c5559c4bbc4ebf3dd1c79c0f34b GIT binary patch literal 3607 zcmbVOU2_yg6g|E9*sz%d*zgrVgn*KSk0Ft-uz)1QU~~g9!62aG>~3c>usgHP%m#zy zqg9kozWU^gmakGp6`)oA0RIP;zrZKU@^sH;caRxes8nXQdv4!8_ug|)_wWDw@*9BT za5C78cQ;@YW_$4--tR#^gE?GI<4OmU*%_?ZjCkh7_=>I*cy6U4 zy_lS`LXD3Ev%_|n{owh`3)~uh@g|b>2-adY$c-c}EV`aFnTvWQ;O5!&WDi=47zqmgX%*kU)CO;)z(^+?55hV3V5>%FMfd zKyNh?jJUg2txBC08Z?u$H}ouDo7+A^-1Y%1$j|H252oDGnyOk!Rv1HE)y@oS@|hLO zDVwuSAj{HgyC5mMBrp);K;Tr{xtiA4TG`rTCZRRIv`b$JoNU|mycMjhH-t(GKY#3<9lT~+BPOZ&Sv0j)|O3l5lwQ~$1CS% zDn^Qb>^CaM7LL04-l}KWE0MV!oa^G4?aAjZj!eFVnjL)v@jx%x&8Knzn!U!S5gK3* zUgt<)FE{Pfi`V#8dUbI0AyS8)pd*EIyT3zkw(~K%enR$FbYI^r{>r8wq31C+{7lmh zDEAqn1>Qg}-qc&{4c#=hphFB{Key_o^#R(YXs1{GjqQTh?t>WSxJ%FsI^cd9kMMu= zCWMbeIL!I9itGq~2pnacA>{iF$m4{ZA>`f^t~Jmb?V|73XicI!MlBkPL@?frV4UB^ zxbwE>BN%!nf@6^g#+wnm)r#P_j^IRM()-$l9VUH(u+KywA8bN?rKF#1LO#`k947rV zCK^e<$#*Bi7|@wMeB=rGJMkDB$r8nhl;%W8xfu;@G&FBQ8))!>E(m^1vu6M~{_4<7 z=93imBKsPO_slAIKI?$ GHS{kGKk29d literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandCollection.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandCollection.class new file mode 100644 index 0000000000000000000000000000000000000000..28f27a1ddd8114e5e3aed4cfcd877078b6ce83e4 GIT binary patch literal 10934 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 BIamMy literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandDetail.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandDetail.class new file mode 100644 index 0000000000000000000000000000000000000000..f3c3a16afa1a8aa537af4199901f22f35fa3e9ea GIT binary patch literal 14163 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 literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandType.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/CommandType.class new file mode 100644 index 0000000000000000000000000000000000000000..70c8e0b6f3dcb52344f2be5ffa39b1dd379ce191 GIT binary patch literal 3225 zcmbVO-E$LF6#s3qo86=dNlQP7qJmUu)0T+fR|;5KiUiw&v{XSlinQ?efM$3%OIQoJ!{!JqO?!B9@8fPkPbMLw5{LZ=O^EQ9}{qwH?j^pD5 z_TgF_gZMx!AByE8v0OJ{ClJFm3u|IuPmoy>lw;wBIBZzh6uWC-OYAo-l!d%v!V_m- zn68TDmWi5)x`s^MskwG})v488-@9Bqqd_~bAvNcF^}zOmRlD493_2!$Gz}5Aq+##E zmVMjKmu+t&U-SZJ!>LVc$X;rAfm?A_-MYJ0c20YqAJ_q{@|vlIb-$8dv;B%&@*DZe zoi$48)pDbrw_CXUicP&@iMEW};$97UaHq;`a#!lb(hAYk)=ytvxu78?l#BG&62y{S zp{0Qi*O!Bu>unGpt<*ONKjC_AaEiyV@l_g`^Gj4nFSwqw)TpdEHR+x(;jc4eHuFYz zL#7^Vx{ULvbTsg*b=xiH8+I+2wbyStUP;npB?LAc>D=m%`7^>reC^f*O<(JJ)@FBKQ(83gHA&8aua0lQLqXpT1BiAze|tdGi@63c$0w(gvD z%WT|CN0%KD^P0p2CX;v$2a-4}mNASck;Ax#k@h^R49_;)a!I5q-CGalEad*YO4uDq^1I9^r20CVoOBw^LoEY*<0Ulo1@(sz60U z;~_&=rhD6r?%JlPuZGa(VQKROPWJLs-?dHAD=nL2(&nk&HjQ1|6n)pSnUgj-uw;pR zZqZ-SfHS`!cI5%g0c#ua+%^*1=o?5XIwj~micWJI$SAsB&;wkyvA1_2RPWBTdY8kl z@}qsqy^r_apU8a+L%%oiI|jdo5xqC@8wM9A>A{dZ3RjjUxfJxNKhT%eAEN&*l2ciI z8^cXRs$dY3D#Wsez{DP6;4V^GBOB`gr3)rO>4KFt1;`3PW|k4REcF-S1oamZ*|-2D zLQp)*d?=89k6uU7p3)K7u~ijKtL5%v7IVz(5Wc|~PHqIF_yY6fMfpg7jqe{vhXFJnYT&B@f9DT1yTuWfK^PJ)?e6TV(AfvOdXE zHjV1`8YGQcrP(mdHqKZvp;s)!ma@g}l}PrsYuNJ7q+Tqq01a(<_R7jdiDJ03YC7d2 zT<$AdTXxBsw>;CXFh_c6r0LleW6^GSP>wCz>yGI)>$vwok9ayH@YB#yr)|gf zPQ&V0ZWZ^>xn*dl7H!A6(5$Xmbsm{SnMJpRWSdAiBK4WFw_(GT<2**stu^4G(KPGc z8MAcLa>|@GEacYPHs*O4b0RR7sCCO@;S7%DLVS}b0lAN6uznnciB2X|ZUP=;S~h~| zIP?VbX-QBT!j*-w5KnT?6KaRJkRIG zP;5HhG}gKW zbaL54gD;sio=l7=%p~|xGM%$5ERY*!V?#V8ysIL-zI3^`bQWQOR_j)yS@H1XxXCH`8I3r36jV;RL-*BMCahmNB;EXk4N_oh*v{ zpK02aGRt9qmz^=Yd@4b=>9Yi8`3XkdLDS|(+U`Mml1@M^Kho_b1g|lHnje9)IK579 zAl6)h<_SR`g$3h(jfVuS(pw2S$Ch{LJxse!45AazS)66N#xnmLuy3=$1Ru;=4WkEx zJJ?x%;{_*8S1!+G3A-}>fTW)|V^cwPaVL1?M^{ak#I=E=IL;o(Py^F>MfCP^ANZB zX1GoHnQgM(Y15(!sk z+TD$@fctQ-bO-w`++Le_b zQvY2_OlIXB8fqbu1qF~~LCq=*qdug}T}oz^tQr8N3K~GEf}YhFNcTZn77@2C^%r6Q z^%vsV7z4$9P%Mjl2#|aaUIz=3!(X^ZKJ}poYnH{9>=sezbghuHrdKgkEQq)qP7p6iUCEXYidm3@iM3M@pa zg2F|pEmzXBN=wvVP`OBLi%@ZB?F}!|g7C$6K1x-(O4s12f-<}hDuT4$pbrpGl=h<} zAA*uGLXOc#pcJ6@(8r)up8Ow3e+-6< Vy<8uxb%Q(j5CK#W<8@w6^FN!_%G3Y= literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/entity/DeviceConfigDetail.class new file mode 100644 index 0000000000000000000000000000000000000000..a26f7d65b8b12e354835e3145252e32cf2bdd166 GIT binary patch literal 6726 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 literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandCollectionMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..5f528a5b8d1e906118dc51ca8355dfcbe2140399 GIT binary patch literal 446 zcmb7>!Ab)$5QZmJyS6HL6+C-%F5XrITky0ZwBUU<8`jh$vt$#Y;FEdq0emQNx)lVa z2M?JU$YlO+{(OACy#v4%oD?uE;HZFO1(T(11Em~|g4b$AFNBUlix2h6=u}pkJ=VnD zHk{F~Yf857T<%eGH0Y`8OvD-W=6)!zhX;wfo~*-6G0jLno6rn3nviT-u7nIeYRiAaP&f2o7L8 F@CE<9j{5)r literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/CommandDetailMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..f9a7f309eb73dab38a32d53bf438cc22a991a031 GIT binary patch literal 434 zcmb7>&q@R_493${XWUi6qrQMga}hkO2(IF3L~y}-rW3}l({|_|abL}Y58y+I*;zpp zJ$PsmNc#1cuW#=!uK;iYdnHUt*ePLG!FX<3M=1wZ@LVnEiLfKr;%&WPou-xc7Hjg> zG(MwU)|5=_yBtybz-X!OIpB;U-wfs1a3T3VlIbv0NHfxp?3$rQcFCkAUV3ZEHCLQu zYI;6ZFq!)tG+&!eI1aw`*TTmuGzEuuStKmqn`r8eFP!s9ki3fujw&Boq@MHxqZvq% zz6NkDB#)i0mim+NbEjVz6zu;rNP!sfFNX>R3Py4^< D+i z)*>i94D-mmzHjpJ`SuO~S8y1>UI6<690+Kn6jSKiv*%et-AF*^yf?uq${5W^c8#YI zxzP*a;bodUk*8W z%D6<+i%Qinrth3PW2{H7tl{j_o^>OM35H{mYRKVK;wnMrRXnIX#W*7Y)qxrr^qFIO z`UAwnaKZ>%IfNlvtsi77 zgONqk%Q?3Kj@R+8!9M#3_M#Dwy8iPfOFX|e;KQu$yP!q@Q=sJr+*AYzD6kayLy3}r o5|r7muvZoku-am&&$Fs5wUlE;*ydOP>adgR2JEt~@N*O33z2ls{Qv*} literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceCommandMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..eb4477ea8bb819159d5436b58483a2f2aff48f04 GIT binary patch literal 549 zcmb7>%}N6?6oqg4H@0f6JADDE8?zByR0PK&6j~Gu?(fW8rm2%;$YhFrH5WdB4<+8t z2(6$C7s<`oKiVOag|(=@M5cGc>837*8p= z(fQ6=Xl+JlMgj&i@(Y_hqC?FLS5&wSW=tMcHc13@=PEVmOULNf9m+$rq}Y$9vDGp{ zt5sr4sn-#DRpeP&$k;lP8uOf-46&eDHN37ac$*i@mnAwMV*ElTsm79wSAH#PFLzdJ zG|A|OrS|5wbTQqljCGv+*ssAC8`A<#pGrn(dRB#sGP*U!dX{7jdpnz2mrBerUXWCk zQiLy{hiR0oM*6It2IvoYJZC literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/mapper/DeviceConfigDetailMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0301772cb6504e6b3ab051c4c104d5c478d8a923 GIT binary patch literal 449 zcmb7>ze)o^5XNVt-kGRiYhi2YGj{67Eb%9KSiF}-peqp=lYh)WuT;r5iM)R$+ zPo|!76lrl?C>YIM@|y2VBQWQGMcWaV8%PCb4@sJ}{Ahxy8osgCMS*iRD7Yw{uaP>^ z&y1#LM*0!pwvkL6Z`RvM`@P*R5Cx~d{Zb&l{L8RRfr5dYJ^31txG!-42axqSheOGk I+z$c10ArAkhyVZp literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/service/CommandCollectionService.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/service/CommandCollectionService.class new file mode 100644 index 0000000000000000000000000000000000000000..2dca4acb6f6648e0e6c2c3ef6b993a8e793e8194 GIT binary patch literal 766 zcmcgqOHRW;4E407X$ysxJ$u+N3)mG{PzkA0_((ayG_k^zWTu*ND$0uEa0V6}fI}gi zrU(!p36NMkjctvdpP&8sbpHSV`>+|nMgYA4`T|;0m13wp39#E?Y;#F=>Xpu9p&T8n z_zF$3h$R}*G?zo0=gK5Qn`Ic2wq_7c)J(}tnN*GpVT$gv(oXfQAm%O`4g~a0kuGg= zp`6N*(0KuUmhhflK(o|%W|v|keS-qpkxq@G!f|}}zrqiGY10u;eEY_$^YMfY94y$z z%H}$;h0Nz;McPlZ!b`j+G@c!n9^FjGC`VBh{6#`1vW1KBL}zT>)`x8_JM5M_6>#|N zMZC!Rii9`(dK%TZ0`^MEAI{qpAfU#m^8t&7fCj8^-sG%Xhk&0Jqs{0rYOuQ5CG)z7yHP#dxhVUf2E)=N8OIrGElWe|7## z&ME?Sa(M#PhyspFx1m&A@@ry~6pzJvoGz(*k_ zNh>N*A(aD%k!Qv;Z?^aG`SuO~7jWXhp#w(_95ZOfBEX3>mVxX|JRNbXV49;_~EvIWRU{E2c67wrH1~sUY m-5_hX3JyI@k`_suqyilZ*@0b3$V2LM$iiKI?nAe*4!!^xlMMX; literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/service/DeviceCommandService.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/service/DeviceCommandService.class new file mode 100644 index 0000000000000000000000000000000000000000..8488f385f4e2a27886f8351715d296b64cc814f6 GIT binary patch literal 1244 zcmcgs&2AGh5FV##(gp$rN+J9lk-`NZ-~vHN4OP`h;YS2<;5OME7B{>0%Jvq5c$hv% z4?F-5g&1eIB%l=%IdB-QJ)Yn1o7wL_&b|S_Be>g!TWz@AhC2eba!hEfoEI?bk0X;w zZ*qq!l?7Tq#Arr3UYsRqul!sd(20uZxydrr@nC$6Cn!_Yi5zK93E4W;{nD)P95*Bz z2-tZ+{-cRsqs5FoStpI*RHD%rmd~gEui&R^K=X{dycAQ) z-3{j@Y6ANG8pJAi7AOvlNeOl78<0LA&vcAp0Uf0sSzoesv`+K&iF$7erZ%H@%Bg8e z`&t{1UK!1tJQ*9CNS9lslMjKaPsYxqx2PRP!A9aQbNP0u#*{ng6nTuk8n1g*=gT3e zuZAI8889y4{hyBOkx`%R>k1vOrpFZd!Gh{3noPx}klB37ShzeboTSg5vxIS<&Ksu3V0a8{bP?U0RkE< z8~hh(HU%_clkY9QbvK~RpDmVcmJUk;F0jc(=(0mF+2mzlHvyMnr}AP|@Vdg%Vyml* d=WDRb2`Z24{8R?pTQy_p;>%+y@TSeZzU4Pk`tv(#SoEhiQ)Dh>qn&XBHc zc&VI9kkDlU`r(ScfM((H+%E0<`VIxOeH|G^xnutD&(@EAJErQ52Wf?z(Jw;!6>n4b~YI+kkGF G*?a{rp8Ssh literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.class b/uartBackend/target/classes/com/topsail/uartBackend/uart/service/Impl/CommandCollectionServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ae02a13abc2fa8b23029c43d9c5a35fa5e67440a GIT binary patch literal 2588 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 K(vV*e8~z6k8oh7; literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/user/entity/User.class b/uartBackend/target/classes/com/topsail/uartBackend/user/entity/User.class new file mode 100644 index 0000000000000000000000000000000000000000..b26e8b8a11b4a79d4b6c8b35628dc7e7c3bd0d06 GIT binary patch literal 6066 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 literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.class b/uartBackend/target/classes/com/topsail/uartBackend/user/service/Impl/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..589cc40564723f723ec32973688f4e9cc110d78f GIT binary patch literal 2380 zcmcIlZF3V<6n-{Incn#+{QwVi*go=S=@1ucKxPO zX|(T!4sIn5+ky6)TY+q;T|amtYD#*c*phYQ2YW*H6vT35{9PTW2F;ExYEPRbLNCp1 zILNH{4dvieReNeJYSmQmjik3Yrn+=DWT5T3vzam5n(oWPqhS8V9w~a7&5|n7!CWxw<2tO5sYcDJq^(mgE6jGs#|LNVD}pe;G@$gW03I zB1;zIn(yGu03V$Y*7c9%DZ3kVa(pLtP?LU3H~dJn_G(O5*mk2()crtl@EST!p!hyg z%+ObM+)UIhPB-Rc{BQ)5Rlh$Md+lyM^nY==cyvOR2ygKKu4Af?KT>AfZ#Dc@vMmWEM9HxlxD&EF4SEbn9Qev{>j>dWV zP7Glh7x6A#+PzDhrKx|BaleNQwbQ&PS7>*N=aZC5&aU>(rg>K4*~v5wf{LIKV1{1` ovn20YkCe-?J0LeP_8ht2khjD*eZ-unw?y$eZo~#|_Ba;6KSBq+(f|Me literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/com/topsail/uartBackend/user/service/UserService.class b/uartBackend/target/classes/com/topsail/uartBackend/user/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..07d9c66f05d6aecce144e61f1ab418e7b27cba89 GIT binary patch literal 675 zcmcIiOHRWu5FNLrX$ytGDPV(@dk~CCSd5(xvpOrc0GS zqM1nVu$E{@(?Z^JJW8f&u4Ji9A;*TW__=h{T=T?qp~px-e2w&ACwHn=6%y7?Kqs&Z z=!Qvd>}sS`Kcj$tstcpY*Brn6`*`Pn*MGrM+}aXuvnl2@S`uW+R(fK+tQMIf?PjHS z5}yc-)7D59JJ&hNaoPkMb{(YF*EwG4l6MjZGgdsu!4d%{zk2x9eC-{xe4E+m5O5k; qHWbnoAfUx)^Dh$}HWs!x?{YS5L&Qgq(Ps=8E!bu>(GCokmEBJ=(bmQQ literal 0 HcmV?d00001 diff --git a/uartBackend/target/classes/mapper/CommandCollectionMapper.xml b/uartBackend/target/classes/mapper/CommandCollectionMapper.xml new file mode 100644 index 0000000..c59dc2b --- /dev/null +++ b/uartBackend/target/classes/mapper/CommandCollectionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/target/classes/mapper/CommandDetailMapper.xml b/uartBackend/target/classes/mapper/CommandDetailMapper.xml new file mode 100644 index 0000000..c9dd73a --- /dev/null +++ b/uartBackend/target/classes/mapper/CommandDetailMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/target/classes/mapper/CommandTypeMapper.xml b/uartBackend/target/classes/mapper/CommandTypeMapper.xml new file mode 100644 index 0000000..77c1772 --- /dev/null +++ b/uartBackend/target/classes/mapper/CommandTypeMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/uartBackend/target/classes/mapper/DeviceCommandMapper.xml b/uartBackend/target/classes/mapper/DeviceCommandMapper.xml new file mode 100644 index 0000000..149ea5e --- /dev/null +++ b/uartBackend/target/classes/mapper/DeviceCommandMapper.xml @@ -0,0 +1,9 @@ + + + + + + delete from device_command where device_detail_id = #{deviceDetailId} + + + diff --git a/uartBackend/target/classes/mapper/DeviceConfigDetailMapper.xml b/uartBackend/target/classes/mapper/DeviceConfigDetailMapper.xml new file mode 100644 index 0000000..4807edc --- /dev/null +++ b/uartBackend/target/classes/mapper/DeviceConfigDetailMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/target/classes/mapper/UserMapper.xml b/uartBackend/target/classes/mapper/UserMapper.xml new file mode 100644 index 0000000..fe87e7b --- /dev/null +++ b/uartBackend/target/classes/mapper/UserMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/uartBackend/target/classes/templates/controller.ftl b/uartBackend/target/classes/templates/controller.ftl new file mode 100644 index 0000000..22a4e0f --- /dev/null +++ b/uartBackend/target/classes/templates/controller.ftl @@ -0,0 +1,66 @@ + +package ${package.Controller}; + + +import com.topsail.uartBackend.core.CodeMsg; +import ${package.Service}.${table.serviceName}; +import ${package.Entity}.${entity}; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import com.topsail.uartBackend.core.Result; + + + +/** +* +* Created by pz on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@RestController +//@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}") +@RequestMapping("${entity?uncap_first}") + +public class ${entity}Controller { + + @Autowired + private ${entity}Service ${entity?uncap_first}Service; + + /** + * 新增 + */ + @PostMapping("/insert${entity}") + public Result insert${entity}( @RequestBody ${entity} ${entity?uncap_first}){ + boolean rsp= ${entity?uncap_first}Service.save(${entity?uncap_first}); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 删除 + */ + @DeleteMapping("/delete${entity}/{id}") + public Result delete${entity}(@PathVariable Integer id){ + boolean rsp= ${entity?uncap_first}Service.removeById(id); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + /** + * 更新 + */ + @PutMapping("/update${entity}") + public Result update${entity}(@RequestBody ${entity} ${entity?uncap_first}){ + boolean rsp= ${entity?uncap_first}Service.updateById(${entity?uncap_first}); + return rsp?Result.success("成功"):Result.error(new CodeMsg(502,"失败")); + } + + + + /** + * 分页查询 + */ + @GetMapping("/get${entity}List") + + public Result pageList(${entity} ${entity?uncap_first},@RequestParam(required = false,defaultValue = "1")Integer pageNo, @RequestParam(required = false,defaultValue = "10")Integer pageSize) { + + return Result.success(Result.returnPageMap(${entity?uncap_first}Service.pageList(${entity?uncap_first},pageNo,pageSize))); + } + +} diff --git a/uartBackend/target/classes/templates/entity.ftl b/uartBackend/target/classes/templates/entity.ftl new file mode 100644 index 0000000..9d15051 --- /dev/null +++ b/uartBackend/target/classes/templates/entity.ftl @@ -0,0 +1,170 @@ +package ${package.Entity}; +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + + +/** + *

+ * ${table.comment!} + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + <#if superEntityClass??> +@EqualsAndHashCode(callSuper = true) + <#else> +@EqualsAndHashCode(callSuper = false) + +@Accessors(chain = true) + +<#if table.convert> +@TableName("${table.name}") + +<#if swagger2> +@ApiModel(value="${entity}对象", description="${table.comment!}") + +<#if superEntityClass??> +public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity} extends Model<${entity}> { +<#else> +public class ${entity} implements Serializable { + + +<#if entitySerialVersionUID> + private static final long serialVersionUID = 1L; + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + <#if field.keyFlag> + <#assign keyPropertyName="${field.propertyName}"/> + + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + <#if field.keyFlag> + <#-- 主键 --> + <#if field.keyIdentityFlag> + @TableId(value = "${field.name}", type = IdType.AUTO) + <#elseif idType??> + @TableId(value = "${field.name}", type = IdType.${idType}) + <#elseif field.convert> + @TableId("${field.name}") + + <#-- 普通字段 --> + <#elseif field.fill??> + <#-- ----- 存在字段填充设置 -----> + <#if field.convert> + @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) + <#else> + @TableField(fill = FieldFill.${field.fill}) + + <#elseif field.convert> + @TableField("${field.name}") + +<#-- 乐观锁注解 --> + <#if (versionFieldName!"") == field.name> + @Version + +<#-- 逻辑删除注解 --> + <#if (logicDeleteFieldName!"") == field.name> + @TableLogic + +<#-- 时间类型处理--> + <#if (field.propertyType) == "LocalDateTime"> + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + <#if (field.propertyName) == "createTime"> + @TableField(fill = FieldFill.INSERT) + + <#if (field.propertyName) == "updateTime"> + @TableField(fill = FieldFill.INSERT_UPDATE) + + private Date ${field.propertyName} ; + <#else> + private ${field.propertyType} ${field.propertyName} ; + + + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if entityBuilderModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if entityBuilderModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/uartBackend/target/classes/templates/mapper.ftl b/uartBackend/target/classes/templates/mapper.ftl new file mode 100644 index 0000000..eaed5e2 --- /dev/null +++ b/uartBackend/target/classes/templates/mapper.ftl @@ -0,0 +1,22 @@ +package ${package.Mapper}; + +import ${package.Entity}.${entity}; +import ${superMapperClassPackage}; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * ${table.comment!} Mapper 接口 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +@Mapper +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + +} + diff --git a/uartBackend/target/classes/templates/service.ftl b/uartBackend/target/classes/templates/service.ftl new file mode 100644 index 0000000..94bbfa7 --- /dev/null +++ b/uartBackend/target/classes/templates/service.ftl @@ -0,0 +1,25 @@ +package ${package.Service}; + +import ${package.Entity}.${entity}; +import ${superServiceClassPackage}; +import java.util.List; + +/** + *

+ * ${table.comment!} 服务类 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.serviceName} : ${superServiceClass}<${entity}> +<#else> +public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { + +/** +*分页查询 +*/ +public List<${entity}> pageList(${entity} ${entity?uncap_first},Integer pageNo, Integer pageSize); +} + diff --git a/uartBackend/target/classes/templates/serviceImpl.ftl b/uartBackend/target/classes/templates/serviceImpl.ftl new file mode 100644 index 0000000..50fde8c --- /dev/null +++ b/uartBackend/target/classes/templates/serviceImpl.ftl @@ -0,0 +1,48 @@ +package ${package.ServiceImpl}; + +import ${package.Entity}.${entity}; +import ${package.Mapper}.${table.mapperName}; +import ${package.Service}.${table.serviceName}; +import ${superServiceImplClassPackage}; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.github.pagehelper.PageHelper; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** +*

+ * ${table.comment!} 服务实现类 + *

+* +* @author ${author} +* @since ${date} +*/ +@Service +<#if kotlin> +open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { + +} +<#else> +@Slf4j +public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { + + + @Autowired + private ${entity}Mapper ${entity?uncap_first}Mapper; + + /** + *分页查询 + */ + @Override + public List<${entity}> pageList(${entity} ${entity?uncap_first},Integer pageNo, Integer pageSize) { + QueryWrapper<${entity}> wrapper = new QueryWrapper<>(); + wrapper.setEntity(${entity?uncap_first}); + PageHelper.startPage(pageNo,pageSize); + List<${entity}> list=list(wrapper); + return list; + } +} + \ No newline at end of file diff --git a/uartBackend/target/maven-archiver/pom.properties b/uartBackend/target/maven-archiver/pom.properties new file mode 100644 index 0000000..408682c --- /dev/null +++ b/uartBackend/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=uartBackend +groupId=com.topsail +version=1.0.0-SNAPSHOT diff --git a/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..a5c538e --- /dev/null +++ b/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,42 @@ +com\topsail\uartBackend\uart\service\Impl\CommandCollectionServiceImpl.class +com\topsail\uartBackend\config\GlobalException.class +com\topsail\uartBackend\uart\service\CommandTypeService.class +com\topsail\uartBackend\uart\entity\CommandCollection.class +com\topsail\uartBackend\uart\controller\DeviceConfigDetailController.class +com\topsail\uartBackend\user\controller\UserController.class +com\topsail\uartBackend\uart\service\Impl\DeviceConfigDetailServiceImpl.class +com\topsail\uartBackend\user\service\Impl\UserServiceImpl.class +com\topsail\uartBackend\uart\controller\DeviceCommandController.class +com\topsail\uartBackend\uart\mapper\CommandTypeMapper.class +com\topsail\uartBackend\uart\entity\CommandType.class +com\topsail\uartBackend\uart\service\CommandCollectionService.class +com\topsail\uartBackend\uart\controller\CommandCollectionController.class +com\topsail\uartBackend\core\JwtUtil.class +com\topsail\uartBackend\CodeGenerator$3.class +com\topsail\uartBackend\UartBackendApplication.class +com\topsail\uartBackend\uart\service\CommandDetailService.class +com\topsail\uartBackend\config\Interceptor.class +com\topsail\uartBackend\uart\entity\DeviceConfigDetail.class +com\topsail\uartBackend\user\service\UserService.class +com\topsail\uartBackend\CodeGenerator.class +com\topsail\uartBackend\config\MybatisObjectHandler.class +com\topsail\uartBackend\core\Result.class +com\topsail\uartBackend\uart\mapper\DeviceConfigDetailMapper.class +com\topsail\uartBackend\CodeGenerator$2.class +com\topsail\uartBackend\uart\entity\CommandDetail.class +com\topsail\uartBackend\config\InterceptorConfig.class +com\topsail\uartBackend\user\entity\User.class +com\topsail\uartBackend\uart\controller\CommandTypeController.class +com\topsail\uartBackend\uart\service\DeviceCommandService.class +com\topsail\uartBackend\uart\service\Impl\DeviceCommandServiceImpl.class +com\topsail\uartBackend\uart\entity\DeviceCommand.class +com\topsail\uartBackend\uart\controller\CommandDetailController.class +com\topsail\uartBackend\uart\mapper\CommandDetailMapper.class +com\topsail\uartBackend\uart\mapper\CommandCollectionMapper.class +com\topsail\uartBackend\uart\service\Impl\CommandDetailServiceImpl.class +com\topsail\uartBackend\uart\service\Impl\CommandTypeServiceImpl.class +com\topsail\uartBackend\uart\service\DeviceConfigDetailService.class +com\topsail\uartBackend\core\CodeMsg.class +com\topsail\uartBackend\uart\mapper\DeviceCommandMapper.class +com\topsail\uartBackend\user\mapper\UserMapper.class +com\topsail\uartBackend\CodeGenerator$1.class diff --git a/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..da31712 --- /dev/null +++ b/uartBackend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,39 @@ +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\user\service\Impl\UserServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\core\Result.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\user\entity\User.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\controller\CommandTypeController.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\entity\DeviceCommand.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\controller\DeviceCommandController.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\CommandCollectionService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\DeviceConfigDetailService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\core\CodeMsg.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\mapper\CommandDetailMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\config\InterceptorConfig.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\mapper\DeviceCommandMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\mapper\CommandCollectionMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\Impl\DeviceCommandServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\Impl\DeviceConfigDetailServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\config\Interceptor.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\DeviceCommandService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\controller\CommandCollectionController.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\mapper\CommandTypeMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\user\mapper\UserMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\config\GlobalException.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\core\JwtUtil.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\controller\CommandDetailController.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\Impl\CommandDetailServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\entity\CommandCollection.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\Impl\CommandTypeServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\entity\DeviceConfigDetail.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\user\service\UserService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\config\MybatisObjectHandler.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\controller\DeviceConfigDetailController.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\UartBackendApplication.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\mapper\DeviceConfigDetailMapper.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\CodeGenerator.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\CommandDetailService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\Impl\CommandCollectionServiceImpl.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\service\CommandTypeService.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\entity\CommandType.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\uart\entity\CommandDetail.java +G:\bluetoothUart\bluetoothUart\uartBackend\src\main\java\com\topsail\uartBackend\user\controller\UserController.java diff --git a/uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/uartBackend/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/uartBackend/target/uartBackend-1.0.0-SNAPSHOT.jar.original b/uartBackend/target/uartBackend-1.0.0-SNAPSHOT.jar.original new file mode 100644 index 0000000000000000000000000000000000000000..df587b12aeb4b4b524b1ef30516ca902a4ec453f GIT binary patch literal 66452 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 literal 0 HcmV?d00001 diff --git a/uartBackend/uartBackend.iml b/uartBackend/uartBackend.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/uartBackend/uartBackend.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/uartPage/read.txt b/uartPage/read.txt new file mode 100644 index 0000000..e69de29