diff --git a/backend/modules/product/normal/service/ProductSaveServices.php b/backend/modules/product/normal/service/ProductSaveServices.php index 5613af6f0..cd34f7867 100644 --- a/backend/modules/product/normal/service/ProductSaveServices.php +++ b/backend/modules/product/normal/service/ProductSaveServices.php @@ -43,6 +43,7 @@ class ProductSaveServices extends BaseService { $data = $this->fillDefaults($data); $this->validate($data); + $data = $this->stripImageUrl($data); $data = $this->prepareData($data); if ($id > 0) { @@ -167,6 +168,39 @@ class ProductSaveServices extends BaseService return $data; } + /** + * 图片路径去站点域名前缀 + * 编辑详情接口回传的 slider_image/推荐图/SKU 规格图可能带 site_url 前缀,入库统一还原为相对路径 + * @param array $data + * @return array + */ + protected function stripImageUrl(array $data): array + { + $siteUrl = rtrim((string) sys_config('site_url'), '/'); + if ($siteUrl === '') { + return $data; + } + $strip = static function ($path) use ($siteUrl): string { + $path = str_replace('\\', '/', (string) $path); + return str_starts_with($path, $siteUrl . '/') ? substr($path, strlen($siteUrl)) : $path; + }; + if (!empty($data['slider_image']) && is_array($data['slider_image'])) { + $data['slider_image'] = array_map($strip, $data['slider_image']); + } + if (!empty($data['recommend_image']) && is_string($data['recommend_image'])) { + $data['recommend_image'] = $strip($data['recommend_image']); + } + if (!empty($data['attrs'])) { + foreach ($data['attrs'] as &$attr) { + if (is_array($attr) && !empty($attr['pic']) && is_string($attr['pic'])) { + $attr['pic'] = $strip($attr['pic']); + } + } + unset($attr); + } + return $data; + } + /** * 数据校验 * @param array $data diff --git a/backend/modules/product/normal/service/ProductServices.php b/backend/modules/product/normal/service/ProductServices.php index 37499f331..7c769ca6e 100644 --- a/backend/modules/product/normal/service/ProductServices.php +++ b/backend/modules/product/normal/service/ProductServices.php @@ -157,7 +157,11 @@ class ProductServices $product['is_virtual'] = (int)($product['is_virtual'] ?? 0); // ============ slider_image(由 Model 获取器自动解码为数组)============ - $product['slider_image'] = $product['slider_image'] ?? []; + // 图片拼站点域名(对齐列表口径);保存链路 ProductSaveServices 会去域名还原为相对路径入库 + $siteUrl = sys_config('site_url'); + $product['slider_image'] = set_file_url($product['slider_image'] ?? [], $siteUrl); + $product['recommend_image'] = set_file_url($product['recommend_image'] ?? '', $siteUrl); + $product['image'] = set_file_url($product['image'] ?? '', $siteUrl); if (!empty($product['slider_image'])) { $product['image'] = $product['slider_image'][0] ?? ''; } @@ -177,6 +181,7 @@ class ProductServices foreach ($product['attrs'] as &$attr) { $attr['is_vip_price'] = $attr['vip_price'] ?? 0; $attr['is_sub_price'] = $attr['brokerage'] ?? 0; + $attr['pic'] = set_file_url($attr['pic'] ?? '', $siteUrl); } unset($attr); $product['attr'] = $product['attrs'][0] ?? []; @@ -204,6 +209,7 @@ class ProductServices $map = array_column($list, null, 'product_id'); foreach ($recommendIds as $rid) { if (isset($map[$rid])) { + $map[$rid]['image'] = set_file_url($map[$rid]['image'] ?? '', $siteUrl); $recommend_list[] = $map[$rid]; } } @@ -411,9 +417,12 @@ class ProductServices ->toArray(); // 字段映射:eb_product_center列名 → 前端期望字段名 + // 图片拼站点域名(对齐 CenterProductServices::getList 口径;编辑详情接口保持原始路径,避免回存绝对地址污染库) foreach ($list as &$item) { $item['store_name'] = $item['name'] ?? ''; $item['sort'] = $item['sort_order'] ?? 0; + $item['image'] = set_file_url($item['image'] ?? ''); + $item['slider_image'] = set_file_url($item['slider_image'] ?? []); } unset($item); diff --git a/backend/modules/product/virtual/service/ProductServices.php b/backend/modules/product/virtual/service/ProductServices.php index 48ea4d40c..34d9220f2 100644 --- a/backend/modules/product/virtual/service/ProductServices.php +++ b/backend/modules/product/virtual/service/ProductServices.php @@ -73,6 +73,11 @@ class ProductServices $limit, ['id', 'name as store_name', 'image', 'price', 'stock', 'sales', 'is_show', 'sort_order', 'add_time'] ); + // 图片拼站点域名(对齐 CenterProductServices::getList 口径;编辑详情接口保持原始路径) + foreach ($list as &$item) { + $item['image'] = set_file_url($item['image'] ?? ''); + } + unset($item); return compact('total', 'list'); }