diff --git a/client/src/sections/wuyuanbiaoba/components/AdvancedSettings.jsx b/client/src/sections/wuyuanbiaoba/components/AdvancedSettings.jsx index e3d0654..2de8956 100644 --- a/client/src/sections/wuyuanbiaoba/components/AdvancedSettings.jsx +++ b/client/src/sections/wuyuanbiaoba/components/AdvancedSettings.jsx @@ -15,7 +15,8 @@ import { Spin, Alert, Tooltip, - Modal + Modal, + Tabs } from "antd"; import { SettingOutlined, @@ -87,15 +88,20 @@ const AdvancedSettings = ({ onLogout, locationConfig }) => { const windowSize = settings.filterConfig?.size ?? 5; const filterThreshold = settings.filterConfig?.threshold ?? 0.1; const flowThreshold = settings.filterConfig?.imgThreshold ?? 10.0; - const enableMqtt = settings.mqttConfig?.enable ?? true; - const brokerAddress = settings.mqttConfig?.mqtt?.broker ?? ''; - const mqttPort = settings.mqttConfig?.mqtt?.port ?? 1883; - const mqttTopic = settings.mqttConfig?.mqtt?.topic ?? ''; - const mqttClientId = settings.mqttConfig?.mqtt?.client_id ?? ''; - const mqttUsername = settings.mqttConfig?.mqtt?.username ?? ''; - const mqttPassword = settings.mqttConfig?.mqtt?.password ?? ''; const enableBatch = settings.mqttConfig?.batch ?? false; const batchInterpolation = settings.mqttConfig?.interpolation ?? 'copy'; + const MQTT_TEMPLATE = { + enable: false, + broker: '', + port: 1883, + topic: '', + username: '', + password: '', + client_id: '' + }; + const mqtts = settings.mqttConfig?.mqtts ?? [MQTT_TEMPLATE, MQTT_TEMPLATE]; + const brokers = [0, 1].map((i) => ({ ...MQTT_TEMPLATE, ...(mqtts[i] ?? {}) })); + const anyMqttEnabled = brokers.some((b) => b.enable); // 更新本地状态的辅助函数 const setDeviceId = (value) => updateLocalSettings({ deviceId: value }); @@ -135,78 +141,22 @@ const AdvancedSettings = ({ onLogout, locationConfig }) => { updateLocalSettings({ filterConfig: { ...settings.filterConfig, imgThreshold: value }, }); - const setEnableMqtt = (value) => - updateLocalSettings({ - mqttConfig: { - enable: value, - mqtt: settings.mqttConfig?.mqtt ?? { - broker: '', - port: 1883, - topic: '', - username: '', - password: '', - client_id: '' - } - }, - }); - const setBrokerAddress = (value) => + const setMqttEnable = (index, value) => updateLocalSettings({ mqttConfig: { ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - broker: value - }, + mqtts: brokers.map((b, i) => + i === index ? { ...b, enable: value } : b + ), }, }); - const setMqttPort = (value) => + const setMqttField = (index, field, value) => updateLocalSettings({ mqttConfig: { ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - port: value - }, - }, - }); - const setMqttTopic = (value) => - updateLocalSettings({ - mqttConfig: { - ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - topic: value - }, - }, - }); - const setMqttClientId = (value) => - updateLocalSettings({ - mqttConfig: { - ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - client_id: value - }, - }, - }); - const setMqttUsername = (value) => - updateLocalSettings({ - mqttConfig: { - ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - username: value - }, - }, - }); - const setMqttPassword = (value) => - updateLocalSettings({ - mqttConfig: { - ...settings.mqttConfig, - mqtt: { - ...(settings.mqttConfig?.mqtt ?? {}), - password: value - }, + mqtts: brokers.map((b, i) => + i === index ? { ...b, [field]: value } : b + ), }, }); const setEnableBatch = (value) => @@ -303,21 +253,36 @@ const AdvancedSettings = ({ onLogout, locationConfig }) => { }; const handleSave = async () => { - if (enableMqtt) { - if (brokerAddress && !validateIP(brokerAddress)) { - message.error('Broker 地址格式不正确,请检查后重试'); + for (let index = 0; index < brokers.length; index++) { + const broker = brokers[index]; + if (!broker.enable) { + continue; + } + const brokerNo = index + 1; + if (broker.broker && !validateIP(broker.broker)) { + message.error(`Broker ${brokerNo} 地址格式不正确,请检查后重试`); return; } - if (mqttPort && !validatePort(mqttPort)) { - message.error('端口号格式不正确,请检查后重试'); + if (broker.port && !validatePort(broker.port)) { + message.error(`Broker ${brokerNo} 端口号格式不正确,请检查后重试`); return; } - if (!brokerAddress) { - message.warning('启用 MQTT 时请填写 Broker 地址'); + if (!broker.broker) { + message.warning(`启用了 Broker ${brokerNo},请填写 Broker 地址`); return; } } + if ( + brokers[0].enable && + brokers[1].enable && + brokers[0].broker.trim().toLowerCase() === + brokers[1].broker.trim().toLowerCase() + ) { + message.warning("Broker 1 与 Broker 2 的地址不能相同"); + return; + } + try { setSaving(true); const success = await saveAllSettings(); @@ -333,6 +298,145 @@ const AdvancedSettings = ({ onLogout, locationConfig }) => { } }; + // 渲染单个 Broker 配置面板(Tabs 内容) + const renderBrokerPane = (index) => { + const broker = brokers[index]; + const brokerNo = index + 1; + return ( +