import { useAuth } from "@/_core/hooks/useAuth"; import { trpc } from "@/lib/trpc"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { Award, TrendingUp, Target, Zap, Footprints, Activity, Wind } from "lucide-react"; import { ResponsiveContainer, RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from "recharts"; const NTRP_LEVELS = [ { min: 1.0, max: 1.5, label: "初学者", desc: "刚开始学习网球,正在学习基本击球动作", color: "bg-gray-100 text-gray-700" }, { min: 1.5, max: 2.0, label: "初级", desc: "能够进行简单的来回击球,但缺乏一致性", color: "bg-orange-100 text-orange-700" }, { min: 2.0, max: 2.5, label: "初中级", desc: "击球更加稳定,开始理解基本策略", color: "bg-yellow-100 text-yellow-700" }, { min: 2.5, max: 3.0, label: "中级", desc: "能够稳定地进行中速击球,具备基本的网前技术", color: "bg-green-100 text-green-700" }, { min: 3.0, max: 3.5, label: "中高级", desc: "击球力量和控制力增强,开始使用旋转", color: "bg-blue-100 text-blue-700" }, { min: 3.5, max: 4.0, label: "高级", desc: "具备全面的技术,能够在比赛中运用战术", color: "bg-indigo-100 text-indigo-700" }, { min: 4.0, max: 4.5, label: "高级竞技", desc: "技术精湛,具备强大的进攻和防守能力", color: "bg-purple-100 text-purple-700" }, { min: 4.5, max: 5.0, label: "专业水平", desc: "接近职业水平,全面的技术和战术能力", color: "bg-red-100 text-red-700" }, ]; function getNTRPLevel(rating: number) { return NTRP_LEVELS.find(l => rating >= l.min && rating < l.max) || NTRP_LEVELS[0]; } export default function Rating() { const { user } = useAuth(); const { data: ratingData } = trpc.rating.current.useQuery(); const { data: history, isLoading } = trpc.rating.history.useQuery(); const { data: stats } = trpc.profile.stats.useQuery(); const currentRating = ratingData?.rating || 1.5; const level = getNTRPLevel(currentRating); // Get latest dimension scores const latestWithDimensions = history?.find((h: any) => h.dimensionScores); const dimensions = (latestWithDimensions as any)?.dimensionScores || {}; const radarData = [ { dimension: "姿势准确", value: dimensions.poseAccuracy || 0, fullMark: 100 }, { dimension: "击球一致", value: dimensions.strokeConsistency || 0, fullMark: 100 }, { dimension: "脚步移动", value: dimensions.footwork || 0, fullMark: 100 }, { dimension: "动作流畅", value: dimensions.fluidity || 0, fullMark: 100 }, { dimension: "力量", value: dimensions.power || 0, fullMark: 100 }, ]; const trendData = (history || []).map((h: any) => ({ date: new Date(h.createdAt).toLocaleDateString("zh-CN", { month: "short", day: "numeric" }), rating: h.rating, })); if (isLoading) { return (
); } return (

NTRP评分系统

基于所有历史训练记录自动计算的综合评分

{/* Current rating card */}
{currentRating.toFixed(1)}

{level.label}

{level.desc}

NTRP {currentRating.toFixed(1)}
{/* Radar chart */} 能力雷达图 五维度综合能力评估 {Object.keys(dimensions).length > 0 ? ( ) : (

完成视频分析后将显示能力雷达图

)}
{/* Rating trend */} 评分变化趋势 NTRP评分随时间的变化 {trendData.length > 0 ? ( ) : (

完成视频分析后将显示评分趋势

)}
{/* Dimension details */} 评分维度说明 NTRP评分由以下五个维度加权计算
{[ { icon: Target, label: "姿势准确性", weight: "30%", desc: "关节角度与标准动作的匹配度", value: dimensions.poseAccuracy }, { icon: Zap, label: "击球一致性", weight: "25%", desc: "多次击球动作的稳定性", value: dimensions.strokeConsistency }, { icon: Footprints, label: "脚步移动", weight: "20%", desc: "步法灵活性和重心转移", value: dimensions.footwork }, { icon: Wind, label: "动作流畅性", weight: "15%", desc: "动作连贯性和平滑度", value: dimensions.fluidity }, { icon: Activity, label: "力量", weight: "10%", desc: "挥拍速度和爆发力", value: dimensions.power }, ].map(item => (
{item.label}

{item.value ? Math.round(item.value) : "--"}

权重 {item.weight}

{item.desc}

))}
{/* NTRP level reference */} NTRP等级参考 美国网球协会(USTA)标准评级体系
{NTRP_LEVELS.map(l => (
= l.min && currentRating < l.max ? "bg-primary/5 border border-primary/20" : "hover:bg-muted/50" }`} > {l.min.toFixed(1)}-{l.max.toFixed(1)}
{l.label}

{l.desc}

{currentRating >= l.min && currentRating < l.max && ( 当前等级 )}
))}
); }