在这里插入图片描述

目录

  1. 概述
  2. 健康管理基础
  3. 核心评估方法
  4. Kotlin 源代码
  5. JavaScript 编译代码
  6. ArkTS 调用代码
  7. 健康指标详解
  8. 实战应用

概述

在现代社会,健康已成为人们最关注的话题之一。随着生活节奏加快、工作压力增大,越来越多的人开始关注自己的身体健康状况。健康指数评估工具是帮助个人了解自身健康状况、制定科学的健康管理计划、预防疾病的重要工具。本文档介绍如何在 Kotlin Multiplatform (KMP) 框架下,结合 OpenHarmony 鸿蒙操作系统,实现一个功能完整的健康指数评估工具。

健康指数评估工具是一个综合性的健康管理平台,它不仅能够根据多个健康指标进行综合评估,还能够进行健康风险预测、生成健康报告、提供个性化的健康建议。通过KMP框架的跨端能力,这个工具可以在Android、iOS、Web和OpenHarmony等多个平台上运行,为用户提供了一个强大的个人健康管理工具。

健康管理的重要性

健康管理在现代生活中的重要性日益凸显:

  1. 早期发现:通过定期评估可以早期发现潜在的健康问题。
  2. 预防疾病:科学的健康管理能够有效预防多种慢性疾病。
  3. 提升生活质量:良好的健康状况能够显著提升生活质量。
  4. 降低医疗成本:预防性的健康管理能够降低医疗成本。
  5. 延长寿命:科学的健康管理能够延长人的寿命。

工具的核心价值

健康指数评估工具提供以下价值:

  • 多维度评估:综合考虑身体、心理、生活方式等多个维度
  • 个性化建议:根据用户的具体情况提供个性化的健康建议
  • 趋势追踪:追踪健康指标的变化趋势,了解健康状况的动态
  • 风险预警:对潜在的健康风险进行预警
  • 详细报告:生成专业的健康评估报告
  • 跨平台支持:一份代码可在多个平台运行,提高开发效率

健康管理基础

核心概念

健康指数(Health Index):综合反映个人健康状况的指标,通常用0-100的分数表示。

身体健康(Physical Health):包括体重、血压、血糖等生理指标。

心理健康(Mental Health):包括压力水平、睡眠质量、情绪状态等心理指标。

生活方式(Lifestyle):包括运动频率、饮食习惯、烟酒使用等生活习惯。

健康风险(Health Risk):可能导致疾病的危险因素。

健康等级(Health Level):根据健康指数划分的等级,如优秀、良好、一般等。

常见的健康评估维度

生理指标:身高、体重、BMI、血压、血糖、胆固醇等。

生活习惯:运动频率、睡眠时长、饮食习惯、烟酒使用等。

心理状态:压力水平、焦虑程度、抑郁程度、生活满意度等。

疾病史:家族病史、既往疾病、当前用药等。

环境因素:工作环境、生活环境、社交关系等。

影响健康的关键因素

遗传因素:家族病史对个人健康有重要影响。

生活方式:运动、饮食、睡眠等生活习惯是健康的重要决定因素。

心理状态:压力、焦虑、抑郁等心理因素会影响身体健康。

环境因素:工作环境、生活环境、空气质量等都会影响健康。

医疗保健:定期体检、及时治疗等医疗保健措施对健康至关重要。


核心评估方法

1. 生理指标评估

根据身高、体重、血压等生理指标进行评估。

2. 生活方式评估

评估运动频率、饮食习惯、睡眠质量等生活方式。

3. 心理状态评估

评估压力水平、情绪状态、生活满意度等心理因素。

4. 疾病风险评估

根据家族病史、既往疾病等评估疾病风险。

5. 综合健康评分

综合考虑多个维度,计算总体健康指数。

6. 个性化建议

根据评估结果提供个性化的健康改善建议。


Kotlin 源代码

// HealthIndexAssessor.kt
import java.time.LocalDateTime
import kotlin.math.pow

data class HealthIndicator(
    val id: String,
    val userId: String,
    val height: Double,
    val weight: Double,
    val bloodPressureSystolic: Int,
    val bloodPressureDiastolic: Int,
    val bloodSugar: Double,
    val cholesterol: Double,
    val exerciseFrequency: Int,
    val sleepHours: Double,
    val stressLevel: Int,
    val timestamp: String
)

data class HealthAssessmentResult(
    val userId: String,
    val bmi: Double,
    val bmiLevel: String,
    val bloodPressureLevel: String,
    val bloodSugarLevel: String,
    val cholesterolLevel: String,
    val lifestyleScore: Double,
    val psychologicalScore: Double,
    val physicalScore: Double,
    val healthIndex: Double,
    val healthLevel: String,
    val riskFactors: List<String>,
    val recommendations: List<String>,
    val timestamp: String
)

data class HealthMetrics(
    val totalUsers: Long,
    val averageHealthIndex: Double,
    val healthyUsers: Long,
    val atRiskUsers: Long,
    val averageBMI: Double,
    val averageBloodPressure: String,
    val commonRiskFactors: Map<String, Long>
)

data class HealthTrend(
    val userId: String,
    val assessments: List<HealthAssessmentResult>,
    val trend: String,
    val improvementAreas: List<String>,
    val maintenanceAreas: List<String>
)

