## 主要改动 ### 1. 连续训练模式 - 移除组数/休息逻辑,只统计总次数和时长 - 训练持续进行直到用户手动暂停 - 实时显示次数、时长、消耗糖分 ### 2. 递进式奖励系统 - 鸡蛋(8-12次) → 核桃(15-20次) → 易拉罐(25-30次) → 气球(40-50次) - 每个奖励在区间内随机触发 - 奖励按顺序递进,不会跳级 - 捏碎粒子特效 + 奖励弹窗 ### 3. 糖分计算与食物对比 - 公式: (MET × 体重 × 时长) / 4 - MET = 3.5, 体重 = 60kg - 食物对比: 苹果/香蕉/米饭/巧克力/可乐 ### 4. 视觉设计优化 - 真实握力环造型(完整圆环 + 中空 + 握点) - 立体渐变和纹理效果 - 挤压动画(训练时整体缩放) - 简洁交互(整个环可点击,无中心按钮) ### 5. 问题修复 - 修复进入页面时音效预热响声(静音预热) - 暂时禁用音效URL(避免404错误) - 修复捏碎特效层级问题 ## 技术实现 - 新增: grip-ring.vue (主页面) - 新增: grip-ring-canvas.vue (画布组件) - 修改: useMetronome.ts (静音预热) - 修改: exercises.ts (移除握力环) - 修改: index.vue (添加头部链接) - 修改: dev-training-entry/index.vue (添加菜单入口) - 修改: pages.json (添加路由) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
100 lines
2.7 KiB
TypeScript
100 lines
2.7 KiB
TypeScript
export type AnimationType =
|
|
| 'curl'
|
|
| 'press'
|
|
| 'sidefly'
|
|
| 'crunch'
|
|
|
|
export interface ExercisePreset {
|
|
id: string
|
|
name: string
|
|
equipment: '哑铃' | '健身环' | '徒手'
|
|
icon: string
|
|
animationType: AnimationType
|
|
description: string
|
|
tips: string[]
|
|
contraindication?: string
|
|
|
|
defaultBpm: number
|
|
bpmMin: number
|
|
bpmMax: number
|
|
defaultSets: number
|
|
defaultReps: number
|
|
defaultRestSec: number
|
|
|
|
beatsPerRep: number
|
|
}
|
|
|
|
export const EXERCISE_PRESETS: ExercisePreset[] = [
|
|
{
|
|
id: 'dumbbell-curl',
|
|
name: '哑铃弯举',
|
|
equipment: '哑铃',
|
|
icon: '🏋',
|
|
animationType: 'curl',
|
|
description: '锻炼肱二头肌,注意肘部固定不动',
|
|
tips: ['肘部贴紧身体', '上举吸气,下落呼气', '动作放慢,控制重量'],
|
|
contraindication: '肘关节炎症急性期不宜',
|
|
defaultBpm: 60,
|
|
bpmMin: 40,
|
|
bpmMax: 100,
|
|
defaultSets: 3,
|
|
defaultReps: 12,
|
|
defaultRestSec: 60,
|
|
beatsPerRep: 2,
|
|
},
|
|
{
|
|
id: 'dumbbell-press',
|
|
name: '哑铃推举',
|
|
equipment: '哑铃',
|
|
icon: '🏋',
|
|
animationType: 'press',
|
|
description: '锻炼肩部三角肌,核心保持收紧',
|
|
tips: ['不要含胸驼背', '推举时呼气', '不要锁死肘关节'],
|
|
contraindication: '肩袖损伤者请咨询医生',
|
|
defaultBpm: 60,
|
|
bpmMin: 40,
|
|
bpmMax: 90,
|
|
defaultSets: 3,
|
|
defaultReps: 10,
|
|
defaultRestSec: 90,
|
|
beatsPerRep: 2,
|
|
},
|
|
{
|
|
id: 'dumbbell-sidefly',
|
|
name: '哑铃侧平举',
|
|
equipment: '哑铃',
|
|
icon: '🏋',
|
|
animationType: 'sidefly',
|
|
description: '锻炼三角肌中束,重量宜轻不宜重',
|
|
tips: ['手肘微屈', '抬至与肩平齐即可', '想象用肩膀发力,不是手臂'],
|
|
defaultBpm: 60,
|
|
bpmMin: 40,
|
|
bpmMax: 80,
|
|
defaultSets: 3,
|
|
defaultReps: 12,
|
|
defaultRestSec: 60,
|
|
beatsPerRep: 2,
|
|
},
|
|
{
|
|
id: 'crunch',
|
|
name: '集中机(仰卧卷腹)',
|
|
equipment: '健身环',
|
|
icon: '💪',
|
|
animationType: 'crunch',
|
|
description: '锻炼腹直肌,借助健身环增加阻力',
|
|
tips: ['下背贴地', '用腹部发力,不是脖子', '上抬呼气,下落吸气'],
|
|
contraindication: '腰椎间盘突出急性期不宜',
|
|
defaultBpm: 50,
|
|
bpmMin: 40,
|
|
bpmMax: 80,
|
|
defaultSets: 3,
|
|
defaultReps: 15,
|
|
defaultRestSec: 60,
|
|
beatsPerRep: 2,
|
|
},
|
|
]
|
|
|
|
export function getPresetById(id: string): ExercisePreset | undefined {
|
|
return EXERCISE_PRESETS.find((e) => e.id === id)
|
|
}
|