Kaynağa Gözat

Merge branch 'master' into master-pdy-1219

# Conflicts:
#	iot-module/iot-module-manage/iot-module-manage-biz/pom.xml
sptkw 2 yıl önce
ebeveyn
işleme
f3426041d1
52 değiştirilmiş dosya ile 692 ekleme ve 75 silme
  1. 4 1
      iot-framework/iot-common/src/main/java/com/middle/platform/common/constant/Global.java
  2. 1 0
      iot-framework/iot-starter-biz-dict/pom.xml
  3. 1 3
      iot-framework/iot-starter-mybatis/src/main/java/com/middle/platform/mybatis/core/dataobject/BaseDO.java
  4. 1 0
      iot-framework/iot-starter-redis/src/main/java/com/middle/platform/redis/constant/CacheConstant.java
  5. 20 0
      iot-framework/iot-starter-web/src/main/java/com/middle/platform/web/config/GlobalExceptionHandler.java
  6. 2 1
      iot-gateway/src/main/resources/logback-spring.xml
  7. 2 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/AuthApplication.java
  8. 1 1
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/controller/AuthController.java
  9. 4 0
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/service/AuthService.java
  10. 2 1
      iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/logback-spring.xml
  11. 10 1
      iot-module/iot-module-data/iot-module-data-api/pom.xml
  12. 12 0
      iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/enums/ApiConstants.java
  13. 21 0
      iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/feign/DynamicTopicApi.java
  14. 13 0
      iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/pojo/TopicDto.java
  15. 4 0
      iot-module/iot-module-data/iot-module-data-biz/pom.xml
  16. 2 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/DataApplication.java
  17. 18 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/api/DynamicTopicApiImpl.java
  18. 17 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/constant/TopicConstant.java
  19. 9 4
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/MqttService.java
  20. 50 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/FuncPerEnum.java
  21. 9 1
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/MqttStrategyFactory.java
  22. 38 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/StrategyAnalyze.java
  23. 34 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/impl/DynamicTopic.java
  24. 1 1
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/strategy/AttrReportStrategy.java
  25. 19 0
      iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/strategy/EventReportStrategy.java
  26. 2 1
      iot-module/iot-module-data/iot-module-data-biz/src/main/resources/logback-spring.xml
  27. 4 0
      iot-module/iot-module-manage/iot-module-manage-biz/pom.xml
  28. 2 2
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/config/FeignConfig.java
  29. 3 3
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotProductController.java
  30. 1 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotProductPara.java
  31. 4 5
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotProductService.java
  32. 4 0
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotUrlService.java
  33. 2 2
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/resources/bootstrap.yaml
  34. 2 1
      iot-module/iot-module-manage/iot-module-manage-biz/src/main/resources/logback-spring.xml
  35. 9 6
      iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/enums/DictType.java
  36. 1 1
      iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/feign/DictApi.java
  37. 1 0
      iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/pojo/UserDto.java
  38. 2 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/SystemApplication.java
  39. 8 4
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/controller/MenuController.java
  40. 37 7
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/controller/UserController.java
  41. 14 3
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/mapper/SysUserMenuMapper.java
  42. 1 4
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/req/SysUserPara.java
  43. 50 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/req/SysUserUpdPara.java
  44. 54 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/SysMenuVo.java
  45. 1 4
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/SysUserVo.java
  46. 17 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/UserDetailVo.java
  47. 16 8
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysMenuService.java
  48. 46 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysUserMenuService.java
  49. 94 6
      iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysUserService.java
  50. 1 1
      iot-module/iot-module-system/iot-module-system-biz/src/main/resources/logback-spring.xml
  51. 2 2
      iot-module/iot-module-system/iot-module-system-biz/src/main/resources/mapper/SysUserMapper.xml
  52. 19 0
      iot-module/iot-module-system/iot-module-system-biz/src/main/resources/mapper/SysUserMenuMapper.xml

+ 4 - 1
iot-framework/iot-common/src/main/java/com/middle/platform/common/constant/Global.java

@@ -10,8 +10,11 @@ public interface Global {
 
     /*删除标记*/
     int DEL = 1;//删除
-
     int UN_DEL = 0;//正常
+    //用户启用停用
+    int USE = 1;//启用
+    int UN_USE = 0;//停用
 
     String UN_AUTH = "未登录,请先登录";
+
 }

+ 1 - 0
iot-framework/iot-starter-biz-dict/pom.xml

@@ -33,6 +33,7 @@
         <dependency>
             <groupId>com.middle.platform</groupId>
             <artifactId>iot-module-system-api</artifactId>
+            <scope>provided</scope>
         </dependency>
     </dependencies>
 </project>

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

@@ -39,7 +39,5 @@ public abstract class BaseDO implements Serializable {
     /**
      * 是否删除
      */
-    @TableLogic
-    private Boolean delFlag;
-
+    private Integer delFlag;
 }

+ 1 - 0
iot-framework/iot-starter-redis/src/main/java/com/middle/platform/redis/constant/CacheConstant.java

@@ -8,4 +8,5 @@ public interface CacheConstant {
     String USER_CACHE = "user:%s";
     String DICT_CACHE = "dict:%s";
     String DICT_ITEM_CACHE = "dictItem:%s:%s";
+    String TOPIC_CACHE = "topic:%s";
 }

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

@@ -5,6 +5,8 @@ import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.exception.ResultCode;
 import com.middle.platform.common.utils.Result;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.util.CollectionUtils;
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 全局异常
@@ -66,5 +69,22 @@ public class GlobalExceptionHandler {
         log.error("参数校验异常:{}", errMsg);
         return Result.failed(ResultCode.ERROR, errMsg);
     }
