浏览代码

【代码优化】IoT: 物模型参数校验

puhui999 7 月之前
父节点
当前提交
d155876f09

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/IotThingModelController.http

@@ -174,7 +174,7 @@ GET {{baseUrl}}/iot/product-thing-model/get?id=67
 tenant-id: {{adminTenentId}}
 tenant-id: {{adminTenentId}}
 Authorization: Bearer {{token}}
 Authorization: Bearer {{token}}
 
 
-### 请求 /iot/product-thing-model/tsl-by-product-id 接口 => 成功
-GET {{baseUrl}}/iot/product-thing-model/tsl-by-product-id?productId=1001
+### 请求 /iot/product-thing-model/get-tsl 接口 => 成功
+GET {{baseUrl}}/iot/product-thing-model/get-tsl?productId=1001
 tenant-id: {{adminTenentId}}
 tenant-id: {{adminTenentId}}
 Authorization: Bearer {{token}}
 Authorization: Bearer {{token}}

+ 9 - 6
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelArrayDataSpecs.java

@@ -1,6 +1,10 @@
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
@@ -16,18 +20,17 @@ import java.util.List;
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs {
 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs {
 
 
-    /**
-     * 数组中的元素个数
-     */
+    @NotNull(message = "数组元素个数不能为空")
     private Integer size;
     private Integer size;
-    /**
-     * 数组中的元素的数据类型。可选值:struct、int、float、double 或 text
-     */
+
+    @NotEmpty(message = "数组元素的数据类型不能为空")
+    @Pattern(regexp = "^(struct|int|float|double|text)$", message = "数组元素的数据类型必须为:struct、int、float、double 或 text")
     private String childDataType;
     private String childDataType;
     /**
     /**
      * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中
      * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中
      * 此时 struct 取值范围为:int、float、double、text、date、enum、bool
      * 此时 struct 取值范围为:int、float、double、text、date、enum、bool
      */
      */
+    @Valid
     private List<ThingModelDataSpecs> dataSpecsList;
     private List<ThingModelDataSpecs> dataSpecsList;
 
 
 }
 }

+ 8 - 9
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelBoolOrEnumDataSpecs.java

@@ -1,6 +1,9 @@
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
@@ -16,16 +19,12 @@ import lombok.EqualsAndHashCode;
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs {
 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs {
 
 
-    // TODO @puhui999:要不写下参数校验?这样,注释可以简洁一点
-    /**
-     * 枚举项的名称。
-     * 可包含中文、大小写英文字母、数字、下划线(_)和短划线(-)
-     * 必须以中文、英文字母或数字开头,长度不超过 20 个字符
-     */
+    @NotEmpty(message = "枚举项的名称不能为空")
+    @Pattern(regexp = "^[\\u4e00-\\u9fa5a-zA-Z0-9][\\u4e00-\\u9fa5a-zA-Z0-9_-]{0,19}$",
+            message = "枚举项的名称只能包含中文、大小写英文字母、数字、下划线和短划线,必须以中文、英文字母或数字开头,长度不超过 20 个字符")
     private String name;
     private String name;
-    /**
-     * 枚举值。
-     */
+
+    @NotNull(message = "枚举值不能为空")
     private Integer value;
     private Integer value;
 
 
 }
 }

