fix(health,miniprogram): 轮播图图片改用相对路径 + wx.downloadFile 解决 HTTP 限制

问题:微信小程序 <image> 不支持 HTTP URL,签名 URL 与 upload 中间件不兼容。
修复:
1. 公开轮播图 API 返回相对路径(/uploads/...)而非签名 URL
2. 小程序用 wx.downloadFile 下载图片后使用本地临时路径
3. 移除 banner_handler 中不再需要的 base_url/Host header 逻辑
This commit is contained in:
iven
2026-05-10 20:14:43 +08:00
parent a6ec8129c9
commit 4788e19a1d
4 changed files with 27 additions and 36 deletions

View File

@@ -30,6 +30,8 @@ interface PublicBanner {
image_url?: string;
link_type?: string;
link_target?: string;
/** 下载后的本地临时路径 */
local_path?: string;
}
// ─── 访客首页 ───
@@ -67,7 +69,22 @@ function GuestHome({ modeClass }: { modeClass: string }) {
]);
if (bannerData.status === 'fulfilled' && bannerData.value?.length > 0) {
setBanners(bannerData.value);
const baseUrl = process.env.TARO_APP_API_URL || 'http://localhost:3000/api/v1';
const fileBase = baseUrl.replace(/\/api\/v1$/, '');
const withLocal = await Promise.all(
bannerData.value.map(async (b) => {
if (!b.image_url) return b;
try {
const fullUrl = b.image_url.startsWith('http') ? b.image_url : `${fileBase}${b.image_url}`;
const res = await Taro.downloadFile({ url: fullUrl });
if (res.tempFilePath) {
return { ...b, local_path: res.tempFilePath };
}
} catch { /* ignore */ }
return b;
})
);
setBanners(withLocal);
} else {
setBanners(FALLBACK_SLIDES);
}
@@ -98,8 +115,8 @@ function GuestHome({ modeClass }: { modeClass: string }) {
{slides.map((slide, idx) => (
<SwiperItem key={slide.id || idx}>
<View className='guest-slide'>
{slide.image_url ? (
<Image className='guest-slide-image' src={slide.image_url} mode='aspectFill' />
{(slide.local_path || slide.image_url) ? (
<Image className='guest-slide-image' src={slide.local_path || slide.image_url} mode='aspectFill' />
) : (
<View className={`guest-slide-bg guest-slide-bg--${(idx % 3) + 1}`} />
)}