news 2026/8/7 2:38:16

Cordova与OpenHarmony浇水记录系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cordova与OpenHarmony浇水记录系统

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

浇水记录系统概述

浇水记录系统是植物养护应用的核心功能之一。它记录用户对植物的浇水操作,帮助用户了解植物的浇水历史和规律。在Cordova框架与OpenHarmony系统的结合下,我们需要实现一个完整的浇水记录系统,包括记录的创建、查询、统计和提醒功能。

浇水记录数据模型

classWateringRecord{constructor(plantId,amount,notes){this.id='water_'+Date.now();this.plantId=plantId;this.amount=amount;// 毫升this.date=newDate();this.notes=notes;this.soilMoisture=null;// 土壤湿度百分比}}classWateringManager{constructor(){this.records=[];this.loadFromStorage();}addWateringRecord(plantId,amount,notes){constrecord=newWateringRecord(plantId,amount,notes);this.records.push(record);this.saveToStorage();returnrecord;}getWateringRecordsForPlant(plantId){returnthis.records.filter(r=>r.plantId===plantId).sort((a,b)=>newDate(b.date)-newDate(a.date));}getLastWateringDate(plantId){constrecords=this.getWateringRecordsForPlant(plantId);returnrecords.length>0?records[0].date:null;}}

这个浇水记录数据模型定义了WateringRecord类和WateringManager类。WateringRecord类包含浇水的详细信息,包括植物ID、浇水量、日期和备注。WateringManager类管理所有浇水记录,提供了添加记录和查询功能。

与OpenHarmony传感器的集成

functionrecordWateringWithSensorData(plantId,amount,notes){// 获取土壤湿度传感器数据cordova.exec(function(sensorData){console.log("传感器数据获取成功");constrecord=newWateringRecord(plantId,amount,notes);record.soilMoisture=sensorData.moisture;wateringManager.records.push(record);wateringManager.saveToStorage();// 保存到数据库saveWateringRecordToDatabase(record);showToast('浇水记录已保存');},function(error){console.error("传感器数据获取失败:",error);// 即使传感器失败,仍然保存记录constrecord=wateringManager.addWateringRecord(plantId,amount,notes);saveWateringRecordToDatabase(record);},"SensorPlugin","getSoilMoisture",[plantId]);}

这段代码展示了如何与OpenHarmony的传感器服务集成。通过SensorPlugin,我们可以获取土壤湿度等传感器数据,并将其与浇水记录关联。这提供了更加准确的浇水数据。

浇水记录列表展示

functionrenderWateringRecords(plantId){constplant=plants.find(p=>p.id===plantId);if(!plant)return;constrecords=wateringManager.getWateringRecordsForPlant(plantId);constcontainer=document.getElementById('page-container');container.innerHTML=`<div class="watering-records-container"> <h2>${plant.name}的浇水记录</h2> <button class="add-record-btn" onclick="showAddWateringRecordDialog('${plantId}')"> ➕ 添加浇水记录 </button> </div>`;if(records.length===0){container.innerHTML+='<p class="empty-message">还没有浇水记录</p>';return;}constrecordsList=document.createElement('div');recordsList.className='records-list';records.forEach(record=>{constrecordItem=document.createElement('div');recordItem.className='record-item';recordItem.innerHTML=`<div class="record-info"> <p class="record-date">${record.date.toLocaleString('zh-CN')}</p> <p class="record-amount">💧 浇水量:${record.amount}ml</p>${record.soilMoisture?`<p class="soil-moisture">土壤湿度:${record.soilMoisture}%</p>`:''}${record.notes?`<p class="record-notes">备注:${record.notes}</p>`:''}</div> <div class="record-actions"> <button onclick="editWateringRecord('${record.id}')">编辑</button> <button onclick="deleteWateringRecord('${record.id}')">删除</button> </div>`;recordsList.appendChild(recordItem);});container.appendChild(recordsList);}

这个函数负责渲染浇水记录列表。它显示了特定植物的所有浇水记录,包括日期、浇水量、土壤湿度和备注。用户可以通过"编辑"和"删除"按钮管理记录。这种设计提供了清晰的记录展示。

添加浇水记录对话框

functionshowAddWateringRecordDialog(plantId){constdialog=document.createElement('div');dialog.className='modal-dialog';dialog.innerHTML=`<div class="modal-content"> <h3>添加浇水记录</h3> <form id="add-watering-form"> <div class="form-group"> <label>浇水量 (毫升)</label> <input type="number" id="watering-amount" min="0" required> </div> <div class="form-group"> <label>浇水日期</label> <input type="datetime-local" id="watering-date" required> </div> <div class="form-group"> <label>备注</label> <textarea id="watering-notes"></textarea> </div> <div class="form-actions"> <button type="submit">保存</button> <button type="button" onclick="closeDialog()">取消</button> </div> </form> </div>`;document.getElementById('modal-container').appendChild(dialog);// 设置默认日期为当前时间constnow=newDate();document.getElementById('watering-date').value=now.toISOString().slice(0,16);document.getElementById('add-watering-form').addEventListener('submit',function(e){e.preventDefault();constamount=parseFloat(document.getElementById('watering-amount').value);constdate=newDate(document.getElementById('watering-date').value);constnotes=document.getElementById('watering-notes').value;constrecord=newWateringRecord(plantId,amount,notes);record.date=date;wateringManager.records.push(record);wateringManager.saveToStorage();saveWateringRecordToDatabase(record);closeDialog();renderWateringRecords(plantId);showToast('浇水记录已添加');});}

这个函数创建并显示添加浇水记录的对话框。用户可以输入浇水量、日期和备注。提交后,新记录会被添加到wateringManager中,并保存到数据库。这种设计提供了灵活的记录输入方式。

浇水统计功能

classWateringStatistics{constructor(wateringManager){this.wateringManager=wateringManager;}getTotalWateringCount(plantId){returnthis.wateringManager.getWateringRecordsForPlant(plantId).length;}getAverageWateringAmount(plantId){constrecords=this.wateringManager.getWateringRecordsForPlant(plantId);if(records.length===0)return0;consttotal=records.reduce((sum,r)=>sum+r.amount,0);returntotal/records.length;}getWateringFrequency(plantId,days=30){constrecords=this.wateringManager.getWateringRecordsForPlant(plantId);constcutoffDate=newDate();cutoffDate.setDate(cutoffDate.getDate()-days);constrecentRecords=records.filter(r=>newDate(r.date)>cutoffDate);return(recentRecords.length/days*7).toFixed(2);// 每周浇水次数}getWateringTrend(plantId,days=30){constrecords=this.wateringManager.getWateringRecordsForPlant(plantId);consttrend={};records.forEach(record=>{constdate=newDate(record.date).toLocaleDateString('zh-CN');trend[date]=(trend[date]||0)+record.amount;});returntrend;}}

这个WateringStatistics类提供了浇水的统计功能。getTotalWateringCount返回浇水总次数,getAverageWateringAmount计算平均浇水量,getWateringFrequency计算浇水频率,getWateringTrend返回浇水趋势数据。这些统计信息可以帮助用户了解浇水规律。

浇水提醒功能

functioncheckWateringReminders(){plants.forEach(plant=>{constlastWateringDate=wateringManager.getLastWateringDate(plant.id);constwateringInterval=plant.wateringInterval||7;// 默认7天if(!lastWateringDate){// 从未浇过水sendWateringReminder(plant.id,plant.name,'从未浇过水');return;}constdaysSinceWatering=Math.floor((newDate()-newDate(lastWateringDate))/(24*60*60*1000));if(daysSinceWatering>=wateringInterval){sendWateringReminder(plant.id,plant.name,`${daysSinceWatering}天未浇水`);}});}functionsendWateringReminder(plantId,plantName,message){cordova.exec(function(result){console.log("提醒已发送");},function(error){console.error("提醒发送失败:",error);},"NotificationPlugin","sendReminder",[{title:`${plantName}需要浇水`,message:message,plantId:plantId,type:'watering'}]);}// 定期检查浇水提醒setInterval(checkWateringReminders,60*60*1000);// 每小时检查一次

这段代码实现了浇水提醒功能。checkWateringReminders函数检查所有植物,如果某个植物超过设定的浇水间隔,就发送提醒。通过NotificationPlugin,我们可以向用户发送系统通知。这个功能帮助用户不会忘记给植物浇水。

浇水记录导出

functionexportWateringRecords(plantId){constplant=plants.find(p=>p.id===plantId);constrecords=wateringManager.getWateringRecordsForPlant(plantId);constcsvContent=[['日期','浇水量(ml)','土壤湿度(%)','备注'],...records.map(r=>[r.date.toLocaleString('zh-CN'),r.amount,r.soilMoisture||'N/A',r.notes||''])].map(row=>row.join(',')).join('\n');cordova.exec(function(result){console.log("浇水记录已导出");},function(error){console.error("导出失败:",error);},"FilePlugin","exportData",[{filename:`${plant.name}_watering_records.csv`,content:csvContent}]);}

这段代码实现了浇水记录的导出功能。通过FilePlugin,我们可以将浇水记录导出为CSV格式的文件。这个功能允许用户备份和分析浇水数据。

总结

浇水记录系统是植物养护应用的重要功能。通过合理的数据模型设计、与OpenHarmony系统的集成和各种统计分析功能,我们可以创建一个功能完整的浇水记录系统,帮助用户科学地管理植物的浇水。

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

冥想第一千七百三十五天(1735)

1.周二了&#xff0c;又是特别忙的一天&#xff0c;项目上全力以赴的一天&#xff0c;今天想换套餐但是1000m还到300m感觉不值得。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

作者头像 李华
网站建设 2026/8/7 2:52:21

代理IP和普通IP有什么区别?这篇文章帮你捋明白

在网络环境日益复杂的今天&#xff0c;代理IP成为企业与开发者频繁接触的关键词。但也有不少人常常疑惑&#xff1a;代理IP和普通IP究竟有什么不同&#xff1f;它们在使用场景、性能、安全性上又有何差异&#xff1f;本文将用通俗易懂的方式&#xff0c;从定义、功能、适用对象…

作者头像 李华
网站建设 2026/8/7 12:41:11

体系结构分类和指令系统

1.体系结构分类 1.1 按处理机的数量进行分类 按处理机的数量进行分类:单处理系统(一个处理单元和其他设备集成)、并行处理系统(两个以上的处理机互联)分布式处理系统(物理上远距离且松耦合的多计算机系统) 1.2 Flynn分类 分类有两个因素&#xff0c;即指令流和数据流&#…

作者头像 李华
网站建设 2026/8/7 1:32:10

基于AI数字人系统源码的低成本开发方案与实践经验

这两年&#xff0c;AI数字人从“概念展示”迅速走向商业落地。无论是企业官网数字客服、直播带货数字主播&#xff0c;还是教育、政务、金融等场景&#xff0c;AI数字人正在成为一种可复制、可规模化的新型生产力工具。但在实际交流中&#xff0c;我发现不少企业和开发者都会遇…

作者头像 李华
网站建设 2026/8/7 22:07:56

SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)

一、阅读指引 1. 不会看执行计划 → 跳第 3 段 2. 索引失效/全表扫描 → 看第 4 段 3. 千万级分页卡顿 → 看第 5 段 4. 想直接抄代码 → 第 8 段有下载链接 二、测试环境 MySQL 8.0.34&#xff0c;16C64G&#xff0c;SSD&#xff1b;订单表 500w&#xff0c;明细表…

作者头像 李华
网站建设 2026/8/7 6:15:15

YOLO目标检测模型如何对接Apipost平台

前言 今天要给大家分享一个在工业巡检场景中非常实用的 AI 边缘计算部署实践。文中涉及的系统架构、接口设计和代码实现均为示例&#xff0c;主要用于说明整体思路和工程方法。我本人也是在实际项目中第一次系统性地接触边缘计算与算法接口化&#xff0c;很多经验都是在不断调…

作者头像 李华