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/dataSpecs/ThingModelEnumDataSpecs.vue | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 160 insertions(+), 0 deletions(-)
diff --git a/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue b/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue
new file mode 100644
index 0000000..71d4778
--- /dev/null
+++ b/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue
@@ -0,0 +1,160 @@
+<!-- dataType锛歟num 鏁扮粍绫诲瀷 -->
+<template>
+ <el-form-item
+ :rules="[{ required: true, validator: validateEnumList, trigger: 'change' }]"
+ label="鏋氫妇椤�"
+ >
+ <div class="flex flex-col">
+ <div class="flex items-center">
+ <span class="flex-1"> 鍙傛暟鍊� </span>
+ <span class="flex-1"> 鍙傛暟鎻忚堪 </span>
+ </div>
+ <div
+ v-for="(item, index) in dataSpecsList"
+ :key="index"
+ class="flex items-center justify-between mb-5px"
+ >
+ <el-form-item
+ :prop="`property.dataSpecsList[${index}].value`"
+ :rules="[
+ { required: true, message: '鏋氫妇鍊间笉鑳戒负绌�' },
+ { validator: validateEnumValue, trigger: 'blur' }
+ ]"
+ class="flex-1 mb-0"
+ >
+ <el-input v-model="item.value" placeholder="璇疯緭鍏ユ灇涓惧��,濡�'0'" />
+ </el-form-item>
+ <span class="mx-2">~</span>
+ <el-form-item
+ :prop="`property.dataSpecsList[${index}].name`"
+ :rules="[
+ { required: true, message: '鏋氫妇鎻忚堪涓嶈兘涓虹┖' },
+ { validator: validateEnumName, trigger: 'blur' }
+ ]"
+ class="flex-1 mb-0"
+ >
+ <el-input v-model="item.name" placeholder="瀵硅鏋氫妇椤圭殑鎻忚堪" />
+ </el-form-item>
+ <el-button class="ml-10px" link type="primary" @click="deleteEnum(index)">鍒犻櫎</el-button>
+ </div>
+ <el-button link type="primary" @click="addEnum">+娣诲姞鏋氫妇椤�</el-button>
+ </div>
+ </el-form-item>
+</template>
+
+<script lang="ts" setup>
+import { useVModel } from '@vueuse/core'
+import { isEmpty } from '@/utils/is'
+import { IoTDataSpecsDataTypeEnum } from '@/views/iot/utils/constants'
+import { DataSpecsEnumOrBoolData } from '@/api/iot/thingmodel'
+
+/** 鏋氫妇鍨嬬殑 dataSpecs 閰嶇疆缁勪欢 */
+defineOptions({ name: 'ThingModelEnumDataSpecs' })
+
+const props = defineProps<{ modelValue: any }>()
+const emits = defineEmits(['update:modelValue'])
+const dataSpecsList = useVModel(props, 'modelValue', emits) as Ref<DataSpecsEnumOrBoolData[]>
+const message = useMessage()
+
+/** 娣诲姞鏋氫妇椤� */
+const addEnum = () => {
+ dataSpecsList.value.push({
+ dataType: IoTDataSpecsDataTypeEnum.ENUM,
+ name: '', // 鏋氫妇椤圭殑鍚嶇О
+ value: undefined // 鏋氫妇鍊�
+ })
+}
+
+/** 鍒犻櫎鏋氫妇椤� */
+const deleteEnum = (index: number) => {
+ if (dataSpecsList.value.length === 1) {
+ message.warning('鑷冲皯闇�瑕佷竴涓灇涓鹃」')
+ return
+ }
+ dataSpecsList.value.splice(index, 1)
+}
+
+/** 鏍¢獙鏋氫妇鍊� */
+const validateEnumValue = (_: any, value: any, callback: any) => {
+ if (isEmpty(value)) {
+ callback(new Error('鏋氫妇鍊间笉鑳戒负绌�'))
+ return
+ }
+ if (isNaN(Number(value))) {
+ callback(new Error('鏋氫妇鍊煎繀椤绘槸鏁板瓧'))
+ return
+ }
+ // 妫�鏌ユ灇涓惧�兼槸鍚﹂噸澶�
+ const values = dataSpecsList.value.map((item) => item.value)
+ if (values.filter((v) => v === value).length > 1) {
+ callback(new Error('鏋氫妇鍊间笉鑳介噸澶�'))
+ return
+ }
+ callback()
+}
+
+/** 鏍¢獙鏋氫妇鎻忚堪 */
+const validateEnumName = (_: any, value: string, callback: any) => {
+ if (isEmpty(value)) {
+ callback(new Error('鏋氫妇鎻忚堪涓嶈兘涓虹┖'))
+ return
+ }
+ // 妫�鏌ュ紑澶村瓧绗�
+ if (!/^[\u4e00-\u9fa5a-zA-Z0-9]/.test(value)) {
+ callback(new Error('鏋氫妇鎻忚堪蹇呴』浠ヤ腑鏂囥�佽嫳鏂囧瓧姣嶆垨鏁板瓧寮�澶�'))
+ return
+ }
+ // 妫�鏌ユ暣浣撴牸寮�
+ if (!/^[\u4e00-\u9fa5a-zA-Z0-9][a-zA-Z0-9\u4e00-\u9fa5_-]*$/.test(value)) {
+ callback(new Error('鏋氫妇鎻忚堪鍙兘鍖呭惈涓枃銆佽嫳鏂囧瓧姣嶃�佹暟瀛椼�佷笅鍒掔嚎鍜岀煭鍒掔嚎'))
+ return
+ }
+ // 妫�鏌ラ暱搴︼紙涓�涓腑鏂囩畻涓�涓瓧绗︼級
+ if (value.length > 20) {
+ callback(new Error('鏋氫妇鎻忚堪闀垮害涓嶈兘瓒呰繃20涓瓧绗�'))
+ return
+ }
+ callback()
+}
+
+/** 鏍¢獙鏁翠釜鏋氫妇鍒楄〃 */
+const validateEnumList = (_: any, __: any, callback: any) => {
+ if (isEmpty(dataSpecsList.value)) {
+ callback(new Error('璇疯嚦灏戞坊鍔犱竴涓灇涓鹃」'))
+ return
+ }
+
+ // 妫�鏌ユ槸鍚﹀瓨鍦ㄧ┖鍊�
+ const hasEmptyValue = dataSpecsList.value.some(
+ (item) => isEmpty(item.value) || isEmpty(item.name)
+ )
+ if (hasEmptyValue) {
+ callback(new Error('瀛樺湪鏈~鍐欑殑鏋氫妇鍊兼垨鎻忚堪'))
+ return
+ }
+
+ // 妫�鏌ユ灇涓惧�兼槸鍚﹂兘鏄暟瀛�
+ const hasInvalidNumber = dataSpecsList.value.some((item) => isNaN(Number(item.value)))
+ if (hasInvalidNumber) {
+ callback(new Error('瀛樺湪闈炴暟瀛楃殑鏋氫妇鍊�'))
+ return
+ }
+
+ // 妫�鏌ユ槸鍚︽湁閲嶅鐨勬灇涓惧��
+ const values = dataSpecsList.value.map((item) => item.value)
+ const uniqueValues = new Set(values)
+ if (values.length !== uniqueValues.size) {
+ callback(new Error('瀛樺湪閲嶅鐨勬灇涓惧��'))
+ return
+ }
+ callback()
+}
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-form-item) {
+ .el-form-item {
+ margin-bottom: 0;
+ }
+}
+</style>
--
Gitblit v1.8.0