news 2026/5/8 21:59:02

操作历史 - Cordova 与 OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
操作历史 - Cordova 与 OpenHarmony 混合开发实战

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

📌 模块概述

操作历史模块是MovieTracker应用中用于记录用户操作的功能。系统会记录用户的所有操作,如添加影片、编辑影片、删除影片等。用户可以查看操作历史,了解自己的操作记录,同时可以撤销或重做某些操作。

该模块的主要功能包括:记录操作、查看历史、撤销操作、重做操作、清空历史等。通过Cordova框架与OpenHarmony原生能力的结合,实现了完整的操作历史管理。

操作历史需要处理大量的操作记录,同时需要支持撤销和重做功能。

🔗 完整流程

第一步:操作记录

系统在用户执行操作时自动记录操作信息,包括操作类型、操作对象、操作时间等。记录过程需要异步进行,避免影响用户体验。

操作记录需要存储在数据库中,支持后续的查询和分析。

第二步:历史查看

用户可以查看所有的操作历史,按时间倒序排列。历史列表需要显示操作的类型、对象、时间等信息。

用户可以搜索和筛选历史记录,快速找到特定的操作。

第三步:撤销与重做

用户可以撤销最近的操作,系统会恢复到操作前的状态。同时支持重做操作,用户可以重新执行撤销的操作。

撤销和重做需要维护一个操作栈,记录所有的操作和状态变化。

🔧 Web代码实现

操作历史HTML结构

<divid="history-page"class="page"><divclass="page-header"><h2>操作历史</h2><divclass="history-actions"><buttonclass="btn btn-secondary"onclick="undoLastOperation()"id="undo-btn">↶ 撤销</button><buttonclass="btn btn-secondary"onclick="redoLastOperation()"id="redo-btn">↷ 重做</button><buttonclass="btn btn-danger"onclick="clearHistory()">🗑️ 清空历史</button></div></div><divclass="history-list"id="history-list"></div></div>

操作历史实现

