From e1bcacef608620b9699ef562a8a5b007673f08ee Mon Sep 17 00:00:00 2001 From: Pine Date: Sun, 13 Sep 2026 22:57:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B4=BB=E5=8A=A8=E5=88=97=E8=A1=A8imag?= =?UTF-8?q?e=E5=AD=97=E6=AE=B5=E7=BB=9F=E4=B8=80=E8=B0=83=E7=94=A8resolve?= =?UTF-8?q?=5Furl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: 数据库中活动image字段格式不统一,早期数据是完整URL, 新上传数据是相对路径/oss/...,桌面端直接使用导致相对路径404。 修复: - list_activities(运营端) 对image调用resolve_url - list_activities_public(用户端) 对image调用resolve_url - get_event_detail(活动详情) 对image调用resolve_url resolve_url会自动将/oss/路径转为CDN鉴权直链,完整URL原样返回 --- app/services/training_admin_bridge.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/services/training_admin_bridge.py b/app/services/training_admin_bridge.py index f1ad363..da7ac59 100644 --- a/app/services/training_admin_bridge.py +++ b/app/services/training_admin_bridge.py @@ -62,7 +62,10 @@ def delete_course(course_id: str) -> bool: # ── 活动(events 表)───────────────────────────────────────────────────── def list_activities(status: str | None = None) -> list[dict]: + from app.infrastructure.oss import resolve_url rows = tdb.list_all("events", "start_at DESC") + for r in rows: + r["image"] = resolve_url(r.get("image", "") or "") if status: return [r for r in rows if r.get("status") == status] return rows @@ -83,11 +86,13 @@ def create_activity(data: dict) -> dict: def list_activities_public(user_id: str | None = None, status: str | None = None) -> list[dict]: """公开活动列表;标注 is_mine(我发布的)与 my_registered(我已报名)。""" + from app.infrastructure.oss import resolve_url rows = tdb.list_all("events", "start_at DESC") bookings = tdb.list_all("bookings") out: list[dict] = [] for r in rows: r = dict(r) + r["image"] = resolve_url(r.get("image", "") or "") r["is_mine"] = bool(user_id and r.get("publisher_id") == user_id) r["my_registered"] = bool( user_id and any( @@ -166,10 +171,12 @@ def delete_activity_owned(event_id: str, user_id: str) -> bool: def get_event_detail(user_id: str | None, event_id: str) -> dict | None: """活动详情:发布者附带报名列表(bookings);非发布者只返回活动与我的报名标记。""" + from app.infrastructure.oss import resolve_url ev = tdb.fetch_by_id("events", event_id) if ev is None: return None ev = dict(ev) + ev["image"] = resolve_url(ev.get("image", "") or "") is_mine = bool(user_id and ev.get("publisher_id") == user_id) ev["is_mine"] = is_mine ev["my_registered"] = False