# 连接配置页面使用指南 ## 📋 概述 全新的连接配置页面采用现代化设计,使用分组表单卡片 + 右侧摘要 + 底部粘性操作栏的布局,提供直观的配置管理体验。 ## 🎯 功能特性 ### ✨ 核心功能 - **分组表单管理**:4个配置分组(基础网络、MQTT、HTTP/回调、代理与安全) - **实时变更检测**:自动对比初始值,显示变更数量和状态 - **分组测试**:每个分组独立测试连接状态 - **发布前对比**:可视化显示配置差异,支持选择性发布 - **响应式布局**:完美适配桌面端和移动端 ### 🔧 技术特性 - **表单验证**:IP地址、URL、端口等格式校验 - **敏感值保护**:密钥等敏感字段默认掩码显示 - **文件上传**:支持证书文件上传,格式验证 - **Mock API**:完整的模拟后端接口,支持异步测试 ## 🏗️ 架构设计 ### 文件结构 ``` src/ ├── api/mock/ │ └── connection.js # Mock API 接口 ├── views/config/connectconf/ │ └── index.vue # 连接配置主页面 └── components/ # 通用组件 ├── XtGroupedFormCard/ # 分组表单卡片 ├── XtRightSummaryPanel/ # 右侧摘要面板 ├── XtStickyActionBar/ # 底部粘性操作栏 ├── XtTestConnectionDrawer/ # 测试连接抽屉 └── XtDiffPublishDialog/ # 差异发布对话框 ``` ### 组件关系图 ```mermaid graph TD A[连接配置页面] --> B[分组表单卡片] A --> C[右侧摘要面板] A --> D[底部操作栏] A --> E[测试连接抽屉] A --> F[发布确认对话框] B --> B1[基础网络] B --> B2[MQTT配置] B --> B3[HTTP/回调] B --> B4[代理与安全] C --> C1[统计信息] C --> C2[配置项列表] C --> C3[快速操作] D --> D1[保存草稿] D --> D2[测试全部] D --> D3[发布变更] D --> D4[回滚配置] ``` ## 📱 响应式设计 ### 断点设置 - **≥1440px**:两列卡片布局 + 右侧摘要面板 - **1280-1439px**:单列卡片布局 + 右侧摘要面板 - **<1280px**:单列卡片布局 + 顶部摘要按钮(抽屉形式) - **<768px**:移动端优化布局 ### 布局适配 ```scss // 大屏双列布局 @media (min-width: 1440px) { .form-groups { grid-template-columns: 1fr 1fr; } } // 中屏隐藏右侧面板 @media (max-width: 1279px) { .desktop-summary { display: none; } .mobile-only { display: block; } } // 移动端优化 @media (max-width: 768px) { .page-header { padding: var(--spacing-4); } .form-groups { gap: var(--spacing-4); } } ``` ## 🔧 配置字段说明 ### 1. 基础网络配置 | 字段名 | 类型 | 必填 | 校验规则 | 说明 | |--------|------|------|----------|------| | toolIp | String | ✅ | IP格式 | 工具机IP地址 | | serverIp | String | ✅ | IP格式 | 服务器IP地址 | | enableProxy | Boolean | - | - | 是否启用代理 | | netProxy | String | - | URL格式 | 网络代理地址 | ### 2. MQTT 配置 | 字段名 | 类型 | 必填 | 校验规则 | 说明 | |--------|------|------|----------|------| | mqttBroker | String | ✅ | MQTT URL格式 | MQTT代理地址 | | mqttProductId | String | ✅ | 3-50字符 | 产品ID | | mqttDeviceId | String | ✅ | 3-50字符 | 设备ID | | mqttSecret | String | ✅ | 最少8位 | 设备密钥(敏感字段) | ### 3. HTTP/回调 配置 | 字段名 | 类型 | 必填 | 校验规则 | 说明 | |--------|------|------|----------|------| | httpBase | String | ✅ | HTTP/HTTPS URL | HTTP基础地址 | | httpTimeout | Number | ✅ | 1000-300000 | 超时时间(毫秒) | ### 4. 代理与安全配置 | 字段名 | 类型 | 必填 | 校验规则 | 说明 | |--------|------|------|----------|------| | packetFilter | Boolean | - | - | 数据包过滤开关 | | certFile | File | - | 证书格式,<2MB | 证书文件 | ## 🧪 校验规则 ### IP地址验证 ```javascript const ipPattern = /^(25[0-5]|2[0-4]\d|1?\d?\d)(\.(25[0-5]|2[0-4]\d|1?\d?\d)){3}$/ ``` ### URL验证 ```javascript const urlPattern = /^https?:\/\/.+/ ``` ### MQTT地址验证 ```javascript const mqttPattern = /^mqtt:\/\/.+:\d+$/ ``` ### 端口范围验证 ```javascript const portRange = { min: 1, max: 65535 } ``` ## 🔄 交互流程 ### 1. 页面加载流程 ```mermaid sequenceDiagram participant U as 用户 participant P as 页面 participant A as Mock API U->>P: 访问连接配置页面 P->>A: 调用 getConfig() A-->>P: 返回当前配置和草稿 P->>P: 初始化表单数据 P->>P: 计算变更状态 P-->>U: 显示配置界面 ``` ### 2. 配置变更流程 ```mermaid sequenceDiagram participant U as 用户 participant P as 页面 participant S as 摘要面板 U->>P: 修改配置字段 P->>P: 触发字段验证 P->>P: 计算变更差异 P->>S: 更新摘要统计 S-->>U: 实时显示变更状态 ``` ### 3. 测试连接流程 ```mermaid sequenceDiagram participant U as 用户 participant P as 页面 participant D as 测试抽屉 participant A as Mock API U->>P: 点击"测试该组" P->>D: 打开测试抽屉 P->>A: 调用 testConnection() A-->>P: 返回测试日志 P->>D: 显示时间轴日志 D-->>U: 展示测试结果 ``` ### 4. 发布配置流程 ```mermaid sequenceDiagram participant U as 用户 participant P as 页面 participant Diff as 差异对话框 participant A as Mock API U->>P: 点击"发布" P->>P: 生成配置差异 P->>Diff: 显示差异对话框 U->>Diff: 选择要发布的字段 Diff->>A: 调用 publishConfig() A-->>Diff: 返回发布结果 Diff->>P: 更新原始数据 P-->>U: 显示发布成功 ``` ## 🎨 UI/UX 特性 ### 敏感值保护 ```javascript // 密钥字段默认掩码显示 showSecrets: { mqttSecret: false // 默认隐藏 } // 点击眼睛图标切换显示 toggleSecret(field) { this.showSecrets[field] = !this.showSecrets[field] } ``` ### 变更检测 ```javascript // 实时计算变更数量 dirtyCount() { let count = 0 Object.keys(this.formData).forEach(key => { if (JSON.stringify(this.formData[key]) !== JSON.stringify(this.originalData[key])) { count++ } }) return count } ``` ### 错误统计 ```javascript // 统计表单验证错误 errorCount() { let count = 0 const forms = ['networkForm', 'mqttForm', 'httpForm', 'securityForm'] forms.forEach(formName => { if (this.$refs[formName]) { this.$refs[formName].fields.forEach(field => { if (field.validateState === 'error') { count++ } }) } }) return count } ``` ## 📊 Mock API 说明 ### API 接口清单 | 接口名称 | 功能 | 延迟 | 失败率 | |----------|------|------|--------| | `getConfig()` | 获取配置 | 300ms | 0% | | `saveDraft()` | 保存草稿 | 500ms | 10% | | `publishConfig()` | 发布配置 | 1000ms | 5% | | `rollbackConfig()` | 回滚配置 | 800ms | 3% | | `testConnection()` | 测试连接 | 800-1500ms | 动态 | ### 测试日志格式 ```javascript { ts: 1640995200000, // 时间戳 step: '连接数据库', // 步骤名称 status: 'ok', // 状态: 'ok'|'warn'|'fail' cost: 120, // 耗时(ms) tip: '连接成功', // 提示信息 details: '详细日志信息...' // 详细信息(可选) } ``` ### 差异数据格式 ```javascript { key: 'database.host', // 配置键 name: '数据库主机', // 显示名称 path: 'config.database', // 配置路径 oldValue: 'localhost', // 原值 newValue: '192.168.1.100', // 新值 isChanged: true, // 是否变更 isNew: false, // 是否新增 isDeleted: false, // 是否删除 description: '主机地址变更' // 变更说明 } ``` ## 🚀 使用示例 ### 1. 基本使用 ```vue ``` ### 2. 测试连接 ```javascript // 测试单个分组 await this.testGroup('基础网络') // 测试所有分组 await this.handleTestAll() ``` ### 3. 配置发布 ```javascript // 获取配置差异 const diffs = getConfigDiffs(this.originalData, this.formData) // 发布选中的配置 await publishConfig(['toolIp', 'serverIp']) ``` ### 4. 主题适配 所有组件都自动支持明暗主题切换: ```javascript // 切换主题 window.toggleTheme() // 设置特定主题 window.setTheme('dark') // 或 'light', 'auto' ``` ## 🔧 自定义扩展 ### 1. 添加新的配置分组 ```vue ``` ### 2. 扩展验证规则 ```javascript formRules: { newField: [ { required: true, message: '请输入新字段', trigger: 'blur' }, { validator: customValidator, trigger: 'blur' } ] } ``` ### 3. 自定义测试步骤 ```javascript // 在 mock/connection.js 中添加 const testSteps = { '新分组': [ { name: '检查新配置', getTip: (status, config) => { return status === 'ok' ? '配置正确' : '配置错误' } } ] } ``` ## 🐛 常见问题 ### Q: 为什么表单验证不生效? **A**: 确保在 `handleFieldChange` 方法中正确映射了表单引用: ```javascript const formMap = { newField: 'newForm' // 添加新字段映射 } ``` ### Q: 如何添加新的敏感字段? **A**: 在 `showSecrets` 对象中添加字段,并在模板中使用 `show-password` 属性: ```javascript showSecrets: { newSecret: false } ``` ### Q: 移动端摘要面板不显示怎么办? **A**: 检查响应式断点设置,确保 `isMobile` 计算属性正确: ```javascript isMobile() { return this.windowWidth < 1280 } ``` ## 📞 技术支持 如有任何问题或建议,请联系前端开发团队。 **Happy Coding! 🎉**