fix(food-encyclopedia): 前台食物图片输出归一化,修复uniapp部分图片不显示
- ToolFoodServiceImpl 新增 normalizeImageForOutput:定位 "crmebimage/" 片段,剥掉前面所有 host 前缀,再用 prefixImage 拼上单层 cdnUrl - 应用于 search / getDetail / getSimilar 三处 image 输出 - 处理三类历史脏数据:相对路径、双层 host 前缀、AI OSS URL(原样透传) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import com.zbkj.common.exception.CrmebException;
|
|||||||
import com.zbkj.common.model.tool.V2Food;
|
import com.zbkj.common.model.tool.V2Food;
|
||||||
import com.zbkj.common.request.PageParamRequest;
|
import com.zbkj.common.request.PageParamRequest;
|
||||||
import com.zbkj.service.dao.tool.V2FoodDao;
|
import com.zbkj.service.dao.tool.V2FoodDao;
|
||||||
|
import com.zbkj.service.service.SystemAttachmentService;
|
||||||
import com.zbkj.service.service.tool.DishImageService;
|
import com.zbkj.service.service.tool.DishImageService;
|
||||||
import com.zbkj.service.service.tool.ToolFoodService;
|
import com.zbkj.service.service.tool.ToolFoodService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -34,6 +35,29 @@ public class ToolFoodServiceImpl implements ToolFoodService {
|
|||||||
@Resource
|
@Resource
|
||||||
private DishImageService dishImageService;
|
private DishImageService dishImageService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SystemAttachmentService systemAttachmentService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 输出端图片归一化:
|
||||||
|
* - 空值原样返回
|
||||||
|
* - data:/blob: 原样返回
|
||||||
|
* - 历史脏数据中包含多层 host 前缀的 "https://h//https://h//crmebimage/..." → 仅保留首段 cdnUrl + 'crmebimage/...'
|
||||||
|
* - 相对路径 "crmebimage/..." → 拼上 cdnUrl
|
||||||
|
* - AI 生成 OSS URL(不含 crmebimage/,如 https://uthink.../foods/...)原样返回
|
||||||
|
*/
|
||||||
|
private String normalizeImageForOutput(String image) {
|
||||||
|
if (StrUtil.isBlank(image)) return image;
|
||||||
|
String s = image.trim();
|
||||||
|
if (s.startsWith("data:") || s.startsWith("blob:")) return s;
|
||||||
|
int idx = s.indexOf("crmebimage/");
|
||||||
|
if (idx >= 0) {
|
||||||
|
// 剥掉 crmebimage/ 之前的所有内容(包含 http(s)://host// 等),再交由 prefixImage 拼上单层 cdnUrl
|
||||||
|
return systemAttachmentService.prefixImage(s.substring(idx));
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 搜索食物
|
* 搜索食物
|
||||||
* @param pageParamRequest 分页参数
|
* @param pageParamRequest 分页参数
|
||||||
@@ -63,7 +87,7 @@ public class ToolFoodServiceImpl implements ToolFoodService {
|
|||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
map.put("id", food.getFoodId());
|
map.put("id", food.getFoodId());
|
||||||
map.put("name", food.getName());
|
map.put("name", food.getName());
|
||||||
map.put("image", food.getImage());
|
map.put("image", normalizeImageForOutput(food.getImage()));
|
||||||
map.put("category", food.getCategory());
|
map.put("category", food.getCategory());
|
||||||
map.put("energy", food.getEnergy());
|
map.put("energy", food.getEnergy());
|
||||||
map.put("protein", food.getProtein());
|
map.put("protein", food.getProtein());
|
||||||
@@ -108,7 +132,7 @@ public class ToolFoodServiceImpl implements ToolFoodService {
|
|||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
map.put("id", food.getFoodId());
|
map.put("id", food.getFoodId());
|
||||||
map.put("name", food.getName());
|
map.put("name", food.getName());
|
||||||
map.put("image", food.getImage());
|
map.put("image", normalizeImageForOutput(food.getImage()));
|
||||||
map.put("category", food.getCategory());
|
map.put("category", food.getCategory());
|
||||||
map.put("energy", food.getEnergy());
|
map.put("energy", food.getEnergy());
|
||||||
map.put("protein", food.getProtein());
|
map.put("protein", food.getProtein());
|
||||||
@@ -153,7 +177,7 @@ public class ToolFoodServiceImpl implements ToolFoodService {
|
|||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
map.put("id", item.getFoodId());
|
map.put("id", item.getFoodId());
|
||||||
map.put("name", item.getName());
|
map.put("name", item.getName());
|
||||||
map.put("image", item.getImage());
|
map.put("image", normalizeImageForOutput(item.getImage()));
|
||||||
similarList.add(map);
|
similarList.add(map);
|
||||||
}
|
}
|
||||||
result.put("list", similarList);
|
result.put("list", similarList);
|
||||||
|
|||||||
Reference in New Issue
Block a user