From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/views/iot/thingmodel/ThingModelProperty.vue | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 177 insertions(+), 0 deletions(-)
diff --git a/src/views/iot/thingmodel/ThingModelProperty.vue b/src/views/iot/thingmodel/ThingModelProperty.vue
new file mode 100644
index 0000000..490f364
--- /dev/null
+++ b/src/views/iot/thingmodel/ThingModelProperty.vue
@@ -0,0 +1,177 @@
+<!-- 浜у搧鐨勭墿妯″瀷琛ㄥ崟锛坧roperty 椤癸級 -->
+<template>
+ <el-form-item
+ :rules="[{ required: true, message: '璇烽�夋嫨鏁版嵁绫诲瀷', trigger: 'change' }]"
+ label="鏁版嵁绫诲瀷"
+ prop="property.dataType"
+ >
+ <el-select v-model="property.dataType" placeholder="璇烽�夋嫨鏁版嵁绫诲瀷" @change="handleChange">
+ <!-- ARRAY 鍜� STRUCT 绫诲瀷鏁版嵁鐩镐簰宓屽鏃讹紝鏈�澶氭敮鎸侀�掑綊宓屽 2 灞傦紙鐖跺拰瀛愶級 -->
+ <el-option
+ v-for="option in getDataTypeOptions2"
+ :key="option.value"
+ :label="`${option.value}(${option.label})`"
+ :value="option.value"
+ />
+ </el-select>
+ </el-form-item>
+ <!-- 鏁板�煎瀷閰嶇疆 -->
+ <ThingModelNumberDataSpecs
+ v-if="
+ [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.FLOAT
+ ].includes(property.dataType || '')
+ "
+ v-model="property.dataSpecs"
+ />
+ <!-- 鏋氫妇鍨嬮厤缃� -->
+ <ThingModelEnumDataSpecs
+ v-if="property.dataType === IoTDataSpecsDataTypeEnum.ENUM"
+ v-model="property.dataSpecsList"
+ />
+ <!-- 甯冨皵鍨嬮厤缃� -->
+ <el-form-item v-if="property.dataType === IoTDataSpecsDataTypeEnum.BOOL" label="甯冨皵鍊�">
+ <template v-for="(item, index) in property.dataSpecsList" :key="item.value">
+ <div class="flex items-center justify-start w-1/1 mb-5px">
+ <span>{{ item.value }}</span>
+ <span class="mx-2">-</span>
+ <el-form-item
+ :prop="`property.dataSpecsList[${index}].name`"
+ :rules="[
+ { required: true, message: '鏋氫妇鎻忚堪涓嶈兘涓虹┖' },
+ { validator: validateBoolName, trigger: 'blur' }
+ ]"
+ class="flex-1 mb-0"
+ >
+ <el-input
+ v-model="item.name"
+ :placeholder="`濡傦細${item.value === 0 ? '鍏�' : '寮�'}`"
+ class="w-255px!"
+ />
+ </el-form-item>
+ </div>
+ </template>
+ </el-form-item>
+ <!-- 鏂囨湰鍨嬮厤缃� -->
+ <el-form-item
+ v-if="property.dataType === IoTDataSpecsDataTypeEnum.TEXT"
+ label="鏁版嵁闀垮害"
+ prop="property.dataSpecs.length"
+ >
+ <el-input v-model="property.dataSpecs.length" class="w-255px!" placeholder="璇疯緭鍏ユ枃鏈瓧鑺傞暱搴�">
+ <template #append>瀛楄妭</template>
+ </el-input>
+ </el-form-item>
+ <!-- 鏃堕棿鍨嬮厤缃� -->
+ <el-form-item
+ v-if="property.dataType === IoTDataSpecsDataTypeEnum.DATE"
+ label="鏃堕棿鏍煎紡"
+ prop="date"
+ >
+ <el-input class="w-255px!" disabled placeholder="String 绫诲瀷鐨� UTC 鏃堕棿鎴筹紙姣锛�" />
+ </el-form-item>
+ <!-- 鏁扮粍鍨嬮厤缃�-->
+ <ThingModelArrayDataSpecs
+ v-if="property.dataType === IoTDataSpecsDataTypeEnum.ARRAY"
+ v-model="property.dataSpecs"
+ />
+ <!-- Struct 鍨嬮厤缃�-->
+ <ThingModelStructDataSpecs
+ v-if="property.dataType === IoTDataSpecsDataTypeEnum.STRUCT"
+ v-model="property.dataSpecsList"
+ />
+ <el-form-item v-if="!isStructDataSpecs && !isParams" label="璇诲啓绫诲瀷" prop="property.accessMode">
+ <el-radio-group v-model="property.accessMode">
+ <el-radio
+ v-for="accessMode in Object.values(IoTThingModelAccessModeEnum)"
+ :key="accessMode.value"
+ :label="accessMode.value"
+ >
+ {{ accessMode.label }}
+ </el-radio>
+ </el-radio-group>
+ </el-form-item>
+</template>
+
+<script lang="ts" setup>
+import { useVModel } from '@vueuse/core'
+import {
+ ThingModelArrayDataSpecs,
+ ThingModelEnumDataSpecs,
+ ThingModelNumberDataSpecs,
+ ThingModelStructDataSpecs
+} from './dataSpecs'
+import { ThingModelProperty, validateBoolName } from '@/api/iot/thingmodel'
+import { isEmpty } from '@/utils/is'
+import {
+ getDataTypeOptions,
+ IoTDataSpecsDataTypeEnum,
+ IoTThingModelAccessModeEnum
+} from '@/views/iot/utils/constants'
+
+/** IoT 鐗╂ā鍨嬪睘鎬� */
+defineOptions({ name: 'ThingModelProperty' })
+
+const props = defineProps<{ modelValue: any; isStructDataSpecs?: boolean; isParams?: boolean }>()
+const emits = defineEmits(['update:modelValue'])
+const property = useVModel(props, 'modelValue', emits) as Ref<ThingModelProperty>
+const getDataTypeOptions2 = computed(() => {
+ if (!props.isStructDataSpecs) {
+ return getDataTypeOptions()
+ }
+ const excludedTypes = [IoTDataSpecsDataTypeEnum.STRUCT, IoTDataSpecsDataTypeEnum.ARRAY]
+ return getDataTypeOptions().filter((item: any) => !excludedTypes.includes(item.value))
+}) // 鑾峰緱鏁版嵁绫诲瀷鍒楄〃
+
+/** 灞炴�у�肩殑鏁版嵁绫诲瀷鍒囨崲鏃跺垵濮嬪寲鐩稿叧鏁版嵁 */
+const handleChange = (dataType: any) => {
+ property.value.dataSpecs = {}
+ property.value.dataSpecsList = []
+ // 涓嶆槸鍒楄〃鍨嬫暟鎹墠璁剧疆 dataSpecs.dataType
+ ![
+ IoTDataSpecsDataTypeEnum.ENUM,
+ IoTDataSpecsDataTypeEnum.BOOL,
+ IoTDataSpecsDataTypeEnum.STRUCT
+ ].includes(dataType) && (property.value.dataSpecs.dataType = dataType)
+ switch (dataType) {
+ case IoTDataSpecsDataTypeEnum.ENUM:
+ property.value.dataSpecsList.push({
+ dataType: IoTDataSpecsDataTypeEnum.ENUM,
+ name: '', // 鏋氫妇椤圭殑鍚嶇О
+ value: undefined // 鏋氫妇鍊�
+ })
+ break
+ case IoTDataSpecsDataTypeEnum.BOOL:
+ for (let i = 0; i < 2; i++) {
+ property.value.dataSpecsList.push({
+ dataType: IoTDataSpecsDataTypeEnum.BOOL,
+ name: '', // 甯冨皵鍊肩殑鍚嶇О
+ value: i // 甯冨皵鍊�
+ })
+ }
+ break
+ }
+}
+
+/** 榛樿閫変腑璇诲啓 */
+watch(
+ () => property.value.accessMode,
+ (val: string) => {
+ if (props.isStructDataSpecs || props.isParams) {
+ return
+ }
+ isEmpty(val) && (property.value.accessMode = IoTThingModelAccessModeEnum.READ_WRITE.value)
+ },
+ { immediate: true }
+)
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-form-item) {
+ .el-form-item {
+ margin-bottom: 0;
+ }
+}
+</style>
--
Gitblit v1.8.0