class HealthIndexAssessor {
    private val assessments = mutableListOf<HealthAssessmentResult>()
    private val indicators = mutableListOf<HealthIndicator>()
    private var assessmentIdCounter = 0
    
    // 评估健康指数
    fun assessHealth(
        userId: String,
        height: Double,
        weight: Double,
        bloodPressureSystolic: Int,
        bloodPressureDiastolic: Int,
        bloodSugar: Double,
        cholesterol: Double,
        exerciseFrequency: Int,
        sleepHours: Double,
        stressLevel: Int
    ): HealthAssessmentResult {
        val id = "HEALTH${++assessmentIdCounter}"
        
        val indicator = HealthIndicator(
            id, userId, height, weight, bloodPressureSystolic, bloodPressureDiastolic,
            bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel,
            LocalDateTime.now().toString()
        )
        indicators.add(indicator)
        
        // 计算BMI
        val heightInMeters = height / 100
        val bmi = weight / (heightInMeters * heightInMeters)
        val bmiLevel = when {
            bmi < 18.5 -> "偏瘦"
            bmi < 24.9 -> "正常"
            bmi < 29.9 -> "超重"
            else -> "肥胖"
        }
        
        // 评估血压
        val bloodPressureLevel = when {
            bloodPressureSystolic < 120 && bloodPressureDiastolic < 80 -> "正常"
            bloodPressureSystolic < 130 && bloodPressureDiastolic < 80 -> "升高"
            bloodPressureSystolic < 140 || bloodPressureDiastolic < 90 -> "1级高血压"
            else -> "2级高血压"
        }
        
        // 评估血糖
        val bloodSugarLevel = when {
            bloodSugar < 5.6 -> "正常"
            bloodSugar < 7.0 -> "空腹血糖受损"
            else -> "糖尿病风险"
        }
        
        // 评估胆固醇
        val cholesterolLevel = when {
            cholesterol < 200 -> "理想"
            cholesterol < 240 -> "边界高"
            else -> "高"
        }
        
        // 计算生活方式评分
        val lifestyleScore = calculateLifestyleScore(exerciseFrequency, sleepHours)
        
        // 计算心理评分
        val psychologicalScore = calculatePsychologicalScore(stressLevel)
        
        // 计算身体评分
        val physicalScore = calculatePhysicalScore(bmi, bloodPressureSystolic, bloodSugar, cholesterol)
        
        // 计算综合健康指数
        val healthIndex = (physicalScore * 0.4 + lifestyleScore * 0.3 + psychologicalScore * 0.3)
        
        // 判断健康等级
        val healthLevel = when {
            healthIndex >= 85 -> "优秀"
            healthIndex >= 70 -> "良好"
            healthIndex >= 55 -> "一般"
            healthIndex >= 40 -> "较差"
            else -> "很差"
        }
        
        // 识别风险因素
        val riskFactors = identifyRiskFactors(
            bmi, bloodPressureSystolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel
        )
        
        // 生成建议
        val recommendations = generateRecommendations(
            bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel, exerciseFrequency, sleepHours, stressLevel
        )
        
        val result = HealthAssessmentResult(
            userId, bmi, bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel,
            lifestyleScore, psychologicalScore, physicalScore, healthIndex, healthLevel,
            riskFactors, recommendations, LocalDateTime.now().toString()
        )
        
        assessments.add(result)
        return result
    }
    
    // 计算生活方式评分
    private fun calculateLifestyleScore(exerciseFrequency: Int, sleepHours: Double): Double {
        var score = 50.0
        
        // 运动评分
        score += when {
            exerciseFrequency >= 5 -> 25.0
            exerciseFrequency >= 3 -> 20.0
            exerciseFrequency >= 1 -> 10.0
            else -> 0.0
        }
        
        // 睡眠评分
        score += when {
            sleepHours >= 7 && sleepHours <= 9 -> 25.0
            sleepHours >= 6 && sleepHours < 7 -> 15.0
            sleepHours > 9 && sleepHours <= 10 -> 15.0
            else -> 0.0
        }
        
        return minOf(score, 100.0)
    }
    
    // 计算心理评分
    private fun calculatePsychologicalScore(stressLevel: Int): Double {
        return when {
            stressLevel <= 3 -> 90.0
            stressLevel <= 5 -> 75.0
            stressLevel <= 7 -> 60.0
            stressLevel <= 9 -> 45.0
            else -> 30.0
        }
    }
    
    // 计算身体评分
    private fun calculatePhysicalScore(
        bmi: Double,
        bloodPressureSystolic: Int,
        bloodSugar: Double,
        cholesterol: Double
    ): Double {
        var score = 100.0
        
        // BMI扣分
        score -= when {
            bmi < 18.5 -> 15.0
            bmi < 24.9 -> 0.0
            bmi < 29.9 -> 15.0
            else -> 25.0
        }
        
        // 血压扣分
        score -= when {
            bloodPressureSystolic < 120 -> 0.0
            bloodPressureSystolic < 130 -> 5.0
            bloodPressureSystolic < 140 -> 15.0
            else -> 25.0
        }
        
        // 血糖扣分
        score -= when {
            bloodSugar < 5.6 -> 0.0
            bloodSugar < 7.0 -> 10.0
            else -> 20.0
        }
        
        // 胆固醇扣分
        score -= when {
            cholesterol < 200 -> 0.0
            cholesterol < 240 -> 10.0
            else -> 20.0
        }
        
        return maxOf(score, 0.0)
    }
    
