From 8549399ae884549ac92d8ca9447ff3066a084353 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sat, 26 Jul 2025 22:35:59 +0800 Subject: [PATCH] =?UTF-8?q?perf=EF=BC=9A=E3=80=90IoT=20=E7=89=A9=E8=81=94?= =?UTF-8?q?=E7=BD=91=E3=80=91=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{components => form}/RuleSceneForm.vue | 77 ++++++++----------- .../configs/AlertConfig.vue | 0 .../configs/ConditionConfig.vue | 0 .../configs/ConditionGroupConfig.vue | 0 .../configs/DeviceControlConfig.vue | 0 .../configs/DeviceTriggerConfig.vue | 0 .../configs/TimerTriggerConfig.vue | 0 .../inputs/CronBuilder.vue | 0 .../{components => form}/inputs/CronInput.vue | 0 .../inputs/DescriptionInput.vue | 0 .../{components => form}/inputs/NameInput.vue | 0 .../inputs/StatusRadio.vue | 0 .../inputs/ValueInput.vue | 0 .../previews/ActionPreview.vue | 0 .../previews/ConfigPreview.vue | 0 .../previews/NextExecutionPreview.vue | 0 .../previews/TriggerPreview.vue | 0 .../previews/ValidationResult.vue | 0 .../sections/ActionSection.vue | 0 .../sections/BasicInfoSection.vue | 0 .../sections/PreviewSection.vue | 0 .../sections/TriggerSection.vue | 0 .../selectors/ActionTypeSelector.vue | 0 .../selectors/OperatorSelector.vue | 0 .../selectors/ProductDeviceSelector.vue | 0 .../selectors/PropertySelector.vue | 0 .../selectors/TriggerTypeSelector.vue | 0 .../{components => form}/selectors/types.ts | 0 src/views/iot/rule/scene/index.vue | 2 +- 29 files changed, 33 insertions(+), 46 deletions(-) rename src/views/iot/rule/scene/{components => form}/RuleSceneForm.vue (74%) rename src/views/iot/rule/scene/{components => form}/configs/AlertConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/configs/ConditionConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/configs/ConditionGroupConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/configs/DeviceControlConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/configs/DeviceTriggerConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/configs/TimerTriggerConfig.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/CronBuilder.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/CronInput.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/DescriptionInput.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/NameInput.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/StatusRadio.vue (100%) rename src/views/iot/rule/scene/{components => form}/inputs/ValueInput.vue (100%) rename src/views/iot/rule/scene/{components => form}/previews/ActionPreview.vue (100%) rename src/views/iot/rule/scene/{components => form}/previews/ConfigPreview.vue (100%) rename src/views/iot/rule/scene/{components => form}/previews/NextExecutionPreview.vue (100%) rename src/views/iot/rule/scene/{components => form}/previews/TriggerPreview.vue (100%) rename src/views/iot/rule/scene/{components => form}/previews/ValidationResult.vue (100%) rename src/views/iot/rule/scene/{components => form}/sections/ActionSection.vue (100%) rename src/views/iot/rule/scene/{components => form}/sections/BasicInfoSection.vue (100%) rename src/views/iot/rule/scene/{components => form}/sections/PreviewSection.vue (100%) rename src/views/iot/rule/scene/{components => form}/sections/TriggerSection.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/ActionTypeSelector.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/OperatorSelector.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/ProductDeviceSelector.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/PropertySelector.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/TriggerTypeSelector.vue (100%) rename src/views/iot/rule/scene/{components => form}/selectors/types.ts (100%) diff --git a/src/views/iot/rule/scene/components/RuleSceneForm.vue b/src/views/iot/rule/scene/form/RuleSceneForm.vue similarity index 74% rename from src/views/iot/rule/scene/components/RuleSceneForm.vue rename to src/views/iot/rule/scene/form/RuleSceneForm.vue index 93cb2f0c2..8fc3e26dc 100644 --- a/src/views/iot/rule/scene/components/RuleSceneForm.vue +++ b/src/views/iot/rule/scene/form/RuleSceneForm.vue @@ -1,5 +1,4 @@ - @@ -65,7 +52,7 @@ import PreviewSection from './sections/PreviewSection.vue' import { RuleSceneFormData, IotRuleScene } from '@/api/iot/rule/scene/scene.types' import { getBaseValidationRules } from '../utils/validation' import { transformFormToApi, transformApiToForm, createDefaultFormData } from '../utils/transform' -import { handleValidationError, showSuccess, withErrorHandling } from '../utils/errorHandler' +import { ElMessage } from 'element-plus' /** IoT 场景联动规则表单 - 主表单组件 */ defineOptions({ name: 'RuleSceneForm' }) @@ -98,7 +85,7 @@ const actionValidation = ref({ valid: true, message: '' }) // 计算属性 const isEdit = computed(() => !!props.ruleScene?.id) -const drawerTitle = computed(() => (isEdit.value ? '编辑场景联动规则' : '新增场景联动规则')) // TODO @puhui999:这个风格,和别的模块一致; +const drawerTitle = computed(() => (isEdit.value ? '编辑场景联动规则' : '新增场景联动规则')) const canSubmit = computed(() => { return ( @@ -132,49 +119,49 @@ const handleValidate = async () => { } validationResult.value = { valid: true, message: '验证通过' } - showSuccess('规则验证通过') + ElMessage.success('规则验证通过') return true } catch (error: any) { const message = error.message || '表单验证失败' validationResult.value = { valid: false, message } - await handleValidationError(message, 'rule-scene-form') + ElMessage.error(message) return false } } -// TODO @puhui999:参考下别的模块,不用这么复杂哈; const handleSubmit = async () => { - const result = await withErrorHandling( - async () => { - // 验证表单 - const isValid = await handleValidate() - if (!isValid) { - throw new Error('表单验证失败') - } + // 校验表单 + if (!formRef.value) return + const valid = await formRef.value.validate() + if (!valid) return - // 转换数据格式 - const apiData = transformFormToApi(formData.value) + // 验证触发器和执行器 + if (!triggerValidation.value.valid) { + ElMessage.error(triggerValidation.value.message) + return + } + if (!actionValidation.value.valid) { + ElMessage.error(actionValidation.value.message) + return + } - // 这里应该调用API保存数据 - console.log('提交数据:', apiData) + // 提交请求 + submitLoading.value = true + try { + // 转换数据格式 + const apiData = transformFormToApi(formData.value) - // 模拟API调用 - await new Promise((resolve) => setTimeout(resolve, 1000)) + // 这里应该调用API保存数据 + console.log('提交数据:', apiData) - return apiData - }, - { - loadingKey: 'rule-scene-submit', - loadingText: isEdit.value ? '更新中...' : '创建中...', - context: 'rule-scene-form', - showSuccess: true, - successMessage: isEdit.value ? '更新成功' : '创建成功' - } - ) + // 模拟API调用 + await new Promise((resolve) => setTimeout(resolve, 1000)) - if (result) { + ElMessage.success(isEdit.value ? '更新成功' : '创建成功') + drawerVisible.value = false emit('success') - handleClose() + } finally { + submitLoading.value = false } } diff --git a/src/views/iot/rule/scene/components/configs/AlertConfig.vue b/src/views/iot/rule/scene/form/configs/AlertConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/AlertConfig.vue rename to src/views/iot/rule/scene/form/configs/AlertConfig.vue diff --git a/src/views/iot/rule/scene/components/configs/ConditionConfig.vue b/src/views/iot/rule/scene/form/configs/ConditionConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/ConditionConfig.vue rename to src/views/iot/rule/scene/form/configs/ConditionConfig.vue diff --git a/src/views/iot/rule/scene/components/configs/ConditionGroupConfig.vue b/src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/ConditionGroupConfig.vue rename to src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue diff --git a/src/views/iot/rule/scene/components/configs/DeviceControlConfig.vue b/src/views/iot/rule/scene/form/configs/DeviceControlConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/DeviceControlConfig.vue rename to src/views/iot/rule/scene/form/configs/DeviceControlConfig.vue diff --git a/src/views/iot/rule/scene/components/configs/DeviceTriggerConfig.vue b/src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/DeviceTriggerConfig.vue rename to src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue diff --git a/src/views/iot/rule/scene/components/configs/TimerTriggerConfig.vue b/src/views/iot/rule/scene/form/configs/TimerTriggerConfig.vue similarity index 100% rename from src/views/iot/rule/scene/components/configs/TimerTriggerConfig.vue rename to src/views/iot/rule/scene/form/configs/TimerTriggerConfig.vue diff --git a/src/views/iot/rule/scene/components/inputs/CronBuilder.vue b/src/views/iot/rule/scene/form/inputs/CronBuilder.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/CronBuilder.vue rename to src/views/iot/rule/scene/form/inputs/CronBuilder.vue diff --git a/src/views/iot/rule/scene/components/inputs/CronInput.vue b/src/views/iot/rule/scene/form/inputs/CronInput.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/CronInput.vue rename to src/views/iot/rule/scene/form/inputs/CronInput.vue diff --git a/src/views/iot/rule/scene/components/inputs/DescriptionInput.vue b/src/views/iot/rule/scene/form/inputs/DescriptionInput.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/DescriptionInput.vue rename to src/views/iot/rule/scene/form/inputs/DescriptionInput.vue diff --git a/src/views/iot/rule/scene/components/inputs/NameInput.vue b/src/views/iot/rule/scene/form/inputs/NameInput.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/NameInput.vue rename to src/views/iot/rule/scene/form/inputs/NameInput.vue diff --git a/src/views/iot/rule/scene/components/inputs/StatusRadio.vue b/src/views/iot/rule/scene/form/inputs/StatusRadio.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/StatusRadio.vue rename to src/views/iot/rule/scene/form/inputs/StatusRadio.vue diff --git a/src/views/iot/rule/scene/components/inputs/ValueInput.vue b/src/views/iot/rule/scene/form/inputs/ValueInput.vue similarity index 100% rename from src/views/iot/rule/scene/components/inputs/ValueInput.vue rename to src/views/iot/rule/scene/form/inputs/ValueInput.vue diff --git a/src/views/iot/rule/scene/components/previews/ActionPreview.vue b/src/views/iot/rule/scene/form/previews/ActionPreview.vue similarity index 100% rename from src/views/iot/rule/scene/components/previews/ActionPreview.vue rename to src/views/iot/rule/scene/form/previews/ActionPreview.vue diff --git a/src/views/iot/rule/scene/components/previews/ConfigPreview.vue b/src/views/iot/rule/scene/form/previews/ConfigPreview.vue similarity index 100% rename from src/views/iot/rule/scene/components/previews/ConfigPreview.vue rename to src/views/iot/rule/scene/form/previews/ConfigPreview.vue diff --git a/src/views/iot/rule/scene/components/previews/NextExecutionPreview.vue b/src/views/iot/rule/scene/form/previews/NextExecutionPreview.vue similarity index 100% rename from src/views/iot/rule/scene/components/previews/NextExecutionPreview.vue rename to src/views/iot/rule/scene/form/previews/NextExecutionPreview.vue diff --git a/src/views/iot/rule/scene/components/previews/TriggerPreview.vue b/src/views/iot/rule/scene/form/previews/TriggerPreview.vue similarity index 100% rename from src/views/iot/rule/scene/components/previews/TriggerPreview.vue rename to src/views/iot/rule/scene/form/previews/TriggerPreview.vue diff --git a/src/views/iot/rule/scene/components/previews/ValidationResult.vue b/src/views/iot/rule/scene/form/previews/ValidationResult.vue similarity index 100% rename from src/views/iot/rule/scene/components/previews/ValidationResult.vue rename to src/views/iot/rule/scene/form/previews/ValidationResult.vue diff --git a/src/views/iot/rule/scene/components/sections/ActionSection.vue b/src/views/iot/rule/scene/form/sections/ActionSection.vue similarity index 100% rename from src/views/iot/rule/scene/components/sections/ActionSection.vue rename to src/views/iot/rule/scene/form/sections/ActionSection.vue diff --git a/src/views/iot/rule/scene/components/sections/BasicInfoSection.vue b/src/views/iot/rule/scene/form/sections/BasicInfoSection.vue similarity index 100% rename from src/views/iot/rule/scene/components/sections/BasicInfoSection.vue rename to src/views/iot/rule/scene/form/sections/BasicInfoSection.vue diff --git a/src/views/iot/rule/scene/components/sections/PreviewSection.vue b/src/views/iot/rule/scene/form/sections/PreviewSection.vue similarity index 100% rename from src/views/iot/rule/scene/components/sections/PreviewSection.vue rename to src/views/iot/rule/scene/form/sections/PreviewSection.vue diff --git a/src/views/iot/rule/scene/components/sections/TriggerSection.vue b/src/views/iot/rule/scene/form/sections/TriggerSection.vue similarity index 100% rename from src/views/iot/rule/scene/components/sections/TriggerSection.vue rename to src/views/iot/rule/scene/form/sections/TriggerSection.vue diff --git a/src/views/iot/rule/scene/components/selectors/ActionTypeSelector.vue b/src/views/iot/rule/scene/form/selectors/ActionTypeSelector.vue similarity index 100% rename from src/views/iot/rule/scene/components/selectors/ActionTypeSelector.vue rename to src/views/iot/rule/scene/form/selectors/ActionTypeSelector.vue diff --git a/src/views/iot/rule/scene/components/selectors/OperatorSelector.vue b/src/views/iot/rule/scene/form/selectors/OperatorSelector.vue similarity index 100% rename from src/views/iot/rule/scene/components/selectors/OperatorSelector.vue rename to src/views/iot/rule/scene/form/selectors/OperatorSelector.vue diff --git a/src/views/iot/rule/scene/components/selectors/ProductDeviceSelector.vue b/src/views/iot/rule/scene/form/selectors/ProductDeviceSelector.vue similarity index 100% rename from src/views/iot/rule/scene/components/selectors/ProductDeviceSelector.vue rename to src/views/iot/rule/scene/form/selectors/ProductDeviceSelector.vue diff --git a/src/views/iot/rule/scene/components/selectors/PropertySelector.vue b/src/views/iot/rule/scene/form/selectors/PropertySelector.vue similarity index 100% rename from src/views/iot/rule/scene/components/selectors/PropertySelector.vue rename to src/views/iot/rule/scene/form/selectors/PropertySelector.vue diff --git a/src/views/iot/rule/scene/components/selectors/TriggerTypeSelector.vue b/src/views/iot/rule/scene/form/selectors/TriggerTypeSelector.vue similarity index 100% rename from src/views/iot/rule/scene/components/selectors/TriggerTypeSelector.vue rename to src/views/iot/rule/scene/form/selectors/TriggerTypeSelector.vue diff --git a/src/views/iot/rule/scene/components/selectors/types.ts b/src/views/iot/rule/scene/form/selectors/types.ts similarity index 100% rename from src/views/iot/rule/scene/components/selectors/types.ts rename to src/views/iot/rule/scene/form/selectors/types.ts diff --git a/src/views/iot/rule/scene/index.vue b/src/views/iot/rule/scene/index.vue index 075623529..3f6e175a8 100644 --- a/src/views/iot/rule/scene/index.vue +++ b/src/views/iot/rule/scene/index.vue @@ -248,7 +248,7 @@