import { adminApi } from "../api/client"; import { trendChart } from "../components/charts"; import { renderError, renderLoading } from "../components/ui"; import { escapeHtml, formatNumber } from "../lib/format"; export async function renderOverview( container: HTMLElement, range = "30d", ): Promise { renderLoading(container, "加载总览"); try { const data = await adminApi.overview(range); container.innerHTML = `
核心指标

运营总览

快速掌握增长与积分消耗情况。

统计周期 ${rangeOption("7d", "7 天", range)} ${rangeOption("30d", "30 天", range)} ${rangeOption("90d", "90 天", range)}
${metric("用户总数", data.totalUsers, "累计账户")} ${metric("活跃用户", data.activeUsers, "当前周期")} ${metric("新增用户", data.newUsers, "当前周期")} ${metric("积分余额", data.totalCreditBalance, "所有账户")} ${metric("赠送积分", data.creditsGranted, "整数积分")} ${metric("消耗积分", data.creditsUsed, "已结算")}

新增用户趋势

按 UTC 日期统计注册数

新增用户
${trendChart(data.trend)}

使用汇总

按类型统计,不包含用户内容

${ data.usage.length === 0 ? '

当前周期暂无使用记录

' : `
${data.usage .map( (item) => ` `, ) .join("")}
当前周期使用统计
类型请求消耗积分语音毫秒输入 Token输出 Token
${escapeHtml(item.kind)} ${formatNumber(item.requests)} ${formatNumber(item.chargedCredits)} ${formatNumber(item.asrMillis)} ${formatNumber(item.inputTokens)} ${formatNumber(item.outputTokens)}
` }
`; container.querySelectorAll("[data-range]").forEach((input) => { input.addEventListener("change", (event) => { void renderOverview(container, (event.target as HTMLInputElement).value); }); }); } catch (error) { renderError(container, error, () => void renderOverview(container, range)); } } function rangeOption(value: string, label: string, selected: string): string { return ` `; } function metric(label: string, value: number, hint: string): string { return `

${label}

${formatNumber(value)} ${hint}
`; }