    // 识别风险因素
    private fun identifyRiskFactors(
        bmi: Double,
        bloodPressureSystolic: Int,
        bloodSugar: Double,
        cholesterol: Double,
        exerciseFrequency: Int,
        sleepHours: Double,
        stressLevel: Int
    ): List<String> {
        val factors = mutableListOf<String>()
        
        if (bmi >= 25) factors.add("超重或肥胖")
        if (bloodPressureSystolic >= 130) factors.add("高血压风险")
        if (bloodSugar >= 7.0) factors.add("糖尿病风险")
        if (cholesterol >= 240) factors.add("高胆固醇")
        if (exerciseFrequency < 3) factors.add("运动不足")
        if (sleepHours < 6 || sleepHours > 10) factors.add("睡眠不规律")
        if (stressLevel > 7) factors.add("压力过大")
        
        return factors
    }
    
    // 生成建议
    private fun generateRecommendations(
        bmiLevel: String,
        bloodPressureLevel: String,
        bloodSugarLevel: String,
        cholesterolLevel: String,
        exerciseFrequency: Int,
        sleepHours: Double,
        stressLevel: Int
    ): List<String> {
        val recommendations = mutableListOf<String>()
        
        if (bmiLevel == "超重" || bmiLevel == "肥胖") {
            recommendations.add("💪 建议增加运动量,控制饮食,目标是将BMI降至正常范围")
        }
        
        if (bloodPressureLevel.contains("高血压")) {
            recommendations.add("❤️ 建议减少盐分摄入,增加运动,定期监测血压")
        }
        
        if (bloodSugarLevel != "正常") {
            recommendations.add("🍎 建议减少糖分摄入,增加纤维素,定期检查血糖")
        }
        
        if (cholesterolLevel == "高") {
            recommendations.add("🥗 建议减少饱和脂肪摄入,增加有氧运动")
        }
        
        if (exerciseFrequency < 3) {
            recommendations.add("🏃 建议每周至少进行3次中等强度的运动")
        }
        
        if (sleepHours < 6 || sleepHours > 10) {
            recommendations.add("😴 建议保持规律的作息,每天睡眠7-9小时")
        }
        
        if (stressLevel > 7) {
            recommendations.add("🧘 建议学习压力管理技巧,进行冥想或瑜伽")
        }
        
        return recommendations
    }
    
    // 获取健康指标
    fun getHealthMetrics(): HealthMetrics {
        if (assessments.isEmpty()) {
            return HealthMetrics(0, 0.0, 0, 0, 0.0, "", emptyMap())
        }
        
        val totalUsers = assessments.map { it.userId }.distinct().size.toLong()
        val averageHealthIndex = assessments.map { it.healthIndex }.average()
        val healthyUsers = assessments.count { it.healthLevel == "优秀" || it.healthLevel == "良好" }.toLong()
        val atRiskUsers = assessments.count { it.healthLevel == "较差" || it.healthLevel == "很差" }.toLong()
        val averageBMI = assessments.map { it.bmi }.average()
        
        val commonRiskFactors = mutableMapOf<String, Long>()
        for (assessment in assessments) {
            for (factor in assessment.riskFactors) {
                commonRiskFactors[factor] = (commonRiskFactors[factor] ?: 0L) + 1
            }
        }
        
        val avgSystolic = assessments.map { it.physicalScore }.average().toInt()
        val averageBloodPressure = "$avgSystolic/80"
        
        return HealthMetrics(
            totalUsers, averageHealthIndex, healthyUsers, atRiskUsers,
            averageBMI, averageBloodPressure, commonRiskFactors
        )
    }
    
    // 获取所有评估
    fun getAllAssessments(): List<HealthAssessmentResult> {
        return assessments.toList()
    }
    
    // 生成健康报告
    fun generateHealthReport(): Map<String, Any> {
        val metrics = getHealthMetrics()
        
        return mapOf(
            "timestamp" to LocalDateTime.now().toString(),
            "metrics" to metrics,
            "assessments" to assessments.toList(),
            "recommendations" to generateGeneralRecommendations(metrics)
        )
    }
    
    // 生成通用建议
    private fun generateGeneralRecommendations(metrics: HealthMetrics): List<String> {
        val recommendations = mutableListOf<String>()
        
        if (metrics.averageHealthIndex < 60) {
            recommendations.add("📊 整体健康水平需要改善,建议进行全面体检")
        }
        
        if (metrics.atRiskUsers > metrics.totalUsers / 3) {
            recommendations.add("⚠️ 高风险人群比例较高,建议加强健康管理")
        }
        
        if (metrics.averageBMI > 25) {
            recommendations.add("⚖️ 平均BMI超标,建议全面推进健康生活方式")
        }
        
        recommendations.add("✅ 定期进行健康评估,追踪健康指标变化")
        
        return recommendations
    }
    
    // 清空数据
    fun clearData() {
        assessments.clear()
        indicators.clear()
    }
}

