news 2026/9/4 1:13:16

每日统计模块 Cordova 与 OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每日统计模块 Cordova 与 OpenHarmony 混合开发实战

📌 概述

每日统计模块提供了每日喝茶数据的统计分析功能。该模块集成了 Cordova 框架与 OpenHarmony 原生能力,实现了高效的数据统计和可视化展示。用户可以查看特定日期的喝茶记录总数、消费金额、平均评分等统计数据。模块支持日期范围选择和数据导出。

🔗 完整流程

第一步:日期选择与数据加载

用户在每日统计页面选择要查看的日期。应用会从数据库中加载该日期的所有喝茶记录。应用会计算该日期的各项统计数据,包括记录数、消费金额、平均评分等。

第二步:统计数据计算

应用会对加载的数据进行聚合和计算。计算包括总记录数、总消费金额、平均消费金额、平均评分、最高评分和最低评分等。这些计算在原生层进行,确保性能。

第三步:统计结果展示

统计完成后,应用会将结果以卡片和图表的形式展示。用户可以查看详细的统计信息和记录列表。

🔧 Web 代码实现

HTML 每日统计页面

<divid="daily-stats-page"class="page"><divclass="page-header"><h1>每日统计</h1></div><divclass="stats-date-selector"><inputtype="date"id="stats-date"onchange="loadDailyStats()"><buttonclass="btn btn-primary"onclick="loadDailyStats()">查询</button></div><divclass="stats-cards"><divclass="stat-card"><divclass="stat-label">喝茶次数</div><divclass="stat-value"id="daily-count">0</div></div><divclass="stat-card"><divclass="stat-label">消费金额</div><divclass="stat-value"id="daily-expense">¥0</div></div><divclass="stat-card"><divclass="stat-label">平均消费</div><divclass="stat-value"id="daily-avg-price">¥0</div></div><divclass="stat-card"><divclass="stat-label">平均评分</div><divclass="stat-value"id="daily-avg-rating">0</div></div></div><divclass="stats-details"><h2>详细记录</h2><divid="daily-records-list"class="records-list"><!-- 记录列表动态生成 --></div></div></div>

每日统计页面包含日期选择器和统计卡片。统计卡片显示关键的统计指标。详细记录部分显示该日期的所有记录。

每日统计逻辑

