From 56d9736597e581d366d1f9b6dcdc009a47b8a554 Mon Sep 17 00:00:00 2001 From: "ethan.chen" Date: Fri, 9 Jan 2026 10:30:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AA=92=E4=BD=93=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3=20/api/media/stats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 返回媒体总数、满分作品数、平均评分 - 按类型统计各类型作品数量 - 返回最新添加的5部作品 - 便于前端展示数据统计信息 --- routes/media.ts | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/routes/media.ts b/routes/media.ts index 67ab19f..5eeb0eb 100644 --- a/routes/media.ts +++ b/routes/media.ts @@ -200,4 +200,68 @@ media.get("/page", async (c) => { } }); +// 获取媒体统计信息 +media.get("/stats", async (c) => { + try { + // 获取总数 + const totalResult = await db + .prepare("SELECT COUNT(*) as total FROM media") + .get(); + const total = totalResult?.total || 0; + + // 获取满分作品数 + const perfectResult = await db + .prepare("SELECT COUNT(*) as count FROM media WHERE rating = 10") + .get(); + const perfectCount = perfectResult?.count || 0; + + // 按类型统计 + const typeStats = await db + .prepare( + "SELECT type, COUNT(*) as count FROM media GROUP BY type ORDER BY count DESC" + ) + .all(); + + // 获取平均评分 + const avgRatingResult = await db + .prepare("SELECT AVG(rating) as avg FROM media WHERE rating IS NOT NULL") + .get(); + const avgRating = avgRatingResult?.avg + ? parseFloat(avgRatingResult.avg).toFixed(2) + : "0.00"; + + // 获取最新添加的作品 + const latestResult = await db + .prepare( + "SELECT title, type, rating, date FROM media ORDER BY created_at DESC LIMIT 5" + ) + .all(); + + // 格式化最新作品的日期 + const latest = latestResult.map((item: any) => { + if (item.date) { + const date = new Date(item.date); + if (!isNaN(date.getTime())) { + item.date = date.toISOString().split("T")[0]; + } + } + return item; + }); + + return c.json({ + code: 0, + data: { + total, + perfectCount, + avgRating, + typeStats, + latest, + }, + message: "Success", + }); + } catch (error: any) { + return c.json({ code: 1, data: {}, message: error.message }, 500); + } +}); + export default media;