fun main() {
    val assessor = HealthIndexAssessor()
    
    // 评估用户健康
    val result = assessor.assessHealth(
        userId = "user1",
        height = 170.0,
        weight = 70.0,
        bloodPressureSystolic = 120,
        bloodPressureDiastolic = 80,
        bloodSugar = 5.2,
        cholesterol = 200.0,
        exerciseFrequency = 4,
        sleepHours = 7.5,
        stressLevel = 5
    )
    
    println("健康评估结果:")
    println("BMI: ${String.format("%.2f", result.bmi)} (${result.bmiLevel})")
    println("健康指数: ${String.format("%.2f", result.healthIndex)}")
    println("健康等级: ${result.healthLevel}")
    println("风险因素: ${result.riskFactors}")
    
    // 生成报告
    val report = assessor.generateHealthReport()
    println("\n健康报告已生成")
}

Kotlin代码说明:这个Kotlin实现提供了完整的健康指数评估功能。HealthIndexAssessor 类能够根据多个健康指标进行综合评估、识别风险因素、生成个性化建议。通过使用数据类和科学的计算方法,代码既简洁又准确。系统支持多维度的健康分析,从单个用户的详细评估到整个群体的健康趋势,为用户提供了全面的健康管理支持。


JavaScript 编译代码

// HealthIndexAssessor.js
class HealthIndicator {
    constructor(id, userId, height, weight, bloodPressureSystolic, bloodPressureDiastolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel, timestamp) {
        this.id = id;
        this.userId = userId;
        this.height = height;
        this.weight = weight;
        this.bloodPressureSystolic = bloodPressureSystolic;
        this.bloodPressureDiastolic = bloodPressureDiastolic;
        this.bloodSugar = bloodSugar;
        this.cholesterol = cholesterol;
        this.exerciseFrequency = exerciseFrequency;
        this.sleepHours = sleepHours;
        this.stressLevel = stressLevel;
        this.timestamp = timestamp;
    }
}

class HealthAssessmentResult {
    constructor(userId, bmi, bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel, lifestyleScore, psychologicalScore, physicalScore, healthIndex, healthLevel, riskFactors, recommendations, timestamp) {
        this.userId = userId;
        this.bmi = bmi;
        this.bmiLevel = bmiLevel;
        this.bloodPressureLevel = bloodPressureLevel;
        this.bloodSugarLevel = bloodSugarLevel;
        this.cholesterolLevel = cholesterolLevel;
        this.lifestyleScore = lifestyleScore;
        this.psychologicalScore = psychologicalScore;
        this.physicalScore = physicalScore;
        this.healthIndex = healthIndex;
        this.healthLevel = healthLevel;
        this.riskFactors = riskFactors;
        this.recommendations = recommendations;
        this.timestamp = timestamp;
    }
}

class HealthMetrics {
    constructor(totalUsers, averageHealthIndex, healthyUsers, atRiskUsers, averageBMI, averageBloodPressure, commonRiskFactors) {
        this.totalUsers = totalUsers;
        this.averageHealthIndex = averageHealthIndex;
        this.healthyUsers = healthyUsers;
        this.atRiskUsers = atRiskUsers;
        this.averageBMI = averageBMI;
        this.averageBloodPressure = averageBloodPressure;
        this.commonRiskFactors = commonRiskFactors;
    }
}

class HealthIndexAssessor {
    constructor() {
        this.assessments = [];
        this.indicators = [];
        this.assessmentIdCounter = 0;
    }
    
    assessHealth(userId, height, weight, bloodPressureSystolic, bloodPressureDiastolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel) {
        const id = `HEALTH${++this.assessmentIdCounter}`;
        
        const indicator = new HealthIndicator(id, userId, height, weight, bloodPressureSystolic, bloodPressureDiastolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel, new Date().toISOString());
        this.indicators.push(indicator);
        
        const heightInMeters = height / 100;
        const bmi = weight / (heightInMeters * heightInMeters);
        
        let bmiLevel;
        if (bmi < 18.5) bmiLevel = "偏瘦";
        else if (bmi < 24.9) bmiLevel = "正常";
        else if (bmi < 29.9) bmiLevel = "超重";
        else bmiLevel = "肥胖";
        
        let bloodPressureLevel;
        if (bloodPressureSystolic < 120 && bloodPressureDiastolic < 80) bloodPressureLevel = "正常";
        else if (bloodPressureSystolic < 130 && bloodPressureDiastolic < 80) bloodPressureLevel = "升高";
        else if (bloodPressureSystolic < 140 || bloodPressureDiastolic < 90) bloodPressureLevel = "1级高血压";
        else bloodPressureLevel = "2级高血压";
        
        let bloodSugarLevel;
        if (bloodSugar < 5.6) bloodSugarLevel = "正常";
        else if (bloodSugar < 7.0) bloodSugarLevel = "空腹血糖受损";
        else bloodSugarLevel = "糖尿病风险";
        
        let cholesterolLevel;
        if (cholesterol < 200) cholesterolLevel = "理想";
        else if (cholesterol < 240) cholesterolLevel = "边界高";
        else cholesterolLevel = "高";
        
        const lifestyleScore = this.calculateLifestyleScore(exerciseFrequency, sleepHours);
        const psychologicalScore = this.calculatePsychologicalScore(stressLevel);
        const physicalScore = this.calculatePhysicalScore(bmi, bloodPressureSystolic, bloodSugar, cholesterol);
        
        const healthIndex = physicalScore * 0.4 + lifestyleScore * 0.3 + psychologicalScore * 0.3;
        
        let healthLevel;
        if (healthIndex >= 85) healthLevel = "优秀";
        else if (healthIndex >= 70) healthLevel = "良好";
        else if (healthIndex >= 55) healthLevel = "一般";
        else if (healthIndex >= 40) healthLevel = "较差";
        else healthLevel = "很差";
        
        const riskFactors = this.identifyRiskFactors(bmi, bloodPressureSystolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel);
        const recommendations = this.generateRecommendations(bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel, exerciseFrequency, sleepHours, stressLevel);
        
        const result = new HealthAssessmentResult(userId, bmi, bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel, lifestyleScore, psychologicalScore, physicalScore, healthIndex, healthLevel, riskFactors, recommendations, new Date().toISOString());
        
        this.assessments.push(result);
        return result;
    }
    
