"use client"; import { useEffect, useState } from "react"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, LineChart, Line, ResponsiveContainer } from "recharts"; interface ClassAnalysis { class_id: string; class_name: string; count: number; avg: number; max: number; min: number; std_dev: number; q1: number; q2: number; q3: number; pass_rate: number; excellent_rate: number; segments: { label: string; count: number; rate: number }[]; } interface Suggestion { class_name: string; rank: number; suggestion: string; } const COLORS = ["#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"]; export default function GradeDistributionChart() { const [data, setData] = useState<{ class_analysis: ClassAnalysis[]; suggestions: Suggestion[] } | null>(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState<"bar" | "quantile" | "segment" | "suggest">("bar"); useEffect(() => { fetch("/api/analytics/grade-distribution") .then(r => r.json()) .then(d => { setData(d); setLoading(false); }) .catch(() => setLoading(false)); }, []); if (loading) return
各班级平均分、最高分、最低分横向对比(从高到低排序)
| 班级 | 平均分 | 最高分 | 最低分 | 标准差 | 及格率 |
|---|---|---|---|---|---|
| {c.class_name} | {c.avg} | {c.max} | {c.min} | {c.std_dev} | {c.pass_rate}% |
四分位数分析:Q1(25%)、中位数(50%)、Q3(75%)
各班级分数段人数分布
{data.class_analysis.map(cls => ({s.suggestion}