From 4ac8cf2f6686c44a00f6f04934a3c985d3f419b2 Mon Sep 17 00:00:00 2001 From: mini Date: Wed, 18 Feb 2026 23:24:34 +0800 Subject: [PATCH] feat: add Download Logs tab in admin panel --- backend/app/routes/admin.py | 23 ++-- backend/app/schemas.py | 2 + frontend/src/views/Admin.vue | 234 ++++++++++++++++++++++++++++------- 3 files changed, 206 insertions(+), 53 deletions(-) diff --git a/backend/app/routes/admin.py b/backend/app/routes/admin.py index 2416895..d395397 100644 --- a/backend/app/routes/admin.py +++ b/backend/app/routes/admin.py @@ -78,16 +78,25 @@ async def download_logs( user: dict = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): - query = select(DownloadLog).order_by(DownloadLog.downloaded_at.desc()) + from sqlalchemy.orm import joinedload + query = ( + select(DownloadLog) + .options(joinedload(DownloadLog.video)) + .order_by(DownloadLog.downloaded_at.desc()) + ) count_query = select(func.count(DownloadLog.id)) if video_id is not None: query = query.where(DownloadLog.video_id == video_id) count_query = count_query.where(DownloadLog.video_id == video_id) total = (await db.execute(count_query)).scalar() or 0 logs = (await db.execute(query.offset((page - 1) * page_size).limit(page_size))).scalars().all() - return DownloadLogListResponse( - logs=[DownloadLogInfo.model_validate(l) for l in logs], - total=total, - page=page, - page_size=page_size, - ) + + items = [] + for l in logs: + d = DownloadLogInfo.model_validate(l) + if l.video: + d.video_title = l.video.title or "" + d.video_platform = l.video.platform or "" + items.append(d) + + return DownloadLogListResponse(logs=items, total=total, page=page, page_size=page_size) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index 1e431b1..507d0a2 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -89,6 +89,8 @@ class TokenResponse(BaseModel): class DownloadLogInfo(BaseModel): id: int video_id: int + video_title: str = "" + video_platform: str = "" ip: str user_agent: str browser: str diff --git a/frontend/src/views/Admin.vue b/frontend/src/views/Admin.vue index 677cd55..0a437ce 100644 --- a/frontend/src/views/Admin.vue +++ b/frontend/src/views/Admin.vue @@ -1,52 +1,98 @@