    calculateLifestyleScore(exerciseFrequency, sleepHours) {
        let score = 50;
        
        if (exerciseFrequency >= 5) score += 25;
        else if (exerciseFrequency >= 3) score += 20;
        else if (exerciseFrequency >= 1) score += 10;
        
        if (sleepHours >= 7 && sleepHours <= 9) score += 25;
        else if ((sleepHours >= 6 && sleepHours < 7) || (sleepHours > 9 && sleepHours <= 10)) score += 15;
        
        return Math.min(score, 100);
    }
    
    calculatePsychologicalScore(stressLevel) {
        if (stressLevel <= 3) return 90;
        else if (stressLevel <= 5) return 75;
        else if (stressLevel <= 7) return 60;
        else if (stressLevel <= 9) return 45;
        else return 30;
    }
    
    calculatePhysicalScore(bmi, bloodPressureSystolic, bloodSugar, cholesterol) {
        let score = 100;
        
        if (bmi < 18.5) score -= 15;
        else if (bmi < 24.9) score -= 0;
        else if (bmi < 29.9) score -= 15;
        else score -= 25;
        
        if (bloodPressureSystolic < 120) score -= 0;
        else if (bloodPressureSystolic < 130) score -= 5;
        else if (bloodPressureSystolic < 140) score -= 15;
        else score -= 25;
        
        if (bloodSugar < 5.6) score -= 0;
        else if (bloodSugar < 7.0) score -= 10;
        else score -= 20;
        
        if (cholesterol < 200) score -= 0;
        else if (cholesterol < 240) score -= 10;
        else score -= 20;
        
        return Math.max(score, 0);
    }
    
    identifyRiskFactors(bmi, bloodPressureSystolic, bloodSugar, cholesterol, exerciseFrequency, sleepHours, stressLevel) {
        const factors = [];
        
        if (bmi >= 25) factors.push("超重或肥胖");
        if (bloodPressureSystolic >= 130) factors.push("高血压风险");
        if (bloodSugar >= 7.0) factors.push("糖尿病风险");
        if (cholesterol >= 240) factors.push("高胆固醇");
        if (exerciseFrequency < 3) factors.push("运动不足");
        if (sleepHours < 6 || sleepHours > 10) factors.push("睡眠不规律");
        if (stressLevel > 7) factors.push("压力过大");
        
        return factors;
    }
    
    generateRecommendations(bmiLevel, bloodPressureLevel, bloodSugarLevel, cholesterolLevel, exerciseFrequency, sleepHours, stressLevel) {
        const recommendations = [];
        
        if (bmiLevel === "超重" || bmiLevel === "肥胖") {
            recommendations.push("💪 建议增加运动量,控制饮食,目标是将BMI降至正常范围");
        }
        
        if (bloodPressureLevel.includes("高血压")) {
            recommendations.push("❤️ 建议减少盐分摄入,增加运动,定期监测血压");
        }
        
        if (bloodSugarLevel !== "正常") {
            recommendations.push("🍎 建议减少糖分摄入,增加纤维素,定期检查血糖");
        }
        
        if (cholesterolLevel === "高") {
            recommendations.push("🥗 建议减少饱和脂肪摄入,增加有氧运动");
        }
        
        if (exerciseFrequency < 3) {
            recommendations.push("🏃 建议每周至少进行3次中等强度的运动");
        }
        
        if (sleepHours < 6 || sleepHours > 10) {
            recommendations.push("😴 建议保持规律的作息,每天睡眠7-9小时");
        }
        
        if (stressLevel > 7) {
            recommendations.push("🧘 建议学习压力管理技巧,进行冥想或瑜伽");
        }
        
        return recommendations;
    }
    
    getHealthMetrics() {
        if (this.assessments.length === 0) {
            return new HealthMetrics(0, 0, 0, 0, 0, "", {});
        }
        
        const uniqueUsers = new Set(this.assessments.map(a => a.userId)).size;
        const averageHealthIndex = this.assessments.reduce((sum, a) => sum + a.healthIndex, 0) / this.assessments.length;
        const healthyUsers = this.assessments.filter(a => a.healthLevel === "优秀" || a.healthLevel === "良好").length;
        const atRiskUsers = this.assessments.filter(a => a.healthLevel === "较差" || a.healthLevel === "很差").length;
        const averageBMI = this.assessments.reduce((sum, a) => sum + a.bmi, 0) / this.assessments.length;
        
        const commonRiskFactors = {};
        for (const assessment of this.assessments) {
            for (const factor of assessment.riskFactors) {
                commonRiskFactors[factor] = (commonRiskFactors[factor] || 0) + 1;
            }
        }
        
        const avgSystolic = Math.round(this.assessments.reduce((sum, a) => sum + a.physicalScore, 0) / this.assessments.length);
        const averageBloodPressure = `${avgSystolic}/80`;
        
        return new HealthMetrics(uniqueUsers, averageHealthIndex, healthyUsers, atRiskUsers, averageBMI, averageBloodPressure, commonRiskFactors);
    }
    
