应用概述

基于HarmonyOS 5和仓颉编程语言的Keep健身应用,主要功能包括:

  • 健身课程推荐与分类
  • 运动数据实时监测
  • 训练计划个性化定制
  • 健康数据统计分析
  • 社交互动与成就系统

技术架构

  1. ​前端​​:仓颉语言开发HarmonyOS应用
  2. ​健康数据​​:HarmonyOS健康数据管理
  3. ​传感器​​:设备运动传感器接入
  4. ​AI能力​​:运动姿态识别与纠正
  5. ​社交功能​​:HarmonyOS帐号服务

核心功能实现

1. 数据模型定义

// 健身课程模型
class WorkoutCourse {
    id: number;
    title: string;
    cover: Resource;
    duration: number; // 分钟
    difficulty: 'beginner' | 'intermediate' | 'advanced';
    calories: number; // 预估卡路里
    category: 'cardio' | 'strength' | 'yoga' | 'hiit';
    exercises: Exercise[];
}

// 单个训练动作
class Exercise {
    name: string;
    duration: number; // 秒
    restAfter: number; // 秒
    videoDemo: Resource;
    tips: string;
}

// 用户训练记录
class WorkoutRecord {
    id: number;
    courseId: number;
    startTime: string;
    endTime: string;
    calories: number;
    heartRate: {time: string, value: number}[];
    completion: number; // 完成百分比
}

2. 主界面实现

@Component
struct KeepHomePage {
    @State recommendedCourses: WorkoutCourse[] = [];
    @State todayWorkoutPlan?: WorkoutCourse;
    @State currentHeartRate: number = 0;
    private sensorManager: SensorManager;
    
    build() {
        Column() {
            // 健康数据概览
            HealthOverview({
                heartRate: this.currentHeartRate,
                steps: 0,
                calories: 0
            })
            
            // 今日推荐训练
            if (this.todayWorkoutPlan) {
                TodayWorkoutCard({
                    course: this.todayWorkoutPlan,
                    onStart: () => this.startWorkout(this.todayWorkoutPlan!)
                })
            }
            
            // 推荐课程
            Text('为你推荐')
                .fontSize(18)
                .fontWeight(FontWeight.Bold)
                .margin({ top: 20, left: 15 })
            
            CourseList({
                courses: this.recommendedCourses,
                onSelect: (course) => this.viewCourseDetail(course)
            })
        }
    }
    
    aboutToAppear() {
        this.loadRecommendations();
        this.loadTodayPlan();
        this.initSensors();
    }
    
    // 初始化传感器
    initSensors() {
        this.sensorManager = new SensorManager();
        this.sensorManager.startHeartRateMonitoring((rate) => {
            this.currentHeartRate = rate;
        });
    }
    
    // 加载推荐课程
    async loadRecommendations() {
        try {
            const response = await http.get('/api/courses/recommended');
            this.recommendedCourses = response.data;
        } catch (error) {
            console.error('加载推荐课程失败:', error);
        }
    }
    
    // 加载今日计划
    async loadTodayPlan() {
        try {
            const response = await http.get('/api/plans/today');
            this.todayWorkoutPlan = response.data;
        } catch (error) {
            console.error('加载今日计划失败:', error);
        }
    }
    
    // 开始训练
    startWorkout(course: WorkoutCourse) {
        router.push({ 
            url: 'pages/WorkoutPage', 
            params: { courseId: course.id } 
        });
    }
    
    // 查看课程详情
    viewCourseDetail(course: WorkoutCourse) {
        router.push({ 
            url: 'pages/CourseDetailPage', 
            params: { courseId: course.id } 
        });
    }
}

3. 训练页面实现

@Component
struct WorkoutPage {
    @State course?: WorkoutCourse;
    @State currentExerciseIndex: number = 0;
    @State exerciseTimeLeft: number = 0;
    @State isPaused: boolean = true;
    @State heartRate: number = 0;
    private timer?: number;
    private sensorManager: SensorManager;
    private poseDetector: PoseDetector;
    
    build() {
        Column() {
            if (this.course) {
                // 训练动作展示
                ExerciseDisplay({
                    exercise: this.course.exercises[this.currentExerciseIndex],
                    timeLeft: this.exerciseTimeLeft,
                    onPoseCorrect: this.handlePoseCorrect
                })
                
                // 训练控制面板
                WorkoutControls({
                    isPaused: this.isPaused,
                    onTogglePause: this.togglePause,
                    onSkip: this.skipExercise,
                    onComplete: this.completeWorkout
                })
                
                // 实时数据
                WorkoutMetrics({
                    heartRate: this.heartRate,
                    calories: this.calculateCalories(),
                    timeElapsed: this.calculateElapsedTime()
                })
            }
        }
    }
    
    aboutToAppear() {
        const params = router.getParams();
        if (params?.courseId) {
            this.loadCourse(params.courseId);
        }
        
        this.sensorManager = new SensorManager();
        this.poseDetector = new PoseDetector();
        
        this.startSensors();
    }
    
    onPageHide() {
        this.stopSensors();
        this.stopTimer();
    }
    
    // 加载课程
    async loadCourse(id: number) {
        try {
            const response = await http.get(`/api/courses/${id}`);
            this.course = response.data;
            this.exerciseTimeLeft = this.course.exercises[0].duration;
        } catch (error) {
            console.error('加载课程失败:', error);
        }
    }
    
    // 开始传感器监测
    startSensors() {
        this.sensorManager.startHeartRateMonitoring((rate) => {
            this.heartRate = rate;
        });
        
        this.poseDetector.startDetection((pose) => {
            this.checkPoseCorrectness(pose);
        });
    }
    
