feat: 新增饮食记录和分析功能
- 创建饮食记录相关的数据库模型、DTO和API接口,支持用户手动添加和AI视觉识别记录饮食。 - 实现饮食分析服务,提供营养分析和健康建议,优化AI教练服务以集成饮食分析功能。 - 更新用户控制器,添加饮食记录的增删查改接口,增强用户饮食管理体验。 - 提供详细的API使用指南和数据库创建脚本,确保功能的完整性和可用性。
This commit is contained in:
247
sql-scripts/pilates-tables-create.sql
Normal file
247
sql-scripts/pilates-tables-create.sql
Normal file
@@ -0,0 +1,247 @@
|
||||
-- 普拉提训练系统完整表结构创建脚本
|
||||
-- 执行前请确保删除旧表(注意删除顺序,避免外键约束错误)
|
||||
|
||||
-- 禁用外键检查(创建时)
|
||||
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;
|
||||
Reference in New Issue
Block a user