-- 普拉提训练系统完整表结构创建脚本 -- 执行前请确保删除旧表(注意删除顺序,避免外键约束错误) -- 禁用外键检查(创建时) SET FOREIGN_KEY_CHECKS = 0; -- 删除现有表(如果存在) DROP TABLE IF EXISTS `t_schedule_exercises`; DROP TABLE IF EXISTS `t_training_plans`; DROP TABLE IF EXISTS `t_exercises`; DROP TABLE IF EXISTS `t_exercise_categories`; -- 重新启用外键检查 SET FOREIGN_KEY_CHECKS = 1; -- 创建分类表 CREATE TABLE `t_exercise_categories` ( `key` varchar(255) NOT NULL COMMENT '分类唯一键(英文/下划线)', `name` varchar(255) NOT NULL COMMENT '分类中文名称', `type` enum('mat_pilates','equipment_pilates') NOT NULL DEFAULT 'mat_pilates' COMMENT '普拉提类型:垫上普拉提或器械普拉提', `equipment_name` varchar(255) DEFAULT NULL COMMENT '器械名称(仅器械普拉提需要)', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(升序)', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`key`), KEY `idx_sort_order` (`sort_order`), KEY `idx_type` (`type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='普拉提训练分类表'; -- 创建动作表 CREATE TABLE `t_exercises` ( `key` varchar(255) NOT NULL COMMENT '动作唯一键(英文/下划线)', `name` varchar(255) NOT NULL COMMENT '动作名称', `category_name` varchar(255) NOT NULL COMMENT '中文分类名(冗余,便于展示)', `description` text DEFAULT NULL COMMENT '动作描述', `target_muscle_groups` text NOT NULL COMMENT '主要锻炼肌肉群', `equipment_name` varchar(255) DEFAULT NULL COMMENT '器械名称(器械普拉提专用)', `beginner_reps` int DEFAULT NULL COMMENT '入门级别建议练习次数', `beginner_sets` int DEFAULT NULL COMMENT '入门级别建议组数', `breathing_cycles` int DEFAULT NULL COMMENT '呼吸循环次数(替代普通次数)', `hold_duration` int DEFAULT NULL COMMENT '保持时间(秒)', `special_instructions` varchar(255) DEFAULT NULL COMMENT '特殊说明(如每侧、前后各等)', `category_key` varchar(255) NOT NULL COMMENT '分类键', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(分类内)', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`key`), KEY `idx_category_key` (`category_key`), KEY `idx_sort_order` (`sort_order`), KEY `idx_category_sort` (`category_key`, `sort_order`), KEY `idx_equipment_name` (`equipment_name`), CONSTRAINT `fk_exercises_category` FOREIGN KEY (`category_key`) REFERENCES `t_exercise_categories` (`key`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='普拉提训练动作表'; -- 创建训练计划表 CREATE TABLE `t_training_plans` ( `id` char(36) NOT NULL COMMENT '训练计划唯一ID', `is_active` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否激活', `user_id` varchar(255) NOT NULL COMMENT '用户ID', `name` varchar(255) DEFAULT NULL COMMENT '计划名称', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `start_date` datetime NOT NULL COMMENT '开始日期', `mode` enum('daysOfWeek','sessionsPerWeek') NOT NULL COMMENT '计划模式', `days_of_week` json NOT NULL COMMENT '周几训练(0-6)', `sessions_per_week` int NOT NULL COMMENT '每周训练次数', `goal` enum('postpartum_recovery','fat_loss','posture_correction','core_strength','flexibility','rehab','stress_relief','') NOT NULL COMMENT '训练目标', `start_weight_kg` float DEFAULT NULL COMMENT '起始体重(公斤)', `preferred_time_of_day` enum('morning','noon','evening','') NOT NULL DEFAULT '' COMMENT '偏好训练时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_is_active` (`is_active`), KEY `idx_deleted` (`deleted`), KEY `idx_user_active` (`user_id`, `is_active`, `deleted`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='训练计划表'; -- 创建训练计划动作表 CREATE TABLE `t_schedule_exercises` ( `id` char(36) NOT NULL COMMENT '计划动作唯一ID', `training_plan_id` char(36) NOT NULL COMMENT '训练计划ID', `user_id` varchar(255) NOT NULL COMMENT '用户ID', `exercise_key` varchar(255) DEFAULT NULL COMMENT '关联的动作key(仅exercise类型)', `name` varchar(255) NOT NULL COMMENT '项目名称', `sets` int DEFAULT NULL COMMENT '组数', `reps` int DEFAULT NULL COMMENT '重复次数', `duration_sec` int DEFAULT NULL COMMENT '持续时长(秒)', `rest_sec` int DEFAULT NULL COMMENT '休息时长(秒)', `note` text DEFAULT NULL COMMENT '备注', `item_type` enum('exercise','rest','note') NOT NULL DEFAULT 'exercise' COMMENT '项目类型', `completed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已完成', `sort_order` int NOT NULL COMMENT '排序顺序', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除', PRIMARY KEY (`id`), KEY `idx_training_plan_id` (`training_plan_id`), KEY `idx_exercise_key` (`exercise_key`), KEY `idx_user_id` (`user_id`), KEY `idx_sort_order` (`sort_order`), KEY `idx_item_type` (`item_type`), KEY `idx_plan_sort` (`training_plan_id`, `sort_order`), CONSTRAINT `fk_schedule_exercises_training_plan` FOREIGN KEY (`training_plan_id`) REFERENCES `t_training_plans` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_schedule_exercises_exercise` FOREIGN KEY (`exercise_key`) REFERENCES `t_exercises` (`key`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='训练计划动作表'; -- 创建索引以优化查询性能 -- 分类表索引已在建表时创建 -- 动作表额外索引 CREATE INDEX `idx_target_muscle_groups` ON `t_exercises` (`target_muscle_groups`(100)); -- 插入初始数据 -- 插入普拉提分类数据 INSERT INTO `t_exercise_categories` (`key`, `name`, `type`, `equipment_name`, `sort_order`, `created_at`, `updated_at`) VALUES -- 垫上普拉提 ('mat_pilates', '垫上普拉提', 'mat_pilates', NULL, 1, NOW(), NOW()), -- 器械普拉提 ('reformer', '核心床', 'equipment_pilates', '核心床', 2, NOW(), NOW()), ('cadillac', '凯迪拉克', 'equipment_pilates', '凯迪拉克', 3, NOW(), NOW()), ('chair', '普拉提椅', 'equipment_pilates', '普拉提椅', 4, NOW(), NOW()), ('barrel', '普拉提桶', 'equipment_pilates', '普拉提桶', 5, NOW(), NOW()); -- 插入垫上普拉提动作数据 INSERT INTO `t_exercises` ( `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, `category_key`, `sort_order`, `created_at`, `updated_at` ) VALUES ('mat_hundred', '百次拍打', '垫上普拉提', '经典的普拉提动作,通过有节奏的手臂拍打配合呼吸来激活核心', '核心肌群、呼吸肌群、肩部稳定性', NULL, NULL, NULL, 10, NULL, '10个呼吸循环', 'mat_pilates', 1, NOW(), NOW()), ('mat_roll_up', '卷起', '垫上普拉提', '从仰卧位缓慢卷起至坐姿,锻炼脊柱逐节控制能力', '核心肌群、脊柱灵活性、腘绳肌柔韧性', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 2, NOW(), NOW()), ('mat_single_leg_circle', '单腿画圈', '垫上普拉提', '单腿做圆周运动,保持骨盆稳定', '核心稳定性、髋关节灵活性、股四头肌、腘绳肌、臀肌', NULL, 5, NULL, NULL, NULL, '每条腿每个方向5次', 'mat_pilates', 3, NOW(), NOW()), ('mat_rolling_like_ball', '滚球', '垫上普拉提', '保持紧凑姿势前后滚动,挑战平衡和控制', '核心肌群、脊柱柔韧性、平衡感', NULL, 8, NULL, NULL, NULL, '6-8次', 'mat_pilates', 4, NOW(), NOW()), ('mat_single_leg_stretch', '单腿伸展', '垫上普拉提', '交替单腿伸展,保持上身抬起', '核心肌群、髋屈肌、股四头肌', NULL, 10, NULL, NULL, NULL, '每侧8-10次', 'mat_pilates', 5, NOW(), NOW()), ('mat_double_leg_stretch', '双腿伸展', '垫上普拉提', '双腿和手臂同时伸展,回到起始位置', '核心肌群、髋屈肌、股四头肌、肩部稳定性', NULL, 10, NULL, NULL, NULL, '6-10次', 'mat_pilates', 6, NOW(), NOW()), ('mat_spine_stretch', '脊柱伸展', '垫上普拉提', '坐姿前屈,逐节伸展脊柱', '脊柱柔韧性、腘绳肌伸展、核心控制', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 7, NOW(), NOW()), ('mat_saw', '锯式', '垫上普拉提', '坐姿扭转配合前屈,增强脊柱旋转能力', '腹斜肌、背部伸肌、脊柱旋转灵活性', NULL, 6, NULL, NULL, NULL, '每侧6次', 'mat_pilates', 8, NOW(), NOW()), ('mat_swan', '天鹅式', '垫上普拉提', '俯卧位脊柱后伸,强化背部肌群', '背部伸肌、臀肌、腘绳肌', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 9, NOW(), NOW()), ('mat_shoulder_bridge', '肩桥', '垫上普拉提', '仰卧抬臀,激活后链肌群', '臀肌、腘绳肌、下背部、脊柱灵活性', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 10, NOW(), NOW()); -- 插入核心床(Reformer)动作数据 INSERT INTO `t_exercises` ( `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, `category_key`, `sort_order`, `created_at`, `updated_at` ) VALUES ('reformer_footwork', '脚部练习系列', '核心床', '在核心床上进行各种脚部位置的推蹬练习', '腿部、足部、核心稳定性', '核心床', 10, NULL, NULL, NULL, NULL, 'reformer', 1, NOW(), NOW()), ('reformer_hundred', '百次拍打', '核心床', '在核心床上进行百次拍打,增加阻力挑战', '核心肌群、呼吸肌群、上身耐力', '核心床', NULL, NULL, 10, NULL, '10个呼吸循环', 'reformer', 2, NOW(), NOW()), ('reformer_bridge', '桥式', '核心床', '在核心床上进行桥式动作,利用弹簧阻力', '臀肌、腘绳肌、脊柱关节', '核心床', 10, NULL, NULL, NULL, '6-10次', 'reformer', 3, NOW(), NOW()), ('reformer_straps', '脚套带练习', '核心床', '使用脚套带进行各种腿部和髋部练习', '髋部灵活性、骨盆稳定性、身体控制、内收肌', '核心床', 10, NULL, NULL, NULL, '8-10次', 'reformer', 4, NOW(), NOW()), ('reformer_elephant', '象式', '核心床', '四点跪撑位置进行推拉练习', '核心肌群、腘绳肌、背部伸肌、肩部稳定性', '核心床', 10, NULL, NULL, NULL, '8-10次', 'reformer', 5, NOW(), NOW()), ('reformer_knee_stretch', '跪姿伸展系列', '核心床', '跪姿位置进行多种伸展动作', '核心肌群、髋部灵活性、肩部控制', '核心床', 10, NULL, NULL, NULL, NULL, 'reformer', 6, NOW(), NOW()); -- 插入凯迪拉克(Cadillac)动作数据 INSERT INTO `t_exercises` ( `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, `category_key`, `sort_order`, `created_at`, `updated_at` ) VALUES ('cadillac_leg_springs', '腿部弹簧系列', '凯迪拉克', '使用腿部弹簧进行各种腿部强化练习', '腘绳肌、股四头肌、臀肌、髋屈肌、内收肌', '凯迪拉克', 20, NULL, NULL, NULL, '10-20次', 'cadillac', 1, NOW(), NOW()), ('cadillac_arm_springs', '手臂弹簧系列', '凯迪拉克', '使用手臂弹簧进行上身力量训练', '胸部、肩部、上背部、手臂', '凯迪拉克', 15, NULL, NULL, NULL, '10-15次', 'cadillac', 2, NOW(), NOW()), ('cadillac_roll_down_bar', '滚背杆卷下', '凯迪拉克', '使用滚背杆进行脊柱逐节控制练习', '腹部肌肉、脊柱灵活性', '凯迪拉克', 12, NULL, NULL, NULL, '8-12次', 'cadillac', 3, NOW(), NOW()), ('cadillac_push_through_bar', '推杆', '凯迪拉克', '推拉横杆进行全身协调练习', '肩部、核心、背部', '凯迪拉克', 12, NULL, NULL, NULL, '8-12次', 'cadillac', 4, NOW(), NOW()); -- 插入普拉提椅(Chair)动作数据 INSERT INTO `t_exercises` ( `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, `category_key`, `sort_order`, `created_at`, `updated_at` ) VALUES ('chair_seated_march', '坐姿行进', '普拉提椅', '坐在椅子上进行交替抬腿练习', '核心肌群、髋屈肌', '普拉提椅', 12, NULL, NULL, NULL, '每侧10-12次', 'chair', 1, NOW(), NOW()), ('chair_seated_leg_lift', '坐姿抬腿', '普拉提椅', '坐姿单腿伸展练习', '股四头肌、核心肌群', '普拉提椅', 12, NULL, NULL, NULL, '每侧10-12次', 'chair', 2, NOW(), NOW()), ('chair_seated_arm_circles', '坐姿手臂画圈', '普拉提椅', '坐姿手臂做圆周运动', '肩部、上背部、手臂', '普拉提椅', 12, NULL, NULL, NULL, '前后各10-12次', 'chair', 3, NOW(), NOW()), ('chair_spine_twist', '脊柱扭转', '普拉提椅', '坐姿脊柱旋转练习', '腹斜肌、脊柱旋转肌', '普拉提椅', 10, NULL, NULL, NULL, '每侧8-10次', 'chair', 4, NOW(), NOW()), ('chair_squat', '椅子深蹲', '普拉提椅', '使用椅子进行深蹲练习', '臀肌、股四头肌、腘绳肌、核心', '普拉提椅', 12, NULL, NULL, NULL, '10-12次', 'chair', 5, NOW(), NOW()); -- 插入普拉提桶(Barrel)动作数据 INSERT INTO `t_exercises` ( `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, `category_key`, `sort_order`, `created_at`, `updated_at` ) VALUES ('barrel_spine_stretch', '脊柱伸展', '普拉提桶', '在桶上进行脊柱后伸练习', '核心肌群、脊柱伸肌、背部肌肉', '普拉提桶', 12, 3, NULL, NULL, '10-12次,2-3组', 'barrel', 1, NOW(), NOW()), ('barrel_mermaid', '美人鱼伸展', '普拉提桶', '侧坐在桶上进行侧向伸展', '核心肌群、腹斜肌、侧向柔韧性', '普拉提桶', 10, 3, NULL, NULL, '每侧8-10次,2-3组', 'barrel', 2, NOW(), NOW()), ('barrel_side_bend', '侧弯', '普拉提桶', '侧卧在桶上进行侧向弯曲练习', '腹斜肌、腰部塑形、平衡感、核心稳定性', '普拉提桶', 10, 3, NULL, NULL, '每侧8-10次,2-3组', 'barrel', 3, NOW(), NOW()), ('barrel_teaser_prep', '预备式Teaser', '普拉提桶', '在桶上进行Teaser动作的预备练习', '核心肌群、平衡感、本体感受', '普拉提桶', 5, 2, NULL, 3, '5次,2组,保持3秒', 'barrel', 4, NOW(), NOW()), ('barrel_swan_dive_prep', '预备式Swan Dive', '普拉提桶', '在桶上进行Swan Dive的预备练习', '背部伸肌、脊柱伸展、平衡感', '普拉提桶', 5, 2, NULL, 3, '5次,2组,保持3秒', 'barrel', 5, NOW(), NOW()); -- 验证数据插入结果 SELECT ec.name as category_name, ec.type, ec.equipment_name, COUNT(e.key) as exercise_count FROM t_exercise_categories ec LEFT JOIN t_exercises e ON ec.key = e.category_key GROUP BY ec.key, ec.name, ec.type, ec.equipment_name ORDER BY ec.sort_order; -- 验证表结构 SELECT TABLE_NAME, TABLE_COMMENT, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('t_exercise_categories', 't_exercises', 't_training_plans', 't_schedule_exercises') ORDER BY TABLE_NAME; -- 验证外键约束 SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME IN ('t_exercises', 't_schedule_exercises') ORDER BY TABLE_NAME, CONSTRAINT_NAME;