news 2026/6/4 14:58:57

旅行记录应用高级搜索 - Cordova OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
旅行记录应用高级搜索 - Cordova OpenHarmony 混合开发实战

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

📌 概述

高级搜索功能提供了更强大的搜索能力,用户可以通过多个条件组合进行精确搜索。高级搜索支持按日期范围、花费范围、目的地、标签等多个条件进行搜索。这个功能满足了用户对特定旅行的精确查找需求。在 Cordova 与 OpenHarmony 的混合开发框架中,高级搜索需要实现复杂的查询逻辑和原生层的性能优化。

🔗 完整流程

第一步:高级搜索条件设计与验证

高级搜索需要支持多个搜索条件,包括日期范围、花费范围、目的地、标签、同行者等。这些条件需要进行验证,确保数据的有效性。搜索条件可以保存为搜索模板,用户可以快速重用。

第二步:复杂查询逻辑实现

高级搜索需要实现复杂的查询逻辑,支持多个条件的组合。查询逻辑需要高效,避免全表扫描。可以使用数据库索引来优化查询性能。

第三步:原生层查询优化与结果缓存

OpenHarmony 原生层可以实现查询的优化和结果缓存。原生层可以预编译查询语句,提高查询效率。原生层还可以缓存常用的查询结果。

🔧 Web 代码实现

高级搜索页面 HTML 结构

<divid="advanced-search-page"class="page"><divclass="page-header"><h1>高级搜索</h1></div><divclass="advanced-search-container"><formid="advancedSearchForm"class="search-form"><divclass="form-group"><label>目的地</label><inputtype="text"name="destination"placeholder="输入目的地..."></div><divclass="form-group"><label>开始日期</label><inputtype="date"name="startDate"></div><divclass="form-group"><label>结束日期</label><inputtype="date"name="endDate"></div><divclass="form-group"><label>最小花费</label><inputtype="number"name="minExpense"placeholder="0"></div><divclass="form-group"><label>最大花费</label><inputtype="number"name="maxExpense"placeholder="999999"></div><divclass="form-group"><label>标签</label><selectname="tags"multiple><!-- 标签选项动态加载 --></select></div><divclass="form-actions"><buttontype="button"class="btn btn-primary"onclick="performAdvancedSearch()">搜索</button><buttontype="button"class="btn btn-secondary"onclick="resetSearchForm()">重置</button></div></form><divclass="search-results"id="advancedSearchResults"><!-- 搜索结果动态加载 --></div></div></div>

HTML 结构包含多个搜索条件输入框和搜索结果展示区域。

执行高级搜索函数

