"use client" import { BookOpen, Brain, CheckCircle2, Clock, TrendingUp } from "lucide-react" import { useTranslations } from "next-intl" import { Card, CardContent } from "@/shared/components/ui/card" import { cn } from "@/shared/lib/utils" interface AnalyticsStatsCardsProps { totalStudents: number studentsWithErrorBook: number totalErrorItems: number averageMasteryRate: number dueReviewCount: number /** 涉及的知识点数 */ knowledgePointCount?: number className?: string } /** * 错题分析统计卡片(教师/管理员视图) * 5 个卡片:覆盖学生/错题总数/平均掌握率/待复习/知识点数 */ export function AnalyticsStatsCards({ totalStudents, studentsWithErrorBook, totalErrorItems, averageMasteryRate, dueReviewCount, knowledgePointCount, className, }: AnalyticsStatsCardsProps) { const t = useTranslations("error-book") const avg = (totalStudents > 0 ? totalErrorItems / totalStudents : 0).toFixed(1) const cards = [ { label: t("analyticsStats.coverage"), value: studentsWithErrorBook, sub: t("analyticsStats.coverageSub", { total: totalStudents }), icon: BookOpen, color: "text-blue-600 dark:text-blue-400", bg: "bg-blue-50 dark:bg-blue-950/30", }, { label: t("analyticsStats.totalErrors"), value: totalErrorItems, sub: t("analyticsStats.totalErrorsSub", { avg }), icon: TrendingUp, color: "text-rose-600 dark:text-rose-400", bg: "bg-rose-50 dark:bg-rose-950/30", }, { label: t("analyticsStats.avgMastery"), value: `${Math.round(averageMasteryRate * 100)}%`, sub: averageMasteryRate >= 0.6 ? t("analyticsStats.avgMasteryGood") : t("analyticsStats.avgMasteryNeedImprove"), icon: CheckCircle2, color: "text-emerald-600 dark:text-emerald-400", bg: "bg-emerald-50 dark:bg-emerald-950/30", }, { label: t("analyticsStats.dueReview"), value: dueReviewCount, sub: dueReviewCount > 0 ? t("analyticsStats.dueReviewNeedAttention") : t("analyticsStats.dueReviewNone"), icon: Clock, color: "text-amber-600 dark:text-amber-400", bg: "bg-amber-50 dark:bg-amber-950/30", }, { label: t("analyticsStats.knowledgePoints"), value: knowledgePointCount ?? 0, sub: knowledgePointCount && knowledgePointCount > 5 ? t("analyticsStats.knowledgePointsWide") : t("analyticsStats.knowledgePointsFocused"), icon: Brain, color: "text-purple-600 dark:text-purple-400", bg: "bg-purple-50 dark:bg-purple-950/30", }, ] return (
{cards.map((card) => { const Icon = card.icon return (
{card.label}
{card.value}
{card.sub}
) })}
) }