asyncfunctionloadDailyStats(){constselectedDate=document.getElementById('stats-date').value;if(!selectedDate){showToast('请选择日期','warning');return;}try{// 获取该日期的所有记录constrecords=awaitdb.getRecordsByDate(selectedDate);// 计算统计数据conststats=calculateDailyStats(records);// 更新统计卡片document.getElementById('daily-count').textContent=stats.count;document.getElementById('daily-expense').textContent='¥'+stats.totalExpense.toFixed(2);document.getElementById('daily-avg-price').textContent='¥'+stats.avgPrice.toFixed(2);document.getElementById('daily-avg-rating').textContent=stats.avgRating.toFixed(1);// 显示记录列表renderDailyRecords(records);// 记录事件if(window.cordova){cordova.exec(null,null,'TeaLogger','logEvent',['daily_stats_loaded',{date:selectedDate,recordCount:records.length}]);}}catch(error){console.error('Failed to load daily stats:',error);showToast('加载统计数据失败','error');}}functioncalculateDailyStats(records){if(records.length===0){return{count:0,totalExpense:0,avgPrice:0,avgRating:0};}consttotalExpense=records.reduce((sum,r)=>sum+(r.price||0),0);consttotalRating=records.reduce((sum,r)=>sum+(r.rating||0),0);return{count:records.length,totalExpense:totalExpense,avgPrice:totalExpense/records.length,avgRating:totalRating/records.length};}functionrenderDailyRecords(records){constlistContainer=document.getElementById('daily-records-list');listContainer.innerHTML='';if(records.length===0){listContainer.innerHTML='<div class="no-data"><p>该日期暂无记录</p></div>';return;}records.forEach(record=>{constrecordEl=document.createElement('div');recordEl.className='record-item';conststars='★'.repeat(record.rating)+'☆'.repeat(5-record.rating);recordEl.innerHTML=`<div class="record-main"> <div class="record-info"> <div class="record-title">${record.teaType}</div> <div class="record-meta"> <span>${record.origin}</span> </div> </div> <div class="record-price">¥${record.price.toFixed(2)}</div> </div> <div class="record-rating">${stars}</div>`;listContainer.appendChild(recordEl);});}// 初始化日期为今天document.addEventListener('DOMContentLoaded',function(){consttoday=newDate().toISOString().split('T')[0];constdateInput=document.getElementById('stats-date');if(dateInput){dateInput.value=today;}});

这段代码实现了每日统计功能。loadDailyStats()加载指定日期的统计数据。calculateDailyStats()计算统计指标。renderDailyRecords()显示该日期的记录列表。

🔌 OpenHarmony 原生代码

日期范围查询

// entry/src/main/ets/plugins/DateRangeQuery.etsimport{relationalStore}from'@kit.ArkData';exportclassDateRangeQuery{privatestore:relationalStore.RdbStore;asyncgetRecordsByDate(date:string):Promise<TeaRecord[]>{conststartOfDay=`${date}00:00:00`;constendOfDay=`${date}23:59:59`;constpredicates=newrelationalStore.RdbPredicates('tea_records');predicates.between('created_at',startOfDay,endOfDay);predicates.orderByDesc('created_at');constresultSet=awaitthis.store.query(predicates);constrecords:TeaRecord[]=[];while(resultSet.goToNextRow()){records.push(this.parseRecord(resultSet));}resultSet.close();returnrecords;}asyncgetRecordsByDateRange(startDate:string,endDate:string):Promise<TeaRecord[]>{constpredicates=newrelationalStore.RdbPredicates('tea_records');predicates.between('created_at',startDate,endDate);predicates.orderByDesc('created_at');constresultSet=awaitthis.store.query(predicates);constrecords:TeaRecord[]=[];while(resultSet.goToNextRow()){records.push(this.parseRecord(resultSet));}resultSet.close();returnrecords;}privateparseRecord(resultSet:relationalStore.ResultSet):TeaRecord{return{id:resultSet.getColumnValue(resultSet.getColumnIndex('id'))asnumber,teaType:resultSet.getColumnValue(resultSet.getColumnIndex('tea_type'))asstring,origin:resultSet.getColumnValue(resultSet.getColumnIndex('origin'))asstring,price:resultSet.getColumnValue(resultSet.getColumnIndex('price'))asnumber,rating:resultSet.getColumnValue(resultSet.getColumnIndex('rating'))asnumber,createdAt:resultSet.getColumnValue(resultSet.getColumnIndex('created_at'))asstring};}}interfaceTeaRecord{id:number;teaType:string;origin:string;price:number;rating:number;createdAt:string;}

这个类提供了日期范围查询功能。getRecordsByDate()查询特定日期的记录。getRecordsByDateRange()查询日期范围内的记录。

📝 总结

每日统计模块展示了如何在 Cordova 框架中实现数据统计功能。通过 Web 层的用户界面和交互,结合原生层的高效数据查询和计算,为用户提供了详细的日期统计分析。

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

飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机

飞轮储能系统的建模与MATLAB仿真&#xff08;永磁同步电机作为飞轮驱动电机&#xff09;不是模型嘿&#xff0c;各位技术爱好者&#xff01;今天咱们来聊聊飞轮储能系统的建模以及用 MATLAB 进行仿真的事儿&#xff0c;这里的飞轮驱动电机用的是永磁同步电机。飞轮储能系统可是…

作者头像 李华
网站建设 2026/9/3 3:46:17

车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了

你有没有过这种时刻&#xff1f;老板微信一问&#xff1a;进度到哪了&#xff1f;你只能回&#xff1a;正在做。干过车间的都懂&#xff0c;这哪是正在做&#xff0c;分明是不知道 。大部分的车间主管都这样&#xff1a;进度全靠猜&#xff0c;Excel堆满桌面&#xff0c;工人填…

作者头像 李华
网站建设 2026/9/3 15:21:06

如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次

执行。原因很简单&#xff1a;默认情况下&#xff0c;Spring 不会在多个实例之间做调度同步。这篇文章就聊聊怎么用 ShedLock&#xff0c;让定时任务在多实例环境下“同一时刻只跑一次”。顺便一提&#xff0c;它也能作为 Quartz 的替代。Maven 依赖先引入 shedlock-spring 这个…

作者头像 李华
网站建设 2026/9/2 20:16:56

基于MPC的永磁同步电机非线性终端滑模控制仿真研究

基于MPC的永磁同步电机非线性终端滑模控制仿真研究 matlab simulink 无参考文件在电机控制领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;以其高效、高功率密度等优点&#xff0c;广泛应用于工业、交通等诸多领域。为了实现PMSM更加精准、高效的控制&#xff0c;各…

作者头像 李华
网站建设 2026/9/4 7:41:04

ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进

ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数&#xff1a;filter,unints1,units2&#xff0c;学习率&#xff08;可添加&#xff09; 以下是三个主要的改进点&#xff1a; sin混沌映射&#xff1a; sin混沌映射初始化种群&#xff0c;这是一种…

作者头像 李华