Chore: remove promotional copy and home-training wording
这个提交包含在:
@@ -67,7 +67,7 @@ export default function Dashboard() {
|
||||
<div className="flex gap-2">
|
||||
<Button data-testid="dashboard-training-button" onClick={() => setLocation("/training")} className="gap-2">
|
||||
<Target className="h-4 w-4" />
|
||||
开始训练
|
||||
训练计划
|
||||
</Button>
|
||||
<Button variant="outline" onClick={() => setLocation("/analysis")} className="gap-2">
|
||||
<Video className="h-4 w-4" />
|
||||
@@ -220,7 +220,7 @@ export default function Dashboard() {
|
||||
<div className="h-[200px] flex items-center justify-center text-muted-foreground text-sm">
|
||||
<div className="text-center">
|
||||
<Video className="h-8 w-8 mx-auto mb-2 opacity-30" />
|
||||
<p>上传训练视频开始AI分析</p>
|
||||
<p>上传训练视频后可查看分析结果</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -231,7 +231,7 @@ export default function Dashboard() {
|
||||
{/* Quick actions */}
|
||||
<Card className="border-0 shadow-sm">
|
||||
<CardHeader className="pb-2">
|
||||
<CardTitle className="text-base font-semibold">快速开始</CardTitle>
|
||||
<CardTitle className="text-base font-semibold">常用入口</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
|
||||
@@ -244,7 +244,7 @@ export default function Dashboard() {
|
||||
</div>
|
||||
<div>
|
||||
<p className="font-medium text-sm">生成训练计划</p>
|
||||
<p className="text-xs text-muted-foreground">AI定制个人训练方案</p>
|
||||
<p className="text-xs text-muted-foreground">按当前设置生成训练安排</p>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
@@ -256,7 +256,7 @@ export default function Dashboard() {
|
||||
</div>
|
||||
<div>
|
||||
<p className="font-medium text-sm">上传视频分析</p>
|
||||
<p className="text-xs text-muted-foreground">MediaPipe AI姿势识别</p>
|
||||
<p className="text-xs text-muted-foreground">导入视频并查看姿势分析</p>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
@@ -268,7 +268,7 @@ export default function Dashboard() {
|
||||
</div>
|
||||
<div>
|
||||
<p className="font-medium text-sm">查看NTRP评分</p>
|
||||
<p className="text-xs text-muted-foreground">多维度能力评估</p>
|
||||
<p className="text-xs text-muted-foreground">查看评分记录和维度结果</p>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -30,18 +30,18 @@ export default function Home() {
|
||||
<div className="max-w-3xl mx-auto text-center">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
|
||||
<Zap className="h-3.5 w-3.5" />
|
||||
AI网球训练助手
|
||||
网球训练系统
|
||||
</div>
|
||||
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight leading-tight">
|
||||
精准分析
|
||||
<span className="text-primary block mt-1">高效提升</span>
|
||||
训练记录
|
||||
<span className="text-primary block mt-1">分析与录制</span>
|
||||
</h1>
|
||||
<p className="text-lg text-muted-foreground mt-6 max-w-xl mx-auto leading-relaxed">
|
||||
AI姿势识别 · 智能训练计划 · 实时动作分析 · 自动评分反馈
|
||||
训练计划 · 姿势分析 · 实时录制 · 评分记录
|
||||
</p>
|
||||
<div className="flex items-center justify-center gap-3 mt-8">
|
||||
<Button onClick={() => setLocation("/login")} size="lg" className="gap-2 h-12 px-6">
|
||||
开始训练
|
||||
进入系统
|
||||
<ChevronRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
@@ -50,43 +50,43 @@ export default function Home() {
|
||||
|
||||
{/* Features */}
|
||||
<section className="container py-16">
|
||||
<h2 className="text-2xl font-bold text-center mb-12">核心功能</h2>
|
||||
<h2 className="text-2xl font-bold text-center mb-12">功能</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-5xl mx-auto">
|
||||
{[
|
||||
{
|
||||
icon: Video,
|
||||
title: "AI姿势识别",
|
||||
desc: "MediaPipe实时分析33个关键点,精准评估挥拍动作",
|
||||
title: "姿势识别",
|
||||
desc: "使用 MediaPipe 分析 33 个关键点并记录挥拍数据",
|
||||
color: "bg-blue-50 text-blue-600",
|
||||
},
|
||||
{
|
||||
icon: Target,
|
||||
title: "智能训练计划",
|
||||
desc: "根据水平和分析结果,AI自动生成和调整训练方案",
|
||||
title: "训练计划",
|
||||
desc: "根据水平和分析结果生成训练安排",
|
||||
color: "bg-green-50 text-green-600",
|
||||
},
|
||||
{
|
||||
icon: Award,
|
||||
title: "NTRP自动评分",
|
||||
desc: "USTA标准五维度评估,每次分析自动更新评分",
|
||||
desc: "按 USTA 维度记录评分结果",
|
||||
color: "bg-purple-50 text-purple-600",
|
||||
},
|
||||
{
|
||||
icon: Zap,
|
||||
title: "击球统计",
|
||||
desc: "击球次数、挥拍速度、一致性,量化训练效果",
|
||||
desc: "记录击球次数、挥拍速度和一致性",
|
||||
color: "bg-orange-50 text-orange-600",
|
||||
},
|
||||
{
|
||||
icon: Footprints,
|
||||
title: "运动轨迹",
|
||||
desc: "重心移动轨迹分析,优化脚步移动模式",
|
||||
desc: "记录重心移动轨迹和脚步变化",
|
||||
color: "bg-teal-50 text-teal-600",
|
||||
},
|
||||
{
|
||||
icon: TrendingUp,
|
||||
title: "进度追踪",
|
||||
desc: "训练历史、能力趋势、评分变化一目了然",
|
||||
desc: "查看训练历史、趋势和评分变化",
|
||||
color: "bg-indigo-50 text-indigo-600",
|
||||
},
|
||||
].map((feature) => (
|
||||
@@ -103,11 +103,11 @@ export default function Home() {
|
||||
|
||||
{/* How it works */}
|
||||
<section className="container py-16">
|
||||
<h2 className="text-2xl font-bold text-center mb-12">使用流程</h2>
|
||||
<h2 className="text-2xl font-bold text-center mb-12">使用步骤</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-6 max-w-4xl mx-auto">
|
||||
{[
|
||||
{ step: "1", title: "输入用户名", desc: "用户名登录即可" },
|
||||
{ step: "2", title: "生成计划", desc: "AI个性化训练方案" },
|
||||
{ step: "2", title: "生成计划", desc: "生成训练安排" },
|
||||
{ step: "3", title: "上传视频", desc: "录制挥拍并分析" },
|
||||
{ step: "4", title: "获取反馈", desc: "评分与矫正建议" },
|
||||
].map((item) => (
|
||||
@@ -125,10 +125,10 @@ export default function Home() {
|
||||
{/* CTA */}
|
||||
<section className="container py-16">
|
||||
<div className="max-w-2xl mx-auto text-center p-8 rounded-2xl bg-primary/5">
|
||||
<h2 className="text-2xl font-bold mb-3">提升技术,从这里开始</h2>
|
||||
<p className="text-muted-foreground mb-6">输入用户名即可使用全部功能</p>
|
||||
<h2 className="text-2xl font-bold mb-3">登录入口</h2>
|
||||
<p className="text-muted-foreground mb-6">输入用户名后进入系统</p>
|
||||
<Button onClick={() => setLocation("/login")} size="lg" className="gap-2">
|
||||
立即开始
|
||||
前往登录
|
||||
<ChevronRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
@@ -141,7 +141,7 @@ export default function Home() {
|
||||
<Target className="h-4 w-4" />
|
||||
<span>Tennis Hub</span>
|
||||
</div>
|
||||
<span>AI网球训练助手</span>
|
||||
<span>训练与分析</span>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
@@ -285,7 +285,7 @@ export default function LiveCamera() {
|
||||
摄像头位置设置
|
||||
</DialogTitle>
|
||||
<DialogDescription>
|
||||
为获得最佳分析效果,请按以下步骤调整设备位置
|
||||
请按以下步骤调整设备位置
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
<div className="space-y-4 py-2">
|
||||
@@ -313,7 +313,7 @@ export default function LiveCamera() {
|
||||
<Button onClick={() => setSetupStep(s => s + 1)}>下一步</Button>
|
||||
) : (
|
||||
<Button onClick={handleSetupComplete} className="gap-2">
|
||||
<Camera className="h-4 w-4" />开始使用摄像头
|
||||
<Camera className="h-4 w-4" />启用摄像头
|
||||
</Button>
|
||||
)}
|
||||
</DialogFooter>
|
||||
|
||||
@@ -37,13 +37,13 @@ export default function Login() {
|
||||
<Target className="w-8 h-8 text-primary" />
|
||||
</div>
|
||||
<h1 className="text-3xl font-bold tracking-tight">Tennis Hub</h1>
|
||||
<p className="text-muted-foreground mt-2">AI网球训练助手</p>
|
||||
<p className="text-muted-foreground mt-2">训练与分析入口</p>
|
||||
</div>
|
||||
|
||||
<Card className="border-0 shadow-xl">
|
||||
<CardHeader className="text-center pb-2">
|
||||
<CardTitle className="text-xl" data-testid="login-title">开始训练</CardTitle>
|
||||
<CardDescription>输入用户名即可开始使用</CardDescription>
|
||||
<CardTitle className="text-xl" data-testid="login-title">登录</CardTitle>
|
||||
<CardDescription>输入用户名后进入系统</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<form onSubmit={handleLogin} className="space-y-4">
|
||||
@@ -96,7 +96,7 @@ export default function Login() {
|
||||
</Card>
|
||||
|
||||
<p className="text-center text-xs text-muted-foreground mt-6">
|
||||
输入用户名即可使用全部功能
|
||||
输入用户名后进入系统
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -96,7 +96,7 @@ export default function Training() {
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<h1 className="text-2xl font-bold tracking-tight" data-testid="training-title">训练计划</h1>
|
||||
<p className="text-muted-foreground text-sm mt-1">AI个性化训练方案</p>
|
||||
<p className="text-muted-foreground text-sm mt-1">按水平和周期生成训练安排</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -109,7 +109,7 @@ export default function Training() {
|
||||
生成训练计划
|
||||
</CardTitle>
|
||||
<CardDescription>
|
||||
根据水平和目标,AI生成个性化训练方案
|
||||
根据水平和目标生成训练安排
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4">
|
||||
@@ -149,7 +149,7 @@ export default function Training() {
|
||||
className="w-full sm:w-auto gap-2"
|
||||
>
|
||||
{generateMutation.isPending ? (
|
||||
<><Loader2 className="h-4 w-4 animate-spin" />AI生成中...</>
|
||||
<><Loader2 className="h-4 w-4 animate-spin" />生成中...</>
|
||||
) : (
|
||||
<><Sparkles className="h-4 w-4" />生成训练计划</>
|
||||
)}
|
||||
@@ -186,7 +186,7 @@ export default function Training() {
|
||||
) : (
|
||||
<RefreshCw className="h-3 w-3" />
|
||||
)}
|
||||
智能调整
|
||||
重新调整
|
||||
</Button>
|
||||
</div>
|
||||
{activePlan.adjustmentNotes && (
|
||||
|
||||
@@ -98,7 +98,7 @@ export default function Tutorials() {
|
||||
<BookOpen className="w-6 h-6 text-primary" />
|
||||
教程库
|
||||
</h1>
|
||||
<p className="text-muted-foreground mt-1">专业动作分解与要领,对照标准动作提升技术</p>
|
||||
<p className="text-muted-foreground mt-1">查看动作分解、要点说明和常见错误</p>
|
||||
</div>
|
||||
|
||||
{/* Progress Overview */}
|
||||
|
||||
在新工单中引用
屏蔽一个用户