asyncfunctionperformAdvancedSearch(){try{// 获取表单数据constform=document.getElementById('advancedSearchForm');constformData=newFormData(form);constsearchCriteria={destination:formData.get('destination'),startDate:formData.get('startDate'),endDate:formData.get('endDate'),minExpense:parseInt(formData.get('minExpense'))||0,maxExpense:parseInt(formData.get('maxExpense'))||Infinity,tags:formData.getAll('tags')};// 从数据库查询所有旅行constallTrips=awaitdb.getAllTrips();// 执行高级搜索constresults=filterTrips(allTrips,searchCriteria);// 渲染搜索结果renderAdvancedSearchResults(results);// 通知原生层if(window.cordova){cordova.exec((result)=>console.log('Advanced search performed:',result),(error)=>console.error('Search error:',error),'AdvancedSearchPlugin','onAdvancedSearchPerformed',[{criteria:searchCriteria,resultCount:results.length,timestamp:Date.now()}]);}}catch(error){console.error('Error performing advanced search:',error);showToast('搜索失败');}}

执行高级搜索函数收集表单数据,然后执行搜索操作。performAdvancedSearch 函数是高级搜索的核心执行函数。函数首先获取高级搜索表单中的所有数据,包括目的地、日期范围、花费范围和标签。然后将这些数据组织成一个搜索条件对象。接着从数据库获取所有旅行数据,调用 filterTrips 函数根据搜索条件进行过滤。搜索完成后,函数渲染搜索结果,并通过 Cordova 插件通知原生层进行相应的处理。这个函数支持多条件组合搜索,用户可以根据多个维度精确查找旅行记录。

高级过滤函数

functionfilterTrips(trips,criteria){returntrips.filter(trip=>{// 目的地过滤if(criteria.destination&&!trip.destination.includes(criteria.destination)){returnfalse;}// 日期范围过滤if(criteria.startDate){consttripStartDate=newDate(trip.startDate);constfilterStartDate=newDate(criteria.startDate);if(tripStartDate<filterStartDate){returnfalse;}}if(criteria.endDate){consttripEndDate=newDate(trip.endDate);constfilterEndDate=newDate(criteria.endDate);if(tripEndDate>filterEndDate){returnfalse;}}// 花费范围过滤if(trip.expense<criteria.minExpense||trip.expense>criteria.maxExpense){returnfalse;}// 标签过滤if(criteria.tags.length>0){consthasAllTags=criteria.tags.every(tag=>trip.tags&&trip.tags.includes(tag));if(!hasAllTags){returnfalse;}}returntrue;});}

高级过滤函数根据多个条件对旅行列表进行过滤。filterTrips 函数实现了高级搜索的核心过滤逻辑。函数使用 filter 方法遍历所有旅行,根据搜索条件进行多维度的过滤。首先检查目的地是否匹配,如果指定了目的地但旅行的目的地不包含该关键词,则排除该旅行。然后检查日期范围,旅行的开始日期必须不早于过滤条件的开始日期,结束日期必须不晚于过滤条件的结束日期。接着检查花费范围,旅行的花费必须在指定的范围内。最后检查标签,如果指定了标签,旅行必须包含所有指定的标签。这种设计提供了灵活的多条件组合搜索能力,用户可以根据多个维度精确查找旅行记录。

搜索结果渲染函数

functionrenderAdvancedSearchResults(results){constcontainer=document.getElementById('advancedSearchResults');container.innerHTML='';if(results.length===0){container.innerHTML='<p class="no-results">未找到匹配的旅行</p>';return;}constresultSummary=document.createElement('div');resultSummary.className='result-summary';resultSummary.innerHTML=`<p>找到 <strong>${results.length}</strong> 条旅行记录</p> <p>总花费: <strong>¥${results.reduce((sum,t)=>sum+(t.expense||0),0)}</strong></p>`;container.appendChild(resultSummary);results.forEach(trip=>{constresultElement=document.createElement('div');resultElement.className='search-result-item';resultElement.innerHTML=`<div class="result-header"> <h3>${trip.destination}</h3> <span class="result-date">${formatDate(trip.startDate)}-${formatDate(trip.endDate)}</span> </div> <div class="result-body"> <p class="result-description">${trip.description||'暂无描述'}</p> <div class="result-stats"> <span>💰 ¥${trip.expense}</span> <span>👥${trip.companions||'独自旅行'}</span> </div> </div> <div class="result-footer"> <button class="btn-small" onclick="navigateTo('trip-detail',${trip.id})"> 查看详情 </button> </div>`;container.appendChild(resultElement);});}

搜索结果渲染函数展示搜索结果和统计信息。renderAdvancedSearchResults 函数负责将高级搜索结果渲染到页面上。函数首先清空结果容器,然后检查是否有搜索结果。如果没有结果,显示"未找到匹配的旅行"的提示信息。如果有结果,首先显示一个结果摘要,包括找到的旅行数量和总花费。这个摘要提供了快速的统计信息,帮助用户了解搜索结果的概况。然后遍历结果数组,为每个旅行创建一个结果卡片。每个卡片包含旅行的目的地、日期范围、描述、花费和同行者信息。这种设计提供了详细的搜索结果展示,用户可以快速浏览搜索结果并选择感兴趣的旅行。

重置搜索表单函数

functionresetSearchForm(){constform=document.getElementById('advancedSearchForm');form.reset();document.getElementById('advancedSearchResults').innerHTML='';}

重置函数清空表单和搜索结果。resetSearchForm 函数提供了重置高级搜索表单的功能。函数首先调用 form.reset() 方法清空表单中的所有输入值,将所有字段恢复到初始状态。然后清空搜索结果容器,移除之前的搜索结果。这个函数提供了一个简单的方式让用户重新开始搜索,无需手动清空每个字段。

🔌 OpenHarmony 原生代码实现

高级搜索优化插件

// AdvancedSearchPlugin.etsimport{BusinessError}from'@ohos.base';exportclassAdvancedSearchPlugin{privatequeryCache:Map<string,any>=newMap();// 处理高级搜索事件onAdvancedSearchPerformed(args:any,callback:Function):void{try{constcriteria=args[0].criteria;constresultCount=args[0].resultCount;consttimestamp=args[0].timestamp;// 生成缓存键constcacheKey=JSON.stringify(criteria);// 缓存搜索结果this.queryCache.set(cacheKey,{resultCount:resultCount,timestamp:timestamp});console.log(`[AdvancedSearch] Results:${resultCount}`);callback({success:true,message:'高级搜索已执行'});}catch(error){callback({success:false,error:error.message});}}// 获取查询缓存getQueryCache(args:any,callback:Function):void{try{constcriteria=args[0].criteria;constcacheKey=JSON.stringify(criteria);constcacheEntry=this.queryCache.get(cacheKey);if(cacheEntry){callback({success:true,data:cacheEntry});}else{callback({success:false,data:null});}}catch(error){callback({success:false,error:error.message});}}}

高级搜索优化插件在原生层缓存查询结果,提高搜索性能。AdvancedSearchPlugin 是 OpenHarmony 原生层的高级搜索管理插件,负责处理与高级搜索相关的原生操作。插件维护了一个查询缓存 Map,用于存储最近执行的高级搜索查询和结果数量。通过将搜索条件序列化为 JSON 字符串作为缓存键,可以精确匹配相同的搜索条件。onAdvancedSearchPerformed 方法处理高级搜索事件,当用户执行高级搜索时,将搜索条件和结果数量缓存起来。getQueryCache 方法提供了获取缓存数据的接口,检查是否存在相同条件的缓存。通过这个插件,Web 层可以充分利用原生层的缓存机制,避免重复的复杂查询操作,显著提高搜索性能。

📝 总结

高级搜索功能展示了如何在 Cordova 与 OpenHarmony 框架中实现一个强大的搜索系统。Web 层负责搜索 UI 和复杂的过滤逻辑,原生层负责查询优化和结果缓存。通过高级搜索,用户可以精确查找特定的旅行记录。

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

docker 搭建 grafana+prometheus 监控主机资源之node_exporter

服务基本信息 服务 作用 端口&#xff08;默认&#xff09; Prometheus 普罗米修斯的主服务器 9090 Node_Exporter 负责收集Host硬件信息和操作系统信息 9100 MySqld_Exporter 负责收集mysql数据信息收集 9104 Cadvisor 负责收集Host上运行的docker…

作者头像 李华
网站建设 2026/6/3 1:31:32

设计模式学习(3) 设计模式原则

0.个人感悟 设计原则类似修真世界里的至高法则&#xff0c;万法的源头。遵守法则造出的术法具有能耗低、恢复快、自洽性高等优点&#xff0c;类似遵守设计原则设计的出的程序&#xff0c;具有很多优点设计原则从不同的角度对软件设计提供了约束和指导。其中开闭原则、依赖倒置让…

作者头像 李华
网站建设 2026/6/3 22:21:00

入门篇--1-为什么开发中总要和多个 Python 版本“打交道”?

大家好&#xff0c;我是你们的老朋友Weisian&#xff0c;一个在代码世界里摸爬滚打多年的开发者。今天和大家聊聊一个看似基础、却常常让人头疼的问题&#xff1a;为什么我们在开发过程中&#xff0c;总是需要同时管理好几个版本Python&#xff1f; 刚入门python时&#xff0c;…

作者头像 李华
网站建设 2026/6/3 21:25:51

使用LLaMA-Factory微调Llama3模型实战

使用LLaMA-Factory微调Llama3模型实战 在大模型落地日益成为企业刚需的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;通用语言模型虽然“见多识广”&#xff0c;但在具体业务场景中却常常显得“水土不服”。比如让Llama3写一段智能手表广告文案&#xff0c;它可能生…

作者头像 李华
网站建设 2026/6/4 7:11:08

FPGA基础知识(二十):Xilinx Block Memory IP核(5)--ROM 详解

《FPGA基础知识》系列导航 本专栏专为FPGA新手打造的Xilinx平台入门指南。旨在手把手带你走通从代码、仿真、约束到生成比特流并烧录的全过程。 本篇是该系列的第二十篇内容 上一篇&#xff1a;FPGA基础知识&#xff08;十九&#xff09;&#xff1a;Xilinx Block Memory IP核…

作者头像 李华