Kaynağa Gözat

update .gitignore

xucaiqin 2 yıl önce
ebeveyn
işleme
aec9479adf
52 değiştirilmiş dosya ile 2939 ekleme ve 4 silme
  1. 1 4
      .gitignore
  2. 731 0
      iot-dependencies/pom.xml
  3. 61 0
      iot-framework/iot-common/pom.xml
  4. 10 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/constant/Global.java
  5. 29 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/BusinessException.java
  6. 10 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/ResultCode.java
  7. 56 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/ServerException.java
  8. 157 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/JsonUtils.java
  9. 78 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/Result.java
  10. 109 0
      iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/ServletUtils.java
  11. 20 0
      iot-framework/iot-starter-es/pom.xml
  12. 20 0
      iot-framework/iot-starter-feign/pom.xml
  13. 48 0
      iot-framework/iot-starter-log/pom.xml
  14. 21 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/config/LogAutoConfiguration.java
  15. 13 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/config/LogRpcAutoConfiguration.java
  16. 53 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/annotations/OperateLog.java
  17. 244 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/aop/OperateLogAspect.java
  18. 51 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/enums/OperateTypeEnum.java
  19. 16 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/LogFrameworkService.java
  20. 18 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/LogFrameworkServiceImpl.java
  21. 100 0
      iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/OperateLogDto.java
  22. 2 0
      iot-framework/iot-starter-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  23. 20 0
      iot-framework/iot-starter-mongo/pom.xml
  24. 20 0
      iot-framework/iot-starter-mqtt/pom.xml
  25. 64 0
      iot-framework/iot-starter-mybatis/pom.xml
  26. 29 0
      iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/config/MybatisAutoConfiguration.java
  27. 46 0
      iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/core/dataobject/BaseDO.java
  28. 59 0
      iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/core/handler/DefaultDbFieldHandler.java
  29. 67 0
      iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/utils/MyBatisUtils.java
  30. 2 0
      iot-framework/iot-starter-mybatis/src/main/resources/META-INF/spring.factories
  31. 1 0
      iot-framework/iot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  32. 20 0
      iot-framework/iot-starter-mysql/pom.xml
  33. 21 0
      iot-framework/iot-starter-rabbitmq/pom.xml
  34. 34 0
      iot-framework/iot-starter-redis/pom.xml
  35. 53 0
      iot-framework/iot-starter-redis/src/main/java/com/middle/platform/redis/config/RedisAutoConfiguration.java
  36. 1 0
      iot-framework/iot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  37. 21 0
      iot-framework/iot-starter-tdengine/pom.xml
  38. 51 0
      iot-framework/iot-starter-web/pom.xml
  39. 36 0
      iot-framework/iot-starter-web/src/main/java/com/middle/platform/web/config/GlobalExceptionHandler.java
  40. 1 0
      iot-framework/iot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  41. 36 0
      iot-framework/pom.xml
  42. 20 0
      iot-gateway/pom.xml
  43. 20 0
      iot-module/iot-module-auth/iot-module-auth-api/pom.xml
  44. 59 0
      iot-module/iot-module-auth/iot-module-auth-biz/pom.xml
  45. 14 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/AuthApplication.java
  46. 21 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/controller/TestController.java
  47. 18 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/bootstrap-local.yaml
  48. 22 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/bootstrap.yaml
  49. 202 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/logback-spring.xml
  50. 24 0
      iot-module/iot-module-auth/pom.xml
  51. 23 0
      iot-module/pom.xml
  52. 86 0
      pom.xml

+ 1 - 4
.gitignore

@@ -4,10 +4,7 @@ target/
 !**/src/test/**/target/
 
 ### IntelliJ IDEA ###
-.idea/modules.xml
-.idea/jarRepositories.xml
-.idea/compiler.xml
-.idea/libraries/
+.idea
 *.iws
 *.iml
 *.ipr

+ 731 - 0
iot-dependencies/pom.xml

