"use client"; import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, Legend, Pie, PieChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from "recharts"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { CHART_TOOLTIP_STYLE } from "@/lib/chart-utils"; type GrowthRow = { date: string; trial: number; paid: number; total: number; cumulative: number }; type StepRow = { key?: string; label: string; count: number; pct_of_prev?: number; uniqueActors?: number }; type BucketRow = { name: string; value: number }; type PieRow = { name: string; value: number; color?: string }; type CacheAnalysis = { total_requests?: number; cache_hits?: number; cache_misses?: number; force_refresh_requests?: number; hit_rate?: number | null; }; export function OverviewCharts({ growth, steps, cacheBuckets, memberPie, planBreakdown, cachePie, cacheAnalysis, }: { growth: GrowthRow[]; steps: StepRow[]; cacheBuckets: BucketRow[]; memberPie: PieRow[]; planBreakdown: PieRow[]; cachePie: PieRow[]; cacheAnalysis?: CacheAnalysis; }) { return (
{growth.length > 0 && ( 会员增长趋势 — 近 30 天

累计会员

每日新增

)}
{steps.length > 0 && ( 30天转化漏斗 ({ name: s.label, count: s.count }))} layout="vertical" margin={{ left: 80, right: 20 }}> )} {cacheBuckets.length > 0 && ( 缓存桶分布 )}
会员分布
{memberPie.map((item, i) => ())}
{memberPie.map((item) => (
{item.name} {item.value}
))} {planBreakdown.length > 0 && (
{planBreakdown.map((item) => (
{item.name} {item.value}
))}
)}
{cachePie.length > 0 && ( 缓存分析{" "} {cacheAnalysis?.hit_rate != null && ( {(cacheAnalysis.hit_rate * 100).toFixed(1)}% 命中 )}
{cachePie.map((item, i) => ())}
总请求
{cacheAnalysis?.total_requests ?? 0}
强制刷新
{cacheAnalysis?.force_refresh_requests ?? 0}
命中
{cacheAnalysis?.cache_hits ?? 0}
未命中
{cacheAnalysis?.cache_misses ?? 0}
)}
); }