+ 2 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDateOrTextDataSpecs.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import jakarta.validation.constraints.Max;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
@@ -20,6 +21,7 @@ public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs {
      * 数据长度,单位为字节。取值不能超过 2048。
      * 数据长度,单位为字节。取值不能超过 2048。
      * 当 dataType 为 text 时,需传入该参数。
      * 当 dataType 为 text 时,需传入该参数。
      */
      */
+    @Max(value = 2048, message = "数据长度不能超过 2048")
     private Integer length;
     private Integer length;
     /**
     /**
      * 默认值,可选参数,用于存储默认值。
      * 默认值,可选参数,用于存储默认值。

+ 8 - 3
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelNumericDataSpec.java

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Pattern;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
@@ -18,18 +20,21 @@ public class ThingModelNumericDataSpec extends ThingModelDataSpecs {
 
 
     /**
     /**
      * 最大值,需转为字符串类型。值必须与 dataType 类型一致。
      * 最大值,需转为字符串类型。值必须与 dataType 类型一致。
-     * 例如,当 dataType 为 int 时,取值为 "200",而不是 200。
      */
      */
+    @NotEmpty(message = "最大值不能为空")
+    @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最大值必须为数值类型")
     private String max;
     private String max;
     /**
     /**
      * 最小值,需转为字符串类型。值必须与 dataType 类型一致。
      * 最小值,需转为字符串类型。值必须与 dataType 类型一致。
-     * 例如,当 dataType 为 int 时,取值为 "0",而不是 0。
      */
      */
+    @NotEmpty(message = "最小值不能为空")
+    @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最小值必须为数值类型")
     private String min;
     private String min;
     /**
     /**
      * 步长,需转为字符串类型。值必须与 dataType 类型一致。
      * 步长,需转为字符串类型。值必须与 dataType 类型一致。
-     * 例如,当 dataType 为 int 时,取值为 "10",而不是 10。
      */
      */
+    @NotEmpty(message = "步长不能为空")
+    @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "步长必须为数值类型")
     private String step;
     private String step;
     /**
     /**
      * 精度。当 dataType 为 float 或 double 时可选传入。
      * 精度。当 dataType 为 float 或 double 时可选传入。

+ 19 - 14
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelStructDataSpecs.java

@@ -1,7 +1,11 @@
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
 
 
+import cn.iocoder.yudao.framework.common.validation.InEnum;
 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum;
 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Pattern;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
@@ -17,35 +21,36 @@ import java.util.List;
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
 public class ThingModelStructDataSpecs extends ThingModelDataSpecs {
 public class ThingModelStructDataSpecs extends ThingModelDataSpecs {
 
 
-    /**
-     * 属性标识符
-     */
+    @NotEmpty(message = "属性标识符不能为空")
+    @Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9_]{0,31}$", message = "属性标识符只能由字母、数字和下划线组成,必须以字母开头,长度不超过 32 个字符")
     private String identifier;
     private String identifier;
-    /**
-     * 属性名称
-     */
+
+    @NotEmpty(message = "属性名称不能为空")
     private String name;
     private String name;
-    /**
-     * 云端可以对该属性进行的操作类型
-     *
-     * 枚举 {@link IotThingModelAccessModeEnum}
-     */
+
+    @NotEmpty(message = "操作类型不能为空")
+    @InEnum(IotThingModelAccessModeEnum.class)
     private String accessMode;
     private String accessMode;
+
     /**
     /**
      * 是否是标准品类的必选服务
      * 是否是标准品类的必选服务
      */
      */
     private Boolean required;
     private Boolean required;
-    /**
-     * struct 数据的数据类型
-     */
+
+    @NotEmpty(message = "数据类型不能为空")
+    @Pattern(regexp = "^(int|float|double|text|date|enum|bool)$", message = "数据类型必须为:int、float、double、text、date、enum、bool")
     private String childDataType;
     private String childDataType;
+
     /**
     /**
      * 数据类型(dataType)为非列表型(int、float、double、text、date、array)的数据规范存储在 dataSpecs 中
      * 数据类型(dataType)为非列表型(int、float、double、text、date、array)的数据规范存储在 dataSpecs 中
      */
      */
+    @Valid
     private ThingModelDataSpecs dataSpecs;
     private ThingModelDataSpecs dataSpecs;
+
     /**
     /**
      * 数据类型(dataType)为列表型(enum、bool、struct)的数据规范存储在 dataSpecsList 中
      * 数据类型(dataType)为列表型(enum、bool、struct)的数据规范存储在 dataSpecsList 中
      */
      */
+    @Valid
     private List<ThingModelDataSpecs> dataSpecsList;
     private List<ThingModelDataSpecs> dataSpecsList;
 
 
 }
 }