@@ -0,0 +1,731 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.middle.platform</groupId>
+    <artifactId>iot-dependencies</artifactId>
+    <version>${revision}</version>
+
+    <name>${project.artifactId}</name>
+    <packaging>pom</packaging>
+    <description>物联中台pom依赖管理</description>
+
+    <properties>
+        <revision>1.0.0</revision>
+        <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
+        <!-- 统一依赖管理 -->
+        <spring.boot.version>3.1.4</spring.boot.version>
+        <spring.cloud.version>2022.0.4</spring.cloud.version>
+        <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>
+        <!-- Web 相关 -->
+        <servlet.versoin>2.5</servlet.versoin>
+        <springdoc.version>2.2.0</springdoc.version>
+        <knife4j.version>4.3.0</knife4j.version>
+        <!-- DB 相关 -->
+        <druid.version>1.2.19</druid.version>
+        <mybatis-plus.version>3.5.3.2</mybatis-plus.version>
+        <mybatis-plus-generator.version>3.5.3.2</mybatis-plus-generator.version>
+        <dynamic-datasource.version>3.6.1</dynamic-datasource.version>
+        <mybatis-plus-join-boot-starter.version>1.4.6</mybatis-plus-join-boot-starter.version>
+        <redisson.version>3.23.4</redisson.version>
+        <dm8.jdbc.version>8.1.2.141</dm8.jdbc.version>
+        <!-- RPC 相关 -->
+        <!-- Config 配置中心相关 -->
+        <apollo.version>1.9.2</apollo.version>
+        <!-- Job 定时任务相关 -->
+        <xxl-job.version>2.3.1</xxl-job.version>
+        <!-- 服务保障相关 -->
+        <lock4j.version>2.2.3</lock4j.version>
+        <resilience4j.version>2.1.0</resilience4j.version>
+        <!-- 监控相关 -->
+        <skywalking.version>9.0.0</skywalking.version>
+        <spring-boot-admin.version>3.1.6</spring-boot-admin.version>
+        <opentracing.version>0.33.0</opentracing.version>
+        <!-- Test 测试相关 -->
+        <podam.version>8.0.0.RELEASE</podam.version>
+        <jedis-mock.version>1.0.10</jedis-mock.version>
+        <mockito-inline.version>5.2.0</mockito-inline.version>
+        <!-- Bpm 工作流相关 -->
+        <flowable.version>7.0.0</flowable.version>
+        <!-- 工具类相关 -->
+        <captcha-plus.version>2.0.3</captcha-plus.version>
+        <jsoup.version>1.16.1</jsoup.version>
+        <lombok.version>1.18.30</lombok.version>
+        <mapstruct.version>1.5.5.Final</mapstruct.version>
+        <hutool.version>5.8.22</hutool.version>
+        <easyexcel.verion>3.3.2</easyexcel.verion>
+        <velocity.version>2.3</velocity.version>
+        <screw.version>1.0.5</screw.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <guava.version>32.1.2-jre</guava.version>
+        <guice.version>5.1.0</guice.version>
+        <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
+        <commons-net.version>3.9.0</commons-net.version>
+        <jsch.version>0.1.55</jsch.version>
+        <tika-core.version>2.9.0</tika-core.version>
+        <ip2region.version>2.7.0</ip2region.version>
+        <reflections.version>0.10.2</reflections.version>
+        <!-- 三方云服务相关 -->
+        <okio.version>3.5.0</okio.version>
+        <okhttp3.version>4.11.0</okhttp3.version>
+        <commons-io.version>2.13.0</commons-io.version>
+        <minio.version>8.5.6</minio.version>
+        <aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version>
+        <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
+        <tencentcloud-sdk-java.version>3.1.853</tencentcloud-sdk-java.version>
+        <justauth.version>2.0.3</justauth.version>
+        <jimureport.version>1.5.8</jimureport.version>
+        <xercesImpl.version>2.12.2</xercesImpl.version>
+        <weixin-java.version>4.5.5.B</weixin-java.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- 统一依赖管理 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring.boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring.cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring.cloud.alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <!--common模块-->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-common</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 业务组件 -->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-banner</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-operatelog</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-dict</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-sms</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-pay</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-weixin</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-tenant</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-data-permission</artifactId>
+                <version>${revision}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-es</artifactId>
+                <version>${revision}</version>
+            </dependency>
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-social</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-error-code</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-biz-ip</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-captcha</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-desensitize</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!-- Spring 核心 -->
+            <!--            <dependency>-->
+            <!--                &lt;!&ndash; 用于生成自定义的 Spring @ConfigurationProperties 配置类的说明文件 &ndash;&gt;-->
+            <!--                <groupId>org.springframework.boot</groupId>-->
+            <!--                <artifactId>spring-boot-configuration-processor</artifactId>-->
+            <!--                <version>${spring.boot.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-env</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!-- Web 相关 -->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-web</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-security</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.xiaoymin</groupId>-->
+            <!--                <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>-->
+            <!--                <version>${knife4j.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.springdoc</groupId>-->
+            <!--                <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>-->
+            <!--                <version>${springdoc.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.xiaoymin</groupId> &lt;!&ndash; 接口文档 UI:knife4j【网关专属】 &ndash;&gt;-->
+            <!--                <artifactId>knife4j-gateway-spring-boot-starter</artifactId>-->
+            <!--                <version>${knife4j.version}</version>-->
+            <!--            </dependency>-->
+
+            <!-- DB 相关 -->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-mybatis</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-3-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->
+                <version>${dynamic-datasource.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.yulichang</groupId>
+                <artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 -->
+                <version>${mybatis-plus-join-boot-starter.version}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.baomidou</groupId>-->
+            <!--                <artifactId>mybatis-plus-generator</artifactId> &lt;!&ndash; 代码生成器,使用它解析表结构 &ndash;&gt;-->
+            <!--                <version>${mybatis-plus-generator.version}</version>-->
+            <!--            </dependency>-->
+
+
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-redis</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson-spring-boot-starter</artifactId>
+                <version>${redisson.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.dameng</groupId>
+                <artifactId>DmJdbcDriver18</artifactId>
+                <version>${dm8.jdbc.version}</version>
+            </dependency>
+
+            <!-- RPC 远程调用相关 -->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-starter-feign</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- Registry 注册中心相关 -->
+
+            <!-- Config 配置中心相关 -->
+
+            <!-- Job 定时任务相关 -->
+            <!--            <dependency>-->
+            <!--                <groupId>com.xuxueli</groupId>-->
+            <!--                <artifactId>xxl-job-core</artifactId>-->
+            <!--                <version>${xxl-job.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-job</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!-- 消息队列相关 -->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-mq</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!-- 服务保障相关 -->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-protection</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.baomidou</groupId>-->
+            <!--                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>-->
+            <!--                <version>${lock4j.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <artifactId>redisson-spring-boot-starter</artifactId>-->
+            <!--                        <groupId>org.redisson</groupId>-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>io.github.resilience4j</groupId>-->
+            <!--                <artifactId>resilience4j-ratelimiter</artifactId>-->
+            <!--                <version>${resilience4j.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>io.github.resilience4j</groupId>-->
+            <!--                <artifactId>resilience4j-spring-boot3</artifactId>-->
+            <!--                <version>${resilience4j.version}</version>-->
+            <!--            </dependency>-->
+
+            <!-- 监控相关 -->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-monitor</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.apache.skywalking</groupId>-->
+            <!--                <artifactId>apm-toolkit-trace</artifactId>-->
+            <!--                <version>${skywalking.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.apache.skywalking</groupId>-->
+            <!--                <artifactId>apm-toolkit-logback-1.x</artifactId>-->
+            <!--                <version>${skywalking.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.apache.skywalking</groupId>-->
+            <!--                <artifactId>apm-toolkit-opentracing</artifactId>-->
+            <!--                <version>${skywalking.version}</version>-->
+            <!--                &lt;!&ndash;                <exclusions>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                    <exclusion>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                        <artifactId>opentracing-api</artifactId>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                        <groupId>io.opentracing</groupId>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                    </exclusion>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                    <exclusion>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                        <artifactId>opentracing-util</artifactId>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                        <groupId>io.opentracing</groupId>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                    </exclusion>&ndash;&gt;-->
+            <!--                &lt;!&ndash;                </exclusions>&ndash;&gt;-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>io.opentracing</groupId>-->
+            <!--                <artifactId>opentracing-api</artifactId>-->
+            <!--                <version>${opentracing.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>io.opentracing</groupId>-->
+            <!--                <artifactId>opentracing-util</artifactId>-->
+            <!--                <version>${opentracing.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>io.opentracing</groupId>-->
+            <!--                <artifactId>opentracing-noop</artifactId>-->
+            <!--                <version>${opentracing.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>de.codecentric</groupId>-->
+            <!--                <artifactId>spring-boot-admin-starter-server</artifactId> &lt;!&ndash; 实现 Spring Boot Admin Server 服务端 &ndash;&gt;-->
+            <!--                <version>${spring-boot-admin.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>de.codecentric</groupId>-->
+            <!--                <artifactId>spring-boot-admin-starter-client</artifactId> &lt;!&ndash; 实现 Spring Boot Admin Server 服务端 &ndash;&gt;-->
+            <!--                <version>${spring-boot-admin.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            &lt;!&ndash; Test 测试相关 &ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-test</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--                <scope>test</scope>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.mockito</groupId>-->
+            <!--                <artifactId>mockito-inline</artifactId>-->
+            <!--                <version>${mockito-inline.version}</version> &lt;!&ndash; 支持 Mockito 的 final 类与 static 方法的 mock &ndash;&gt;-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.springframework.boot</groupId>-->
+            <!--                <artifactId>spring-boot-starter-test</artifactId>-->
+            <!--                <version>${spring.boot.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <artifactId>asm</artifactId>-->
+            <!--                        <groupId>org.ow2.asm</groupId>-->
+            <!--                    </exclusion>-->
+            <!--                    <exclusion>-->
+            <!--                        <groupId>org.mockito</groupId>-->
+            <!--                        <artifactId>mockito-core</artifactId>-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.fppt</groupId> &lt;!&ndash; 单元测试,我们采用内嵌的 Redis 数据库 &ndash;&gt;-->
+            <!--                <artifactId>jedis-mock</artifactId>-->
+            <!--                <version>${jedis-mock.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>uk.co.jemos.podam</groupId> &lt;!&ndash; 单元测试,随机生成 POJO 类 &ndash;&gt;-->
+            <!--                <artifactId>podam</artifactId>-->
+            <!--                <version>${podam.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            &lt;!&ndash; 工作流相关 &ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-flowable</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.flowable</groupId>-->
+            <!--                <artifactId>flowable-spring-boot-starter-process</artifactId>-->
+            <!--                <version>${flowable.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.flowable</groupId>-->
+            <!--                <artifactId>flowable-spring-boot-starter-actuator</artifactId>-->
+            <!--                <version>${flowable.version}</version>-->
+            <!--            </dependency>-->
+            <!--            &lt;!&ndash; 工作流相关结束 &ndash;&gt;-->
+
+            <!--            &lt;!&ndash; 工具类相关 &ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>yudao-common</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-excel</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.mapstruct</groupId>-->
+            <!--                <artifactId>mapstruct</artifactId> &lt;!&ndash; use mapstruct-jdk8 for Java 8 or higher &ndash;&gt;-->
+            <!--                <version>${mapstruct.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.mapstruct</groupId>-->
+            <!--                <artifactId>mapstruct-jdk8</artifactId>-->
+            <!--                <version>${mapstruct.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.mapstruct</groupId>-->
+            <!--                <artifactId>mapstruct-processor</artifactId>-->
+            <!--                <version>${mapstruct.version}</version>-->
+            <!--            </dependency>-->
+
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.alibaba</groupId>-->
+            <!--                <artifactId>easyexcel</artifactId>-->
+            <!--                <version>${easyexcel.verion}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>commons-io</groupId>-->
+            <!--                <artifactId>commons-io</artifactId>-->
+            <!--                <version>${commons-io.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.apache.tika</groupId>-->
+            <!--                <artifactId>tika-core</artifactId> &lt;!&ndash; 文件类型的识别 &ndash;&gt;-->
+            <!--                <version>${tika-core.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.apache.velocity</groupId>-->
+            <!--                <artifactId>velocity-engine-core</artifactId>-->
+            <!--                <version>${velocity.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.alibaba</groupId>-->
+            <!--                <artifactId>fastjson</artifactId>-->
+            <!--                <version>${fastjson.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>cn.smallbun.screw</groupId>-->
+            <!--                <artifactId>screw-core</artifactId> &lt;!&ndash; 实现数据库文档 &ndash;&gt;-->
+            <!--                <version>${screw.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <groupId>org.freemarker</groupId>-->
+            <!--                        <artifactId>freemarker</artifactId> &lt;!&ndash; 移除 Freemarker 依赖,采用 Velocity 作为模板引擎 &ndash;&gt;-->
+            <!--                    </exclusion>-->
+            <!--                    <exclusion>-->
+            <!--                        <groupId>com.alibaba</groupId>-->
+            <!--                        <artifactId>fastjson</artifactId> &lt;!&ndash; 最新版screw-core1.0.5依赖fastjson1.2.73存在漏洞,移除。 &ndash;&gt;-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.google.inject</groupId>-->
+            <!--                <artifactId>guice</artifactId>-->
+            <!--                <version>${guice.version}</version>-->
+            <!--            </dependency>-->
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>transmittable-thread-local</artifactId> <!-- 解决 ThreadLocal 父子线程的传值问题 -->
+                <version>${transmittable-thread-local.version}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>commons-net</groupId>-->
+            <!--                <artifactId>commons-net</artifactId> &lt;!&ndash; 解决 ftp 连接 &ndash;&gt;-->
+            <!--                <version>${commons-net.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.jcraft</groupId>-->
+            <!--                <artifactId>jsch</artifactId> &lt;!&ndash; 解决 sftp 连接 &ndash;&gt;-->
+            <!--                <version>${jsch.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.xingyuv</groupId>-->
+            <!--                <artifactId>spring-boot-starter-captcha-plus</artifactId>-->
+            <!--                <version>${captcha-plus.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.lionsoul</groupId>-->
+            <!--                <artifactId>ip2region</artifactId>-->
+            <!--                <version>${ip2region.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.jsoup</groupId>-->
+            <!--                <artifactId>jsoup</artifactId>-->
+            <!--                <version>${jsoup.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>org.reflections</groupId>-->
+            <!--                <artifactId>reflections</artifactId>-->
+            <!--                <version>${reflections.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            &lt;!&ndash; 三方云服务相关 &ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.squareup.okio</groupId>-->
+            <!--                <artifactId>okio</artifactId>-->
+            <!--                <version>${okio.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.squareup.okhttp3</groupId>-->
+            <!--                <artifactId>okhttp</artifactId>-->
+            <!--                <version>${okhttp3.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.middle.platform</groupId>-->
+            <!--                <artifactId>iot-starter-file</artifactId>-->
+            <!--                <version>${revision}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>io.minio</groupId>-->
+            <!--                <artifactId>minio</artifactId>-->
+            <!--                <version>${minio.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.binarywang</groupId>-->
+            <!--                <artifactId>weixin-java-pay</artifactId>-->
+            <!--                <version>${weixin-java.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.binarywang</groupId>-->
+            <!--                <artifactId>weixin-java-mp</artifactId>-->
+            <!--                <version>${weixin-java.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.binarywang</groupId>-->
+            <!--                <artifactId>wx-java-mp-spring-boot-starter</artifactId>-->
+            <!--                <version>${weixin-java.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--            &lt;!&ndash; SMS SDK begin &ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.aliyun</groupId>-->
+            <!--                <artifactId>aliyun-java-sdk-core</artifactId>-->
+            <!--                <version>${aliyun-java-sdk-core.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <artifactId>opentracing-api</artifactId>-->
+            <!--                        <groupId>io.opentracing</groupId>-->
+            <!--                    </exclusion>-->
+            <!--                    <exclusion>-->
+            <!--                        <artifactId>opentracing-util</artifactId>-->
+            <!--                        <groupId>io.opentracing</groupId>-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.aliyun</groupId>-->
+            <!--                <artifactId>aliyun-java-sdk-dysmsapi</artifactId>-->
+            <!--                <version>${aliyun-java-sdk-dysmsapi.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>com.tencentcloudapi</groupId>-->
+            <!--                <artifactId>tencentcloud-sdk-java-sms</artifactId>-->
+            <!--                <version>${tencentcloud-sdk-java.version}</version>-->
+            <!--            </dependency>-->
+            <!--            &lt;!&ndash; SMS SDK end &ndash;&gt;-->
+
+            <!--            <dependency>-->
+            <!--                <groupId>com.xingyuv</groupId>-->
+            <!--                <artifactId>spring-boot-starter-justauth</artifactId> &lt;!&ndash; 社交登陆(例如说,个人微信、企业微信等等) &ndash;&gt;-->
+            <!--                <version>${justauth.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <groupId>cn.hutool</groupId>-->
+            <!--                        <artifactId>hutool-core</artifactId>-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+
+            <!--            &lt;!&ndash; 积木报表&ndash;&gt;-->
+            <!--            <dependency>-->
+            <!--                <groupId>org.jeecgframework.jimureport</groupId>-->
+            <!--                <artifactId>jimureport-spring-boot-starter</artifactId>-->
+            <!--                <version>${jimureport.version}</version>-->
+            <!--                <exclusions>-->
+            <!--                    <exclusion>-->
+            <!--                        <groupId>com.alibaba</groupId>-->
+            <!--                        <artifactId>druid</artifactId>-->
+            <!--                    </exclusion>-->
+            <!--                </exclusions>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>xerces</groupId>-->
+            <!--                <artifactId>xercesImpl</artifactId>-->
+            <!--                <version>${xercesImpl.version}</version>-->
+            <!--            </dependency>-->
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-module-system-api</artifactId>
+                <version>${revision}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <!-- 统一 revision 版本 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>flatten-maven-plugin</artifactId>
+                <version>${flatten-maven-plugin.version}</version>
+                <configuration>
+                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
+                    <updatePomFile>true</updatePomFile>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>flatten</goal>
+                        </goals>
+                        <id>flatten</id>
+                        <phase>process-resources</phase>
+                    </execution>
+                    <execution>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                        <id>flatten.clean</id>
+                        <phase>clean</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 61 - 0
iot-framework/iot-common/pom.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-common</artifactId>
+    <packaging>jar</packaging>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+    </dependencies>
+</project>

+ 10 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/constant/Global.java

@@ -0,0 +1,10 @@
+package com.middle.platform.common.constant;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-05 16:42:00
+ */
+public interface Global {
+     int SUCCESS = 200;
+     int ERROR = 500;
+}

+ 29 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/BusinessException.java

@@ -0,0 +1,29 @@
+package com.middle.platform.common.exception;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 业务异常
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BusinessException extends RuntimeException {
+    @Serial
+    private static final long serialVersionUID = 4515565480123536390L;
+    /**
+     * 异常信息
+     **/
+    private final String message;
+
+    public BusinessException() {
+        this("");
+    }
+
+    public BusinessException(String message) {
+        super(message);
+        this.message = message;
+    }
+}

+ 10 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/ResultCode.java

@@ -0,0 +1,10 @@
+package com.middle.platform.common.exception;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-04 09:58:55
+ */
+public class ResultCode {
+    public static final int SUCCESS = 200;
+    public static final int ERROR = 500;
+}

+ 56 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/exception/ServerException.java

@@ -0,0 +1,56 @@
+package com.middle.platform.common.exception;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 服务器异常 Exception
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public final class ServerException extends RuntimeException {
+
+    /**
+     * 全局错误码
+     */
+    private Integer code;
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 空构造方法,避免反序列化问题
+     */
+    public ServerException() {
+    }
+
+    public ServerException(String message) {
+        this(500, message);
+    }
+
+    public ServerException(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public ServerException setCode(Integer code) {
+        this.code = code;
+        return this;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public ServerException setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+}

+ 157 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/JsonUtils.java

@@ -0,0 +1,157 @@
+package com.middle.platform.common.utils;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * JSON 工具类
+ *
+ * @author 芋道源码
+ */
+@Slf4j
+public class JsonUtils {
+
+    private static ObjectMapper objectMapper = new ObjectMapper();
+
+    static {
+        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化
+    }
+
+    /**
+     * 初始化 objectMapper 属性
+     * <p>
+     * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean
+     *
+     * @param objectMapper ObjectMapper 对象
+     */
+    public static void init(ObjectMapper objectMapper) {
+        JsonUtils.objectMapper = objectMapper;
+    }
+
+    @SneakyThrows
+    public static String toJsonString(Object object) {
+        return objectMapper.writeValueAsString(object);
+    }
+
+    @SneakyThrows
+    public static byte[] toJsonByte(Object object) {
+        return objectMapper.writeValueAsBytes(object);
+    }
+
+    @SneakyThrows
+    public static String toJsonPrettyString(Object object) {
+        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
+    }
+
+    public static <T> T parseObject(String text, Class<T> clazz) {
+        if (StrUtil.isEmpty(text)) {
+            return null;
+        }
+        try {
+            return objectMapper.readValue(text, clazz);
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static <T> T parseObject(String text, Type type) {
+        if (StrUtil.isEmpty(text)) {
+            return null;
+        }
+        try {
+            return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type));
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将字符串解析成指定类型的对象
+     * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下,
+     * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。
+     *
+     * @param text 字符串
+     * @param clazz 类型
+     * @return 对象
+     */
+    public static <T> T parseObject2(String text, Class<T> clazz) {
+        if (StrUtil.isEmpty(text)) {
+            return null;
+        }
+        return JSONUtil.toBean(text, clazz);
+    }
+
+    public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
+        if (ArrayUtil.isEmpty(bytes)) {
+            return null;
+        }
+        try {
+            return objectMapper.readValue(bytes, clazz);
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", bytes, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static <T> T parseObject(String text, TypeReference<T> typeReference) {
+        try {
+            return objectMapper.readValue(text, typeReference);
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static <T> List<T> parseArray(String text, Class<T> clazz) {
+        if (StrUtil.isEmpty(text)) {
+            return new ArrayList<>();
+        }
+        try {
+            return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static JsonNode parseTree(String text) {
+        try {
+            return objectMapper.readTree(text);
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static JsonNode parseTree(byte[] text) {
+        try {
+            return objectMapper.readTree(text);
+        } catch (IOException e) {
+            log.error("json parse err,json:{}", text, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static boolean isJson(String text) {
+        return JSONUtil.isTypeJSON(text);
+    }
+
+}

+ 78 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/Result.java

@@ -0,0 +1,78 @@
+package com.middle.platform.common.utils;
+
+
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author xcq
+ */
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class Result<T> implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -7366649565737779295L;
+    /**
+     * 200-成功 102-失败
+     */
+    @Getter
+    @Setter
+    private int code;
+
+    @Getter
+    @Setter
+    private String msg;
+    @Getter
+    @Setter
+    private Boolean status;
+
+    @Getter
+    @Setter
+    private T data;
+
+    public static <T> Result<T> ok() {
+        return restResult(null, true, 200, null);
+    }
+
+    public static <T> Result<T> ok(T data) {
+        return restResult(data, true, 200, null);
+    }
+
+    public static <T> Result<T> ok(T data, String msg) {
+        return restResult(data, true, 200, msg);
+    }
+
+    public static <T> Result<T> failed() {
+        return restResult(null, false, 102, null);
+    }
+
+    public static <T> Result<T> failed(String msg) {
+        return restResult(null, false, 102, msg);
+    }
+
+    public static <T> Result<T> failed(T data) {
+        return restResult(data, false, 102, null);
+    }
+
+    public static <T> Result<T> failed(T data, String msg) {
+        return restResult(data, false, 102, msg);
+    }
+
+    public static <T> Result<T> failed(T data, String msg, int code) {
+        return restResult(data, false, code, msg);
+    }
+
+    private static <T> Result<T> restResult(T data, Boolean status, int code, String msg) {
+        Result<T> apiResult = new Result<>();
+        apiResult.setCode(code);
+        apiResult.setStatus(status);
+        apiResult.setData(data);
+        apiResult.setMsg(msg);
+        return apiResult;
+    }
+}

+ 109 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/ServletUtils.java

@@ -0,0 +1,109 @@
+package com.middle.platform.common.utils;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.JakartaServletUtil;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.http.MediaType;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Map;
+
+/**
+ * 客户端工具类
+ *
+ * @author 芋道源码
+ */
+public class ServletUtils {
+
+    /**
+     * 返回 JSON 字符串
+     *
+     * @param response 响应
+     * @param object 对象,会序列化成 JSON 字符串
+     */
+    @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码
+    public static void writeJSON(HttpServletResponse response, Object object) {
+        String content = JsonUtils.toJsonString(object);
+        JakartaServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE);
+    }
+
+    /**
+     * 返回附件
+     *
+     * @param response 响应
+     * @param filename 文件名
+     * @param content 附件内容
+     */
+    public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException {
+        // 设置 header 和 contentType
+        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
+        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+        // 输出附件
+        IoUtil.write(response.getOutputStream(), false, content);
+    }
+
+    /**
+     * @param request 请求
+     * @return ua
+     */
+    public static String getUserAgent(HttpServletRequest request) {
+        String ua = request.getHeader("User-Agent");
+        return ua != null ? ua : "";
+    }
+
+    /**
+     * 获得请求
+     *
+     * @return HttpServletRequest
+     */
+    public static HttpServletRequest getRequest() {
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        if (!(requestAttributes instanceof ServletRequestAttributes)) {
+            return null;
+        }
+        return ((ServletRequestAttributes) requestAttributes).getRequest();
+    }
+
+    public static String getUserAgent() {
+        HttpServletRequest request = getRequest();
+        if (request == null) {
+            return null;
+        }
+        return getUserAgent(request);
+    }
+
+    public static String getClientIP() {
+        HttpServletRequest request = getRequest();
+        if (request == null) {
+            return null;
+        }
+        return JakartaServletUtil.getClientIP(request);
+    }
+
+    public static boolean isJsonRequest(ServletRequest request) {
+        return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE);
+    }
+
+    public static String getBody(HttpServletRequest request) {
+        return JakartaServletUtil.getBody(request);
+    }
+
+    public static byte[] getBodyBytes(HttpServletRequest request) {
+        return JakartaServletUtil.getBodyBytes(request);
+    }
+
+    public static String getClientIP(HttpServletRequest request) {
+        return JakartaServletUtil.getClientIP(request);
+    }
+
+    public static Map<String, String> getParamMap(HttpServletRequest request) {
+        return JakartaServletUtil.getParamMap(request);
+    }
+}

+ 20 - 0
iot-framework/iot-starter-es/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-es</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 20 - 0
iot-framework/iot-starter-feign/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-feign</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 48 - 0
iot-framework/iot-starter-log/pom.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-log</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+        </dependency>
+        <!-- 工具类相关 -->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 21 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/config/LogAutoConfiguration.java

@@ -0,0 +1,21 @@
+package com.middle.platform.log.config;
+
+
+import com.middle.platform.log.core.aop.OperateLogAspect;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+
+@AutoConfiguration
+public class LogAutoConfiguration {
+
+    @Bean
+    public OperateLogAspect operateLogAspect() {
+        return new OperateLogAspect();
+    }
+
+//    @Bean
+//    public LogFrameworkService operateLogFrameworkService(OperateLogApi operateLogApi) {
+//        return new LogFrameworkServiceImpl(operateLogApi);
+//    }
+
+}

+ 13 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/config/LogRpcAutoConfiguration.java

@@ -0,0 +1,13 @@
+package com.middle.platform.log.config;
+
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+
+/**
+ * 操作日志使用到 Feign 的配置项
+ *
+ */
+@AutoConfiguration
+//@EnableFeignClients(clients = OperateLogApi.class) // 主要是引入相关的 API 服务
+public class LogRpcAutoConfiguration {
+
+}

+ 53 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/annotations/OperateLog.java

@@ -0,0 +1,53 @@
+package com.middle.platform.log.core.annotations;
+
+
+import com.middle.platform.log.core.enums.OperateTypeEnum;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 操作日志注解
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OperateLog {
+
+    // ========== 模块字段 ==========
+
+    /**
+     * 操作模块
+     */
+    String module() default "";
+
+    /**
+     * 操作名
+     */
+    String name() default "";
+
+    /**
+     * 操作分类
+     * 实际并不是数组,因为枚举不能设置 null 作为默认值
+     */
+    OperateTypeEnum[] type() default {};
+
+    // ========== 开关字段 ==========
+
+    /**
+     * 是否记录操作日志
+     */
+    boolean enable() default true;
+
+    /**
+     * 是否记录方法参数
+     */
+    boolean logArgs() default true;
+
+    /**
+     * 是否记录方法结果的数据
+     */
+    boolean logResultData() default true;
+
+}

+ 244 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/aop/OperateLogAspect.java

@@ -0,0 +1,244 @@
+package com.middle.platform.log.core.aop;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.ArrayUtil;
+import com.google.common.collect.Maps;
+import com.middle.platform.common.constant.Global;
+import com.middle.platform.common.utils.JsonUtils;
+import com.middle.platform.common.utils.Result;
+import com.middle.platform.common.utils.ServletUtils;
+import com.middle.platform.log.core.annotations.OperateLog;
+import com.middle.platform.log.core.enums.OperateTypeEnum;
+import com.middle.platform.log.core.service.LogFrameworkService;
+import com.middle.platform.log.core.service.OperateLogDto;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.multipart.MultipartFile;
+import java.lang.reflect.Array;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.function.Predicate;
+import java.util.stream.IntStream;
+
+
+
+@Aspect
+@Slf4j
+public class OperateLogAspect {
+
+    @Resource
+    private LogFrameworkService logFrameworkService;
+
+    @Around("@annotation(operateLog)")
+    public Object around(ProceedingJoinPoint joinPoint, OperateLog operateLog) throws Throwable {
+        return around0(joinPoint, operateLog);
+    }
+
+    private Object around0(ProceedingJoinPoint joinPoint, OperateLog operateLog) throws Throwable {
+        // 记录开始时间
+        LocalDateTime startTime = LocalDateTime.now();
+        try {
+            // 执行原有方法
+            Object result = joinPoint.proceed();
+            // 记录正常执行时的操作日志
+            this.log(joinPoint, operateLog, startTime, result, null);
+            return result;
+        } catch (Throwable exception) {
+            this.log(joinPoint, operateLog, startTime, null, exception);
+            throw exception;
+        }
+    }
+
+
+    private void log(ProceedingJoinPoint joinPoint, OperateLog operateLog, LocalDateTime startTime, Object result, Throwable exception) {
+        try {
+            // 判断不记录的情况
+            if (!isLogEnable(joinPoint, operateLog)) {
+                return;
+            }
+            // 真正记录操作日志
+            this.log0(joinPoint, operateLog, startTime, result, exception);
+        } catch (Throwable ex) {
+            log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) result({}) exception({}) ]", joinPoint, operateLog, result, exception, ex);
+        }
+    }
+
+    private void log0(ProceedingJoinPoint joinPoint, OperateLog operateLog, LocalDateTime startTime, Object result, Throwable exception) {
+        OperateLogDto operateLogObj = new OperateLogDto();
+        // 补全通用字段
+//        operateLogObj.setTraceId(TracerUtils.getTraceId());
+        operateLogObj.setStartTime(startTime);
+        // 补充用户信息
+        fillUserFields(operateLogObj);
+        // 补全模块信息
+        fillModuleFields(operateLogObj, joinPoint, operateLog);
+        // 补全请求信息
+        fillRequestFields(operateLogObj);
+        // 补全方法信息
+        fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception);
+
+        // 异步记录日志
+        logFrameworkService.createOperateLog(operateLogObj);
+    }
+
+    private static void fillUserFields(OperateLogDto operateLogObj) {
+//        operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId());
+//        operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType());
+    }
+
+    private static void fillModuleFields(OperateLogDto operateLogObj, ProceedingJoinPoint joinPoint, OperateLog operateLog) {
+        // module 属性
+        if (operateLog != null) {
+            operateLogObj.setModule(operateLog.module());
+        }
+        // name 属性
+        if (operateLog != null) {
+            operateLogObj.setName(operateLog.name());
+        }
+        // type 属性
+        if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) {
+            operateLogObj.setType(operateLog.type()[0].getType());
+        }
+        if (operateLogObj.getType() == null) {
+            RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint));
+            OperateTypeEnum operateLogType = convertOperateLogType(requestMethod);
+            operateLogObj.setType(operateLogType != null ? operateLogType.getType() : null);
+        }
+    }
+
+    private static void fillRequestFields(OperateLogDto operateLogObj) {
+        // 获得 Request 对象
+        HttpServletRequest request = ServletUtils.getRequest();
+        if (request == null) {
+            return;
+        }
+        // 补全请求信息
+        operateLogObj.setRequestMethod(request.getMethod());
+        operateLogObj.setRequestUrl(request.getRequestURI());
+        operateLogObj.setUserIp(ServletUtils.getClientIP(request));
+        operateLogObj.setUserAgent(ServletUtils.getUserAgent(request));
+    }
+
+    private static void fillMethodFields(OperateLogDto operateLogObj, ProceedingJoinPoint joinPoint, OperateLog operateLog, LocalDateTime startTime, Object result, Throwable exception) {
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        operateLogObj.setJavaMethod(methodSignature.toString());
+        if (operateLog == null || operateLog.logArgs()) {
+            operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint));
+        }
+        if (operateLog == null || operateLog.logResultData()) {
+            operateLogObj.setResultData(String.valueOf(result));
+        }
+        operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis()));
+        // (正常)处理 resultCode 和 resultMsg 字段
+        if (result instanceof Result<?> commonResult) {
+            operateLogObj.setResultCode(commonResult.getCode());
+            operateLogObj.setResultMsg(commonResult.getMsg());
+        } else {
+            operateLogObj.setResultCode(Global.SUCCESS);
+        }
+        // (异常)处理 resultCode 和 resultMsg 字段
+        if (exception != null) {
+            operateLogObj.setResultCode(Global.ERROR);
+            operateLogObj.setResultMsg(ExceptionUtil.getRootCauseMessage(exception));
+        }
+    }
+
+    private static boolean isLogEnable(ProceedingJoinPoint joinPoint, OperateLog operateLog) {
+        // 有 @OperateLog 注解的情况下
+        if (operateLog != null) {
+            return operateLog.enable();
+        }
+        return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null;
+    }
+
+    private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) {
+        if (ArrayUtil.isEmpty(requestMethods)) {
+            return null;
+        }
+        return Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.POST || requestMethod == RequestMethod.PUT || requestMethod == RequestMethod.DELETE).findFirst().orElse(null);
+    }
+
+    private static RequestMethod obtainFirstMatchRequestMethod(RequestMethod[] requestMethods) {
+        if (ArrayUtil.isEmpty(requestMethods)) {
+            return null;
+        }
+        // 优先,匹配最优的 POST、PUT、DELETE
+        RequestMethod result = obtainFirstLogRequestMethod(requestMethods);
+        if (result != null) {
+            return result;
+        }
+        // 然后,匹配次优的 GET
+        result = Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.GET).findFirst().orElse(null);
+        if (result != null) {
+            return result;
+        }
+        // 兜底,获得第一个
+        return requestMethods[0];
+    }
+
+    private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) {
+        if (requestMethod == null) {
+            return null;
+        }
+        return switch (requestMethod) {
+            case GET -> OperateTypeEnum.GET;
+            case POST -> OperateTypeEnum.CREATE;
+            case PUT -> OperateTypeEnum.UPDATE;
+            case DELETE -> OperateTypeEnum.DELETE;
+            default -> OperateTypeEnum.OTHER;
+        };
+    }
+
+    private static RequestMethod[] obtainRequestMethod(ProceedingJoinPoint joinPoint) {
+        RequestMapping requestMapping = AnnotationUtils.getAnnotation( // 使用 Spring 的工具类,可以处理 @RequestMapping 别名注解
+                ((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class);
+        return requestMapping != null ? requestMapping.method() : new RequestMethod[]{};
+    }
+
+    private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) {
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        String[] argNames = methodSignature.getParameterNames();
+        Object[] argValues = joinPoint.getArgs();
+        // 拼接参数
+        Map<String, Object> args = Maps.newHashMapWithExpectedSize(argValues.length);
+        for (int i = 0; i < argNames.length; i++) {
+            String argName = argNames[i];
+            Object argValue = argValues[i];
+            // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起
+            args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]");
+        }
+        return JsonUtils.toJsonString(args);
+    }
+
+
+    private static boolean isIgnoreArgs(Object object) {
+        Class<?> clazz = object.getClass();
+        // 处理数组的情况
+        if (clazz.isArray()) {
+            return IntStream.range(0, Array.getLength(object)).anyMatch(index -> isIgnoreArgs(Array.get(object, index)));
+        }
+        // 递归,处理数组、Collection、Map 的情况
+        if (Collection.class.isAssignableFrom(clazz)) {
+            return ((Collection<?>) object).stream().anyMatch((Predicate<Object>) OperateLogAspect::isIgnoreArgs);
+        }
+        if (Map.class.isAssignableFrom(clazz)) {
+            return isIgnoreArgs(((Map<?, ?>) object).values());
+        }
+        // obj
+        return object instanceof MultipartFile || object instanceof HttpServletRequest || object instanceof HttpServletResponse || object instanceof BindingResult;
+    }
+
+}

+ 51 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/enums/OperateTypeEnum.java

@@ -0,0 +1,51 @@
+package com.middle.platform.log.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 操作日志的操作类型
+ *
+ * @author ruoyi
+ */
+@Getter
+@AllArgsConstructor
+public enum OperateTypeEnum {
+
+    /**
+     * 查询
+     * 绝大多数情况下,不会记录查询动作,因为过于大量显得没有意义。
+     */
+    GET(1),
+    /**
+     * 新增
+     */
+    CREATE(2),
+    /**
+     * 修改
+     */
+    UPDATE(3),
+    /**
+     * 删除
+     */
+    DELETE(4),
+    /**
+     * 导出
+     */
+    EXPORT(5),
+    /**
+     * 导入
+     */
+    IMPORT(6),
+    /**
+     * 其它
+     * 在无法归类时,可以选择使用其它。因为还有操作名可以进一步标识
+     */
+    OTHER(0);
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+
+}

+ 16 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/LogFrameworkService.java

@@ -0,0 +1,16 @@
+package com.middle.platform.log.core.service;
+
+/**
+ * 操作日志 Framework Service 接口
+ *
+ */
+public interface LogFrameworkService {
+
+    /**
+     * 记录操作日志
+     *
+     * @param operateLogDto 操作日志请求
+     */
+    void createOperateLog(OperateLogDto operateLogDto);
+
+}

+ 18 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/LogFrameworkServiceImpl.java

@@ -0,0 +1,18 @@
+package com.middle.platform.log.core.service;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.scheduling.annotation.Async;
+
+/**
+ * 操作日志 Framework Service 实现类
+ */
+@RequiredArgsConstructor
+public class LogFrameworkServiceImpl implements LogFrameworkService {
+
+
+    @Override
+    @Async
+    public void createOperateLog(OperateLogDto operateLogDto) {
+    }
+
+}

+ 100 - 0
iot-framework/iot-starter-log/src/main/java/com/middle/platform/log/core/service/OperateLogDto.java

@@ -0,0 +1,100 @@
+package com.middle.platform.log.core.service;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * 操作日志
+ *
+ */
+@Data
+public class OperateLogDto {
+
+    /**
+     * 链路追踪编号
+     */
+    private String traceId;
+
+    /**
+     * 用户编号
+     */
+    private Long userId;
+    /**
+     * 用户类型
+     */
+    private Integer userType;
+
+    /**
+     * 操作模块
+     */
+    private String module;
+
+    /**
+     * 操作名
+     */
+    private String name;
+
+    /**
+     * 操作分类
+     */
+    private Integer type;
+
+
+    /**
+     * 请求方法名
+     */
+    private String requestMethod;
+
+    /**
+     * 请求地址
+     */
+    private String requestUrl;
+
+    /**
+     * 用户 IP
+     */
+    private String userIp;
+
+    /**
+     * 浏览器 UserAgent
+     */
+    private String userAgent;
+
+    /**
+     * Java 方法名
+     */
+    private String javaMethod;
+
+    /**
+     * Java 方法的参数
+     */
+    private String javaMethodArgs;
+
+    /**
+     * 开始时间
+     */
+    private LocalDateTime startTime;
+
+    /**
+     * 执行时长,单位:毫秒
+     */
+    private Integer duration;
+
+    /**
+     * 结果码
+     */
+    private Integer resultCode;
+
+    /**
+     * 结果提示
+     */
+    private String resultMsg;
+
+    /**
+     * 结果数据
+     */
+    private String resultData;
+
+}

+ 2 - 0
iot-framework/iot-starter-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1,2 @@
+com.middle.platform.log.config.LogAutoConfiguration
+com.middle.platform.log.config.LogRpcAutoConfiguration

+ 20 - 0
iot-framework/iot-starter-mongo/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-mongo</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 20 - 0
iot-framework/iot-starter-mqtt/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-mqtt</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 64 - 0
iot-framework/iot-starter-mybatis/pom.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-mybatis</artifactId>
+    <packaging>jar</packaging>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.dameng</groupId>
+            <artifactId>DmJdbcDriver18</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-3-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.yulichang</groupId>
+            <artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 -->
+        </dependency>
+    </dependencies>
+</project>

+ 29 - 0
iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/config/MybatisAutoConfiguration.java

@@ -0,0 +1,29 @@
+package com.middle.platform.mybatis.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.middle.platform.mybatis.core.handler.DefaultDbFieldHandler;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * MyBaits 配置类
+ */
+@AutoConfiguration
+public class MybatisAutoConfiguration {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件
+        return mybatisPlusInterceptor;
+    }
+
+
+    @Bean
+    public MetaObjectHandler defaultMetaObjectHandler() {
+        return new DefaultDbFieldHandler(); // 自动填充参数类
+    }
+
+}

+ 46 - 0
iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/core/dataobject/BaseDO.java

@@ -0,0 +1,46 @@
+package com.middle.platform.mybatis.core.dataobject;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 基础实体对象
+ *
+ */
+@Data
+public abstract class BaseDO implements Serializable {
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+    /**
+     * 最后更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+    /**
+     * 创建者,目前使用 SysUser 的 id 编号
+     * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createBy;
+    /**
+     * 更新者,目前使用 SysUser 的 id 编号
+     * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateBy;
+    /**
+     * 是否删除
+     */
+    @TableLogic
+    private Boolean delFlag;
+
+}

+ 59 - 0
iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/core/handler/DefaultDbFieldHandler.java

@@ -0,0 +1,59 @@
+package com.middle.platform.mybatis.core.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.middle.platform.mybatis.core.dataobject.BaseDO;
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+/**
+ * @author xucaiqin
+ * @date 2023-11-30 17:17:20
+ */
+public class DefaultDbFieldHandler implements MetaObjectHandler {
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO baseDO) {
+
+            LocalDateTime current = LocalDateTime.now();
+            // 创建时间为空,则以当前时间为插入时间
+            if (Objects.isNull(baseDO.getCreateTime())) {
+                baseDO.setCreateTime(current);
+            }
+            // 更新时间为空,则以当前时间为更新时间
+            if (Objects.isNull(baseDO.getUpdateTime())) {
+                baseDO.setUpdateTime(current);
+            }
+            //todo 添加用户id获取
+//            Long userId = WebFrameworkUtils.getLoginUserId();
+            Long userId = null;
+            // 当前登录用户不为空,创建人为空,则当前登录用户为创建人
+            if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreateBy())) {
+                baseDO.setCreateBy(userId);
+            }
+            // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
+            if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdateBy())) {
+                baseDO.setUpdateBy(userId);
+            }
+        }
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        // 更新时间为空,则以当前时间为更新时间
+        Object modifyTime = getFieldValByName("updateTime", metaObject);
+        if (Objects.isNull(modifyTime)) {
+            setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
+        }
+
+        // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
+        Object modifier = getFieldValByName("updater", metaObject);
+        //todo
+//        Long userId = WebFrameworkUtils.getLoginUserId();
+        Long userId = 0L;
+        if (Objects.nonNull(userId) && Objects.isNull(modifier)) {
+            setFieldValByName("updater", userId.toString(), metaObject);
+        }
+    }
+}

+ 67 - 0
iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/utils/MyBatisUtils.java

@@ -0,0 +1,67 @@
+package com.middle.platform.mybatis.utils;
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * MyBatis 工具类
+ */
+public class MyBatisUtils {
+
+    private static final String MYSQL_ESCAPE_CHARACTER = "`";
+
+
+
+    /**
+     * 将拦截器添加到链中
+     * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置
+     *
+     * @param interceptor 链
+     * @param inner 拦截器
+     * @param index 位置
+     */
+    public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) {
+        List<InnerInterceptor> inners = new ArrayList<>(interceptor.getInterceptors());
+        inners.add(index, inner);
+        interceptor.setInterceptors(inners);
+    }
+
+    /**
+     * 获得 Table 对应的表名
+     *
+     * 兼容 MySQL 转义表名 `t_xxx`
+     *
+     * @param table 表
+     * @return 去除转移字符后的表名
+     */
+    public static String getTableName(Table table) {
+        String tableName = table.getName();
+        if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) {
+            tableName = tableName.substring(1, tableName.length() - 1);
+        }
+        return tableName;
+    }
+
+    /**
+     * 构建 Column 对象
+     *
+     * @param tableName 表名
+     * @param tableAlias 别名
+     * @param column 字段名
+     * @return Column 对象
+     */
+    public static Column buildColumn(String tableName, Alias tableAlias, String column) {
+        if (tableAlias != null) {
+            tableName = tableAlias.getName();
+        }
+        return new Column(tableName + StringPool.DOT + column);
+    }
+
+}

+ 2 - 0
iot-framework/iot-starter-mybatis/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+  com.middle.platform.mybatis.config.MybatisAutoConfiguration \

+ 1 - 0
iot-framework/iot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+com.middle.platform.mybatis.config.MybatisAutoConfiguration

+ 20 - 0
iot-framework/iot-starter-mysql/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-mysql</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 21 - 0
iot-framework/iot-starter-rabbitmq/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-rabbitmq</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 34 - 0
iot-framework/iot-starter-redis/pom.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-redis</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!-- DB 相关 -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 53 - 0
iot-framework/iot-starter-redis/src/main/java/com/middle/platform/redis/config/RedisAutoConfiguration.java

@@ -0,0 +1,53 @@
+package com.middle.platform.redis.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+
+/**
+ * @author xucaiqin
+ * @date 2023-11-30 16:58:22
+ */
+@AutoConfiguration
+public class RedisAutoConfiguration {
+    /**
+     * 创建 RedisTemplate Bean,使用 JSON 序列化方式
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        // 创建 RedisTemplate 对象
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 设置 RedisConnection 工厂。 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
+        template.setConnectionFactory(factory);
+        // 使用 String 序列化方式,序列化 KEY 。
+        template.setKeySerializer(RedisSerializer.string());
+        template.setHashKeySerializer(RedisSerializer.string());
+        // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
+        template.setValueSerializer(serializer());
+        template.setHashValueSerializer(serializer());
+        return template;
+    }
+
+    private Jackson2JsonRedisSerializer<Object> serializer() {
+        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 解决jackson2无法序列化LocalDateTime问题
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(new JavaTimeModule());
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        return new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
+    }
+}

+ 1 - 0
iot-framework/iot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+com.middle.platform.redis.config.RedisAutoConfiguration

+ 21 - 0
iot-framework/iot-starter-tdengine/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-tdengine</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 51 - 0
iot-framework/iot-starter-web/pom.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-framework</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-starter-web</artifactId>
+    <packaging>jar</packaging>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-common</artifactId>
+        </dependency>
+        <!-- Spring Boot 配置所需依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- Web 相关 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 36 - 0
iot-framework/iot-starter-web/src/main/java/com/middle/platform/web/config/GlobalExceptionHandler.java

@@ -0,0 +1,36 @@
+package com.middle.platform.web.config;
+
+import com.middle.platform.common.exception.BusinessException;
+import com.middle.platform.common.exception.ResultCode;
+import com.middle.platform.common.utils.Result;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常
+ */
+@RestControllerAdvice
+@AllArgsConstructor
+@Slf4j
+public class GlobalExceptionHandler {
+    /**
+     * 处理业务异常 ServiceException
+     */
+    @ExceptionHandler(value = BusinessException.class)
+    public Result<?> serviceExceptionHandler(BusinessException ex) {
+        log.info("[BusinessException]", ex);
+        return Result.failed(ex.getMessage());
+    }
+
+    /**
+     * 处理系统异常,兜底处理所有的一切
+     */
+    @ExceptionHandler(value = Exception.class)
+    public Result<?> defaultExceptionHandler(Throwable ex) {
+        log.error("[defaultExceptionHandler]", ex);
+        return Result.failed(ResultCode.ERROR, ex.getMessage());
+    }
+
+}

+ 1 - 0
iot-framework/iot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+com.middle.platform.web.config.GlobalExceptionHandler

+ 36 - 0
iot-framework/pom.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-middle-platform</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-framework</artifactId>
+    <packaging>pom</packaging>
+    <description>框架</description>
+
+    <modules>
+        <module>iot-common</module>
+        <module>iot-starter-es</module>
+        <module>iot-starter-feign</module>
+        <module>iot-starter-web</module>
+        <module>iot-starter-redis</module>
+        <module>iot-starter-mqtt</module>
+        <module>iot-starter-mongo</module>
+        <module>iot-starter-mybatis</module>
+        <module>iot-starter-mysql</module>
+        <module>iot-starter-tdengine</module>
+        <module>iot-starter-rabbitmq</module>
+        <module>iot-starter-log</module>
+    </modules>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 20 - 0
iot-gateway/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-middle-platform</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>iot-gateway</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 20 - 0
iot-module/iot-module-auth/iot-module-auth-api/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-module-auth</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>iot-module-auth-api</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 59 - 0
iot-module/iot-module-auth/iot-module-auth-biz/pom.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-module-auth</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>iot-module-auth-biz</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!-- Spring Cloud 基础 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <!-- Registry 注册中心相关 -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- Config 配置中心相关 -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-starter-mybatis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-starter-es</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-starter-redis</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 14 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/AuthApplication.java

@@ -0,0 +1,14 @@
+package com.middle.platform.auth.biz;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AuthApplication {
+
+    public static void main(String[] args) {
+        // 启动 Spring Boot 应用
+        SpringApplication.run(AuthApplication.class, args);
+    }
+
+}

+ 21 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/controller/TestController.java

@@ -0,0 +1,21 @@
+package com.middle.platform.auth.biz.controller;
+
+import com.middle.platform.common.utils.Result;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-15 08:46:49
+ */
+@RestController
+@RequestMapping("/index")
+public class TestController {
+    @GetMapping("")
+    public Result<Object> st() {
+        return Result.ok(LocalDateTime.now().toString());
+    }
+}

+ 18 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/bootstrap-local.yaml

@@ -0,0 +1,18 @@
+spring:
+  cloud:
+    nacos:
+      server-addr: 127.0.0.1:8848
+      discovery:
+        namespace: fb99fe69-2012-40a2-9058-3a62e61e1027
+      config:
+        server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+        namespace: 78524032-ad7a-4724-8f8b-eef5ac08c5b5
+        group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+        name: ${spring.application.name} # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name
+        file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
+        username: nacos
+        password: nacos
+        shared-configs:
+          - data-id: common.yaml
+            group: common
+            refresh: true

+ 22 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/bootstrap.yaml

@@ -0,0 +1,22 @@
+server:
+  port: 10000
+spring:
+  application:
+    name: iot-auth
+  profiles:
+    active: local
+  # Servlet 配置
+  servlet:
+    # 文件上传相关配置项
+    multipart:
+      max-file-size: 16MB # 单个文件大小
+      max-request-size: 32MB # 设置总上传的文件大小
+  # Jackson 配置项
+  jackson:
+    serialization:
+      write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳
+      write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+      write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+      fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+

+ 202 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/logback-spring.xml

@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
+                         当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration scan="true" scanPeriod="10 seconds">
+    <contextName>logback</contextName>
+
+    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
+    <property name="log.path" value="logs"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <!--0. 日志格式和颜色渲染 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--1. 输出到控制台-->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!--2. 输出到文档-->
+    <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${log.path}/${LOG_HOME}/debug.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志归档 -->
+            <fileNamePattern>${log.path}/${LOG_HOME}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${log.path}/${LOG_HOME}/info.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 每天日志归档路径以及格式 -->
+            <fileNamePattern>${log.path}/${LOG_HOME}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${log.path}/${LOG_HOME}/warn.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/${LOG_HOME}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${log.path}/${LOG_HOME}/error.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/${LOG_HOME}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录ERROR级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--
+        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
+        以及指定<appender>。<logger>仅有一个name属性,
+        一个可选的level和一个可选的addtivity属性。
+        name:用来指定受此logger约束的某一个包或者具体的某一个类。
+        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+              还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
+              如果未设置此属性,那么当前logger将会继承上级的级别。
+        addtivity:是否向上级logger传递打印信息。默认是true。
+        <logger name="org.springframework.web" level="info"/>
+        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
+    -->
+
+    <!--
+        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
+        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
+        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
+        【logging.level.org.mybatis=debug logging.level.dao=debug】
+     -->
+
+    <!--
+        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
+        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+        不能设置为INHERITED或者同义词NULL。默认是DEBUG
+        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
+    -->
+
+    <!-- 4. 最终的策略 -->
+    <!-- 4.1 开发环境:打印控制台-->
+    <springProfile name="dev">
+        <root level="debug">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="DEBUG_FILE"/>
+            <appender-ref ref="INFO_FILE"/>
+            <appender-ref ref="WARN_FILE"/>
+            <appender-ref ref="ERROR_FILE"/>
+        </root>
+    </springProfile>
+
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+
+    <!-- 4.2 生产环境:输出到文档
+    <springProfile name="pro">
+        <root level="info">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile> -->
+
+</configuration>

+ 24 - 0
iot-module/iot-module-auth/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-module</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-module-auth</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>iot-module-auth-api</module>
+        <module>iot-module-auth-biz</module>
+    </modules>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 23 - 0
iot-module/pom.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.middle.platform</groupId>
+        <artifactId>iot-middle-platform</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>iot-module</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>iot-module-auth</module>
+    </modules>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 86 - 0
pom.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.middle.platform</groupId>
+    <artifactId>iot-middle-platform</artifactId>
+    <version>${revision}</version>
+
+    <packaging>pom</packaging>
+    <description>物联中台</description>
+    <name>${project.artifactId}</name>
+    <properties>
+        <revision>1.0.0</revision>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
+    </properties>
+
+    <modules>
+
+        <module>iot-dependencies</module>
+        <module>iot-framework</module>
+        <module>iot-gateway</module>
+        <module>iot-module</module>
+    </modules>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.middle.platform</groupId>
+                <artifactId>iot-dependencies</artifactId>
+                <version>${revision}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+
+    <build>
+        <plugins>
+            <!-- 统一 revision 版本 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>flatten-maven-plugin</artifactId>
+                <version>${flatten-maven-plugin.version}</version>
+                <configuration>
+                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
+                    <updatePomFile>true</updatePomFile>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>flatten</goal>
+                        </goals>
+                        <id>flatten</id>
+                        <phase>process-resources</phase>
+                    </execution>
+                    <execution>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                        <id>flatten.clean</id>
+                        <phase>clean</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>huaweicloud</id>
+            <name>huawei</name>
+            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
+        </repository>
+        <repository>
+            <id>aliyunmaven</id>
+            <name>aliyun</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+        </repository>
+    </repositories>
+</project>