Commit d155876f0957e0a3b84519f1530f8e444e9961c1

Authored by puhui999
1 parent 343353b8

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

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 @@ -174,7 +174,7 @@ GET {{baseUrl}}/iot/product-thing-model/get?id=67
174 tenant-id: {{adminTenentId}} 174 tenant-id: {{adminTenentId}}
175 Authorization: Bearer {{token}} 175 Authorization: Bearer {{token}}
176 176
177 -### 请求 /iot/product-thing-model/tsl-by-product-id 接口 => 成功  
178 -GET {{baseUrl}}/iot/product-thing-model/tsl-by-product-id?productId=1001 177 +### 请求 /iot/product-thing-model/get-tsl 接口 => 成功
  178 +GET {{baseUrl}}/iot/product-thing-model/get-tsl?productId=1001
179 tenant-id: {{adminTenentId}} 179 tenant-id: {{adminTenentId}}
180 Authorization: Bearer {{token}} 180 Authorization: Bearer {{token}}
181 \ No newline at end of file 181 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelArrayDataSpecs.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4 +import jakarta.validation.Valid;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import jakarta.validation.constraints.Pattern;
4 import lombok.Data; 8 import lombok.Data;
5 import lombok.EqualsAndHashCode; 9 import lombok.EqualsAndHashCode;
6 10
@@ -16,18 +20,17 @@ import java.util.List; @@ -16,18 +20,17 @@ import java.util.List;
16 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复 20 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs { 21 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs {
18 22
19 - /**  
20 - * 数组中的元素个数  
21 - */ 23 + @NotNull(message = "数组元素个数不能为空")
22 private Integer size; 24 private Integer size;
23 - /**  
24 - * 数组中的元素的数据类型。可选值:struct、int、float、double 或 text  
25 - */ 25 +
  26 + @NotEmpty(message = "数组元素的数据类型不能为空")
  27 + @Pattern(regexp = "^(struct|int|float|double|text)$", message = "数组元素的数据类型必须为:struct、int、float、double 或 text")
26 private String childDataType; 28 private String childDataType;
27 /** 29 /**
28 * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中 30 * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中
29 * 此时 struct 取值范围为:int、float、double、text、date、enum、bool 31 * 此时 struct 取值范围为:int、float、double、text、date、enum、bool
30 */ 32 */
  33 + @Valid
31 private List<ThingModelDataSpecs> dataSpecsList; 34 private List<ThingModelDataSpecs> dataSpecsList;
32 35
33 } 36 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelBoolOrEnumDataSpecs.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import jakarta.validation.constraints.Pattern;
4 import lombok.Data; 7 import lombok.Data;
5 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
6 9
@@ -16,16 +19,12 @@ import lombok.EqualsAndHashCode; @@ -16,16 +19,12 @@ import lombok.EqualsAndHashCode;
16 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复 19 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs { 20 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs {
18 21
19 - // TODO @puhui999:要不写下参数校验?这样,注释可以简洁一点  
20 - /**  
21 - * 枚举项的名称。  
22 - * 可包含中文、大小写英文字母、数字、下划线(_)和短划线(-)  
23 - * 必须以中文、英文字母或数字开头,长度不超过 20 个字符  
24 - */ 22 + @NotEmpty(message = "枚举项的名称不能为空")
  23 + @Pattern(regexp = "^[\\u4e00-\\u9fa5a-zA-Z0-9][\\u4e00-\\u9fa5a-zA-Z0-9_-]{0,19}$",
  24 + message = "枚举项的名称只能包含中文、大小写英文字母、数字、下划线和短划线,必须以中文、英文字母或数字开头,长度不超过 20 个字符")
25 private String name; 25 private String name;
26 - /**  
27 - * 枚举值。  
28 - */ 26 +
  27 + @NotNull(message = "枚举值不能为空")
29 private Integer value; 28 private Integer value;
30 29
31 } 30 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDateOrTextDataSpecs.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4 +import jakarta.validation.constraints.Max;
4 import lombok.Data; 5 import lombok.Data;
5 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
6 7
@@ -20,6 +21,7 @@ public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs { @@ -20,6 +21,7 @@ public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs {
20 * 数据长度,单位为字节。取值不能超过 2048。 21 * 数据长度,单位为字节。取值不能超过 2048。
21 * 当 dataType 为 text 时,需传入该参数。 22 * 当 dataType 为 text 时,需传入该参数。
22 */ 23 */
  24 + @Max(value = 2048, message = "数据长度不能超过 2048")
23 private Integer length; 25 private Integer length;
24 /** 26 /**
25 * 默认值,可选参数,用于存储默认值。 27 * 默认值,可选参数,用于存储默认值。
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelNumericDataSpec.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.Pattern;
4 import lombok.Data; 6 import lombok.Data;
5 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
6 8
@@ -18,18 +20,21 @@ public class ThingModelNumericDataSpec extends ThingModelDataSpecs { @@ -18,18 +20,21 @@ public class ThingModelNumericDataSpec extends ThingModelDataSpecs {
18 20
19 /** 21 /**
20 * 最大值,需转为字符串类型。值必须与 dataType 类型一致。 22 * 最大值,需转为字符串类型。值必须与 dataType 类型一致。
21 - * 例如,当 dataType 为 int 时,取值为 "200",而不是 200。  
22 */ 23 */
  24 + @NotEmpty(message = "最大值不能为空")
  25 + @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最大值必须为数值类型")
23 private String max; 26 private String max;
24 /** 27 /**
25 * 最小值,需转为字符串类型。值必须与 dataType 类型一致。 28 * 最小值,需转为字符串类型。值必须与 dataType 类型一致。
26 - * 例如,当 dataType 为 int 时,取值为 "0",而不是 0。  
27 */ 29 */
  30 + @NotEmpty(message = "最小值不能为空")
  31 + @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最小值必须为数值类型")
28 private String min; 32 private String min;
29 /** 33 /**
30 * 步长,需转为字符串类型。值必须与 dataType 类型一致。 34 * 步长,需转为字符串类型。值必须与 dataType 类型一致。
31 - * 例如,当 dataType 为 int 时,取值为 "10",而不是 10。  
32 */ 35 */
  36 + @NotEmpty(message = "步长不能为空")
  37 + @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "步长必须为数值类型")
33 private String step; 38 private String step;
34 /** 39 /**
35 * 精度。当 dataType 为 float 或 double 时可选传入。 40 * 精度。当 dataType 为 float 或 double 时可选传入。
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelStructDataSpecs.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType;
2 2
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum; 4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum;
4 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  6 +import jakarta.validation.Valid;
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.Pattern;
5 import lombok.Data; 9 import lombok.Data;
6 import lombok.EqualsAndHashCode; 10 import lombok.EqualsAndHashCode;
7 11
@@ -17,35 +21,36 @@ import java.util.List; @@ -17,35 +21,36 @@ import java.util.List;
17 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复 21 @JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
18 public class ThingModelStructDataSpecs extends ThingModelDataSpecs { 22 public class ThingModelStructDataSpecs extends ThingModelDataSpecs {
19 23
20 - /**  
21 - * 属性标识符  
22 - */ 24 + @NotEmpty(message = "属性标识符不能为空")
  25 + @Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9_]{0,31}$", message = "属性标识符只能由字母、数字和下划线组成,必须以字母开头,长度不超过 32 个字符")
23 private String identifier; 26 private String identifier;
24 - /**  
25 - * 属性名称  
26 - */ 27 +
  28 + @NotEmpty(message = "属性名称不能为空")
27 private String name; 29 private String name;
28 - /**  
29 - * 云端可以对该属性进行的操作类型  
30 - *  
31 - * 枚举 {@link IotThingModelAccessModeEnum}  
32 - */ 30 +
  31 + @NotEmpty(message = "操作类型不能为空")
  32 + @InEnum(IotThingModelAccessModeEnum.class)
33 private String accessMode; 33 private String accessMode;
  34 +
34 /** 35 /**
35 * 是否是标准品类的必选服务 36 * 是否是标准品类的必选服务
36 */ 37 */
37 private Boolean required; 38 private Boolean required;
38 - /**  
39 - * struct 数据的数据类型  
40 - */ 39 +
  40 + @NotEmpty(message = "数据类型不能为空")
  41 + @Pattern(regexp = "^(int|float|double|text|date|enum|bool)$", message = "数据类型必须为:int、float、double、text、date、enum、bool")
41 private String childDataType; 42 private String childDataType;
  43 +
42 /** 44 /**
43 * 数据类型(dataType)为非列表型(int、float、double、text、date、array)的数据规范存储在 dataSpecs 中 45 * 数据类型(dataType)为非列表型(int、float、double、text、date、array)的数据规范存储在 dataSpecs 中
44 */ 46 */
  47 + @Valid
45 private ThingModelDataSpecs dataSpecs; 48 private ThingModelDataSpecs dataSpecs;
  49 +
46 /** 50 /**
47 * 数据类型(dataType)为列表型(enum、bool、struct)的数据规范存储在 dataSpecsList 中 51 * 数据类型(dataType)为列表型(enum、bool、struct)的数据规范存储在 dataSpecsList 中
48 */ 52 */
  53 + @Valid
49 private List<ThingModelDataSpecs> dataSpecsList; 54 private List<ThingModelDataSpecs> dataSpecsList;
50 55
51 } 56 }