letoperationHistory=[];lethistoryIndex=-1;asyncfunctionrecordOperation(type,object,details){constoperation={type:type,object:object,details:details,timestamp:Date.now(),id:Date.now()};// 移除重做栈中的操作operationHistory=operationHistory.slice(0,historyIndex+1);operationHistory.push(operation);historyIndex++;// 保存到数据库awaitdb.addHistory(operation);updateHistoryButtons();}asyncfunctionundoLastOperation(){if(historyIndex<0)return;constoperation=operationHistory[historyIndex];historyIndex--;// 执行撤销操作awaitperformUndo(operation);updateHistoryButtons();loadHistoryList();}asyncfunctionredoLastOperation(){if(historyIndex>=operationHistory.length-1)return;historyIndex++;constoperation=operationHistory[historyIndex];// 执行重做操作awaitperformRedo(operation);updateHistoryButtons();loadHistoryList();}asyncfunctionperformUndo(operation){// 根据操作类型执行撤销switch(operation.type){case'add':awaitdb.deleteMovie(operation.object);break;case'delete':awaitdb.addMovie(operation.details);break;case'update':awaitdb.updateMovie(operation.object,operation.details.oldData);break;}}asyncfunctionperformRedo(operation){// 根据操作类型执行重做switch(operation.type){case'add':awaitdb.addMovie(operation.details);break;case'delete':awaitdb.deleteMovie(operation.object);break;case'update':awaitdb.updateMovie(operation.object,operation.details.newData);break;}}functionupdateHistoryButtons(){document.getElementById('undo-btn').disabled=historyIndex<0;document.getElementById('redo-btn').disabled=historyIndex>=operationHistory.length-1;}asyncfunctionloadHistoryList(){try{consthistory=awaitdb.getHistory();renderHistoryList(history);}catch(error){console.error('加载历史失败:',error);}}functionrenderHistoryList(history){constcontainer=document.getElementById('history-list');container.innerHTML='';if(history.length===0){container.innerHTML='<p class="empty-message">暂无操作历史</p>';return;}history.reverse().forEach(op=>{constitem=document.createElement('div');item.className='history-item';constdate=newDate(op.timestamp).toLocaleString('zh-CN');consttypeText={'add':'添加','delete':'删除','update':'修改'}[op.type]||op.type;item.innerHTML=`<span class="operation-type">${typeText}</span> <span class="operation-object">${op.object}</span> <span class="operation-time">${date}</span>`;container.appendChild(item);});}asyncfunctionclearHistory(){if(confirm('确定要清空操作历史吗?')){try{awaitdb.clearHistory();operationHistory=[];historyIndex=-1;loadHistoryList();updateHistoryButtons();showSuccess('历史已清空');}catch(error){console.error('清空历史失败:',error);showError('清空历史失败');}}}

🔌 OpenHarmony原生代码

操作历史插件

// HistoryPlugin.etsimport{webview}from'@kit.ArkWeb';import{common}from'@kit.AbilityKit';exportclassHistoryPlugin{privatecontext:common.UIAbilityContext;constructor(context:common.UIAbilityContext){this.context=context;}publicregisterHistory(controller:webview.WebviewController):void{controller.registerJavaScriptProxy({object:newHistoryBridge(),name:'historyNative',methodList:['recordOperation','getOperationStats']});}}exportclassHistoryBridge{publicrecordOperation(operationJson:string):string{try{constoperation=JSON.parse(operationJson);returnJSON.stringify({success:true,operationId:operation.id,timestamp:operation.timestamp});}catch(error){returnJSON.stringify({success:false,error:error.message});}}publicgetOperationStats(historyJson:string):string{try{consthistory=JSON.parse(historyJson);conststats={totalCount:history.length,addCount:history.filter((h:any)=>h.type==='add').length,deleteCount:history.filter((h:any)=>h.type==='delete').length,updateCount:history.filter((h:any)=>h.type==='update').length};returnJSON.stringify(stats);}catch(error){returnJSON.stringify({error:error.message});}}}

📝 总结

操作历史模块展示了Cordova与OpenHarmony混合开发中的操作记录和撤销重做功能。通过Web层提供历史查看界面,同时利用OpenHarmony原生能力进行操作统计。

在实现这个模块时,需要注意操作记录的完整性、撤销重做的准确性、以及性能的优化。通过合理的架构设计,可以构建出高效、易用的操作历史功能。

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

LangFlow与关键词提取结合:精准定位内容主题

LangFlow与关键词提取结合&#xff1a;精准定位内容主题 在信息爆炸的时代&#xff0c;每天产生的文本数据量呈指数级增长。从社交媒体评论到企业文档&#xff0c;从新闻报道到科研论文&#xff0c;如何快速理解海量文本的核心主题&#xff0c;成为许多组织面临的关键挑战。传统…

作者头像 李华
网站建设 2026/5/8 21:03:58

LED显示屏安装抗震结构措施:全面讲解安全规范

LED显示屏抗震安装实战指南&#xff1a;从结构设计到施工避坑你有没有想过&#xff0c;城市楼宇外墙上那块巨大的LED屏幕&#xff0c;在地震来临时会不会掉下来&#xff1f;这不是危言耸听。近年来&#xff0c;多地曾发生因强风或地震导致户外广告牌、显示屏松动甚至坠落的事件…

作者头像 李华
网站建设 2026/5/8 2:28:10

抖音无水印视频下载终极指南:一键保存高清短视频

还在为抖音视频上的水印烦恼吗&#xff1f;想要永久收藏那些精彩的短视频内容吗&#xff1f;douyin_downloader抖音无水印下载工具为您提供专业级解决方案&#xff0c;让您轻松下载高清无水印视频&#xff0c;无论是个人收藏还是内容创作都能得心应手。 【免费下载链接】douyin…

作者头像 李华
网站建设 2026/4/23 14:05:16

快手今天晚上怎么了?

快手今晚集中出现大量黄色直播&#xff0c;核心原因是黑产团伙发起的技术突袭攻击&#xff0c;并非平台正常内容生态问题。具体来看&#xff0c;黑产团伙通过三种关键手段批量推送涉黄内容&#xff0c;导致违规直播短时间内刷屏&#xff1a;1. 批量操控账号&#xff1a;利用“接…

作者头像 李华
网站建设 2026/4/30 8:42:44

设计模式学习(5) 23-2 简单工厂、工厂方法 23-4 抽象工厂

0. 个人感悟 工厂模式是经典的创建型模式&#xff0c;工作中也经常用到&#xff0c;值得一学核心思想是将对象的创建和自身业务隔离开&#xff0c;从而达到复用、解耦的效果随着业务的逐渐扩展(产品创建逻辑膨胀、不同产品组合工作等)&#xff0c;工厂抽象程度不断加深&#x…

作者头像 李华
网站建设 2026/5/4 9:29:27

LangFlow中的二维码生成器:快速创建可扫描内容

LangFlow中的二维码生成器&#xff1a;快速创建可扫描内容 在智能系统日益渗透日常场景的今天&#xff0c;如何让大语言模型&#xff08;LLM&#xff09;的输出不再局限于对话框里的文字&#xff0c;而是真正“走出去”&#xff0c;与物理世界产生互动&#xff1f;一个简单的二…

作者头像 李华