From a29e77156e474344da3cbe695c252e7cff732056 Mon Sep 17 00:00:00 2001 From: zhang1106 <849185023@qq.com> Date: Thu, 11 Jun 2026 11:26:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(device):=20=E4=BF=AE=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E5=A4=87=E6=97=B6=E8=AE=BE=E5=A4=87=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B/=E7=8A=B6=E6=80=81=E4=B8=8B=E6=8B=89=E6=A1=86?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端:DeviceManagement.jsx 中补充 options 的判断条件 - 原条件 !field.options 对空数组 [] 判定为 false,导致 数据库里 options 被清空时下拉框没有选项 - 改为同时检查 null/undefined 和空数组,确保本地默认值 能正确兜底(type、status 字段同步修复) 后端:initDeviceFields.js 加固系统字段 options 兜底逻辑 - 系统字段(isSystem: true)的 options 永远不应为空 - 启动时如果检测到系统字段 options 为空,强制重置为默认 值,这样即使前端修复后 options 仍为空,后端重启时也能自愈 - 仅作用于系统字段,不影响用户自定义字段 --- backend/initDeviceFields.js | 12 +++++++++++- frontend/src/pages/DeviceManagement.jsx | 6 ++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/initDeviceFields.js b/backend/initDeviceFields.js index c191406..e02a0c7 100644 --- a/backend/initDeviceFields.js +++ b/backend/initDeviceFields.js @@ -184,7 +184,17 @@ async function initDeviceFields() { } } - if (field.options && !existingOptions) { + // 加固:系统字段(isSystem: true)的 options 永远不应为空 + // 如果用户在"字段管理"页面误清空了系统字段的 options(如设备类型/状态), + // 启动时强制重置为默认值,避免前端拿到空 options 导致下拉框无选项 + if ( + existingField.isSystem && + field.options && + (!existingOptions || existingOptions.length === 0) + ) { + await existingField.update({ options: field.options }); + console.log(`系统字段 options 为空,已重置为默认值: ${field.displayName}`); + } else if (field.options && !existingOptions) { await existingField.update({ options: field.options }); console.log(`更新字段 options: ${field.displayName}`); } else if (field.options && Array.isArray(existingOptions)) { diff --git a/frontend/src/pages/DeviceManagement.jsx b/frontend/src/pages/DeviceManagement.jsx index 713c3e7..841a7b3 100644 --- a/frontend/src/pages/DeviceManagement.jsx +++ b/frontend/src/pages/DeviceManagement.jsx @@ -164,12 +164,14 @@ function DeviceManagement() { let fields = response.data.sort((a, b) => a.order - b.order); // 补充缺失的 options(状态和设备类型) + // 修复:原条件 !field.options 对空数组 [] 判定为 false,导致 options 被清空时下拉框无选项 + // 改为同时检查 null/undefined 和空数组,确保本地默认值能正确兜底 fields = fields.map(field => { - if (field.fieldName === 'type' && !field.options) { + if (field.fieldName === 'type' && (!field.options || field.options.length === 0)) { const defaultTypeField = DEFAULT_DEVICE_FIELDS_LOCAL.find(f => f.fieldName === 'type'); return { ...field, options: defaultTypeField?.options || [] }; } - if (field.fieldName === 'status' && !field.options) { + if (field.fieldName === 'status' && (!field.options || field.options.length === 0)) { const defaultStatusField = DEFAULT_DEVICE_FIELDS_LOCAL.find( f => f.fieldName === 'status' );