    getAllAssessments() {
        return this.assessments;
    }
    
    generateHealthReport() {
        const metrics = this.getHealthMetrics();
        
        return {
            timestamp: new Date().toISOString(),
            metrics: metrics,
            assessments: this.assessments,
            recommendations: this.generateGeneralRecommendations(metrics)
        };
    }
    
    generateGeneralRecommendations(metrics) {
        const recommendations = [];
        
        if (metrics.averageHealthIndex < 60) {
            recommendations.push("📊 整体健康水平需要改善,建议进行全面体检");
        }
        
        if (metrics.atRiskUsers > metrics.totalUsers / 3) {
            recommendations.push("⚠️ 高风险人群比例较高,建议加强健康管理");
        }
        
        if (metrics.averageBMI > 25) {
            recommendations.push("⚖️ 平均BMI超标,建议全面推进健康生活方式");
        }
        
        recommendations.push("✅ 定期进行健康评估,追踪健康指标变化");
        
        return recommendations;
    }
    
    clearData() {
        this.assessments = [];
        this.indicators = [];
    }
}

// 使用示例
const assessor = new HealthIndexAssessor();

const result = assessor.assessHealth("user1", 170, 70, 120, 80, 5.2, 200, 4, 7.5, 5);
console.log("健康评估结果:");
console.log("BMI:", result.bmi.toFixed(2), `(${result.bmiLevel})`);
console.log("健康指数:", result.healthIndex.toFixed(2));
console.log("健康等级:", result.healthLevel);
console.log("风险因素:", result.riskFactors);

const report = assessor.generateHealthReport();
console.log("\n健康报告已生成");

JavaScript代码说明:JavaScript版本是Kotlin代码的直接转译。我们使用ES6的class语法定义各个类,使用数学函数进行计算。整体逻辑和算法与Kotlin版本保持一致,确保跨平台的一致性。JavaScript的灵活性使得代码更加简洁,同时保持了清晰的结构和完整的功能。


ArkTS 调用代码

// HealthIndexPage.ets
import { HealthIndexAssessor } from './HealthIndexAssessor';

@Entry
@Component
struct HealthIndexPage {
    @State height: number = 170;
    @State weight: number = 70;
    @State bloodPressureSystolic: number = 120;
    @State bloodPressureDiastolic: number = 80;
    @State bloodSugar: number = 5.2;
    @State cholesterol: number = 200;
    @State exerciseFrequency: number = 4;
    @State sleepHours: number = 7.5;
    @State stressLevel: number = 5;
    @State selectedTab: number = 0;
    @State result: any = null;
    @State metrics: any = null;
    @State isLoading: boolean = false;
    @State errorMessage: string = '';
    @State report: any = null;
    
    private assessor: HealthIndexAssessor = new HealthIndexAssessor();
    
    assessHealth() {
        this.isLoading = true;
        this.errorMessage = '';
        
        try {
            this.result = this.assessor.assessHealth(
                "user1",
                this.height,
                this.weight,
                this.bloodPressureSystolic,
                this.bloodPressureDiastolic,
                this.bloodSugar,
                this.cholesterol,
                this.exerciseFrequency,
                this.sleepHours,
                this.stressLevel
            );
            
            this.metrics = this.assessor.getHealthMetrics();
            
            AlertDialog.show({ message: '健康评估完成' });
        } catch (error) {
            this.errorMessage = '评估失败: ' + error.message;
        } finally {
            this.isLoading = false;
        }
    }
    
    generateReport() {
        this.isLoading = true;
        
        try {
            this.report = this.assessor.generateHealthReport();
        } catch (error) {
            this.errorMessage = '生成报告失败: ' + error.message;
        } finally {
            this.isLoading = false;
        }
    }
    
    getHealthLevelColor(level: string): string {
        switch (level) {
            case '优秀': return '#4CAF50';
            case '良好': return '#2196F3';
            case '一般': return '#FF9800';
            case '较差': return '#F44336';
            case '很差': return '#D32F2F';
            default: return '#999999';
        }
    }
    