+    @ResponseBody
+    @ExceptionHandler(ConstraintViolationException.class)
+    public Result<Object> constraintViolationExceptionHandler(ConstraintViolationException ex) {
+        Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
+        StringBuilder sb = new StringBuilder();
+        if (!CollectionUtils.isEmpty(constraintViolations)) {
+            boolean first = true;
+            for (ConstraintViolation<?> constraintViolation : constraintViolations) {
+                if (!first) {
+                    sb.append(",");
+                }
+                sb.append(constraintViolation.getMessage());
+                first = false;
+            }
+        }
+        return Result.failed(ResultCode.ERROR, sb.toString());
+    }
 
 }

+ 2 - 1
iot-gateway/src/main/resources/logback-spring.xml

@@ -7,10 +7,11 @@
     <!--关闭logback自身的debug日志打印-->
     <statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
     <contextName>logback</contextName>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
     <property name="log.path" value="logs"/>
-    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name" defaultValue="iot-gateway"/>
     <!--0. 日志格式和颜色渲染 -->
     <!-- 彩色日志依赖的渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

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

@@ -2,8 +2,10 @@ package com.middle.platform.auth.biz;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
+@EnableTransactionManagement
 public class AuthApplication {
 
     public static void main(String[] args) {

+ 1 - 1
iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/controller/AuthController.java

@@ -40,7 +40,7 @@ public class AuthController {
      * @return
      */
     @PostMapping("/resetPass")
-    public Result<Object> resetPass(@RequestParam @NotNull(message = "用户id不能为空") Long id) {
+    public Result<Object> resetPass(@Validated @NotNull(message = "用户id不能为空") Long id) {
         authService.resetPassword(id);
         return Result.ok(true, "重置成功");
     }

+ 4 - 0
iot-module/iot-module-auth/iot-module-auth-biz/src/main/java/com/middle/platform/auth/biz/service/AuthService.java

@@ -2,6 +2,7 @@ package com.middle.platform.auth.biz.service;
 
 import cn.dev33.satoken.stp.StpUtil;
 import com.middle.platform.auth.biz.pojo.LoginPara;
+import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.HashUtil;
 import com.middle.platform.system.api.feign.UserApi;
@@ -34,6 +35,9 @@ public class AuthService {
         if (Objects.isNull(userDto)) {
             throw new BusinessException("账号不存在");
         }
+        if (Objects.equals(userDto.getStatus(), Global.UN_USE)) {
+            throw new BusinessException("账号已停用");
+        }
         if (HashUtil.argon2Match(loginPara.getPassword(), userDto.getPassword())) {
             StpUtil.login(userDto.getId());
             return true;

+ 2 - 1
iot-module/iot-module-auth/iot-module-auth-biz/src/main/resources/logback-spring.xml

@@ -7,10 +7,11 @@
     <!--关闭logback自身的debug日志打印-->
     <statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
     <contextName>logback</contextName>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
     <property name="log.path" value="logs"/>
-    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name" defaultValue="iot-auth"/>
     <!--0. 日志格式和颜色渲染 -->
     <!-- 彩色日志依赖的渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

+ 10 - 1
iot-module/iot-module-data/iot-module-data-api/pom.xml

@@ -17,5 +17,14 @@
         <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-starter-feign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-common</artifactId>
+        </dependency>
+    </dependencies>
 </project>

+ 12 - 0
iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/enums/ApiConstants.java

@@ -0,0 +1,12 @@
+package com.middle.platform.data.api.enums;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-03 10:28:58
+ */
+public class ApiConstants {
+    public static final String NAME = "iot-data";
+
+    public static final String VERSION = "1.0.0";
+
+}

+ 21 - 0
iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/feign/DynamicTopicApi.java

@@ -0,0 +1,21 @@
+package com.middle.platform.data.api.feign;
+
+import com.middle.platform.common.constant.RpcConstants;
+import com.middle.platform.data.api.enums.ApiConstants;
+import com.middle.platform.data.api.pojo.TopicDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-22 13:53:09
+ */
+@FeignClient(name = ApiConstants.NAME, contextId = "dynamicTopicApi")
+public interface DynamicTopicApi {
+    String PREFIX = RpcConstants.RPC_API_PREFIX + "/dynamic-topic";
+
+    @PostMapping(PREFIX + "/saveTopic")
+    Boolean saveTopic(@RequestBody TopicDto topicDto);
+
+}

+ 13 - 0
iot-module/iot-module-data/iot-module-data-api/src/main/java/com/middle/platform/data/api/pojo/TopicDto.java

@@ -0,0 +1,13 @@
+package com.middle.platform.data.api.pojo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-17 16:05:28
+ */
+@Getter
+@Setter
+public class TopicDto {
+}

+ 4 - 0
iot-module/iot-module-data/iot-module-data-biz/pom.xml

@@ -60,6 +60,10 @@
             <groupId>com.middle.platform</groupId>
             <artifactId>iot-starter-mqtt</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-module-data-api</artifactId>
+        </dependency>
 
     </dependencies>
 </project>

+ 2 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/DataApplication.java

@@ -2,12 +2,14 @@ package com.middle.platform.data.biz;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
  * @author xucaiqin
  * @date 2023-12-17 10:47:48
  */
 @SpringBootApplication
+@EnableTransactionManagement
 public class DataApplication {
 
     public static void main(String[] args) {

+ 18 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/api/DynamicTopicApiImpl.java

@@ -0,0 +1,18 @@
+package com.middle.platform.data.biz.api;
+
+import com.middle.platform.data.api.feign.DynamicTopicApi;
+import com.middle.platform.data.biz.service.mqtt.impl.DynamicTopic;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-22 13:55:46
+ */
+@RestController
+@Validated
+@RequiredArgsConstructor
+public class DynamicTopicApiImpl implements DynamicTopicApi {
+    private final DynamicTopic dynamicTopic;
+}

+ 17 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/constant/TopicConstant.java

@@ -0,0 +1,17 @@
+package com.middle.platform.data.biz.constant;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-22 11:44:53
+ */
+public interface TopicConstant {
+    //属性上报-发布
+    String ATTR_PUB = "1-1";
+    //云端响应属性上报-订阅
+    String ATTR_SUB = "1-2";
+    //事件上报
+    String EVENT_PUB = "2-1";
+    //云端响应事件上报-订阅
+    String EVENT_SUB = "2-2";
+
+}

+ 9 - 4
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/MqttService.java

@@ -2,6 +2,7 @@ package com.middle.platform.data.biz.service;
 
 import com.middle.platform.data.biz.config.MqttConfig;
 import com.middle.platform.data.biz.service.mqtt.MqttStrategyFactory;
+import com.middle.platform.data.biz.service.mqtt.MqttTopicStrategy;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
@@ -10,6 +11,8 @@ import org.springframework.messaging.MessageHandler;
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Component;
 
+import java.util.Objects;
+
 @Component
 @Slf4j
 public class MqttService {
@@ -23,10 +26,12 @@ public class MqttService {
             MessageHeaders headers = message.getHeaders();
             Object payload = message.getPayload();
             String topic = (String) headers.get("mqtt_receivedTopic");
-            log.info("topic {}",topic);
-            log.info("payload {}",payload);
-//            MqttTopicStrategy mqttTopicStrategy = mqttStrategyFactory.getByTopic(topic);
-//            mqttTopicStrategy.dealMsg(payload);
+            log.info("topic {}", topic);
+            log.info("payload {}", payload);
+            MqttTopicStrategy mqttTopicStrategy = mqttStrategyFactory.getByTopic(topic);
+            if (Objects.nonNull(mqttTopicStrategy)) {
+                mqttTopicStrategy.dealMsg(payload);
+            }
         };
     }
 }

+ 50 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/FuncPerEnum.java

@@ -0,0 +1,50 @@
+package com.middle.platform.data.biz.service.mqtt;
+
+import com.middle.platform.data.biz.constant.TopicConstant;
+import com.middle.platform.data.biz.service.mqtt.strategy.AttrReportStrategy;
+import com.middle.platform.data.biz.service.mqtt.strategy.EventReportStrategy;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 功能权限 枚举
+ *
+ * @author xucaiqin
+ * @date 2023-12-22 11:37:56
+ */
+@Getter
+@AllArgsConstructor
+public enum FuncPerEnum {
+    ATTR_PUB(TopicConstant.ATTR_PUB, AttrReportStrategy.class.getSimpleName()),
+    EVENT_PUB(TopicConstant.EVENT_PUB, EventReportStrategy.class.getSimpleName()),
+    ;
+    private final String func;
+    private final String name;
+
+    /**
+     * 通过功能权限
+     *
+     * @param func 功能权限
+     *             <p>
+     *             属性上报字典-1
+     *             发布-1
+     *             订阅-2
+     *             发布订阅-3
+     *             如:属性上报-发布 具体为对应的值 1-1
+     *             </p>
+     * @return 策略类字符串
+     */
+    public static String strategy(String func) {
+        for (FuncPerEnum value : FuncPerEnum.values()) {
+            if (StringUtils.equals(value.getFunc(), func)) {
+                String beanName = value.getName();
+                char[] chars = beanName.toCharArray();
+                chars[0] += 32;
+                return String.valueOf(chars);
+            }
+        }
+        return null;
+    }
+
+}

+ 9 - 1
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/MqttStrategyFactory.java

@@ -9,9 +9,17 @@ import java.util.Map;
 public class MqttStrategyFactory {
     @Resource
     private Map<String, MqttTopicStrategy> mqttTopicStrategyMap;
+    @Resource
+    private StrategyAnalyze strategyAnalyze;
 
+    /**
+     * 通过topic名称获取对应解析策略
+     *
+     * @param topic mqtt主题
+     * @return
+     */
     public MqttTopicStrategy getByTopic(String topic) {
-        return mqttTopicStrategyMap.get(topic);
+        return mqttTopicStrategyMap.get(strategyAnalyze.getByTopic(topic));
     }
 
 }

+ 38 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/StrategyAnalyze.java

@@ -0,0 +1,38 @@
+package com.middle.platform.data.biz.service.mqtt;
+
+import com.middle.platform.redis.constant.CacheConstant;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+/**
+ * mqtt-topic解析
+ *
+ * @author xucaiqin
+ * @date 2023-12-22 11:27:55
+ */
+@Component
+public class StrategyAnalyze {
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 设备上报数据,通过topic获取对应的策略类.
+     * redis:<topic,功能权限> 到 <功能权限,策略类>
+     *
+     * @param topic mqtt topic
+     * @return
+     */
+    public String getByTopic(String topic) {
+        //1.topic查找对应的功能权限
+        String func = (String) redisTemplate.opsForValue().get(String.format(CacheConstant.TOPIC_CACHE, topic));
+        if (StringUtils.isNotBlank(func)) {
+            //2.功能权限到策略类
+            return FuncPerEnum.strategy(func);
+        }
+        return "";
+    }
+
+
+}

+ 34 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/impl/DynamicTopic.java

@@ -0,0 +1,34 @@
+package com.middle.platform.data.biz.service.mqtt.impl;
+
+import jakarta.annotation.Resource;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-22 13:52:20
+ */
+@Component
+public class DynamicTopic {
+    @Resource
+    private MqttPahoMessageDrivenChannelAdapter mqttPahoMessageDrivenChannelAdapter;
+
+    /**
+     * 云端动态订阅topic
+     *
+     * @param topic 订阅的topic
+     * @param qos   服务质量
+     */
+    public void addTopic(String topic, int qos) {
+        mqttPahoMessageDrivenChannelAdapter.addTopic(topic, qos);
+    }
+
+    /**
+     * 云端动态取消订阅topic
+     *
+     * @param topic 需要取消的topic
+     */
+    public void removeTopic(String topic) {
+        mqttPahoMessageDrivenChannelAdapter.removeTopic(topic);
+    }
+}

+ 1 - 1
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/impl/AttrReportStrategy.java → iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/strategy/AttrReportStrategy.java

@@ -1,4 +1,4 @@
-package com.middle.platform.data.biz.service.mqtt.impl;
+package com.middle.platform.data.biz.service.mqtt.strategy;
 
 import com.middle.platform.data.biz.service.mqtt.MqttTopicStrategy;
 import lombok.extern.slf4j.Slf4j;

+ 19 - 0
iot-module/iot-module-data/iot-module-data-biz/src/main/java/com/middle/platform/data/biz/service/mqtt/strategy/EventReportStrategy.java

@@ -0,0 +1,19 @@
+package com.middle.platform.data.biz.service.mqtt.strategy;
+
+import com.middle.platform.data.biz.service.mqtt.MqttTopicStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 事件上报
+ */
+@Service
+@Slf4j
+public class EventReportStrategy implements MqttTopicStrategy {
+
+    @Override
+    public void dealMsg(Object msg) {
+        log.debug("属性上报数据:{}", msg);
+
+    }
+}

+ 2 - 1
iot-module/iot-module-data/iot-module-data-biz/src/main/resources/logback-spring.xml

@@ -7,10 +7,11 @@
     <!--关闭logback自身的debug日志打印-->
     <statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
     <contextName>logback</contextName>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
     <property name="log.path" value="logs"/>
-    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name" defaultValue="iot-data"/>
     <!--0. 日志格式和颜色渲染 -->
     <!-- 彩色日志依赖的渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

+ 4 - 0
iot-module/iot-module-manage/iot-module-manage-biz/pom.xml

@@ -66,6 +66,10 @@
             <groupId>com.middle.platform</groupId>
             <artifactId>iot-module-system-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.middle.platform</groupId>
+            <artifactId>iot-module-data-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.middle.platform</groupId>
             <artifactId>iot-module-manage-api</artifactId>

+ 2 - 2
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/config/FeignConfig.java

@@ -1,6 +1,6 @@
 package com.middle.platform.manage.biz.config;
 
-import com.middle.platform.system.api.feign.DictApi;
+import com.middle.platform.data.api.feign.DynamicTopicApi;
 import com.middle.platform.system.api.feign.UserApi;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Configuration;
@@ -12,6 +12,6 @@ import org.springframework.context.annotation.Configuration;
  * @date 2023-12-19 11:00:25
  */
 @Configuration
-@EnableFeignClients(clients = {UserApi.class, DictApi.class})
+@EnableFeignClients(clients = {UserApi.class, DynamicTopicApi.class})
 public class FeignConfig {
 }

+ 3 - 3
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotProductController.java

@@ -137,7 +137,7 @@ public class IotProductController {
     @GetMapping("/getUrl")
     public Result<Object> getUrl(@RequestParam("productId") @NotBlank(message = "id不能为空") Long productId,
                                  @RequestParam("type") @NotNull(message = "类型不能为空") Integer type) {
-        return Result.ok(iotUrlService.getUrl(productId,type), "查询成功");
+        return Result.ok(iotUrlService.getUrl(productId, type), "查询成功");
     }
 
     /**
@@ -146,8 +146,8 @@ public class IotProductController {
      * @param iotUrlPara
      * @return
      */
-    @PostMapping("/urlConfig")
-    public Result<Object> urlConfig(@RequestBody @Valid IotUrlPara iotUrlPara) {
+    @PostMapping("/save")
+    public Result<Object> save(@RequestBody @Valid IotUrlPara iotUrlPara) {
         return Result.ok(iotUrlService.saveUrl(iotUrlPara), "保存成功");
     }
 

+ 1 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotProductPara.java

@@ -26,7 +26,7 @@ public class IotProductPara {
     private Integer nodeType;
 
     /**
-     * 联网类型
+     * 联网类型 network_type
      */
     @NotNull(message = "联网类型不能为空")
     private Integer networkType;

+ 4 - 5
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotProductService.java

@@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.PageRes;
+import com.middle.platform.data.api.feign.DynamicTopicApi;
 import com.middle.platform.manage.biz.domain.req.IotProductPara;
 import com.middle.platform.manage.biz.domain.req.ProductPage;
 import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
@@ -16,7 +17,6 @@ import com.middle.platform.manage.biz.mapper.IotProductMapper;
 import com.middle.platform.system.api.enums.DictType;
 import com.middle.platform.system.api.feign.DictApi;
 import com.middle.platform.system.api.feign.UserApi;
-import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -38,10 +38,8 @@ public class IotProductService {
     private final IotModService iotModService;
     private final IotCloudService iotCloudService;
 
-    @Resource
-    private UserApi userApi;
-    @Resource
-    private  DictApi dictApi;
+    private final UserApi userApi;
+    private final DictApi dictApi;
 
     /**
      * 分页查询产品数据
@@ -73,6 +71,7 @@ public class IotProductService {
      * @param iotProductPara
      * @return
      */
+    @Transactional(rollbackFor = Exception.class)
     public Object save(IotProductPara iotProductPara) {
         IotProduct iotProduct = new IotProduct();
         iotProduct.setCode(IdUtil.nanoId(12));

+ 4 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotUrlService.java

@@ -3,6 +3,7 @@ package com.middle.platform.manage.biz.service;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
+import com.middle.platform.data.api.feign.DynamicTopicApi;
 import com.middle.platform.manage.biz.constant.UrlCategory;
 import com.middle.platform.manage.biz.constant.UrlInit;
 import com.middle.platform.manage.biz.constant.UrlProtocol;
@@ -23,6 +24,7 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class IotUrlService {
     private final IotUrlMapper iotUrlMapper;
+    private final DynamicTopicApi dynamicTopicApi;
 
     /**
      * 新增topic
@@ -43,6 +45,8 @@ public class IotUrlService {
         iotUrl.setType(iotUrlPara.getType());
         iotUrl.setRemark(iotUrlPara.getRemark());
         iotUrlMapper.insert(iotUrl);
+        //新增订阅的topic
+//        dynamicTopicApi
         return true;
     }
 

+ 2 - 2
iot-module/iot-module-manage/iot-module-manage-biz/src/main/resources/bootstrap.yaml

@@ -18,7 +18,7 @@ spring:
       write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
       write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
       fail-on-empty-beans: false # 允许序列化无属性的 Bean
-  main:
-    allow-bean-definition-overriding: true
+#  main:
+#    allow-bean-definition-overriding: true
 
 

+ 2 - 1
iot-module/iot-module-manage/iot-module-manage-biz/src/main/resources/logback-spring.xml

@@ -7,10 +7,11 @@
     <!--关闭logback自身的debug日志打印-->
     <statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
     <contextName>logback</contextName>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
     <property name="log.path" value="logs"/>
-    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name" defaultValue="iot-manage"/>
     <!--0. 日志格式和颜色渲染 -->
     <!-- 彩色日志依赖的渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

+ 9 - 6
iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/enums/DictType.java

@@ -5,10 +5,13 @@ package com.middle.platform.system.api.enums;
  * @date 2023-12-21 11:26:25
  */
 public interface DictType {
-    String NODE_TYPE = "nodeType";
-    String NETWORK_TYPE = "networkType";
-    String REPORT_PROTOCOL_TYPE = "reportProtocolType";
-    String VENDORS_TYPE = "vendorsType";
-    String DATA_FORMAT_TYPE = "dataFormatType";
-    String AUTH_TYPE = "authType";
+    String NODE_TYPE = "node_type";
+    String NETWORK_TYPE = "network_type";
+    String REPORT_PROTOCOL_TYPE = "reportProtocol_type";
+    String VENDORS_TYPE = "vendors_type";
+    String DATA_FORMAT_TYPE = "data_tormat_type";
+    String AUTH_TYPE = "auth_type";//认证类型
+    String SEX_TYPE = "sex_type";//性别
+    String MENU_TYPE = "menu_type";//菜单类别
+
 }

+ 1 - 1
iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/feign/DictApi.java

@@ -17,7 +17,7 @@ import java.util.List;
  */
 @FeignClient(name = ApiConstants.NAME, contextId = "dictApi")
 public interface DictApi {
-    String PREFIX = RpcConstants.RPC_API_PREFIX + "/dict-data";
+    String PREFIX = RpcConstants.RPC_API_PREFIX + "/dict";
 
     @GetMapping(PREFIX + "/getLabel")
     Result<DictDto> getDictData(@RequestParam("dictType") String dictType,

+ 1 - 0
iot-module/iot-module-system/iot-module-system-api/src/main/java/com/middle/platform/system/api/pojo/UserDto.java

@@ -18,4 +18,5 @@ public class UserDto implements Serializable {
     private Long id;
     private String username;
     private String password;
+    private Integer status;
 }

+ 2 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/SystemApplication.java

@@ -2,12 +2,14 @@ package com.middle.platform.system.biz;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
  * @author xucaiqin
  * @date 2023-12-17 10:51:37
  */
 @SpringBootApplication
+@EnableTransactionManagement
 public class SystemApplication {
     public static void main(String[] args) {
         // 启动 Spring Boot 应用

+ 8 - 4
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/controller/MenuController.java

@@ -1,7 +1,7 @@
 package com.middle.platform.system.biz.controller;
 
 import com.middle.platform.common.utils.Result;
-import com.middle.platform.system.biz.entity.SysUser;
+import com.middle.platform.system.biz.entity.SysMenu;
 import com.middle.platform.system.biz.service.SysMenuService;
 import jakarta.annotation.Resource;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -21,9 +21,13 @@ public class MenuController {
     @Resource
     private SysMenuService sysMenuService;
 
-
+    /**
+     * 菜单列表
+     *
+     * @return
+     */
     @PostMapping("/list")
-    public Result<List<SysUser>> list() {
-        return Result.ok();
+    public Result<List<SysMenu>> list() {
+        return Result.ok(sysMenuService.list());
     }
 }

+ 37 - 7
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/controller/UserController.java

@@ -4,14 +4,14 @@ import com.middle.platform.common.utils.PageRes;
 import com.middle.platform.common.utils.Result;
 import com.middle.platform.system.biz.pojo.req.SysUserPagePara;
 import com.middle.platform.system.biz.pojo.req.SysUserPara;
+import com.middle.platform.system.biz.pojo.req.SysUserUpdPara;
 import com.middle.platform.system.biz.pojo.res.SysUserVo;
 import com.middle.platform.system.biz.service.SysUserService;
 import jakarta.annotation.Resource;
+import jakarta.validation.constraints.NotNull;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * @author xucaiqin
  * @date 2023-12-15 08:46:49
@@ -33,7 +33,7 @@ public class UserController {
      */
     @PostMapping("/save")
     public Result<Object> save(@RequestBody @Validated SysUserPara sysUserPara) {
-        return Result.ok(sysUserService.save(sysUserPara));
+        return Result.ok(sysUserService.save(sysUserPara), "保存成功");
     }
 
     /**
@@ -42,11 +42,41 @@ public class UserController {
      * @param basePara
      * @return
      */
-    @GetMapping("/list")
-    public Result<PageRes<SysUserVo>> list(SysUserPagePara basePara) {
-        List<SysUserVo> list = sysUserService.pageQuery(basePara);
-        return Result.ok(new PageRes<>(list));
+    @PostMapping("/list")
+    public Result<PageRes<SysUserVo>> list(@RequestBody SysUserPagePara basePara) {
+        return Result.ok(sysUserService.pageQuery(basePara), "查询成功");
     }
 
+    /**
+     * 用户详情
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/detail")
+    public Result<Object> detail(@Validated @NotNull(message = "用户id不能为空") Long id) {
+        return Result.ok(sysUserService.detail(id), "查询成功");
+    }
 
+    /**
+     * 删除用户
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping("/remove/{id}")
+    public Result<Object> list(@Validated @PathVariable("id") @NotNull(message = "用户id不能为空") Long id) {
+        return Result.ok(sysUserService.remove(id), "删除成功");
+    }
+
+    /**
+     * 修改用户
+     *
+     * @param sysUserUpdPara
+     * @return
+     */
+    @PostMapping("/update")
+    public Result<Object> update(@RequestBody @Validated SysUserUpdPara sysUserUpdPara) {
+        return Result.ok(sysUserService.update(sysUserUpdPara), "修改成功");
+    }
 }

+ 14 - 3
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/mapper/SysUserMenuMapper.java

@@ -2,12 +2,23 @@ package com.middle.platform.system.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.middle.platform.system.biz.entity.SysUserMenu;
+import com.middle.platform.system.biz.pojo.res.SysMenuVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
-* @date 2023-12-18 15:17:33
-* @author xucaiqin
-*/
+ * @author xucaiqin
+ * @date 2023-12-18 15:17:33
+ */
 @Mapper
 public interface SysUserMenuMapper extends BaseMapper<SysUserMenu> {
+    /**
+     * 根据用户id查询关联的菜单详情
+     *
+     * @param id 用户id
+     * @return
+     */
+    List<SysMenuVo> queryUserMenu(@Param("id") Long id);
 }

+ 1 - 4
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/req/SysUserPara.java

@@ -1,7 +1,6 @@
 package com.middle.platform.system.biz.pojo.req;
 
 import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
@@ -17,6 +16,7 @@ import java.util.List;
 @Getter
 @Setter
 public class SysUserPara {
+    private Long id;
     /**
      * 姓名
      */
@@ -50,13 +50,10 @@ public class SysUserPara {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空")
     private String remark;
     /**
      * 权限
      */
-    @NotEmpty(message = "权限不能为空")
-    @NotNull(message = "权限不能为空")
     private List<Long> menu;
 
 }

+ 50 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/req/SysUserUpdPara.java

@@ -0,0 +1,50 @@
+package com.middle.platform.system.biz.pojo.req;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 修改用户
+ *
+ * @author xucaiqin
+ * @date 2023-12-18 14:44:40
+ */
+@Getter
+@Setter
+public class SysUserUpdPara {
+    @NotNull(message = "id不能为空")
+    private Long id;
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 性别0未知1男2女
+     */
+    private Integer sex;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 登录密码
+     */
+    private String password;
+
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 权限
+     */
+    private List<Long> menu;
+
+}

+ 54 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/SysMenuVo.java

@@ -0,0 +1,54 @@
+package com.middle.platform.system.biz.pojo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 菜单权限表
+* @date 2023-12-18 15:17:33
+* @author xucaiqin
+*/
+@Getter
+@Setter
+public class SysMenuVo  {
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 父菜单ID
+     */
+    private Long pid;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    private String code;
+
+    /**
+     * 权限标识
+     */
+    private String permission;
+
+    /**
+     * 菜单类型 1-菜单 2-功能 menu_type
+     */
+    private Integer type;
+    private String typeLabel;
+
+    /**
+     * 显示顺序
+     */
+    private Integer sort;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 1 - 4
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/SysUserVo.java

@@ -21,6 +21,7 @@ public class SysUserVo {
      * 性别0未知1男2女
      */
     private Integer sex;
+    private String sexLabel;
 
     /**
      * 联系电话
@@ -32,10 +33,6 @@ public class SysUserVo {
      */
     private String username;
 
-    /**
-     * 登录密码
-     */
-    private String password;
 
     /**
      * 启用状态 1-启用 0-停用

+ 17 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/pojo/res/UserDetailVo.java

@@ -0,0 +1,17 @@
+package com.middle.platform.system.biz.pojo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author xucaiqin
+ * @date 2023-12-22 10:20:02
+ */
+@Getter
+@Setter
+public class UserDetailVo {
+    private SysUserVo sysUserVo;
+    private List<SysMenuVo> menuList;
+}

+ 16 - 8
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysMenuService.java

@@ -1,16 +1,24 @@
 package com.middle.platform.system.biz.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.middle.platform.common.constant.Global;
+import com.middle.platform.system.biz.entity.SysMenu;
+import com.middle.platform.system.biz.mapper.SysMenuMapper;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
-import jakarta.annotation.Resource;
+
 import java.util.List;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.middle.platform.system.biz.mapper.SysMenuMapper;
-import com.middle.platform.system.biz.entity.SysMenu;
+
 /**
-* @date 2023-12-18 15:17:33
-* @author xucaiqin
-*/
+ * @author xucaiqin
+ * @date 2023-12-18 15:17:33
+ */
 @Service
-public class SysMenuService extends ServiceImpl<SysMenuMapper, SysMenu> {
+@RequiredArgsConstructor
+public class SysMenuService {
+    private final SysMenuMapper sysMenuMapper;
 
+    public List<SysMenu> list() {
+        return sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getDelFlag, Global.UN_DEL));
+    }
 }

+ 46 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysUserMenuService.java

@@ -1,11 +1,20 @@
 package com.middle.platform.system.biz.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.middle.platform.common.constant.Global;
+import com.middle.platform.system.api.enums.DictType;
+import com.middle.platform.system.api.feign.DictApi;
 import com.middle.platform.system.biz.entity.SysUserMenu;
 import com.middle.platform.system.biz.mapper.SysUserMenuMapper;
+import com.middle.platform.system.biz.pojo.res.SysMenuVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author xucaiqin
@@ -15,6 +24,7 @@ import java.util.List;
 @RequiredArgsConstructor
 public class SysUserMenuService {
     private final SysUserMenuMapper sysUserMenuMapper;
+    private final DictApi dictApi;
 
     /**
      * 保存用户关联的菜单权限
@@ -31,4 +41,40 @@ public class SysUserMenuService {
             sysUserMenuMapper.insert(sysUserMenu);
         }
     }
+
+    /**
+     * 删除用户关联的菜单
+     *
+     * @param userId
+     */
+    public void removeMenu(Long userId) {
+        SysUserMenu sysUserMenu = new SysUserMenu();
+        sysUserMenu.setDeleteTime(LocalDateTime.now());
+        sysUserMenu.setDelFlag(Global.DEL);
+        sysUserMenuMapper.update(sysUserMenu, new LambdaQueryWrapper<SysUserMenu>().eq(SysUserMenu::getUserId, userId).eq(SysUserMenu::getDelFlag, Global.UN_DEL));
+    }
+
+    /**
+     * 查询用户关联菜单
+     *
+     * @param id 用户id
+     */
+    public List<SysUserMenu> query(Long id) {
+        return sysUserMenuMapper.selectList(new LambdaQueryWrapper<SysUserMenu>().eq(SysUserMenu::getUserId, id).eq(SysUserMenu::getDelFlag, Global.UN_DEL));
+    }
+
+    /**
+     * 查询用户关联的菜单
+     *
+     * @param id 用户id
+     * @return
+     */
+    public List<SysMenuVo> queryUserMenu(Long id) {
+        List<SysMenuVo> sysMenuVos = sysUserMenuMapper.queryUserMenu(id);
+        if (CollectionUtils.isEmpty(sysMenuVos)) {
+            return new ArrayList<>();
+        }
+        sysMenuVos.forEach(a -> Optional.ofNullable(dictApi.query(DictType.MENU_TYPE, String.valueOf(a.getType()))).ifPresent(m -> a.setTypeLabel(m.getLabel())));
+        return sysMenuVos;
+    }
 }

+ 94 - 6
iot-module/iot-module-system/iot-module-system-biz/src/main/java/com/middle/platform/system/biz/service/SysUserService.java

@@ -2,21 +2,33 @@ package com.middle.platform.system.biz.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.HashUtil;
+import com.middle.platform.common.utils.PageRes;
+import com.middle.platform.system.api.enums.DictType;
+import com.middle.platform.system.api.feign.DictApi;
+import com.middle.platform.system.api.pojo.SysUserFlag;
 import com.middle.platform.system.api.pojo.UserCache;
 import com.middle.platform.system.api.pojo.UserDto;
 import com.middle.platform.system.biz.entity.SysUser;
 import com.middle.platform.system.biz.mapper.SysUserMapper;
-import com.middle.platform.system.api.pojo.SysUserFlag;
 import com.middle.platform.system.biz.pojo.req.SysUserPagePara;
 import com.middle.platform.system.biz.pojo.req.SysUserPara;
+import com.middle.platform.system.biz.pojo.req.SysUserUpdPara;
+import com.middle.platform.system.biz.pojo.res.SysMenuVo;
 import com.middle.platform.system.biz.pojo.res.SysUserVo;
+import com.middle.platform.system.biz.pojo.res.UserDetailVo;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -31,6 +43,7 @@ public class SysUserService {
 
     private final SysUserMapper sysUserMapper;
     private final SysUserMenuService sysUserMenuService;
+    private final DictApi dictApi;
     @Value("${defaultPass:KW123!@}")
     private String defaultPass;
 
@@ -43,12 +56,14 @@ public class SysUserService {
         sysUser.setPhone(sysUserPara.getPhone());
         sysUser.setUsername(sysUserPara.getUsername());
         sysUser.setPassword(Optional.ofNullable(sysUserPara.getPassword()).map(HashUtil::argon2).orElseGet(() -> HashUtil.argon2(defaultPass)));
-        sysUser.setStatus(0);
+        sysUser.setStatus(Global.USE);
         sysUser.setRemark(sysUserPara.getRemark());
         sysUserMapper.insert(sysUser);
         //用户id主键
         Long id = sysUser.getId();
-        sysUserMenuService.save(id, sysUserPara.getMenu());
+        if (!CollectionUtils.isEmpty(sysUserPara.getMenu())) {
+            sysUserMenuService.save(id, sysUserPara.getMenu());
+        }
         return true;
     }
 
@@ -58,9 +73,14 @@ public class SysUserService {
      * @param basePara
      * @return 用户列表
      */
-    public List<SysUserVo> pageQuery(SysUserPagePara basePara) {
+    public PageRes<SysUserVo> pageQuery(SysUserPagePara basePara) {
         PageHelper.startPage(basePara.getPage(), basePara.getPageSize());
-        return sysUserMapper.pageList(basePara);
+        List<SysUserVo> sysUserVos = sysUserMapper.pageList(basePara);
+        PageInfo<SysUserVo> pageInfo = new PageInfo<>(sysUserVos);
+        sysUserVos.forEach(u -> Optional.ofNullable(dictApi.query(DictType.SEX_TYPE, String.valueOf(u.getSex()))).ifPresent(d -> {
+            u.setSexLabel(d.getLabel());
+        }));
+        return new PageRes<>(pageInfo, sysUserVos);
     }
 
     /**
@@ -112,7 +132,7 @@ public class SysUserService {
      * @return
      */
     private void checkUser(String username) {
-        SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username).last("limit 1"));
+        SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username).eq(SysUser::getDelFlag, Global.UN_DEL).last("limit 1"));
         if (Objects.nonNull(sysUser)) {
             throw new BusinessException("账号已存在");
         }
@@ -129,6 +149,8 @@ public class SysUserService {
         if (Objects.isNull(sysUser)) {
             throw new BusinessException("用户不存在");
         }
+        sysUser.setUpdateBy(null);
+        sysUser.setUpdateTime(null);
         return sysUser;
     }
 
@@ -141,4 +163,70 @@ public class SysUserService {
         sysUser.setPassword(HashUtil.argon2(defaultPass));
         sysUserMapper.updateById(sysUser);
     }
+
+    /**
+     * 删除用户
+     *
+     * @param id
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Object remove(Long id) {
+        //删除用户
+        SysUser sysUser = new SysUser();
+        sysUser.setDeleteTime(LocalDateTime.now());
+        sysUser.setDelFlag(Global.DEL);
+        sysUserMapper.update(sysUser, new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, id).eq(SysUser::getDelFlag, Global.UN_DEL));
+        //删除用户关联菜单
+        sysUserMenuService.removeMenu(id);
+        return true;
+    }
+
+    /**
+     * 修改用户
+     *
+     * @param sysUserPara
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Object update(SysUserUpdPara sysUserPara) {
+        SysUser sysUser = checkUser(sysUserPara.getId());
+        sysUser.setName(sysUserPara.getName());
+        sysUser.setSex(sysUserPara.getSex());
+        sysUser.setPhone(sysUserPara.getPhone());
+        if (StringUtils.isNotBlank(sysUserPara.getPassword())) {
+            sysUser.setPassword(Optional.of(sysUserPara.getPassword()).map(HashUtil::argon2).orElseGet(() -> HashUtil.argon2(defaultPass)));
+        }
+        sysUser.setRemark(sysUserPara.getRemark());
+        sysUserMapper.updateById(sysUser);
+        //先删除,再新增
+        sysUserMenuService.removeMenu(sysUser.getId());
+        if (!CollectionUtils.isEmpty(sysUserPara.getMenu())) {
+            sysUserMenuService.save(sysUser.getId(), sysUserPara.getMenu());
+        }
+        return true;
+    }
+
+    /**
+     * 查询详情
+     *
+     * @param id 用户id
+     * @return
+     */
+    public Object detail(Long id) {
+        SysUser sysUser = sysUserMapper.selectById(id);
+        if (Objects.isNull(sysUser)) {
+            throw new BusinessException("用户不存在");
+        }
+        SysUserVo sysUserVo = new SysUserVo();
+        BeanUtils.copyProperties(sysUser, sysUserVo);
+        Optional.ofNullable(dictApi.query(DictType.SEX_TYPE, String.valueOf(sysUserVo.getSex()))).ifPresent(d -> sysUserVo.setSexLabel(d.getLabel()));
+        UserDetailVo userDetailVo = new UserDetailVo();
+        userDetailVo.setSysUserVo(sysUserVo);
+
+        //查询用户菜单
+        List<SysMenuVo> query = sysUserMenuService.queryUserMenu(id);
+        userDetailVo.setMenuList(query);
+        return userDetailVo;
+    }
 }

+ 1 - 1
iot-module/iot-module-system/iot-module-system-biz/src/main/resources/logback-spring.xml

@@ -10,7 +10,7 @@
     <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
     <property name="log.path" value="logs"/>
-    <springProperty scope="context" name="LOG_HOME" source="spring.application.name"/>
+    <springProperty scope="context" name="LOG_HOME" source="spring.application.name" defaultValue="iot-system"/>
     <!--0. 日志格式和颜色渲染 -->
     <!-- 彩色日志依赖的渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

+ 2 - 2
iot-module/iot-module-system/iot-module-system-biz/src/main/resources/mapper/SysUserMapper.xml

@@ -28,16 +28,16 @@
   <select id="pageList" resultType="com.middle.platform.system.biz.pojo.res.SysUserVo">
       select *
       from sys_user su
-
       <where>
           <if test="name != null and name != ''">
               and su.name like concat('%', #{name,jdbcType=VARCHAR}, '%')
           </if>
+          and su.del_flag = 0
       </where>
   </select>
 
   <select id="queryOne" resultType="com.middle.platform.system.api.pojo.UserDto">
-      select su.id, su.username, su.password
+      select su.id, su.username, su.password, su.status
       from sys_user su
       <where>
           <if test="username != null and username != ''">

+ 19 - 0
iot-module/iot-module-system/iot-module-system-biz/src/main/resources/mapper/SysUserMenuMapper.xml

@@ -19,4 +19,23 @@
     id, user_id, menu_id, create_by, create_time, update_by, update_time, delete_time,
     del_flag
   </sql>
+
+  <select id="queryUserMenu" resultType="com.middle.platform.system.biz.pojo.res.SysMenuVo">
+      select sm.id,
+             sm.pid,
+             sm.name,
+             sm.code,
+             sm.permission,
+             sm.type,
+             sm.sort,
+             sm.sort
+      from sys_user_menu sum
+               left join sys_menu sm on sum.menu_id = sm.id and sm.del_flag = 0
+      <where>
+          <if test="id != null">
+              and sum.user_id = #{id,jdbcType=BIGINT}
+          </if>
+          and sum.del_flag = 0
+      </where>
+  </select>
 </mapper>