当前位置: 首页 > news >正文

每日统计模块 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 层的用户界面和交互,结合原生层的高效数据查询和计算,为用户提供了详细的日期统计分析。

http://www.cnnetsun.cn/news/115421.html

相关文章:

  • 时间序列回归预测:LSTM、CNN - LSTM、PSO - CNN - LSTM、GAPSO - CNN - LSTM大比拼
  • 飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机
  • 车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 基于MPC的永磁同步电机非线性终端滑模控制仿真研究
  • ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进
  • Q学习(Q-learning)路径规划算法实战
  • ANSYS/LS - dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例探索
  • 基于TOA/FOA的无源定位方法MATLAB仿真探索
  • 基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均
  • springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
  • 微软和布朗大学最新发现:让AI助手拥有18000多种技能的革命性突破
  • MATLAB仿真:二维TOA传感器网络定位与时钟偏差拟合,最小二乘求解
  • 【参数辨识】基于卡尔曼滤波(KF)估计离散线性系统对垂直起降(VTOL)飞行器的鲁棒辨识附matlab代码
  • 桥梁与隧道安全守护者 抗冰冻型风速监测方案
  • 05-FreeRTOS的内存管理
  • 基于改进蛇优化算法(GOSO/ISO)优化随机森林数据回归预测模型(含初始化种群混沌映射、减法...
  • 基于大数据的人脸识别系统设计与实现开题报告
  • 车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南
  • 气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案
  • 【TVM 教程】交叉编译与 RPC
  • 腾讯云国际站代理商的QAPM服务能提供哪些专属服务?
  • 网安副业怎么选?漏洞挖掘、技术博客、竞赛奖金实战,哪个更适配你?
  • 量子计算验证方法:软件测试从业者的转型指南
  • 突破 Oracle/MySQL 瓶颈:金仓数据库以三重革新,筑牢业务转型 “数据底座”
  • 【学习神器】NotebookLM“播客”功能实战指南:四六级、考研党高效复习秘籍
  • 如何解决 pip install 网络报错 ERROR: No matching distribution found for requests
  • 12 Ways to Find User Account Info and Login Details in Linux
  • 紧急警告:错误的导出格式正毁掉你的量子实验成果,速查正确方式
  • 35 岁职场焦虑蔓延?为什么网络安全行业越老越值钱?