    // 停止传感器
    stopSensors() {
        this.sensorManager.stopAll();
        this.poseDetector.stop();
    }
    
    // 检查动作准确性
    checkPoseCorrectness(pose: Pose) {
        const currentExercise = this.course?.exercises[this.currentExerciseIndex];
        if (!currentExercise) return;
        
        const correctness = this.poseDetector.compareWithTemplate(
            pose, 
            currentExercise.name
        );
        
        if (correctness < 0.7) {
            prompt.showToast({ 
                message: '动作不标准,请调整姿势' 
            });
        }
    }
    
    // 开始/暂停计时器
    togglePause() {
        this.isPaused = !this.isPaused;
        if (this.isPaused) {
            this.stopTimer();
        } else {
            this.startTimer();
        }
    }
    
    // 开始计时器
    startTimer() {
        this.stopTimer();
        this.timer = setInterval(() => {
            if (this.exerciseTimeLeft > 0) {
                this.exerciseTimeLeft--;
            } else {
                this.nextExercise();
            }
        }, 1000);
    }
    
    // 停止计时器
    stopTimer() {
        if (this.timer) {
            clearInterval(this.timer);
            this.timer = undefined;
        }
    }
    
    // 下一个动作
    nextExercise() {
        if (!this.course) return;
        
        if (this.currentExerciseIndex < this.course.exercises.length - 1) {
            this.currentExerciseIndex++;
            this.exerciseTimeLeft = this.course.exercises[this.currentExerciseIndex].duration;
        } else {
            this.completeWorkout();
        }
    }
    
    // 跳过当前动作
    skipExercise() {
        this.nextExercise();
    }
    
    // 完成训练
    completeWorkout() {
        this.stopTimer();
        this.stopSensors();
        
        // 保存训练记录
        this.saveWorkoutRecord();
        
        router.back();
    }
    
    // 保存训练记录
    async saveWorkoutRecord() {
        if (!this.course) return;
        
        const record = {
            courseId: this.course.id,
            startTime: new Date().toISOString(),
            endTime: new Date().toISOString(),
            calories: this.calculateCalories(),
            heartRate: this.sensorManager.getHeartRateHistory(),
            completion: 100
        };
        
        try {
            await http.post('/api/records', record);
        } catch (error) {
            console.error('保存训练记录失败:', error);
        }
    }
}

4. 传感器管理封装

class SensorManager {
    private heartRateListener?: (rate: number) => void;
    private heartRateHistory: {time: string, value: number}[] = [];
    
    // 开始心率监测
    startHeartRateMonitoring(listener: (rate: number) => void) {
        this.heartRateListener = listener;
        
        // 模拟心率数据,实际应使用HarmonyOS传感器API
        setInterval(() => {
            const rate = Math.floor(60 + Math.random() * 40); // 模拟60-100心率
            this.heartRateListener?.(rate);
            this.heartRateHistory.push({
                time: new Date().toISOString(),
                value: rate
            });
        }, 3000);
    }
    
    // 获取心率历史
    getHeartRateHistory() {
        return this.heartRateHistory;
    }
    
    // 停止所有传感器
    stopAll() {
        // 实际应用中应停止所有传感器监听
    }
}

5. 姿态检测封装

class PoseDetector {
    private listener?: (pose: Pose) => void;
    
    // 开始姿态检测
    startDetection(listener: (pose: Pose) => void) {
        this.listener = listener;
        
        // 模拟姿态数据,实际应使用HarmonyOS AI姿态检测API
        setInterval(() => {
            const pose = this.generateRandomPose();
            this.listener?.(pose);
        }, 2000);
    }
    
    // 停止检测
    stop() {
        // 实际应用中应停止检测
    }
    
    // 比较当前姿态与标准姿态
    compareWithTemplate(current: Pose, exerciseName: string): number {
        // 实际应用中应使用AI模型比较
        return Math.random(); // 返回0-1的相似度
    }
    
    // 生成随机姿态数据
    private generateRandomPose(): Pose {
        return {
            joints: {} // 模拟关节数据
        };
    }
}

项目结构

keep-app/
├── entry/
│   ├── src/
│   │   ├── main/
│   │   │   ├── ets/
│   │   │   │   ├── pages/
│   │   │   │   │   ├── KeepHomePage.ets      # 主页
│   │   │   │   │   ├── WorkoutPage.ets       # 训练页面
│   │   │   │   │   ├── CourseDetailPage.ets  # 课程详情页
│   │   │   │   │   └── ProfilePage.ets       # 个人主页
│   │   │   │   ├── components/
│   │   │   │   │   ├── HealthOverview.ets    # 健康数据概览
│   │   │   │   │   ├── TodayWorkoutCard.ets  # 今日训练卡片
│   │   │   │   │   ├── ExerciseDisplay.ets   # 训练动作展示
│   │   │   │   │   └── WorkoutControls.ets   # 训练控制面板
│   │   │   │   ├── model/
│   │   │   │   │   ├── WorkoutCourse.ets     # 课程模型
│   │   │   │   │   └── WorkoutRecord.ets    # 训练记录模型
│   │   │   │   ├── services/
│   │   │   │   │   ├── SensorManager.ets     # 传感器管理
│   │   │   │   │   └── PoseDetector.ets      # 姿态检测
│   │   │   │   ├── app.ets                   # 应用入口
│   │   │   │   └── resources/                # 资源文件
│   │   │   └── module.json5                  # 模块配置
Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