feat(图片处理): 统一处理图片路径,确保存储相对路径并对齐接口返回

This commit is contained in:
吴昊天 2026-10-10 10:06:23 +08:00
parent 161050c4aa
commit d04e69ec1f
3 changed files with 49 additions and 1 deletions

View File

@ -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

View File

@ -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);

View File

@ -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');
}