news 2026/5/1 9:49:07

Cordova与OpenHarmony年度报表生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cordova与OpenHarmony年度报表生成

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

年度报表的意义

年度报表为用户提供了一个完整的年度运动总结。通过Cordova框架与OpenHarmony的报表生成能力,我们可以创建专业的年度报表。本文将介绍如何实现这一功能。

年度数据收集

classAnnualReport{constructor(year){this.year=year;this.startDate=newDate(year,0,1);this.endDate=newDate(year,11,31);this.workouts=[];this.monthlyData=[];this.statistics={};}asyncgenerateReport(){awaitthis.collectAnnualData();this.calculateMonthlyBreakdown();this.calculateAnnualStatistics();this.identifyMilestones();this.generateInsights();returnthis.formatReport();}asynccollectAnnualData(){constquery=`SELECT * FROM workouts WHERE timestamp BETWEEN${this.startDate.getTime()}AND${this.endDate.getTime()}ORDER BY timestamp DESC`;this.workouts=awaitexecuteQuery(query);}}

AnnualReport类管理年度报表的生成。通过collectAnnualData方法,我们从数据库中获取整年的运动数据。

年度统计计算

functioncalculateAnnualStatistics(workouts){conststats={totalWorkouts:workouts.length,totalDistance:0,totalDuration:0,totalCalories:0,averageDistance:0,averageDuration:0,averageCalories:0,workoutDays:0,restDays:0,longestStreak:0,currentStreak:0,bestMonth:null,worstMonth:null,totalElevationGain:0};if(workouts.length===0){returnstats;}// 计算基本统计workouts.forEach(workout=>{stats.totalDistance+=workout.distance;stats.totalDuration+=workout.duration;stats.totalCalories+=workout.calories;stats.totalElevationGain+=workout.elevation||0;});stats.averageDistance=stats.totalDistance/workouts.length;stats.averageDuration=stats.totalDuration/workouts.length;stats.averageCalories=stats.totalCalories/workouts.length;// 计算运动天数constuniqueDays=newSet(workouts.map(w=>newDate(w.timestamp).toDateString()));stats.workoutDays=uniqueDays.size;stats.restDays=365-stats.workoutDays;// 计算连续运动天数stats.longestStreak=calculateLongestStreak(workouts);stats.currentStreak=calculateCurrentStreak(workouts);returnstats;}functioncalculateLongestStreak(workouts){constdates=newSet(workouts.map(w=>newDate(w.timestamp).toDateString()));constsortedDates=Array.from(dates).sort();letmaxStreak=1;letcurrentStreak=1;for(leti=1;i<sortedDates.length;i++){constprevDate=newDate(sortedDates[i-1]);constcurrDate=newDate(sortedDates[i]);constdayDiff=(currDate-prevDate)/(1000*60*60*24);if(dayDiff===1){currentStreak++;maxStreak=Math.max(maxStreak,currentStreak);}else{currentStreak=1;}}returnmaxStreak;}

年度统计计算提供了年份的全面统计数据。这个函数计算了总距离、总时长、总卡路里等关键指标,以及连续运动天数等特殊指标。

月度对比分析

functionanalyzeMonthlyComparison(workouts){constmonthlyData={};for(letmonth=0;month<12;month++){monthlyData[month]={workouts:[],distance:0,duration:0,calories:0,count:0};}workouts.forEach(workout=>{constmonth=newDate(workout.timestamp).getMonth();monthlyData[month].workouts.push(workout);monthlyData[month].distance+=workout.distance;monthlyData[month].duration+=workout.duration;monthlyData[month].calories+=workout.calories;monthlyData[month].count++;});constmonthNames=['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'];constcomparison={};Object.keys(monthlyData).forEach(month=>{constdata=monthlyData[month];comparison[monthNames[month]]={workouts:data.count,distance:data.distance,duration:data.duration,calories:data.calories,averageDistance:data.count>0?data.distance/data.count:0};});returncomparison;}

月度对比分析将年份分为12个月,并比较每月的运动数据。这个函数帮助用户了解全年不同月份的运动强度变化。

季度分析

functionanalyzeQuarterlyPerformance(workouts){constquarters={Q1:{months:[0,1,2],workouts:[]},Q2:{months:[3,4,5],workouts:[]},Q3:{months:[6,7,8],workouts:[]},Q4:{months:[9,10,11],workouts:[]}};workouts.forEach(workout=>{constmonth=newDate(workout.timestamp).getMonth();Object.keys(quarters).forEach(quarter=>{if(quarters[quarter].months.includes(month)){quarters[quarter].workouts.push(workout);}});});constanalysis={};Object.keys(quarters).forEach(quarter=>{constquarterWorkouts=quarters[quarter].workouts;analysis[quarter]={count:quarterWorkouts.length,distance:quarterWorkouts.reduce((sum,w)=>sum+w.distance,0),duration:quarterWorkouts.reduce((sum,w)=>sum+w.duration,0),calories:quarterWorkouts.reduce((sum,w)=>sum+w.calories,0),averageIntensity:calculateAverageIntensity(quarterWorkouts)};});returnanalysis;}

季度分析将年份分为四个季度,并分析每个季度的运动表现。这个函数提供了更高层次的数据聚合视图。

里程碑识别

functionidentifyMilestones(stats,workouts){constmilestones=[];// 距离里程碑if(stats.totalDistance>=1000){milestones.push({type:'distance',value:Math.floor(stats.totalDistance/100)*100,description:`完成${Math.floor(stats.totalDistance/100)*100}公里运动`});}// 时间里程碑consttotalHours=stats.totalDuration/60;if(totalHours>=100){milestones.push({type:'duration',value:Math.floor(totalHours/10)*10,description:`累计运动${Math.floor(totalHours/10)*10}小时`});}// 卡路里里程碑if(stats.totalCalories>=50000){milestones.push({type:'calories',value:Math.floor(stats.totalCalories/10000)*10000,description:`消耗${Math.floor(stats.totalCalories/10000)*10000}卡路里`});}// 连续运动里程碑if(stats.longestStreak>=30){milestones.push({type:'streak',value:stats.longestStreak,description:`连续运动${stats.longestStreak}`});}returnmilestones;}

里程碑识别识别了用户在年度内达成的重要成就。这个函数检查了各种里程碑条件,并为用户生成成就记录。

年度排名

functiongenerateAnnualRanking(stats){constranking={mostActiveMonth:null,leastActiveMonth:null,favoriteWorkoutType:null,bestDay:null,averageWorkoutDuration:0};// 计算平均运动时长ranking.averageWorkoutDuration=stats.totalDuration/stats.totalWorkouts;// 这些需要从详细数据中计算// 最活跃的月份、最不活跃的月份等returnranking;}

年度排名为用户提供了个人的年度排名和排序。这个函数识别了最活跃的月份、最喜欢的运动类型等信息。

年度建议

functiongenerateAnnualRecommendations(stats,milestones){constrecommendations=[];if(stats.workoutDays<100){recommendations.push('年度运动天数较少,建议明年增加运动频率');}elseif(stats.workoutDays>250){recommendations.push('你的运动坚持度很高,建议注意休息和恢复');}if(stats.averageCalories<400){recommendations.push('平均运动强度较低,建议明年尝试更高强度的训练');}if(stats.longestStreak<30){recommendations.push('最长连续运动天数较少,建议明年制定更长期的运动计划');}if(milestones.length>5){recommendations.push('你在年度内达成了多个里程碑,继续保持这种势头!');}returnrecommendations;}

年度建议根据年度统计数据为用户提供来年的改进建议。这个函数分析了各项指标,并生成相应的建议。

总结

年度报表生成通过Cordova与OpenHarmony的结合,提供了全面的年度运动总结。从年度统计到月度对比,从季度分析到里程碑识别,这个系统为用户提供了深入的年度运动洞察。通过这些报表,用户能够更好地回顾自己的年度运动成就,为来年制定更有效的运动计划。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:07:32

仿写文章Prompt:Topit窗口置顶工具全新产品介绍

仿写文章Prompt&#xff1a;Topit窗口置顶工具全新产品介绍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 请基于Topit窗口置顶工具创作一篇结构创新的推荐文章…

作者头像 李华
网站建设 2026/5/1 5:04:30

《C++初阶之类和对象》【类的六大默认成员函数】

一、构造函数什么是构造函数&#xff1f;构造函数&#xff08;Constructor&#xff09;&#xff1a;是 C 中一类特殊的成员函数&#xff0c;用于初始化对象。它在对象创建时由编译器自动调用&#xff0c;负责设置对象的初始状态&#xff08;如&#xff1a;分配资源、初始化成员…

作者头像 李华
网站建设 2026/5/1 7:20:28

两段驱动代码的区别

1#include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) //驱动入口函数 {printk(KERN_EMERG "helloworld_init\r\n");//注意&#xff1a; 内核打印用 printk 而不是 printfreturn 0; } static void __exit he…

作者头像 李华
网站建设 2026/4/23 11:21:21

全面讲解ESP32连接阿里云MQTT准备工作

手把手教你搞定 ESP32 连接阿里云 MQTT&#xff1a;从零开始的硬核实战准备 你有没有遇到过这样的情况&#xff1f;手里的 ESP32 板子焊好了&#xff0c;传感器也接上了&#xff0c;代码写了一半&#xff0c;结果一运行——“Connection Refused”、“Bad Credentials”、“TL…

作者头像 李华
网站建设 2026/5/1 5:04:57

二分算法进阶

一、高考志愿 1、问题&#xff1a;现有 m 所学校&#xff0c;每所学校预计分数线是 a​。有 n 位学生&#xff0c;估分分别为 b。根据 n 位学生的估分情况&#xff0c;分别给每位学生推荐一所学校&#xff0c;要求学校的预计分数线和学生的估分相差最小&#xff08;可高可低&a…

作者头像 李华