5
5
prop =" property.dataType"
6
6
>
7
7
<el-select v-model =" property.dataType" placeholder =" 请选择数据类型" @change =" handleChange" >
8
+ <!-- ARRAY 和 STRUCT 类型数据相互嵌套时,最多支持递归嵌套2层(父和子) -->
8
9
<el-option
9
- v-for =" option in dataTypeOptions "
10
+ v-for =" option in getDataTypeOptions "
10
11
:key =" option.value"
11
12
:label =" option.label"
12
13
:value =" option.value"
13
14
/>
14
15
</el-select >
15
16
</el-form-item >
16
17
<!-- 数值型配置 -->
17
- <ThinkModelNumberTypeDataSpecs
18
+ <ThingModelNumberDataSpecs
18
19
v-if ="
19
20
[DataSpecsDataType.INT, DataSpecsDataType.DOUBLE, DataSpecsDataType.FLOAT].includes(
20
21
property.dataType || ''
23
24
v-model =" property.dataSpecs"
24
25
/>
25
26
<!-- 枚举型配置 -->
26
- <ThinkModelEnumTypeDataSpecs
27
+ <ThingModelEnumDataSpecs
27
28
v-if =" property.dataType === DataSpecsDataType.ENUM"
28
29
v-model =" property.dataSpecsList"
29
30
/>
30
31
<!-- 布尔型配置 -->
31
- <el-form-item
32
- v-if =" property.dataType === DataSpecsDataType.BOOL"
33
- :rules =" [{ required: true, message: '请输入布尔值名称', trigger: 'blur' }]"
34
- label =" 布尔值"
35
- prop =" property.dataSpecsList"
36
- >
32
+ <el-form-item v-if =" property.dataType === DataSpecsDataType.BOOL" label =" 布尔值" >
37
33
<template v-for =" (item , index ) in property .dataSpecsList " :key =" item .value " >
38
34
<div class =" flex items-center justify-start w-1/1 mb-5px" >
39
35
<span >{{ item.value }}</span >
58
54
<!-- 文本型配置 -->
59
55
<el-form-item
60
56
v-if =" property.dataType === DataSpecsDataType.TEXT"
61
- :rules =" [
62
- { required: true, message: '请输入文本字节长度', trigger: 'blur' },
63
- { validator: validateTextLength, trigger: 'blur' }
64
- ]"
65
57
label =" 数据长度"
66
58
prop =" property.dataSpecs.length"
67
59
>
74
66
<el-input class =" w-255px!" disabled placeholder =" String类型的UTC时间戳(毫秒)" />
75
67
</el-form-item >
76
68
<!-- 数组型配置-->
77
- <ThinkModelArrayTypeDataSpecs
69
+ <ThingModelArrayDataSpecs
78
70
v-if =" property.dataType === DataSpecsDataType.ARRAY"
79
71
v-model =" property.dataSpecs"
80
72
/>
81
- <!-- TODO puhui999: Struct 属性待完善 -->
82
- <el-form-item
83
- :rules = " [{ required: true, message: '请选择读写类型', trigger: 'change' }] "
84
- label = " 读写类型 "
85
- prop = " property.accessMode "
86
- >
73
+ <!-- Struct 型配置 -->
74
+ <ThingModelStructDataSpecs
75
+ v-if = " property.dataType === DataSpecsDataType.STRUCT "
76
+ v-model = " property.dataSpecsList "
77
+ />
78
+ < el-form-item v-if = " !isStructDataSpecs " label = " 读写类型 " prop = " property.accessMode " >
87
79
<el-radio-group v-model =" property.accessMode" >
88
80
<el-radio label =" rw" >读写</el-radio >
89
81
<el-radio label =" r" >只读</el-radio >
102
94
103
95
<script lang="ts" setup>
104
96
import { useVModel } from ' @vueuse/core'
105
- import { DataSpecsDataType , dataTypeOptions } from ' ./config'
97
+ import { DataSpecsDataType , dataTypeOptions , validateBoolName } from ' ./config'
106
98
import {
107
- ThinkModelArrayTypeDataSpecs ,
108
- ThinkModelEnumTypeDataSpecs ,
109
- ThinkModelNumberTypeDataSpecs
99
+ ThingModelArrayDataSpecs ,
100
+ ThingModelEnumDataSpecs ,
101
+ ThingModelNumberDataSpecs ,
102
+ ThingModelStructDataSpecs
110
103
} from ' ./dataSpecs'
111
- import { ThinkModelProperty } from ' @/api/iot/thinkmodel'
112
- import { isEmpty } from ' @/utils/is'
104
+ import { ThingModelProperty } from ' @/api/iot/thingmodel'
113
105
114
106
/** IoT 物模型数据 */
115
- defineOptions ({ name: ' ThinkModelDataSpecs ' })
107
+ defineOptions ({ name: ' ThingModelDataSpecs ' })
116
108
117
- const props = defineProps <{ modelValue: any }>()
109
+ const props = defineProps <{ modelValue: any ; isStructDataSpecs ? : boolean }>()
118
110
const emits = defineEmits ([' update:modelValue' ])
119
- const property = useVModel (props , ' modelValue' , emits ) as Ref <ThinkModelProperty >
120
-
111
+ const property = useVModel (props , ' modelValue' , emits ) as Ref <ThingModelProperty >
112
+ const getDataTypeOptions = computed (() => {
113
+ return ! props .isStructDataSpecs
114
+ ? dataTypeOptions
115
+ : dataTypeOptions .filter (
116
+ (item ) =>
117
+ ! ([DataSpecsDataType .STRUCT , DataSpecsDataType .ARRAY ] as any []).includes (item .value )
118
+ )
119
+ }) // 获得数据类型列表
121
120
/** 属性值的数据类型切换时初始化相关数据 */
122
121
const handleChange = (dataType : any ) => {
123
122
property .value .dataSpecsList = []
@@ -143,45 +142,6 @@ const handleChange = (dataType: any) => {
143
142
break
144
143
}
145
144
}
146
-
147
- // TODO @puhui999:一些校验的规则,是不是写到 utils 里。
148
- /** 校验布尔值名称 */
149
- const validateBoolName = (_ : any , value : string , callback : any ) => {
150
- if (isEmpty (value )) {
151
- callback (new Error (' 布尔值名称不能为空' ))
152
- return
153
- }
154
- // 检查开头字符
155
- if (! / ^ [\u4e00 -\u9fa5 a-zA-Z0-9 ] / .test (value )) {
156
- callback (new Error (' 布尔值名称必须以中文、英文字母或数字开头' ))
157
- return
158
- }
159
- // 检查整体格式
160
- if (! / ^ [\u4e00 -\u9fa5 a-zA-Z0-9 ][a-zA-Z0-9\u4e00 -\u9fa5 _-] * $ / .test (value )) {
161
- callback (new Error (' 布尔值名称只能包含中文、英文字母、数字、下划线和短划线' ))
162
- return
163
- }
164
- // 检查长度(一个中文算一个字符)
165
- if (value .length > 20 ) {
166
- callback (new Error (' 布尔值名称长度不能超过20个字符' ))
167
- return
168
- }
169
-
170
- callback ()
171
- }
172
-
173
- /** 校验文本长度 */
174
- const validateTextLength = (_ : any , value : any , callback : any ) => {
175
- if (isEmpty (value )) {
176
- callback (new Error (' 文本长度不能为空' ))
177
- return
178
- }
179
- if (isNaN (Number (value ))) {
180
- callback (new Error (' 文本长度必须是数字' ))
181
- return
182
- }
183
- callback ()
184
- }
185
145
</script >
186
146
187
147
<style lang="scss" scoped>
0 commit comments