import Link from "next/link"; import { ArrowUpRight, Clock3, Smartphone, Sparkles } from "lucide-react"; import { DashboardCharts } from "@/components/admin/dashboard-charts"; import type { DashboardData } from "@/lib/analytics/contracts"; import { getDashboardData, parseDashboardQuery } from "@/lib/analytics/server"; import { formatDateTime, formatDurationMs, formatNumber } from "@/lib/utils"; export const dynamic = "force-dynamic"; const ranges = [ { label: "24 小时", value: "1" }, { label: "7 天", value: "7" }, { label: "30 天", value: "30" }, { label: "90 天", value: "90" }, ] as const; type RecentEventItem = DashboardData["recentEvents"][number]; type ConversationItem = DashboardData["recentConversations"][number]; function describeConversationMode(mode: string | null) { if (mode === "clone") { return "专属音色模式"; } if (mode === "standard") { return "标准模式"; } return null; } function buildEventNote(event: RecentEventItem) { const notes = [ event.durationMs && event.durationMs > 0 ? `耗时 ${formatDurationMs(event.durationMs)}` : null, event.value?.trim() || null, event.elementText?.trim() || null, ].filter(Boolean); return notes[0] ?? "无额外说明"; } function buildConversationNote(item: ConversationItem) { const notes = [ item.turnIndex ? `第 ${item.turnIndex} 轮` : null, describeConversationMode(item.mode), item.durationMs && item.durationMs > 0 ? `${item.role === "用户发言" ? "识别完成" : "文本完成"} ${formatDurationMs(item.durationMs)}` : null, ].filter(Boolean); return notes.join(" · "); } type AdminPageProps = { searchParams: Promise<{ range?: string; }>; }; export default async function AdminPage({ searchParams }: AdminPageProps) { const rawParams = await searchParams; const query = parseDashboardQuery(rawParams); const data = await getDashboardData(query); return (
Android 陪伴数据台

使用总览

最近谁在使用,哪里需要留意,一眼看清。

这里持续汇总老年陪伴助手在 Android 应用中的使用情况,除了常用功能和异常提醒,也会单独整理回复耗时、连接速度和最近对话片段,方便你直接判断体验是不是顺畅。

返回首页
Android 应用 数据自动更新

时间范围

{ranges.map((item) => ( {item.label} ))}
{data.stats.map((stat) => (

{stat.label}

{formatNumber(stat.value)}

{stat.hint}

))}

性能概览

陪伴流程现在快不快

只看真实耗时,不看空洞的成功失败计数

{data.performanceMetrics.map((metric) => (

{metric.label}

{formatDurationMs(metric.valueMs)}

{metric.hint}

{metric.sampleCount > 0 ? `基于 ${formatNumber(metric.sampleCount)} 次记录` : "暂无样本"}

))}

常用功能

最近更常打开哪里

近 {query.days} 天
{data.topPaths.map((item, index) => (
{index + 1}

功能页面

{item.label}

{formatNumber(item.total)}
))}

最近活跃设备

刚刚还在使用的是谁

{data.recentSessions.map((session) => (
Android 设备
{formatDateTime(session.lastSeenAt)}

{session.deviceLabel}

设备会话 {session.sessionKey.slice(0, 18)}...

{formatNumber(session.eventCount)} 条事件 {session.appVersion ? ` · 版本 ${session.appVersion}` : ""} {session.locale ? ` · ${session.locale}` : ""}

))}

最近对话

刚刚聊了些什么

聊天记录会自动上传,这里只展示最新片段

{data.recentConversations.length > 0 ? ( data.recentConversations.map((item) => (
{item.role} {formatDateTime(item.occurredAt)}

{item.text}

{buildConversationNote(item) || "已自动归档到聊天记录"}

设备会话 {item.sessionKey.slice(0, 18)}...

)) ) : (
当前时间范围内还没有自动上传的聊天片段。
)}

最近记录

刚刚发生了什么

{data.recentEvents.map((event) => ( ))}
时间 终端 动作 页面 / 功能 补充说明
{formatDateTime(event.occurredAt)} Android {event.name}

{event.type}

{event.pathname ?? "未标记功能"}

{event.component ?? "无额外标签"}

{buildEventNote(event)}

设备会话 {event.sessionKey.slice(0, 18)}...

); }