KMP OpenHarmony 健康指数评估工具:个人健康管理的智能伙伴
本文介绍了一个基于Kotlin Multiplatform框架的健康指数评估工具,支持跨平台运行。该工具通过生理指标(BMI、血压、血糖等)、生活方式(运动、睡眠)和心理状态(压力水平)等多维度评估用户健康状况,提供个性化建议和风险预警。文章详细讲解了核心评估方法、Kotlin实现代码以及健康指标的计算逻辑,帮助开发者构建跨平台的健康管理应用。

目录
概述
在现代社会,健康已成为人们最关注的话题之一。随着生活节奏加快、工作压力增大,越来越多的人开始关注自己的身体健康状况。健康指数评估工具是帮助个人了解自身健康状况、制定科学的健康管理计划、预防疾病的重要工具。本文档介绍如何在 Kotlin Multiplatform (KMP) 框架下,结合 OpenHarmony 鸿蒙操作系统,实现一个功能完整的健康指数评估工具。
健康指数评估工具是一个综合性的健康管理平台,它不仅能够根据多个健康指标进行综合评估,还能够进行健康风险预测、生成健康报告、提供个性化的健康建议。通过KMP框架的跨端能力,这个工具可以在Android、iOS、Web和OpenHarmony等多个平台上运行,为用户提供了一个强大的个人健康管理工具。
健康管理的重要性
健康管理在现代生活中的重要性日益凸显:
- 早期发现:通过定期评估可以早期发现潜在的健康问题。
- 预防疾病:科学的健康管理能够有效预防多种慢性疾病。
- 提升生活质量:良好的健康状况能够显著提升生活质量。
- 降低医疗成本:预防性的健康管理能够降低医疗成本。
- 延长寿命:科学的健康管理能够延长人的寿命。
工具的核心价值
健康指数评估工具提供以下价值:
- 多维度评估:综合考虑身体、心理、生活方式等多个维度
- 个性化建议:根据用户的具体情况提供个性化的健康建议
- 趋势追踪:追踪健康指标的变化趋势,了解健康状况的动态
- 风险预警:对潜在的健康风险进行预警
- 详细报告:生成专业的健康评估报告
- 跨平台支持:一份代码可在多个平台运行,提高开发效率
健康管理基础
核心概念
健康指数(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调用,用户可以快速构建自己的健康管理系统。
在实际应用中,健康管理的价值远不止于此。从预防疾病到延长寿命,从提升生活质量到降低医疗成本,健康管理都发挥着重要的作用。通过持续改进和优化,可以构建更加科学和高效的健康管理体系。
掌握好健康评估的方法和工具,对于提升个人健康水平和生活质量都有重要的帮助。通过这个工具的学习和使用,希望能够帮助用户更好地了解自己的健康状况,制定科学的健康管理计划,实现健康长寿的目标。
更多推荐

所有评论(0)