    build() {
        Column() {
            Text('健康指数评估工具')
                .fontSize(24)
                .fontWeight(FontWeight.Bold)
                .margin({ top: 20, bottom: 20 })
            
            Tabs({ barPosition: BarPosition.Start }) {
                TabContent() {
                    Column() {
                        Text('个人信息').fontSize(14).fontWeight(FontWeight.Bold).margin({ bottom: 15 })
                        
                        Row() {
                            Column() {
                                Text('身高(cm):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '170' })
                                    .type(InputType.Number)
                                    .value(this.height.toString())
                                    .onChange((value: string) => { this.height = parseFloat(value) || 170; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            
                            Column() {
                                Text('体重(kg):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '70' })
                                    .type(InputType.Number)
                                    .value(this.weight.toString())
                                    .onChange((value: string) => { this.weight = parseFloat(value) || 70; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            .margin({ left: 10 })
                        }
                        .margin({ bottom: 15 })
                        
                        Row() {
                            Column() {
                                Text('收缩压:').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '120' })
                                    .type(InputType.Number)
                                    .value(this.bloodPressureSystolic.toString())
                                    .onChange((value: string) => { this.bloodPressureSystolic = parseInt(value) || 120; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            
                            Column() {
                                Text('舒张压:').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '80' })
                                    .type(InputType.Number)
                                    .value(this.bloodPressureDiastolic.toString())
                                    .onChange((value: string) => { this.bloodPressureDiastolic = parseInt(value) || 80; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            .margin({ left: 10 })
                        }
                        .margin({ bottom: 15 })
                        
                        Row() {
                            Column() {
                                Text('血糖(mmol/L):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '5.2' })
                                    .type(InputType.Number)
                                    .value(this.bloodSugar.toString())
                                    .onChange((value: string) => { this.bloodSugar = parseFloat(value) || 5.2; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            
                            Column() {
                                Text('胆固醇(mg/dL):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '200' })
                                    .type(InputType.Number)
                                    .value(this.cholesterol.toString())
                                    .onChange((value: string) => { this.cholesterol = parseFloat(value) || 200; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            .margin({ left: 10 })
                        }
                        .margin({ bottom: 15 })
                        
                        Row() {
                            Column() {
                                Text('运动频率(周):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '4' })
                                    .type(InputType.Number)
                                    .value(this.exerciseFrequency.toString())
                                    .onChange((value: string) => { this.exerciseFrequency = parseInt(value) || 4; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            
                            Column() {
                                Text('睡眠时长(小时):').fontSize(12).margin({ bottom: 5 })
                                TextInput({ placeholder: '7.5' })
                                    .type(InputType.Number)
                                    .value(this.sleepHours.toString())
                                    .onChange((value: string) => { this.sleepHours = parseFloat(value) || 7.5; })
                                    .height(40).padding(10).border({ width: 1, color: '#cccccc' })
                            }
                            .flex(1)
                            .margin({ left: 10 })
                        }
                        .margin({ bottom: 15 })
                        
                        Text('压力水平(1-10):').fontSize(12).margin({ bottom: 5 })
                        Slider({ value: this.stressLevel, min: 1, max: 10, step: 1 })
                            .onChange((value: number) => { this.stressLevel = value; })
                            .margin({ bottom: 15 })
                        
                        Button('进行评估').width('100%').height(40).margin({ bottom: 15 })
                            .onClick(() => { this.assessHealth(); }).enabled(!this.isLoading)
                        
                        if (this.errorMessage) {
                            Text(this.errorMessage).fontSize(12).fontColor('#F44336').margin({ bottom: 15 })
                        }
                    }
                    .padding(15)
                }
                .tabBar('📝 个人信息')
                
                TabContent() {
                    Column() {
                        if (this.result) {
                            Text('评估结果').fontSize(16).fontWeight(FontWeight.Bold).margin({ bottom: 15 })
                            
                            Row() {
                                Column() {
                                    Text('健康指数').fontSize(11).fontColor('#999999')
                                    Text(this.result.healthIndex.toFixed(2)).fontSize(20)
                                        .fontWeight(FontWeight.Bold).fontColor('#2196F3').margin({ top: 5 })
                                }
                                .flex(1).alignItems(HorizontalAlign.Center).padding(15).backgroundColor('#F5F5F5').borderRadius(5)
                                
                                Column() {
                                    Text('健康等级').fontSize(11).fontColor('#999999')
                                    Text(this.result.healthLevel).fontSize(16)
                                        .fontWeight(FontWeight.Bold).fontColor(this.getHealthLevelColor(this.result.healthLevel)).margin({ top: 5 })
                                }
                                .flex(1).alignItems(HorizontalAlign.Center).padding(15).backgroundColor('#F5F5F5').borderRadius(5)
                                .margin({ left: 10 })
                                
                                Column() {
                                    Text('BMI').fontSize(11).fontColor('#999999')
                                    Text(this.result.bmi.toFixed(2)).fontSize(16)
                                        .fontWeight(FontWeight.Bold).fontColor('#FF9800').margin({ top: 5 })
                                }
                                .flex(1).alignItems(HorizontalAlign.Center).padding(15).backgroundColor('#F5F5F5').borderRadius(5)
                                .margin({ left: 10 })
                            }
                            .margin({ bottom: 15 })
                            
                            Column() {
                                Row() {
                                    Text('BMI等级:').fontSize(12)
                                    Text(this.result.bmiLevel).fontSize(12).fontWeight(FontWeight.Bold)
                                }
                                .margin({ bottom: 10 })
                                
                                Row() {
                                    Text('血压:').fontSize(12)
                                    Text(this.result.bloodPressureLevel).fontSize(12).fontWeight(FontWeight.Bold)
                                }
                                .margin({ bottom: 10 })
                                
                                Row() {
                                    Text('血糖:').fontSize(12)
                                    Text(this.result.bloodSugarLevel).fontSize(12).fontWeight(FontWeight.Bold)
                                }
                                .margin({ bottom: 10 })
                                
                                Row() {
                                    Text('胆固醇:').fontSize(12)
                                    Text(this.result.cholesterolLevel).fontSize(12).fontWeight(FontWeight.Bold)
                                }
                            }
                            .padding(10).backgroundColor('#F5F5F5').borderRadius(5)
                        } else {
                            Text('请先进行健康评估').fontSize(12).fontColor('#999999')
                        }
                    }
                    .padding(15)
                }
                .tabBar('📊 评估结果')
                
                TabContent() {
                    Column() {
                        if (this.result && this.result.riskFactors.length > 0) {
                            Text('风险因素').fontSize(16).fontWeight(FontWeight.Bold).margin({ bottom: 15 })
                            
                            List() {
                                ForEach(this.result.riskFactors, (factor: string) => {
                                    ListItem() {
                                        Row() {
                                            Text('⚠️').fontSize(16).margin({ right: 10 })
                                            Text(factor).fontSize(12).flex(1)
                                        }
                                        .padding(10).border({ width: 1, color: '#eeeeee' }).borderRadius(5)
                                    }
                                }, (factor: string) => factor)
                            }
                        } else {
                            Text('暂无风险因素').fontSize(12).fontColor('#999999')
                        }
                    }
                    .padding(15)
                }
                .tabBar('⚠️ 风险因素')
                
                TabContent() {
                    Column() {
                        if (this.result && this.result.recommendations.length > 0) {
                            Text('健康建议').fontSize(16).fontWeight(FontWeight.Bold).margin({ bottom: 15 })
                            
                            Column() {
                                ForEach(this.result.recommendations, (rec: string, index: number) => {
                                    Row() {
                                        Text(rec).fontSize(11).flex(1)
                                    }
                                    .padding(10).margin({ bottom: 8 }).backgroundColor('#E8F5E9').borderRadius(5)
                                }, (rec: string, index: number) => index.toString())
                            }
                        } else {
                            Text('暂无建议').fontSize(12).fontColor('#999999')
                        }
                    }
                    .padding(15)
                }
                .tabBar('💡 建议')
                
                TabContent() {
                    Column() {
                        Button('生成报告').width('100%').height(40).margin({ bottom: 15 })
                            .onClick(() => { this.generateReport(); })
                        
                        if (this.report) {
                            Text('健康报告').fontSize(16).fontWeight(FontWeight.Bold).margin({ bottom: 15 })
                            
                            if (this.report.recommendations && this.report.recommendations.length > 0) {
                                Text('综合建议:').fontSize(14).fontWeight(FontWeight.Bold).margin({ bottom: 10 })
                                
                                Column() {
                                    ForEach(this.report.recommendations, (rec: string, index: number) => {
                                        Row() {
                                            Text('•').fontSize(14).fontWeight(FontWeight.Bold).margin({ right: 10 })
                                            Text(rec).fontSize(11).flex(1)
                                        }
                                        .padding(10).margin({ bottom: 8 }).backgroundColor('#E3F2FD').borderRadius(5)
                                    }, (rec: string, index: number) => index.toString())
                                }
                            }
                        }
                    }
                    .padding(15)
                }
                .tabBar('📈 报告')
            }
            .width('100%')
            .flex(1)
        }
        .padding(10)
        .width('100%')
        .height('100%')
    }
}

ArkTS代码说明:这个ArkTS实现展示了如何在OpenHarmony应用中集成健康指数评估工具。通过使用标签页组件,用户可以在个人信息输入、查看评估结果、查看风险因素、获取健康建议和生成报告之间切换。UI设计直观,提供了良好的用户体验。每个标签页都有不同的功能,用户可以全面地进行健康评估和管理。


健康指标详解

生理指标

BMI(体质指数):体重与身高的比值,反映体重是否正常。

血压:心脏收缩和舒张时的压力,反映心血管健康。

血糖:血液中的葡萄糖浓度,反映代谢健康。

胆固醇:血液中的脂肪物质,高水平会增加心脏病风险。

生活方式指标

运动频率:每周运动的次数,建议至少3次。

睡眠时长:每天的睡眠时间,建议7-9小时。

压力水平:心理压力的程度,影响身心健康。

健康等级

优秀:健康指数85-100分,身体状况很好。

良好:健康指数70-84分,身体状况良好。

一般:健康指数55-69分,需要改善。

较差:健康指数40-54分,需要重点关注。

很差:健康指数0-39分,需要立即采取行动。


实战应用

应用场景1:个人健康管理

个人用户可以定期使用这个工具评估自己的健康状况,了解自己的健康指数,制定改善计划。

应用场景2:企业员工健康管理

企业可以为员工提供这个工具,定期评估员工的健康状况,制定企业健康管理计划。

应用场景3:医疗机构健康评估

医疗机构可以使用这个工具进行患者的初步健康评估,为医生提供参考。

应用场景4:健康保险风险评估

保险公司可以使用这个工具评估投保人的健康风险,制定相应的保险方案。


总结

健康指数评估工具是现代健康管理中的重要工具。通过KMP框架和OpenHarmony操作系统的结合,我们可以实现一个功能完整、高效可靠的健康评估工具。

这个工具不仅能够进行健康评估,还能够识别风险因素、生成个性化建议、生成健康报告。通过本文介绍的Kotlin实现、JavaScript编译和ArkTS调用,用户可以快速构建自己的健康管理系统。

在实际应用中,健康管理的价值远不止于此。从预防疾病到延长寿命,从提升生活质量到降低医疗成本,健康管理都发挥着重要的作用。通过持续改进和优化,可以构建更加科学和高效的健康管理体系。

掌握好健康评估的方法和工具,对于提升个人健康水平和生活质量都有重要的帮助。通过这个工具的学习和使用,希望能够帮助用户更好地了解自己的健康状况,制定科学的健康管理计划,实现健康长寿的目标。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新

更多推荐