|
|
@@ -0,0 +1,1101 @@
|
|
|
+# IoT场景联动规则表单设计思路文档
|
|
|
+
|
|
|
+## 概述
|
|
|
+
|
|
|
+本文档详细描述了IoT场景联动规则表单的设计思路,包括表单结构、组件设计、数据流转和用户交互逻辑。通过Mermaid图直观展示各个组件之间的关系和数据流向。
|
|
|
+
|
|
|
+## 表单整体架构设计
|
|
|
+
|
|
|
+### 1. 表单主体结构
|
|
|
+
|
|
|
+表单采用分步骤设计,包含以下主要部分:
|
|
|
+
|
|
|
+- **基础信息配置**:场景名称、描述、状态
|
|
|
+- **触发器配置**:设备触发或定时触发
|
|
|
+- **执行器配置**:设备控制或告警配置
|
|
|
+- **预览与保存**:配置预览和最终保存
|
|
|
+
|
|
|
+### 2. 组件层次结构图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ A[RuleSceneForm<br/>主表单组件] --> B[BasicInfoSection<br/>基础信息]
|
|
|
+ A --> C[TriggerSection<br/>触发器配置]
|
|
|
+ A --> D[ActionSection<br/>执行器配置]
|
|
|
+ A --> E[PreviewSection<br/>预览区域]
|
|
|
+
|
|
|
+ %% 基础信息组件
|
|
|
+ B --> B1[NameInput<br/>场景名称输入]
|
|
|
+ B --> B2[DescriptionInput<br/>场景描述输入]
|
|
|
+ B --> B3[StatusRadio<br/>状态选择]
|
|
|
+
|
|
|
+ %% 触发器配置组件
|
|
|
+ C --> C1[TriggerTypeSelector<br/>触发类型选择器]
|
|
|
+ C --> C2[DeviceTriggerConfig<br/>设备触发配置]
|
|
|
+ C --> C3[TimerTriggerConfig<br/>定时触发配置]
|
|
|
+
|
|
|
+ %% 设备触发配置子组件
|
|
|
+ C2 --> C21[ProductSelector<br/>产品选择器]
|
|
|
+ C2 --> C22[DeviceSelector<br/>设备选择器]
|
|
|
+ C2 --> C23[PropertySelector<br/>属性选择器]
|
|
|
+ C2 --> C24[OperatorSelector<br/>操作符选择器]
|
|
|
+ C2 --> C25[ValueInput<br/>值输入]
|
|
|
+ C2 --> C26[ConditionGroupConfig<br/>条件分组配置]
|
|
|
+
|
|
|
+ %% 定时触发配置子组件
|
|
|
+ C3 --> C31[CronInput<br/>CRON表达式输入]
|
|
|
+ C3 --> C32[CronBuilder<br/>可视化CRON构建器]
|
|
|
+ C3 --> C33[NextExecutionPreview<br/>下次执行时间预览]
|
|
|
+
|
|
|
+ %% 执行器配置组件
|
|
|
+ D --> D1[ActionTypeSelector<br/>执行类型选择器]
|
|
|
+ D --> D2[DeviceControlConfig<br/>设备控制配置]
|
|
|
+ D --> D3[AlertConfig<br/>告警配置]
|
|
|
+
|
|
|
+ %% 设备控制配置子组件
|
|
|
+ D2 --> D21[TargetProductSelector<br/>目标产品选择器]
|
|
|
+ D2 --> D22[TargetDeviceSelector<br/>目标设备选择器]
|
|
|
+ D2 --> D23[ControlTypeSelector<br/>控制类型选择器]
|
|
|
+ D2 --> D24[ParamsConfig<br/>参数配置]
|
|
|
+
|
|
|
+ %% 告警配置子组件
|
|
|
+ D3 --> D31[AlertConfigSelector<br/>告警配置选择器]
|
|
|
+
|
|
|
+ %% 预览区域组件
|
|
|
+ E --> E1[ConfigPreview<br/>配置预览]
|
|
|
+ E --> E2[ValidationResult<br/>验证结果]
|
|
|
+ E --> E3[SaveButton<br/>保存按钮]
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef mainComponent fill:#e1f5fe,stroke:#01579b,stroke-width:2px
|
|
|
+ classDef sectionComponent fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
|
|
|
+ classDef subComponent fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
|
|
|
+
|
|
|
+ class A mainComponent
|
|
|
+ class B,C,D,E sectionComponent
|
|
|
+ class B1,B2,B3,C1,C2,C3,C21,C22,C23,C24,C25,C26,C31,C32,C33,D1,D2,D3,D21,D22,D23,D24,D31,E1,E2,E3 subComponent
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 组件层次结构文本
|
|
|
+
|
|
|
+```text
|
|
|
+RuleSceneForm (主表单)
|
|
|
+├── BasicInfoSection (基础信息)
|
|
|
+│ ├── NameInput (场景名称输入)
|
|
|
+│ ├── DescriptionInput (场景描述输入)
|
|
|
+│ └── StatusRadio (状态选择)
|
|
|
+├── TriggerSection (触发器配置)
|
|
|
+│ ├── TriggerTypeSelector (触发类型选择)
|
|
|
+│ ├── DeviceTriggerConfig (设备触发配置)
|
|
|
+│ │ ├── ProductSelector (产品选择器)
|
|
|
+│ │ ├── DeviceSelector (设备选择器)
|
|
|
+│ │ ├── PropertySelector (属性选择器)
|
|
|
+│ │ ├── OperatorSelector (操作符选择器)
|
|
|
+│ │ ├── ValueInput (值输入)
|
|
|
+│ │ └── ConditionGroupConfig (条件分组配置)
|
|
|
+│ └── TimerTriggerConfig (定时触发配置)
|
|
|
+│ ├── CronInput (CRON表达式输入)
|
|
|
+│ ├── CronBuilder (可视化CRON构建器)
|
|
|
+│ └── NextExecutionPreview (下次执行时间预览)
|
|
|
+├── ActionSection (执行器配置)
|
|
|
+│ ├── ActionTypeSelector (执行类型选择)
|
|
|
+│ ├── DeviceControlConfig (设备控制配置)
|
|
|
+│ │ ├── TargetProductSelector (目标产品选择器)
|
|
|
+│ │ ├── TargetDeviceSelector (目标设备选择器)
|
|
|
+│ │ ├── ControlTypeSelector (控制类型选择器)
|
|
|
+│ │ └── ParamsConfig (参数配置)
|
|
|
+│ └── AlertConfig (告警配置)
|
|
|
+│ └── AlertConfigSelector (告警配置选择器)
|
|
|
+└── PreviewSection (预览区域)
|
|
|
+ ├── ConfigPreview (配置预览)
|
|
|
+ ├── ValidationResult (验证结果)
|
|
|
+ └── SaveButton (保存按钮)
|
|
|
+```
|
|
|
+
|
|
|
+## 表单数据结构设计
|
|
|
+
|
|
|
+### 1. 表单数据模型结构图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+classDiagram
|
|
|
+ class RuleSceneFormData {
|
|
|
+ +number id?
|
|
|
+ +string name
|
|
|
+ +string description?
|
|
|
+ +number status
|
|
|
+ +TriggerFormData[] triggers
|
|
|
+ +ActionFormData[] actions
|
|
|
+ +validateForm() boolean
|
|
|
+ +toApiFormat() ApiRequestData
|
|
|
+ }
|
|
|
+
|
|
|
+ class TriggerFormData {
|
|
|
+ +number type
|
|
|
+ +number productId?
|
|
|
+ +number deviceId?
|
|
|
+ +string identifier?
|
|
|
+ +string operator?
|
|
|
+ +string value?
|
|
|
+ +string cronExpression?
|
|
|
+ +ConditionGroupFormData[] conditionGroups?
|
|
|
+ +validateTrigger() boolean
|
|
|
+ +isDeviceTrigger() boolean
|
|
|
+ +isTimerTrigger() boolean
|
|
|
+ }
|
|
|
+
|
|
|
+ class ActionFormData {
|
|
|
+ +number type
|
|
|
+ +number productId?
|
|
|
+ +number deviceId?
|
|
|
+ +Record params?
|
|
|
+ +number alertConfigId?
|
|
|
+ +validateAction() boolean
|
|
|
+ +isDeviceAction() boolean
|
|
|
+ +isAlertAction() boolean
|
|
|
+ }
|
|
|
+
|
|
|
+ class ConditionGroupFormData {
|
|
|
+ +ConditionFormData[] conditions
|
|
|
+ +string logicOperator
|
|
|
+ +validateGroup() boolean
|
|
|
+ }
|
|
|
+
|
|
|
+ class ConditionFormData {
|
|
|
+ +number type
|
|
|
+ +number productId
|
|
|
+ +number deviceId
|
|
|
+ +string identifier
|
|
|
+ +string operator
|
|
|
+ +string param
|
|
|
+ +validateCondition() boolean
|
|
|
+ }
|
|
|
+
|
|
|
+ class TriggerTypeEnum {
|
|
|
+ <<enumeration>>
|
|
|
+ DEVICE_STATE_UPDATE: 1
|
|
|
+ DEVICE_PROPERTY_POST: 2
|
|
|
+ DEVICE_EVENT_POST: 3
|
|
|
+ DEVICE_SERVICE_INVOKE: 4
|
|
|
+ TIMER: 100
|
|
|
+ }
|
|
|
+
|
|
|
+ class ActionTypeEnum {
|
|
|
+ <<enumeration>>
|
|
|
+ DEVICE_PROPERTY_SET: 1
|
|
|
+ DEVICE_SERVICE_INVOKE: 2
|
|
|
+ ALERT_TRIGGER: 100
|
|
|
+ ALERT_RECOVER: 101
|
|
|
+ }
|
|
|
+
|
|
|
+ class OperatorEnum {
|
|
|
+ <<enumeration>>
|
|
|
+ EQUALS: "="
|
|
|
+ NOT_EQUALS: "!="
|
|
|
+ GREATER_THAN: ">"
|
|
|
+ LESS_THAN: "<"
|
|
|
+ IN: "in"
|
|
|
+ BETWEEN: "between"
|
|
|
+ }
|
|
|
+
|
|
|
+ RuleSceneFormData "1" --> "*" TriggerFormData : contains
|
|
|
+ RuleSceneFormData "1" --> "*" ActionFormData : contains
|
|
|
+ TriggerFormData "1" --> "*" ConditionGroupFormData : contains
|
|
|
+ ConditionGroupFormData "1" --> "*" ConditionFormData : contains
|
|
|
+ TriggerFormData --> TriggerTypeEnum : uses
|
|
|
+ ActionFormData --> ActionTypeEnum : uses
|
|
|
+ ConditionFormData --> OperatorEnum : uses
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 表单数据模型代码
|
|
|
+
|
|
|
+```typescript
|
|
|
+interface RuleSceneFormData {
|
|
|
+ // 基础信息
|
|
|
+ id?: number;
|
|
|
+ name: string;
|
|
|
+ description?: string;
|
|
|
+ status: number;
|
|
|
+
|
|
|
+ // 触发器配置
|
|
|
+ triggers: TriggerFormData[];
|
|
|
+
|
|
|
+ // 执行器配置
|
|
|
+ actions: ActionFormData[];
|
|
|
+}
|
|
|
+
|
|
|
+interface TriggerFormData {
|
|
|
+ type: number;
|
|
|
+ productId?: number;
|
|
|
+ deviceId?: number;
|
|
|
+ identifier?: string;
|
|
|
+ operator?: string;
|
|
|
+ value?: string;
|
|
|
+ cronExpression?: string;
|
|
|
+ conditionGroups?: ConditionGroupFormData[];
|
|
|
+}
|
|
|
+
|
|
|
+interface ActionFormData {
|
|
|
+ type: number;
|
|
|
+ productId?: number;
|
|
|
+ deviceId?: number;
|
|
|
+ params?: Record<string, any>;
|
|
|
+ alertConfigId?: number;
|
|
|
+}
|
|
|
+
|
|
|
+interface ConditionGroupFormData {
|
|
|
+ conditions: ConditionFormData[];
|
|
|
+ logicOperator: 'AND' | 'OR';
|
|
|
+}
|
|
|
+
|
|
|
+interface ConditionFormData {
|
|
|
+ type: number;
|
|
|
+ productId: number;
|
|
|
+ deviceId: number;
|
|
|
+ identifier: string;
|
|
|
+ operator: string;
|
|
|
+ param: string;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 表单验证规则
|
|
|
+
|
|
|
+```typescript
|
|
|
+const validationRules = {
|
|
|
+ name: [
|
|
|
+ { required: true, message: '场景名称不能为空' },
|
|
|
+ { max: 50, message: '场景名称不能超过50个字符' }
|
|
|
+ ],
|
|
|
+ status: [
|
|
|
+ { required: true, message: '场景状态不能为空' },
|
|
|
+ { type: 'enum', enum: [0, 1], message: '状态值必须为0或1' }
|
|
|
+ ],
|
|
|
+ triggers: [
|
|
|
+ { required: true, message: '触发器配置不能为空' },
|
|
|
+ { type: 'array', min: 1, message: '至少需要一个触发器' }
|
|
|
+ ],
|
|
|
+ actions: [
|
|
|
+ { required: true, message: '执行器配置不能为空' },
|
|
|
+ { type: 'array', min: 1, message: '至少需要一个执行器' }
|
|
|
+ ]
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+## 核心组件设计
|
|
|
+
|
|
|
+### 1. 基础信息组件 (BasicInfoSection)
|
|
|
+
|
|
|
+```vue
|
|
|
+<template>
|
|
|
+ <el-card class="basic-info-section">
|
|
|
+ <template #header>
|
|
|
+ <span>基础信息</span>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-form :model="formData" :rules="rules" label-width="120px">
|
|
|
+ <el-form-item label="场景名称" prop="name">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.name"
|
|
|
+ placeholder="请输入场景名称"
|
|
|
+ maxlength="50"
|
|
|
+ show-word-limit
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="场景描述" prop="description">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.description"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入场景描述"
|
|
|
+ :rows="3"
|
|
|
+ maxlength="200"
|
|
|
+ show-word-limit
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="场景状态" prop="status">
|
|
|
+ <el-radio-group v-model="formData.status">
|
|
|
+ <el-radio :label="0">开启</el-radio>
|
|
|
+ <el-radio :label="1">关闭</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-card>
|
|
|
+</template>
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 触发器配置组件 (TriggerSection)
|
|
|
+
|
|
|
+```vue
|
|
|
+<template>
|
|
|
+ <el-card class="trigger-section">
|
|
|
+ <template #header>
|
|
|
+ <div class="section-header">
|
|
|
+ <span>触发器配置</span>
|
|
|
+ <el-button type="primary" size="small" @click="addTrigger">
|
|
|
+ <el-icon><Plus /></el-icon>
|
|
|
+ 添加触发器
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <div v-for="(trigger, index) in triggers" :key="index" class="trigger-item">
|
|
|
+ <div class="trigger-header">
|
|
|
+ <span>触发器 {{ index + 1 }}</span>
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ text
|
|
|
+ @click="removeTrigger(index)"
|
|
|
+ v-if="triggers.length > 1"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 触发类型选择 -->
|
|
|
+ <TriggerTypeSelector v-model="trigger.type" @change="onTriggerTypeChange(trigger, $event)" />
|
|
|
+
|
|
|
+ <!-- 设备触发配置 -->
|
|
|
+ <DeviceTriggerConfig
|
|
|
+ v-if="isDeviceTrigger(trigger.type)"
|
|
|
+ v-model="trigger"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 定时触发配置 -->
|
|
|
+ <TimerTriggerConfig
|
|
|
+ v-if="trigger.type === TriggerType.TIMER"
|
|
|
+ v-model="trigger.cronExpression"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+</template>
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 执行器配置组件 (ActionSection)
|
|
|
+
|
|
|
+```vue
|
|
|
+<template>
|
|
|
+ <el-card class="action-section">
|
|
|
+ <template #header>
|
|
|
+ <div class="section-header">
|
|
|
+ <span>执行器配置</span>
|
|
|
+ <el-button type="primary" size="small" @click="addAction">
|
|
|
+ <el-icon><Plus /></el-icon>
|
|
|
+ 添加执行器
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <div v-for="(action, index) in actions" :key="index" class="action-item">
|
|
|
+ <div class="action-header">
|
|
|
+ <span>执行器 {{ index + 1 }}</span>
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ text
|
|
|
+ @click="removeAction(index)"
|
|
|
+ v-if="actions.length > 1"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 执行类型选择 -->
|
|
|
+ <ActionTypeSelector v-model="action.type" @change="onActionTypeChange(action, $event)" />
|
|
|
+
|
|
|
+ <!-- 设备控制配置 -->
|
|
|
+ <DeviceControlConfig
|
|
|
+ v-if="isDeviceAction(action.type)"
|
|
|
+ v-model="action"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 告警配置 -->
|
|
|
+ <AlertConfig
|
|
|
+ v-if="isAlertAction(action.type)"
|
|
|
+ v-model="action.alertConfigId"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+</template>
|
|
|
+```
|
|
|
+
|
|
|
+## 表单交互流程设计
|
|
|
+
|
|
|
+### 1. 表单初始化流程图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart TD
|
|
|
+ A[页面加载] --> B[初始化表单数据结构]
|
|
|
+ B --> C[获取基础数据]
|
|
|
+ C --> C1[加载产品列表]
|
|
|
+ C --> C2[加载告警配置列表]
|
|
|
+ C --> C3[加载用户权限信息]
|
|
|
+ C1 --> D[表单渲染]
|
|
|
+ C2 --> D
|
|
|
+ C3 --> D
|
|
|
+ D --> E[建立双向数据绑定]
|
|
|
+ E --> F[表单就绪]
|
|
|
+
|
|
|
+ %% 错误处理
|
|
|
+ C --> G{数据加载失败?}
|
|
|
+ G -->|是| H[显示错误信息]
|
|
|
+ G -->|否| D
|
|
|
+ H --> I[提供重试选项]
|
|
|
+ I --> C
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 触发器配置流程图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart TD
|
|
|
+ A[开始配置触发器] --> B[选择触发类型]
|
|
|
+ B --> C{触发类型}
|
|
|
+
|
|
|
+ %% 设备触发分支
|
|
|
+ C -->|设备触发| D[设备触发配置]
|
|
|
+ D --> D1[选择产品]
|
|
|
+ D1 --> D2[加载设备列表]
|
|
|
+ D2 --> D3[选择设备]
|
|
|
+ D3 --> D4[加载物模型]
|
|
|
+ D4 --> D5[选择属性/事件]
|
|
|
+ D5 --> D6[选择操作符]
|
|
|
+ D6 --> D7[输入比较值]
|
|
|
+ D7 --> D8[配置条件分组]
|
|
|
+ D8 --> E[触发器配置完成]
|
|
|
+
|
|
|
+ %% 定时触发分支
|
|
|
+ C -->|定时触发| F[定时触发配置]
|
|
|
+ F --> F1[输入CRON表达式]
|
|
|
+ F1 --> F2{表达式格式}
|
|
|
+ F2 -->|正确| F3[显示下次执行时间]
|
|
|
+ F2 -->|错误| F4[显示错误提示]
|
|
|
+ F4 --> F5[提供可视化编辑器]
|
|
|
+ F5 --> F1
|
|
|
+ F3 --> E
|
|
|
+
|
|
|
+ %% 验证
|
|
|
+ E --> G[验证触发器配置]
|
|
|
+ G --> H{验证通过?}
|
|
|
+ H -->|是| I[保存触发器配置]
|
|
|
+ H -->|否| J[显示验证错误]
|
|
|
+ J --> D
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 执行器配置流程图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart TD
|
|
|
+ A[开始配置执行器] --> B[选择执行类型]
|
|
|
+ B --> C{执行类型}
|
|
|
+
|
|
|
+ %% 设备控制分支
|
|
|
+ C -->|设备控制| D[设备控制配置]
|
|
|
+ D --> D1[选择目标产品]
|
|
|
+ D1 --> D2[加载目标设备列表]
|
|
|
+ D2 --> D3[选择目标设备]
|
|
|
+ D3 --> D4[选择控制类型]
|
|
|
+ D4 --> D5{控制类型}
|
|
|
+ D5 -->|属性设置| D6[配置属性参数]
|
|
|
+ D5 -->|服务调用| D7[配置服务参数]
|
|
|
+ D6 --> E[执行器配置完成]
|
|
|
+ D7 --> E
|
|
|
+
|
|
|
+ %% 告警分支
|
|
|
+ C -->|告警触发/恢复| F[告警配置]
|
|
|
+ F --> F1[选择告警配置项]
|
|
|
+ F1 --> F2[配置告警参数]
|
|
|
+ F2 --> E
|
|
|
+
|
|
|
+ %% 验证
|
|
|
+ E --> G[验证执行器配置]
|
|
|
+ G --> H{验证通过?}
|
|
|
+ H -->|是| I[保存执行器配置]
|
|
|
+ H -->|否| J[显示验证错误]
|
|
|
+ J --> D
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 表单提交流程图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart TD
|
|
|
+ A[用户点击保存] --> B[表单验证]
|
|
|
+ B --> C{验证通过?}
|
|
|
+ C -->|否| D[显示验证错误]
|
|
|
+ D --> E[用户修正错误]
|
|
|
+ E --> B
|
|
|
+
|
|
|
+ C -->|是| F[数据转换]
|
|
|
+ F --> G[转换为API格式]
|
|
|
+ G --> H[提交请求]
|
|
|
+ H --> I{请求成功?}
|
|
|
+
|
|
|
+ I -->|是| J[显示成功消息]
|
|
|
+ J --> K[跳转到列表页面]
|
|
|
+
|
|
|
+ I -->|否| L[显示错误消息]
|
|
|
+ L --> M[提供重试选项]
|
|
|
+ M --> H
|
|
|
+
|
|
|
+ %% 加载状态
|
|
|
+ H --> N[显示加载状态]
|
|
|
+ N --> I
|
|
|
+```
|
|
|
+
|
|
|
+### 5. 数据流转图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart LR
|
|
|
+ A[用户输入] --> B[表单组件]
|
|
|
+ B --> C[数据验证]
|
|
|
+ C --> D[状态管理]
|
|
|
+ D --> E[API调用]
|
|
|
+ E --> F[后端处理]
|
|
|
+ F --> G[数据库存储]
|
|
|
+
|
|
|
+ %% 反向数据流
|
|
|
+ G --> H[响应数据]
|
|
|
+ H --> I[状态更新]
|
|
|
+ I --> J[UI更新]
|
|
|
+ J --> K[用户反馈]
|
|
|
+
|
|
|
+ %% 错误处理流
|
|
|
+ C --> L{验证失败?}
|
|
|
+ L -->|是| M[错误提示]
|
|
|
+ M --> A
|
|
|
+
|
|
|
+ E --> N{请求失败?}
|
|
|
+ N -->|是| O[错误处理]
|
|
|
+ O --> K
|
|
|
+```
|
|
|
+
|
|
|
+## 组件状态管理设计
|
|
|
+
|
|
|
+### 1. 状态管理架构图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ A[全局状态管理] --> B[表单状态]
|
|
|
+ A --> C[UI状态]
|
|
|
+ A --> D[数据缓存状态]
|
|
|
+
|
|
|
+ %% 表单状态
|
|
|
+ B --> B1[formData<br/>表单数据]
|
|
|
+ B --> B2[validationErrors<br/>验证错误]
|
|
|
+ B --> B3[isDirty<br/>数据变更标识]
|
|
|
+ B --> B4[isSubmitting<br/>提交状态]
|
|
|
+
|
|
|
+ %% UI状态
|
|
|
+ C --> C1[loading<br/>加载状态]
|
|
|
+ C --> C2[activeStep<br/>当前步骤]
|
|
|
+ C --> C3[expandedSections<br/>展开的区域]
|
|
|
+ C --> C4[modalVisible<br/>弹窗显示状态]
|
|
|
+
|
|
|
+ %% 数据缓存状态
|
|
|
+ D --> D1[productList<br/>产品列表]
|
|
|
+ D --> D2[deviceList<br/>设备列表]
|
|
|
+ D --> D3[thingModelList<br/>物模型列表]
|
|
|
+ D --> D4[alertConfigList<br/>告警配置列表]
|
|
|
+
|
|
|
+ %% 状态操作
|
|
|
+ E[状态操作] --> E1[updateFormData<br/>更新表单数据]
|
|
|
+ E --> E2[validateForm<br/>验证表单]
|
|
|
+ E --> E3[resetForm<br/>重置表单]
|
|
|
+ E --> E4[submitForm<br/>提交表单]
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef stateClass fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
|
|
|
+ classDef actionClass fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
|
|
|
+
|
|
|
+ class A,B,C,D stateClass
|
|
|
+ class E,E1,E2,E3,E4 actionClass
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 组件通信图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+sequenceDiagram
|
|
|
+ participant U as User
|
|
|
+ participant F as FormComponent
|
|
|
+ participant T as TriggerSection
|
|
|
+ participant A as ActionSection
|
|
|
+ participant S as StateManager
|
|
|
+ participant API as BackendAPI
|
|
|
+
|
|
|
+ U->>F: 填写基础信息
|
|
|
+ F->>S: updateFormData(basicInfo)
|
|
|
+ S-->>F: 状态更新完成
|
|
|
+
|
|
|
+ U->>T: 配置触发器
|
|
|
+ T->>S: updateTriggers(triggerData)
|
|
|
+ S->>API: loadDeviceList(productId)
|
|
|
+ API-->>S: 返回设备列表
|
|
|
+ S-->>T: 更新设备选项
|
|
|
+
|
|
|
+ U->>A: 配置执行器
|
|
|
+ A->>S: updateActions(actionData)
|
|
|
+ S-->>A: 状态更新完成
|
|
|
+
|
|
|
+ U->>F: 点击保存
|
|
|
+ F->>S: validateForm()
|
|
|
+ S-->>F: 验证结果
|
|
|
+
|
|
|
+ alt 验证通过
|
|
|
+ F->>S: submitForm()
|
|
|
+ S->>API: saveRuleScene(formData)
|
|
|
+ API-->>S: 保存结果
|
|
|
+ S-->>F: 显示成功消息
|
|
|
+ else 验证失败
|
|
|
+ S-->>F: 显示错误信息
|
|
|
+ end
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 数据流向图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart LR
|
|
|
+ A[用户操作] --> B[组件事件]
|
|
|
+ B --> C[状态更新]
|
|
|
+ C --> D[数据验证]
|
|
|
+ D --> E{验证通过?}
|
|
|
+
|
|
|
+ E -->|是| F[更新状态]
|
|
|
+ E -->|否| G[显示错误]
|
|
|
+
|
|
|
+ F --> H[触发副作用]
|
|
|
+ H --> I[API调用]
|
|
|
+ I --> J[更新缓存]
|
|
|
+ J --> K[UI重新渲染]
|
|
|
+
|
|
|
+ G --> L[用户修正]
|
|
|
+ L --> A
|
|
|
+
|
|
|
+ %% 样式
|
|
|
+ classDef processClass fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
|
|
|
+ classDef decisionClass fill:#fff3e0,stroke:#f57c00,stroke-width:2px
|
|
|
+ classDef errorClass fill:#ffebee,stroke:#d32f2f,stroke-width:2px
|
|
|
+
|
|
|
+ class A,B,C,D,F,H,I,J,K,L processClass
|
|
|
+ class E decisionClass
|
|
|
+ class G errorClass
|
|
|
+```
|
|
|
+
|
|
|
+## 用户体验优化
|
|
|
+
|
|
|
+### 1. 智能提示和帮助
|
|
|
+
|
|
|
+- **字段说明**:为复杂字段提供详细说明和示例
|
|
|
+- **实时验证**:输入时实时验证数据格式
|
|
|
+- **智能推荐**:根据已选择的产品推荐相关设备
|
|
|
+- **预览功能**:实时预览配置效果
|
|
|
+
|
|
|
+### 2. 错误处理和反馈
|
|
|
+
|
|
|
+- **表单验证**:清晰的错误提示信息
|
|
|
+- **数据加载**:加载状态和错误重试机制
|
|
|
+- **保存反馈**:明确的成功/失败反馈
|
|
|
+
|
|
|
+### 3. 操作便利性
|
|
|
+
|
|
|
+- **批量操作**:支持批量添加/删除触发器和执行器
|
|
|
+- **模板功能**:提供常用场景模板
|
|
|
+- **导入导出**:支持配置的导入和导出
|
|
|
+
|
|
|
+## 响应式设计考虑
|
|
|
+
|
|
|
+### 1. 移动端适配
|
|
|
+
|
|
|
+- **布局调整**:在小屏幕上采用垂直布局
|
|
|
+- **操作优化**:增大点击区域,优化触摸操作
|
|
|
+- **内容精简**:在移动端隐藏非必要信息
|
|
|
+
|
|
|
+### 2. 不同屏幕尺寸适配
|
|
|
+
|
|
|
+- **大屏幕**:充分利用空间,并排显示更多内容
|
|
|
+- **中等屏幕**:平衡内容密度和可读性
|
|
|
+- **小屏幕**:优先显示核心功能
|
|
|
+
|
|
|
+## 性能优化策略
|
|
|
+
|
|
|
+### 1. 组件懒加载
|
|
|
+
|
|
|
+```javascript
|
|
|
+// 懒加载复杂组件
|
|
|
+const DeviceTriggerConfig = defineAsyncComponent(() =>
|
|
|
+ import('./components/DeviceTriggerConfig.vue')
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 数据缓存
|
|
|
+
|
|
|
+```javascript
|
|
|
+// 缓存产品和设备数据
|
|
|
+const productCache = new Map();
|
|
|
+const deviceCache = new Map();
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 防抖处理
|
|
|
+
|
|
|
+```javascript
|
|
|
+// 搜索防抖
|
|
|
+const debouncedSearch = debounce(searchDevices, 300);
|
|
|
+```
|
|
|
+
|
|
|
+## 可访问性设计
|
|
|
+
|
|
|
+### 1. 键盘导航
|
|
|
+
|
|
|
+- 支持Tab键在表单元素间导航
|
|
|
+- 提供快捷键操作
|
|
|
+
|
|
|
+### 2. 屏幕阅读器支持
|
|
|
+
|
|
|
+- 为表单元素提供适当的标签
|
|
|
+- 使用ARIA属性增强可访问性
|
|
|
+
|
|
|
+### 3. 颜色和对比度
|
|
|
+
|
|
|
+- 确保足够的颜色对比度
|
|
|
+- 不仅依赖颜色传达信息
|
|
|
+
|
|
|
+## 表单验证策略
|
|
|
+
|
|
|
+### 1. 验证层次结构图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ A[表单验证] --> B[字段级验证]
|
|
|
+ A --> C[组件级验证]
|
|
|
+ A --> D[表单级验证]
|
|
|
+ A --> E[业务级验证]
|
|
|
+
|
|
|
+ %% 字段级验证
|
|
|
+ B --> B1[必填验证]
|
|
|
+ B --> B2[格式验证]
|
|
|
+ B --> B3[长度验证]
|
|
|
+ B --> B4[类型验证]
|
|
|
+
|
|
|
+ %% 组件级验证
|
|
|
+ C --> C1[触发器验证]
|
|
|
+ C --> C2[执行器验证]
|
|
|
+ C --> C3[条件组合验证]
|
|
|
+
|
|
|
+ %% 表单级验证
|
|
|
+ D --> D1[数据完整性验证]
|
|
|
+ D --> D2[逻辑一致性验证]
|
|
|
+ D --> D3[依赖关系验证]
|
|
|
+
|
|
|
+ %% 业务级验证
|
|
|
+ E --> E1[设备权限验证]
|
|
|
+ E --> E2[产品可用性验证]
|
|
|
+ E --> E3[规则冲突验证]
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef levelClass fill:#e1f5fe,stroke:#01579b,stroke-width:2px
|
|
|
+ classDef validationClass fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
|
|
|
+
|
|
|
+ class A levelClass
|
|
|
+ class B,C,D,E levelClass
|
|
|
+ class B1,B2,B3,B4,C1,C2,C3,D1,D2,D3,E1,E2,E3 validationClass
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 验证时机图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+stateDiagram-v2
|
|
|
+ [*] --> 字段输入
|
|
|
+ 字段输入 --> 实时验证: onChange
|
|
|
+ 实时验证 --> 显示错误: 验证失败
|
|
|
+ 实时验证 --> 清除错误: 验证通过
|
|
|
+ 显示错误 --> 字段输入: 用户修正
|
|
|
+ 清除错误 --> 字段输入: 继续输入
|
|
|
+
|
|
|
+ 字段输入 --> 失焦验证: onBlur
|
|
|
+ 失焦验证 --> 显示警告: 格式错误
|
|
|
+ 失焦验证 --> 正常状态: 格式正确
|
|
|
+ 显示警告 --> 字段输入: 重新聚焦
|
|
|
+ 正常状态 --> 字段输入: 重新聚焦
|
|
|
+
|
|
|
+ 字段输入 --> 表单提交: 用户提交
|
|
|
+ 表单提交 --> 全量验证
|
|
|
+ 全量验证 --> 提交成功: 验证通过
|
|
|
+ 全量验证 --> 显示错误: 验证失败
|
|
|
+ 提交成功 --> [*]
|
|
|
+ 显示错误 --> 字段输入: 用户修正
|
|
|
+```
|
|
|
+
|
|
|
+## 测试策略
|
|
|
+
|
|
|
+### 1. 测试金字塔图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ A[测试金字塔] --> B[单元测试<br/>Unit Tests<br/>70%]
|
|
|
+ A --> C[集成测试<br/>Integration Tests<br/>20%]
|
|
|
+ A --> D[端到端测试<br/>E2E Tests<br/>10%]
|
|
|
+
|
|
|
+ %% 单元测试详细
|
|
|
+ B --> B1[组件渲染测试]
|
|
|
+ B --> B2[数据验证逻辑测试]
|
|
|
+ B --> B3[用户交互测试]
|
|
|
+ B --> B4[工具函数测试]
|
|
|
+
|
|
|
+ %% 集成测试详细
|
|
|
+ C --> C1[表单提交流程测试]
|
|
|
+ C --> C2[API调用测试]
|
|
|
+ C --> C3[数据转换测试]
|
|
|
+ C --> C4[组件间通信测试]
|
|
|
+
|
|
|
+ %% 端到端测试详细
|
|
|
+ D --> D1[完整用户流程测试]
|
|
|
+ D --> D2[浏览器兼容性测试]
|
|
|
+ D --> D3[响应式设计测试]
|
|
|
+ D --> D4[性能测试]
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef pyramidClass fill:#e8f5e8,stroke:#2e7d32,stroke-width:3px
|
|
|
+ classDef unitClass fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
|
|
|
+ classDef integrationClass fill:#fff3e0,stroke:#f57c00,stroke-width:2px
|
|
|
+ classDef e2eClass fill:#ffebee,stroke:#d32f2f,stroke-width:2px
|
|
|
+
|
|
|
+ class A pyramidClass
|
|
|
+ class B,B1,B2,B3,B4 unitClass
|
|
|
+ class C,C1,C2,C3,C4 integrationClass
|
|
|
+ class D,D1,D2,D3,D4 e2eClass
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 测试用例覆盖图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+mindmap
|
|
|
+ root((测试用例覆盖))
|
|
|
+ 功能测试
|
|
|
+ 基础信息
|
|
|
+ 名称输入验证
|
|
|
+ 描述输入验证
|
|
|
+ 状态切换测试
|
|
|
+ 触发器配置
|
|
|
+ 设备触发配置
|
|
|
+ 定时触发配置
|
|
|
+ 条件组合测试
|
|
|
+ 执行器配置
|
|
|
+ 设备控制配置
|
|
|
+ 告警配置测试
|
|
|
+ 表单提交
|
|
|
+ 验证流程测试
|
|
|
+ 保存流程测试
|
|
|
+
|
|
|
+ 异常测试
|
|
|
+ 网络异常
|
|
|
+ API调用失败
|
|
|
+ 超时处理
|
|
|
+ 数据异常
|
|
|
+ 格式错误处理
|
|
|
+ 空数据处理
|
|
|
+ 用户异常
|
|
|
+ 权限不足
|
|
|
+ 操作冲突
|
|
|
+
|
|
|
+ 性能测试
|
|
|
+ 加载性能
|
|
|
+ 首屏加载时间
|
|
|
+ 组件渲染性能
|
|
|
+ 交互性能
|
|
|
+ 表单响应速度
|
|
|
+ 数据处理性能
|
|
|
+ 内存性能
|
|
|
+ 内存泄漏检测
|
|
|
+ 组件销毁测试
|
|
|
+
|
|
|
+ 兼容性测试
|
|
|
+ 浏览器兼容
|
|
|
+ Chrome测试
|
|
|
+ Firefox测试
|
|
|
+ Safari测试
|
|
|
+ Edge测试
|
|
|
+ 设备兼容
|
|
|
+ 桌面端测试
|
|
|
+ 平板端测试
|
|
|
+ 移动端测试
|
|
|
+```
|
|
|
+
|
|
|
+## 表单设计架构总览
|
|
|
+
|
|
|
+### 完整架构图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ %% 用户界面层
|
|
|
+ subgraph "用户界面层 (UI Layer)"
|
|
|
+ A[RuleSceneForm 主表单]
|
|
|
+ B[BasicInfoSection 基础信息]
|
|
|
+ C[TriggerSection 触发器配置]
|
|
|
+ D[ActionSection 执行器配置]
|
|
|
+ E[PreviewSection 预览区域]
|
|
|
+ end
|
|
|
+
|
|
|
+ %% 状态管理层
|
|
|
+ subgraph "状态管理层 (State Management)"
|
|
|
+ F[FormState 表单状态]
|
|
|
+ G[ValidationState 验证状态]
|
|
|
+ H[UIState 界面状态]
|
|
|
+ I[CacheState 缓存状态]
|
|
|
+ end
|
|
|
+
|
|
|
+ %% 业务逻辑层
|
|
|
+ subgraph "业务逻辑层 (Business Logic)"
|
|
|
+ J[FormValidator 表单验证器]
|
|
|
+ K[DataTransformer 数据转换器]
|
|
|
+ L[ConfigBuilder 配置构建器]
|
|
|
+ M[RuleEngine 规则引擎]
|
|
|
+ end
|
|
|
+
|
|
|
+ %% 数据访问层
|
|
|
+ subgraph "数据访问层 (Data Access)"
|
|
|
+ N[ProductAPI 产品接口]
|
|
|
+ O[DeviceAPI 设备接口]
|
|
|
+ P[RuleSceneAPI 规则场景接口]
|
|
|
+ Q[AlertAPI 告警接口]
|
|
|
+ end
|
|
|
+
|
|
|
+ %% 工具层
|
|
|
+ subgraph "工具层 (Utilities)"
|
|
|
+ R[CronValidator CRON验证器]
|
|
|
+ S[TypeChecker 类型检查器]
|
|
|
+ T[ErrorHandler 错误处理器]
|
|
|
+ U[Logger 日志记录器]
|
|
|
+ end
|
|
|
+
|
|
|
+ %% 连接关系
|
|
|
+ A --> B
|
|
|
+ A --> C
|
|
|
+ A --> D
|
|
|
+ A --> E
|
|
|
+
|
|
|
+ B --> F
|
|
|
+ C --> F
|
|
|
+ D --> F
|
|
|
+ E --> F
|
|
|
+
|
|
|
+ F --> J
|
|
|
+ G --> J
|
|
|
+ H --> K
|
|
|
+ I --> L
|
|
|
+
|
|
|
+ J --> M
|
|
|
+ K --> M
|
|
|
+ L --> M
|
|
|
+
|
|
|
+ M --> N
|
|
|
+ M --> O
|
|
|
+ M --> P
|
|
|
+ M --> Q
|
|
|
+
|
|
|
+ J --> R
|
|
|
+ K --> S
|
|
|
+ M --> T
|
|
|
+ A --> U
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef uiClass fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
|
|
|
+ classDef stateClass fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
|
|
|
+ classDef businessClass fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
|
|
|
+ classDef dataClass fill:#fff3e0,stroke:#f57c00,stroke-width:2px
|
|
|
+ classDef utilClass fill:#fce4ec,stroke:#c2185b,stroke-width:2px
|
|
|
+
|
|
|
+ class A,B,C,D,E uiClass
|
|
|
+ class F,G,H,I stateClass
|
|
|
+ class J,K,L,M businessClass
|
|
|
+ class N,O,P,Q dataClass
|
|
|
+ class R,S,T,U utilClass
|
|
|
+```
|
|
|
+
|
|
|
+### 设计原则总结
|
|
|
+
|
|
|
+```mermaid
|
|
|
+mindmap
|
|
|
+ root((表单设计原则))
|
|
|
+ 用户体验
|
|
|
+ 直观易用
|
|
|
+ 清晰的视觉层次
|
|
|
+ 一致的交互模式
|
|
|
+ 智能的操作提示
|
|
|
+ 响应迅速
|
|
|
+ 实时验证反馈
|
|
|
+ 快速数据加载
|
|
|
+ 流畅的动画效果
|
|
|
+ 错误友好
|
|
|
+ 明确的错误信息
|
|
|
+ 便捷的错误修正
|
|
|
+ 优雅的异常处理
|
|
|
+
|
|
|
+ 技术架构
|
|
|
+ 组件化设计
|
|
|
+ 高内聚低耦合
|
|
|
+ 可复用的组件
|
|
|
+ 清晰的组件边界
|
|
|
+ 状态管理
|
|
|
+ 集中式状态管理
|
|
|
+ 可预测的状态变更
|
|
|
+ 高效的状态同步
|
|
|
+ 数据流控制
|
|
|
+ 单向数据流
|
|
|
+ 明确的数据来源
|
|
|
+ 可追踪的数据变更
|
|
|
+
|
|
|
+ 质量保证
|
|
|
+ 代码质量
|
|
|
+ 类型安全
|
|
|
+ 代码规范
|
|
|
+ 充分的注释
|
|
|
+ 测试覆盖
|
|
|
+ 单元测试
|
|
|
+ 集成测试
|
|
|
+ 端到端测试
|
|
|
+ 性能优化
|
|
|
+ 懒加载
|
|
|
+ 缓存策略
|
|
|
+ 防抖节流
|
|
|
+
|
|
|
+ 可维护性
|
|
|
+ 模块化结构
|
|
|
+ 清晰的目录结构
|
|
|
+ 合理的文件组织
|
|
|
+ 明确的依赖关系
|
|
|
+ 文档完善
|
|
|
+ API文档
|
|
|
+ 组件文档
|
|
|
+ 使用说明
|
|
|
+ 扩展性设计
|
|
|
+ 插件化架构
|
|
|
+ 配置化开发
|
|
|
+ 版本兼容性
|
|
|
+```
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+IoT场景联动规则表单设计需要考虑:
|
|
|
+
|
|
|
+### 1. 核心设计要点
|
|
|
+
|
|
|
+- **复杂性管理**:通过组件化和分步骤设计降低复杂度
|
|
|
+- **用户体验**:提供直观的操作界面和智能提示
|
|
|
+- **数据完整性**:完善的验证机制确保数据质量
|
|
|
+- **扩展性**:模块化设计支持功能扩展
|
|
|
+- **性能优化**:合理的加载和缓存策略
|
|
|
+- **可访问性**:确保所有用户都能正常使用
|
|
|
+
|
|
|
+### 2. 技术实现要点
|
|
|
+
|
|
|
+- **状态管理**:采用集中式状态管理,确保数据流的可控性
|
|
|
+- **组件设计**:高内聚低耦合的组件架构,提高代码复用性
|
|
|
+- **验证策略**:多层次的验证机制,保证数据质量
|
|
|
+- **错误处理**:完善的错误处理和用户反馈机制
|
|
|
+- **性能优化**:懒加载、缓存、防抖等优化策略
|
|
|
+
|
|
|
+### 3. 质量保证
|
|
|
+
|
|
|
+- **测试覆盖**:完整的测试金字塔,确保代码质量
|
|
|
+- **文档完善**:详细的设计文档和使用说明
|
|
|
+- **代码规范**:统一的编码规范和类型安全
|
|
|
+
|
|
|
+通过以上设计思路和详细的Mermaid图表,可以构建一个功能完善、用户友好、技术先进的IoT场景联动规则配置表单系统。
|