From 05d46ed2f11dc1c9d2ca2872f9e930e560aff29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8A=E5=A4=A9?= <442384644@qq.com> Date: Fri, 23 Oct 2026 14:09:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=99=9A=E6=8B=9F=E5=95=86=E5=93=81):=20?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E4=B8=8E=E6=A0=87=E7=AD=BE=20ID=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=BD=AC=20int=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=BC=96=E8=BE=91=E9=A1=B5=E6=97=A0=E6=B3=95=E5=9B=9E?= =?UTF-8?q?=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 商品详情接口的 cate_id / label_id 由 explode 后仍为字符串数组, 而后台分类级联选择的 value 是数字,导致编辑页分类、标签回显为空。 统一 array_map('intval') 处理,与 label_list / protection_list 口径一致。 - 后台网盘商品编辑页兼容后端返回数组或逗号字符串两种格式, 并过滤非正数与 NaN 值,避免提交空节点。 --- backend/modules/product/virtual/service/ProductServices.php | 5 +++-- frontend/admin/src/pages/plugin/virtual/product/Add.vue | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/modules/product/virtual/service/ProductServices.php b/backend/modules/product/virtual/service/ProductServices.php index 34d9220f2..9d9da690d 100644 --- a/backend/modules/product/virtual/service/ProductServices.php +++ b/backend/modules/product/virtual/service/ProductServices.php @@ -131,8 +131,9 @@ class ProductServices // ============ 列表/JSON字段 ============ $product['logistics'] = !empty($product['logistics']) ? explode(',', $product['logistics']) : []; $product['recommend_list'] = !empty($product['recommend_list']) ? explode(',', (string)$product['recommend_list']) : []; - $product['cate_id'] = !empty($product['cate_id']) ? explode(',', (string)$product['cate_id']) : []; - $product['label_id'] = !empty($product['label_id']) ? explode(',', (string)$product['label_id']) : []; + // 分类/标签 ID 统一转 int:分类级联选项的 value 是数字,返回字符串会导致编辑页无法回显 + $product['cate_id'] = !empty($product['cate_id']) ? array_map('intval', explode(',', (string)$product['cate_id'])) : []; + $product['label_id'] = !empty($product['label_id']) ? array_map('intval', explode(',', (string)$product['label_id'])) : []; $product['label_list'] = !empty($product['label_list']) ? array_map('intval', explode(',', (string)$product['label_list'])) : []; $product['protection_list'] = !empty($product['protection_list']) ? array_map('intval', explode(',', (string)$product['protection_list'])) : []; $product['params_list'] = !empty($product['params_list']) ? json_decode($product['params_list'], true) : []; diff --git a/frontend/admin/src/pages/plugin/virtual/product/Add.vue b/frontend/admin/src/pages/plugin/virtual/product/Add.vue index aacf3454d..d5f2c14fc 100644 --- a/frontend/admin/src/pages/plugin/virtual/product/Add.vue +++ b/frontend/admin/src/pages/plugin/virtual/product/Add.vue @@ -511,8 +511,10 @@ async function loadProduct() { formValidate.value.slider_image = images; formValidate.value.image = images[0] || ''; } - const cate = data.cate_id || []; - formValidate.value.cate_id = Array.isArray(cate) ? cate : [cate]; + // 分类回显:级联选项的 value 是数字,字符串 ID 无法命中节点,这里统一转成数字 + const cate = data.cate_id; + const cateArr = Array.isArray(cate) ? cate : cate ? String(cate).split(',') : []; + formValidate.value.cate_id = cateArr.map((v) => Number(v)).filter((v) => !Number.isNaN(v) && v > 0); // 规格回显(优先使用 attr/attrs 中的数据) if (data.attr && typeof data.attr === 'object') { oneFormValidate.value[0].price = parseFloat(data.attr.price) || 0;