news 2026/6/10 4:22:39

每日统计模块 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/6/4 21:46:19

数据结构总结笔记

1 数据结构三要素是什么&#xff1f;逻辑结构包括什么&#xff1f;存储结构包括什么&#xff1f; 数据结构三要素&#xff1a;逻辑结构、存储结构、数据运算。 逻辑结构包括线性结构和非线性结构&#xff1a; 线性结构&#xff1a;线性表、栈、队列&#xff1b;非线性结构&a…

作者头像 李华
网站建设 2026/6/4 4:47:19

PHP 开发者必须掌握的基本 Linux 命令

开始 PHP 开发时&#xff0c;我并没有特别的理由选择 Linux。既不是出于对开源软件的热情&#xff0c;也不是认为 Linux 比 macOS 或 Windows 更优秀。当时只是希望找到一个更轻量、更可定制的开发环境。对我而言&#xff0c;Linux 就是一个可能提升编码效率的工具。随着项目规…

作者头像 李华
网站建设 2026/6/9 17:42:18

用格子玻尔兹曼方法(LBM)模拟不可压缩密度守恒压力驱动流

格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟不可压缩密度守恒压力驱动流&#xff0c;MATLAB代码嘿&#xff0c;大家好&#xff01;今天来聊聊如何使用格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟不可压缩密度守恒压力驱动流&#xff0c;并且会用MATLAB代码来实现。…

作者头像 李华
网站建设 2026/6/4 18:22:28

基于LQR控制算法的四轮独立电驱动汽车横向稳定性控制研究

适用方向&#xff1a;基于LQR控制算法的直接横摆力矩控制&#xff08;DYC&#xff09;的四轮独立电驱动汽车的横向稳定性控制研究 主要内容&#xff1a;利用carsim建模&#xff0c;在simulink中搭建控制器&#xff0c;然后进行联合。 实现汽车在高速低附着路面下完成双移线工况…

作者头像 李华
网站建设 2026/6/5 3:40:07

IPv6违规外联防御指南:从风险盲区到可管可控

在数字化转型加速推进的今天&#xff0c;IPv6作为下一代互联网协议&#xff0c;正以其庞大的地址空间和高效的通信机制&#xff0c;推动着网络基础设施的全面升级。根据APNIC监测数据&#xff0c;2022年全球IPv6支持能力持续增强&#xff0c;支持率从2021年3月的28.31%显著提升…

作者头像 李华
网站建设 2026/6/9 19:40:50

网型逆变器小干扰稳定性分析与控制策略优化:Simulink仿真探索

跟网型逆变器小干扰稳定性分析与控制策略优化simulink仿真模型和代码 现代逆变技术 阻抗重塑 双锁相环 可附赠参考文献&#xff08;英文&#xff09; 和一份与模型完全对应的中文版报告在现代逆变技术的领域中&#xff0c;网型逆变器的小干扰稳定性分析以及控制策略的优化是至关…

作者头像 李华