
数据库开发者工具桌面应用CLIMCP 服务AI 应用【免费下载链接】dbx15MB轻量级跨平台数据库客户端、数据库管理工具。支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、DuckDB、ClickHouse、SQL Server 等。15MB, lightweight, cross-platform database client. Supports MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, ClickHouse, SQL Server and more.项目地址https://gitcode.com/t8y2/dbx点击查看免费下载本文以 MQTT 控制台优化需求文档 v1.3 为骨架结合 dbx 仓库前端组件、Rust 类型定义与云同步实现系统讲解 MQTT 控制台的架构重构、订阅配置生命周期、视觉规范以及跨设备同步契约。读完本文你将掌握如何把 MQTT 控制台从侧栏 Topic 树 页面的双入口收敛为右侧单一入口如何设计保存配置、启用配置、Broker 已确认订阅三者分离的状态模型如何让 WebDAV/GitHub 快照以明确字段携带订阅配置且不泄露认证秘密以及如何用一套可落地的验收标准驱动此类前端 后端重构。背景与目标MQTT Broker 通常只负责消息路由不提供客户端订阅配置的持久化管理。在 dbx 中用户保存的 Topic Filter、QoS、No Local、启用状态属于本地配置如果没有纳入项目同步重装系统、更换设备或恢复项目时这些配置很容易丢失。这正是本次优化要解决的核心痛点。本次优化的目标可归纳为七条左侧全局侧栏只保留MQTT 控制台入口不再承担订阅管理职责。右侧控制台统一管理全部订阅配置新建、编辑、启用、停用、删除。支持只保存配置、不立即订阅即保存备用配置。改善 Topic 列表与消息收发方向的视觉辨识度。WebDAV、GitHub 项目同步必须包含 MQTT 订阅配置。同步订阅配置不依赖同步密码/敏感信息选项——订阅本身不是秘密但秘密必须被剥离。下载旧快照时不得意外清空本地 MQTT 订阅配置。需求文档版本迭代到 v1.3本次新增的正是 WebDAV、GitHub 同步 MQTT 订阅配置这一契约设计文档同时作为开发基线文末附有实现状态标明当前仓库已完成的核心功能与尚待完善项。现有问题与现状判断控制台侧的问题清单需求文档对既有实现做了十二点体检它们构成了重构的动机MQTT 控制台节点同时承担页面入口和 Topic 父节点双重职责。单击控制台节点时容易执行展开/折叠而不是打开页面。MQTT Topic 没有右键功能。左侧 Topic 树和右侧控制台分别加载、缓存订阅数据存在双份状态。控制台订阅或取消订阅后侧栏没有同步刷新。保存订阅和当前订阅没有明确区分。保存配置后会直接订阅无法仅保存备用配置。MQTT 通配符订阅与实际消息 Topic 容易混淆。多个 Topic 行之间没有明显边界。Topic 字体较小、颜色较淡。接收消息缺少背景色与控制台底色不容易区分。已有控制台标签页可能无法响应外部目标 Topic 的变化。同步侧的现状判断需求文档特别强调了一个容易被忽略的事实当前同步快照已经包含连接配置而 MQTT 的savedTopics保存在连接的externalConfig中从数据结构上看现有同步可能已经间接携带了 MQTT 订阅。但间接携带不等于受保障的功能目前存在六项不足MQTT 订阅没有成为明确、独立的同步契约。缺少针对 WebDAV、GitHub 的 MQTT 订阅往返测试。无法明确区分旧快照没有订阅字段和用户明确清空全部订阅。新增的enabled状态尚未纳入同步兼容规则。MQTT 认证信息位于externalConfig必须确认不会因为同步订阅而泄露密码、证书私钥等敏感信息。下载快照采用连接元数据替换方式必须明确 MQTT 订阅覆盖规则。因此本次需求不是简单地假设现有同步已经支持而是把 MQTT 订阅同步正式定义为必须保障的功能并用显式字段、校验规则和回归测试来落地。整体信息架构左侧导航、右侧管理左侧全局侧栏左侧连接树只保留两级结构MQTT 连接 └─ MQTT 控制台约束如下不在MQTT 控制台节点下展开 Topic。单击直接打开或切换到对应 MQTT 控制台。不在左侧提供新建、刷新、启用、停用、删除订阅等功能。不再维护 MQTT Topic 的侧栏数据快照。不需要 MQTT Topic 右键菜单。一句话总结左侧全局侧栏仅负责页面导航不参与订阅状态管理。右侧 MQTT 控制台右侧控制台是 MQTT 业务操作和状态展示的唯一入口整体布局如下┌──────────────────────────────────────────────────────────┐ │ MQTT 控制台 刷新连接 清空消息 │ ├────────────────────┬─────────────────────────────────────┤ │ 订阅配置 │ 当前过滤器device//status │ │ [ 新建] [刷新] │ │ │ [搜索订阅配置] │ 消息列表 │ │ │ │ │ ● device/# │ │ │ ○ device//status ├─────────────────────────────────────┤ │ ! system/events/# │ 发布消息 │ └────────────────────┴─────────────────────────────────────┘右侧订阅区域负责新建订阅配置、编辑订阅配置、启用订阅、停用订阅、删除订阅配置、刷新订阅状态、搜索订阅配置、选择消息过滤器、展示 QoS、展示 No Local、展示订阅状态和错误信息。在仓库中这一职责由 MqttAdminConsole.vue 承担其同目录下的 TopicTreeNode.vue 负责订阅树节点渲染另有 MqttPublishDialog.vue 承载发布交互配套测试位于tests。四个关键概念与界面命名需求文档强调四类容易混淆的Topic概念界面文案必须逐一区分订阅配置Saved Subscription一条持久化配置包含Topic Filter、QoS、No Local、Enabled四个字段。配置可以保存但不启用界面主标题建议统一使用订阅配置。订阅过滤器Subscription Filter允许使用 MQTT 通配符例如device//status device/# system/events/#界面不要将订阅过滤器描述成 Broker 上全部存在的 Topic——过滤器是我想要什么Broker 的 Topic 是实际有什么。发布 TopicPublish Topic发布必须使用具体 Topic不能包含或#device/001/control实际消息 TopicMessage Topic接收或发送消息时展示实际 Topicdevice/001/status device/002/status例如当前过滤器为device//status时消息列表可以同时展示device/001/status和device/002/status。这属于正常 MQTT 匹配行为不是数据不一致。订阅配置数据模型与兼容规则需求文档给出了建议的数据结构仓库中已经落地为前后端两套对应定义interface MqttSavedTopic { topic: string; qos: MqttQoS; noLocal?: boolean; enabled: boolean; }前端定义位于 apps/desktop/src/types/mqtt.ts其中enabled的注释明确写着Whether the topic is restored and subscribed when the connection opens是否在连接打开时恢复并订阅该 Topic。Rust 侧对应定义位于 crates/dbx-types/src/mqtt.rs采用serde(rename_all camelCase)与前端 JSON 字段对齐#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all camelCase)] pub struct MqttSavedTopic { pub topic: String, #[serde(default)] pub qos: MqttQoS, #[serde(default)] pub no_local: bool, /// Whether this saved subscription should be restored and subscribed on connect. /// Missing values from older configs are treated as enabled. #[serde(default default_saved_topic_enabled)] pub enabled: bool, }字段语义字段含义topicMQTT Topic Filterqos请求的订阅 QoSnoLocal是否禁止 Broker 将本客户端发布的消息转发回来MQTT 5.0 No Localenabled是否启用、立即订阅并在重连时自动恢复兼容规则两个默认值enabled 缺失 → true noLocal 缺失 → falseRust 侧通过#[serde(default default_saved_topic_enabled)]实现历史配置缺少 enabled 按启用处理默认函数返回trueqos同样带#[serde(default)]其默认枚举值在 crates/dbx-types/src/mqtt.rs 中定义为AtMostOnceQoS 0。另外Topic Filter 大小写敏感不得转换大小写。自动恢复规则建立或恢复 MQTT 连接时enabled true自动发送订阅请求。enabled false只保留配置不发送订阅请求。恢复订阅时必须使用原有的 Topic Filter、QoS 和 No Local不能回退到默认值。新建订阅配置交互形式采用与 Redis 新增操作一致的模态弹出对话框。不使用新标签页、内联展开卡片或侧栏右键表单。入口位于右侧订阅配置栏的 新建按钮。弹窗布局┌────────────── 新建订阅配置 ──────────────┐ │ │ │ Topic Filter │ │ [ device//status ] │ │ 支持单层通配符 和多层通配符 # │ │ │ │ QoS │ │ [ QoS 0 ▼ ] │ │ │ │ □ 禁止本地转发No Local │ │ │ │ ☑ 启用订阅 │ │ 保存后立即订阅重新连接时自动恢复 │ │ │ │ [取消] [保存] │ └──────────────────────────────────────────┘主按钮统一使用保存不再固定使用创建并订阅。需求文档建议新增 MqttSubscriptionDialog.vue与弹窗交互相关的建议新增组件实现时可放在 mqtt 组件目录下负责新建和编辑承载 Topic Filter 校验、QoS、No Local 和启用状态设置。启用订阅的语义开启启用订阅时保存订阅配置 → 当前已连接则立即发送订阅请求 → 以后重新连接自动恢复订阅。关闭时只保存订阅配置 → 当前不发送订阅请求 → 以后重新连接不自动订阅。关键设计决策使用单一启用订阅选项避免同时提供立即订阅和自动订阅两个开关产生复杂组合四个状态交叉。Topic Filter 校验规则必填项且满足自动去除首尾空格。不允许包含空字符。必须独占一个层级。#必须独占最后一个层级。不允许重复保存相同 Topic Filter。输入框按 Enter 可以提交。有效示例device//status device/# system/events无效示例device 未独占层级 device/#/status # 未独占最后层级 device/abc# # 混在层级内QoS 选项下拉框提供三个档位QoS 0 — 最多一次 QoS 1 — 至少一次 QoS 2 — 恰好一次默认值保持当前行为建议使用 QoS 0对应 Rust 侧MqttQoS的#[default] AtMostOnce。提交状态机点击保存后按序执行禁用表单避免重复提交。按钮显示保存中…。先持久化配置。如果启用则等待 Broker 订阅确认。成功后关闭弹窗。刷新右侧订阅配置列表。自动选中新配置。显示成功反馈。只保存未启用配置时不发送 MQTT 订阅请求状态显示为未启用。订阅失败时配置仍可保存状态显示为订阅失败保留 Broker 返回的错误信息用户可以稍后重试或停用。这一失败不丢配置的设计与后端 crates/dbx-core/src/admin/mqtt/client.rs 中PendingSubscribe携带completion: OptionSubscriptionCompletion的异步确认机制相吻合——订阅请求被跟踪并等待确认失败结果通过 oneshot 通道回传。禁止本地转发No Local禁止本地转发对应 MQTT 5.0 的No Local特性。要求保存配置时持久化noLocal。启用和恢复订阅时携带noLocal。订阅配置列表中展示NL或No Local。MQTT 5.0 时允许设置。MQTT 3.1 和 MQTT 3.1.1 时禁用。禁用时提示仅 MQTT 5.0 支持。提示文案开启后Broker 不会将当前客户端自己发布的匹配消息再次转发给该客户端。这一协议版本差异在 dbx 后端有清晰的支撑MQTT 客户端层基于 rumqttc 同时封装了 V4 与 V5 两套后端见 crates/dbx-core/src/admin/mqtt/client.rs 的MqttBackendKind::{V4, V5}及对AsyncClientV4/AsyncClientV5的双持有协议版本由连接配置的protocol_versionv3 | v4 | v5默认 v5决定No Local 仅在 V5 通道可用。订阅状态与操作状态定义订阅配置至少包含以下界面状态已订阅 未启用 订阅中 订阅失败 连接已断开示例● device//status QoS 1 NL 已订阅 ○ device//alarm QoS 0 未启用 ◌ system/events/# QoS 1 订阅中 ! audit/# QoS 1 订阅失败启用Enable对未启用配置执行启用将enabled更新为true。当前连接可用时立即订阅。后续重新连接自动恢复。状态由未启用→订阅中→已订阅或订阅失败。停用Disable对启用配置执行停用当前已经订阅时发送取消订阅请求。将enabled更新为false。保留 Topic Filter、QoS 和 No Local 配置。后续重新连接不自动订阅。停用 取消当前订阅但保留配置删除Delete如果当前已经订阅先取消订阅。删除本地保存配置。从订阅配置列表移除。删除 取消当前订阅并永久删除配置删除前需要确认。编辑Edit允许编辑 Topic Filter、QoS、No Local 和启用状态。如果修改的是正在启用的配置取消旧订阅。保存新配置。使用新配置重新订阅。失败时应提供明确错误避免旧配置和新配置同时处于不确定状态。订阅列表视觉优化行布局采用紧凑列表 行间分隔线不使用大量独立卡片行高3236px 水平内边距8px Topic 字号13px 或 text-sm 分隔线border-b border-border/50示例● device//status QoS 1 NL ──────────────────────────────── ○ device//alarm QoS 0 ──────────────────────────────── ! system/events/# QoS 1 NL未选中时也必须能区分每一条订阅。字体规范Topic Filter 主文字font-mono font-medium text-[13px] 或 text-sm text-foreground/90辅助文字text-xs text-muted-foreground避免 Topic 主文字使用过小或过淡的样式。分组与订阅节点如果采用树形结构▾ device/ / status QoS 1 NL alarm QoS 0分组节点使用展开/文件夹图标、font-semibold、不显示 QoS 和 No Local。完整订阅节点使用状态图标、等宽字体、展示 QoS / No Local / 启用状态提供编辑、启用、停用、删除操作。如果一个节点既是完整订阅又存在子节点应同时展示展开按钮和订阅状态。树形引导线增加低对比度引导线device │ ├─ production │ ├─ status │ └─ alarm └─ test └─ status行状态样式普通状态bg-transparent text-foreground/90 border-b border-border/50悬停状态hover:bg-muted/60选中状态bg-primary/10 border-l-2 border-l-primary text-primary未启用text-muted-foreground订阅中bg-amber-500/5 border-l-2 border-l-amber-400订阅失败bg-destructive/5 border-l-2 border-l-destructive无障碍约束状态不能只通过颜色表达还需要状态文字或图标。辅助标签右侧显示QoS 0/1/2、NL、已订阅、未启用等标签。要求标签不能挤压 Topic 主文字Topic 过长时省略悬停显示完整 TopicNL悬停显示完整含义。消息列表视觉优化消息方向必须通过多重信号共同表达不能只依赖颜色接收消息靠左显示、浅蓝色背景、蓝色左边线、显示接收标签bg-blue-50/70 dark:bg-blue-950/30 border-l-2 border-blue-400发送消息靠右显示、浅绿色背景、绿色右边线、显示发送标签bg-emerald-50/70 dark:bg-emerald-950/30 border-r-2 border-emerald-400方向同时通过左右对齐 发送/接收标签 不同方向边线 不同背景色四种方式表达浅色与深色主题下都必须能清楚区分。数据层面消息方向由MqttMessage.directionsent | received承载前端类型见 apps/desktop/src/types/mqtt.tsRust 侧对应MqttMessageDirection::{Sent, Received}crates/dbx-types/src/mqtt.rs。其他交互细节刷新订阅配置刷新按钮位于右侧订阅配置区域。刷新后保留当前选择当前选择不存在时切换到全部消息不重复创建订阅不清空消息缓冲区。搜索订阅配置支持按完整 Topic Filter 搜索。搜索结果保留必要的树形上下文或临时切换为扁平列表清除搜索后恢复原展开状态。选择未启用配置可以查看和编辑配置消息区域可以显示该过滤器已有的历史消息不应暗示当前正在接收新消息明确显示该订阅尚未启用。状态管理三类状态必须分离右侧 MQTT 控制台是唯一状态所有者维护Broker 连接状态、已保存订阅配置、当前有效订阅、当前选择的过滤器、启用和停用状态、订阅请求状态、订阅错误、消息列表、发布面板状态。左侧连接树不再维护 MQTT Topic Tree。需求文档特别强调必须区分三种本质不同的状态已保存配置 持久化层enabled 只是意图标记 已启用配置 意图层想订阅什么 Broker 已确认订阅 事实层Broker 实际确认了什么不能将这三个状态合并为一个列表状态。这一区分也在后端得到呼应需求文档规划在 MQTT 客户端层区分保存配置、启用、停用、删除和当前已确认订阅连接恢复时仅恢复enabled true的配置从 crates/dbx-core/src/admin/mqtt/client.rs 的PendingSubscribe/PendingUnsubscribe结构看订阅请求带有独立序号sequence、期望状态add_to_desired和完成通知通道正是为支撑意图与事实分离而设计的。WebDAV 与 GitHub 同步这是 v1.3 的核心增量也是本文的重点章节。同步范围WebDAV 和 GitHub 项目同步必须包含每个 MQTT 连接的全部订阅配置connectionId Topic Filter QoS No Local Enabled需要同步已启用配置、未启用配置、QoS、No Local、启用状态、空订阅列表。不需要同步当前选中的过滤器、Topic 树展开状态、当前订阅中/订阅失败等临时运行状态、MQTT 消息缓存、已发布或已接收的消息历史、当前连接在线状态。与连接的关联订阅配置必须通过稳定的connectionId与 MQTT 连接关联。下载同步快照后连接存在恢复该连接对应的订阅配置。连接不存在由同步快照恢复连接及其订阅配置。非 MQTT 连接忽略 MQTT 订阅数据。不得把一个 MQTT 连接的订阅错误应用到另一个连接。建议的快照结构与仓库实现需求文档建议在同步快照中将 MQTT 订阅定义为明确字段而不是只依赖externalConfig.savedTopicsinterface MqttSubscriptionSyncEntry { connectionId: string; subscriptions: MqttSavedTopic[]; } interface SyncSnapshot { // 其他现有字段 mqttSubscriptions?: MqttSubscriptionSyncEntry[]; }该设计在仓库中已完整落地于 crates/dbx-core/src/persistence/cloud_sync.rspub struct SyncSnapshot { pub schema_version: u32, pub exported_at: String, pub app_version: String, pub connections: VecConnectionConfig, /// Explicit MQTT subscription metadata. None means this is a legacy /// snapshot that predates MQTT subscription sync and must not clear local /// subscriptions when applied. #[serde(default)] pub mqtt_subscriptions: OptionVecMqttSubscriptionSyncEntry, // ... } pub struct MqttSubscriptionSyncEntry { pub connection_id: String, pub subscriptions: VecMqttSubscriptionSyncTopic, } pub struct MqttSubscriptionSyncTopic { pub topic: String, #[serde(default default_sync_qos)] pub qos: String, // 默认 atmostonce #[serde(default)] pub no_local: bool, #[serde(default default_sync_enabled)] pub enabled: bool, // 默认 true }注意mqtt_subscriptions的字段注释本身就是契约语义的权威表述None表示早于 MQTT 订阅同步的旧快照应用时不得清空本地订阅。快照导出/导入分别由extract_mqtt_subscriptions与apply_mqtt_subscriptions同一文件内实现负责导出时从连接externalConfig.savedTopics提取并写入独立字段导入时将订阅写回savedTopics同时实现了对旧快照中陈旧savedTopics值的保留处理避免下载旧快照时意外清空本地订阅。语义总结mqttSubscriptions 缺失 旧版本快照不修改本地 MQTT 订阅配置 mqttSubscriptions 存在但某连接 subscriptions 为空 明确清空该连接的全部订阅配置这一设计解决了旧快照没有字段和用户明确删除全部订阅无法区分的问题。externalConfig.savedTopics仍可作为本地连接配置的存储位置但同步快照具有明确、可测试的 MQTT 订阅契约。上传规则上传到 WebDAV 或 GitHub 时从持久化存储读取最新 MQTT 订阅配置。包含所有已启用和未启用配置。不读取仅存在于页面内、尚未保存的表单内容。删除的配置不能继续出现在新快照中。上传成功提示中显示 MQTT 同步摘要例如同步完成3 个 MQTT 连接18 条订阅配置WebDAV 自动上传也必须包含最新订阅配置。下载规则下载快照前保持现有全局下载确认并增加 MQTT 订阅变化摘要MQTT 订阅配置将发生变化 新增 5 条更新 2 条删除 1 条下载应用规则沿用现有快照方向语义下载时以远端快照为准。仅当快照明确包含 MQTT 订阅字段时覆盖本地配置。旧快照不包含该字段时保留本地 MQTT 订阅。整个下载应用过程必须是原子的。数据校验失败时不允许部分写入。已连接状态下的下载下载同步快照时如果 MQTT 连接当前已打开不应静默取消或新增运行中的订阅。先更新持久化配置。明确提示重新连接后应用新的订阅配置。当前运行连接保持现状直到用户重新连接。后续可选增强立即应用但本轮默认不做自动运行时协调。这样可避免同步下载过程中突然停止或增加消息接收。冲突策略本轮遵循现有项目同步的上传/下载方向不单独实现 Topic 级双向自动合并上传本地快照覆盖远端快照。下载远端快照覆盖对应本地配置。下载前展示变化摘要并确认。原因是简单求并集会导致已删除的订阅重新出现。如果未来需要自动双向合并必须增加updatedAt deletedAt 或删除墓碑 设备/版本标识在没有版本和删除记录之前不采用自动合并。安全边界MQTT 订阅配置不是敏感凭据因此无论是否开启同步敏感信息订阅配置都必须同步。Topic Filter、QoS、No Local、Enabled 属于普通元数据。但以下信息不得因订阅同步而以明文泄露MQTT 用户密码客户端私钥私钥密码Token其他认证密钥证书、私钥文件路径属于设备相关配置不应被当作订阅数据同步覆盖到其他设备。三条硬性要求WebDAV 未启用敏感信息同步时订阅仍同步但认证秘密必须清除。GitHub 同步继续遵循现有快照加密要求。MQTTexternalConfig的秘密清理必须专门验证不能只验证其他 MQ 类型。仓库中连接秘密的处理位于 crates/dbx-core/src/connection/connection_secrets.rs与云同步的加密秘密块EncryptedSecretsBlob见 cloud_sync.rs配合确保普通快照只携带元数据、秘密走加密通道。数据校验下载时对每条订阅配置校验connectionId存在且指向 MQTT 连接。Topic Filter 格式有效。Topic Filter 不重复。QoS 值合法。No Local 类型合法。Enabled 类型合法。MQTT 3.1 和 MQTT 3.1.1 下收到noLocal true时不得静默错误启用。若快照中存在非法 MQTT 订阅数据下载整体失败、本地订阅配置保持不变、显示具体连接和 Topic Filter 错误、不允许只恢复部分订阅。版本兼容旧订阅缺少 enabled → true 旧订阅缺少 noLocal → false 旧快照缺少 mqttSubscriptions → 保留本地订阅 新快照明确 subscriptions: [] → 清空对应连接订阅新版快照被不支持 MQTT 同步的旧版应用读取时应遵循现有快照版本兼容策略不得静默损坏远端快照。同步后的界面刷新下载成功后重新加载连接配置。刷新右侧 MQTT 订阅配置列表。当前选择仍存在时保留选择。当前选择已被远端删除时切换到全部消息。已连接实例提示重新连接。未连接实例在下次连接时恢复enabled true的订阅。代码改动范围对照需求文档第十四章列出的改动范围与当前仓库结构基本吻合实施时可对照以下实际路径注意文档原稿中的crates/dbx-core/src/mqtt/client.rs、crates/dbx-core/src/storage.rs在实际仓库中分别位于admin/mqtt/与persistence/目录左侧连接树apps/desktop/src/stores/connectionStore.tsMQTT 连接下只创建MQTT 控制台节点移除侧栏 Topic Tree 加载与转换逻辑不再默认展开 MQTT Topic。apps/desktop/src/components/sidebar/SidebarTreeRuntimeHost.vue单击 MQTT 控制台节点直接打开控制台移除 Topic 展开逻辑与导航分支。MQTT 控制台apps/desktop/src/components/mqtt/MqttAdminConsole.vue唯一订阅管理入口新建/编辑/启用/停用/删除展示 QoS、No Local、Enabled 与运行状态搜索与刷新收发消息样式优化正确处理已有标签页的目标过滤器变化。apps/desktop/src/components/mqtt/TopicTreeNode.vue建议重构为MqttSubscriptionTreeNode.vue增加行间分隔线和树形引导线提高 Topic 字体可读性区分分组与订阅节点。数据类型与后端apps/desktop/src/types/mqtt.tsMqttSavedTopic增加enabled并定义订阅运行状态与同步类型。crates/dbx-core/src/admin/mqtt/client.rs区分保存配置、启用、停用、删除与当前已确认订阅连接恢复时仅恢复enabled true的配置。crates/dbx-core/src/persistence/storage.rs提供完整保存、读取和替换 MQTT 订阅配置的能力保证同步应用的原子性。云同步crates/dbx-core/src/persistence/cloud_sync.rs明确定义 MQTT 订阅同步字段实现导入导出、兼容、校验和摘要规则验证 MQTT 敏感信息清理。apps/desktop/src/components/editor/EditorSettingsDialog.vueWebDAV/GitHub 下载前展示 MQTT 变化摘要下载后提示重新连接。标签页状态apps/desktop/src/stores/queryStore.ts简化 MQTT 控制台打开逻辑确保已有标签页响应目标过滤器变化移除不再需要的侧栏 Topic 跳转逻辑。验收标准速查需求文档第十五章给出了 54 条验收标准是驱动与验证本次重构的完整清单可按主题分组使用页面结构1–4MQTT 连接下只显示MQTT 控制台控制台节点不再展开 Topic单击直接打开/切换页面全局侧栏不保存 MQTT Topic 快照。新建订阅5–13模态弹窗与 Redis 新增一致不开新标签页、不用内联卡片主按钮为保存弹窗含 Topic Filter/QoS/No Local/启用订阅关闭启用只保存不订阅开启启用保存并立即订阅已启用配置重连自动恢复未启用配置重连不自动订阅历史数据缺enabled按启用处理。订阅操作14–19可启用未启用配置可停用并保留配置可删除并取消当前订阅可编辑四要素Topic 重复或格式错误不能保存订阅失败时配置和错误信息可被保留。No Local20–23可保存、恢复和同步MQTT 5.0 可设置MQTT 3.1/3.1.1 禁用列表显示NL。订阅列表视觉24–32未选中行间有分隔Topic 主文字不小于 13px 且对比度足够分组与订阅节点区分明显树形结构有缩进和引导线每条配置展示 QoS/No Local/启用状态选中态有背景色和左侧强调线未启用/订阅中/失败可辨认状态不只靠颜色Topic 过长可查看完整内容。消息列表视觉33–36接收消息浅蓝靠左带蓝左边线发送消息浅绿靠右带绿右边线方向由位置/标签/边线/颜色共同表达浅色与深色主题均可区分。WebDAV 与 GitHub 同步37–54WebDAV 上传含全部订阅配置GitHub 上传含全部订阅配置WebDAV 自动上传含最新配置启用与未启用配置均可同步QoS/No Local/Enabled 往返一致不开启敏感信息同步时订阅仍同步且密码私钥不进明文快照下载新快照可恢复全部订阅旧快照缺字段不清空本地订阅新快照显式空列表可清空非法数据导致整体下载失败且本地不变已连接实例下载后不立即改变运行订阅下载后提示重连未连接实例下次连接只恢复enabled true下载前显示新增/更新/删除数量同步成功显示连接数与订阅配置数WebDAV 与 GitHub 各有独立回归测试连续上传—下载—上传后数据稳定不丢字段。实现状态据需求文档第十六章当前仓库已完成左侧仅保留 MQTT 控制台入口订阅配置统一在右侧控制台管理。使用模态弹窗新建和编辑订阅支持仅保存、启用、停用、删除、QoS、No Local 和 Enabled。订阅配置与当前运行订阅分离历史配置缺少 Enabled 时兼容为启用。Topic 树、状态、QoS、No Local、选中态和消息收发方向完成视觉区分。WebDAV/GitHub 快照增加 MQTT 订阅专属字段支持启用和未启用配置同步并兼容旧快照。MQTT 密码不进入普通同步快照同步下载校验非法订阅数据并保留本地原子性。后续可继续完善同步设置页面增加 MQTT 新增、更新、删除数量摘要及请重新连接提示。增加 WebDAV/GitHub 上传—下载—再次上传的自动化回归测试。小结本文围绕 dbx 的 MQTT 控制台优化完整还原了从问题诊断到架构收敛、从数据模型到视觉规范、从同步契约到验收清单的闭环。核心要点可以浓缩为三条工程原则单一入口管理订阅左侧导航、右侧操作意图与事实分离保存配置 ≠ 启用配置 ≠ Broker 已确认订阅显式契约驱动同步mqttSubscriptions字段 默认值兼容 原子下载 秘密剥离。这套设计不仅适用于 MQTT其状态分层 同步契约 校验原子性的思路对 dbx 中其他 MQ 类型Kafka、RocketMQ、RabbitMQ 等对应 crates/dbx-core/src/admin/mq的订阅管理同样具有参考价值。赞分享数据库开发者工具桌面应用CLIMCP 服务AI 应用【免费下载链接】dbx15MB轻量级跨平台数据库客户端、数据库管理工具。支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、DuckDB、ClickHouse、SQL Server 等。15MB, lightweight, cross-platform database client. Supports MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, ClickHouse, SQL Server and more.项目地址https://gitcode.com/t8y2/dbx点击查看免费下载相关推荐mesh2motion动画状态管理播放控制与状态同步机制mesh2motion动画状态管理播放控制与状态同步机制 引言3D动画状态管理的核心挑战 在3D角色动画系统中动画状态管理Animation State前端3D渲染图形学BISHENG 频道信息源订阅状态治理同步订阅 每日对账F031 实战解析BISHENG 频道信息源订阅状态治理同步订阅 每日对账F031 实战解析 本文导读 BISHENG 开放 LLM DevOps 平台仓库根目录AI 应用AI AgentLLMOps工作流自动化RAG后端前端git-bug JIRA Bridge 完整指南设计约束、认证机制、状态同步与配置实战git bug JIRA Bridge 完整指南设计约束、认证机制、状态同步与配置实战 本文以 git bug 仓库中的 JIRA Bridge 设计文档 h开发工具研发协作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考