news 2026/1/15 11:46:32

筛选器管理模块 Cordova 与 OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
筛选器管理模块 Cordova 与 OpenHarmony 混合开发实战

📌 概述

筛选器管理模块允许用户保存和管理常用的筛选条件。该模块集成了 Cordova 框架与 OpenHarmony 原生能力,提供了完整的筛选器管理功能。用户可以创建多个筛选器,为每个筛选器设置特定的条件,然后快速应用这些筛选器来查看特定的数据。模块支持筛选器的编辑、删除和排序。

🔗 完整流程

第一步:筛选器数据加载

当用户进入筛选器管理页面时,应用会从数据库中加载所有已保存的筛选器。应用会显示每个筛选器的名称、条件和使用次数。

第二步:筛选器展示与管理

数据加载完成后,应用会将筛选器显示为列表形式。用户可以点击筛选器快速应用,也可以编辑或删除筛选器。用户可以创建新的筛选器。

第三步:筛选器应用与同步

当用户点击筛选器时,应用会立即应用该筛选器的条件,显示符合条件的数据。应用会更新筛选器的使用统计。

🔧 Web 代码实现

HTML 筛选器列表

<divid="filters-page"class="page"><divclass="page-header"><h1>筛选器</h1><buttonclass="btn btn-primary"onclick="openCreateFilterModal()">+ 新建筛选器</button></div><divid="filters-list"class="filters-list"><!-- 筛选器项动态生成 --></div><!-- 创建/编辑筛选器模态框 --><divid="filter-modal"class="modal"style="display:none;"><divclass="modal-content"><divclass="modal-header"><h2id="filter-modal-title">新建筛选器</h2><buttonclass="btn-close"onclick="closeFilterModal()">×</button></div><formid="filter-form"class="form"><divclass="form-group"><labelfor="filter-name">筛选器名称 *</label><inputtype="text"id="filter-name"name="name"required></div><divclass="form-group"><labelfor="filter-tea-type">茶叶类型</label><selectid="filter-tea-type"name="teaType"><optionvalue="">全部</option></select></div><divclass="form-group"><labelfor="filter-origin">产地</label><selectid="filter-origin"name="origin"><optionvalue="">全部</option></select></div><divclass="form-group"><labelfor="filter-rating-min">最低评分</label><selectid="filter-rating-min"name="ratingMin"><optionvalue="">全部</option><optionvalue="1">1 星及以上</option><optionvalue="2">2 星及以上</option><optionvalue="3">3 星及以上</option><optionvalue="4">4 星及以上</option><optionvalue="5">5 星</option></select></div><divclass="modal-actions"><buttontype="submit"class="btn btn-primary">保存</button><buttontype="button"class="btn btn-secondary"onclick="closeFilterModal()">取消</button></div></form></div></div></div>

筛选器管理页面包含筛选器列表和创建筛选器的按钮。模态框用于创建或编辑筛选器。

筛选器管理逻辑

letallFilters=[];letcurrentEditingFilterId=null;asyncfunctionrenderFilters(){try{// 加载筛选器数据allFilters=awaitdb.getFilters();constlistContainer=document.getElementById('filters-list');listContainer.innerHTML='';if(allFilters.length===0){listContainer.innerHTML='<div class="no-data"><p>暂无筛选器</p></div>';return;}allFilters.forEach(filter=>{constfilterEl=document.createElement('div');filterEl.className='filter-item';filterEl.dataset.filterId=filter.id;constconditions=buildConditionString(filter);filterEl.innerHTML=`<div class="filter-info"> <div class="filter-name">${filter.name}</div> <div class="filter-conditions">${conditions}</div> <div class="filter-usage">使用次数:${filter.usageCount||0}</div> </div> <div class="filter-actions"> <button class="btn-icon" onclick="applyFilter(${filter.id})" title="应用">✓</button> <button class="btn-icon" onclick="editFilter(${filter.id})" title="编辑">✏️</button> <button class="btn-icon" onclick="deleteFilter(${filter.id})" title="删除">🗑️</button> </div>`;listContainer.appendChild(filterEl);});// 加载分类和产地constcategories=awaitdb.getTeaCategories();constorigins=awaitdb.getOrigins();populateSelectOptions('filter-tea-type',categories);populateSelectOptions('filter-origin',origins);document.getElementById('filter-form').addEventListener('submit',handleSaveFilter);}catch(error){console.error('Failed to render filters:',error);showToast('加载筛选器失败','error');}}functionbuildConditionString(filter){constconditions=[];if(filter.teaType)conditions.push(`茶叶:${filter.teaType}`);if(filter.origin)conditions.push(`产地:${filter.origin}`);if(filter.ratingMin)conditions.push(`评分:${filter.ratingMin}★+`);returnconditions.length>0?conditions.join(' | '):'无条件';}asyncfunctionapplyFilter(filterId){try{constfilter=awaitdb.getFilter(filterId);if(!filter){showToast('筛选器不存在','error');return;}// 更新使用次数awaitdb.updateFilterUsageCount(filterId);// 应用筛选器条件constrecords=awaitdb.getAllRecords();constfiltered=records.filter(record=>{if(filter.teaType&&record.teaType!==filter.teaType)returnfalse;if(filter.origin&&record.origin!==filter.origin)returnfalse;if(filter.ratingMin&&record.rating<filter.ratingMin)returnfalse;returntrue;});// 显示筛选结果showFilterResults(filtered);showToast(`应用筛选器:${filter.name}`,'success');if(window.cordova){cordova.exec(null,null,'TeaLogger','logEvent',['filter_applied',{filterId:filterId,resultCount:filtered.length}]);}}catch(error){console.error('Failed to apply filter:',error);showToast('应用筛选器失败','error');}}functionopenCreateFilterModal(){currentEditingFilterId=null;document.getElementById('filter-modal-title').textContent='新建筛选器';document.getElementById('filter-form').reset();document.getElementById('filter-modal').style.display='flex';}asyncfunctioneditFilter(filterId){try{constfilter=awaitdb.getFilter(filterId);if(!filter){showToast('筛选器不存在','error');return;}currentEditingFilterId=filterId;document.getElementById('filter-modal-title').textContent='编辑筛选器';// 填充表单document.getElementById('filter-name').value=filter.name;document.getElementById('filter-tea-type').value=filter.teaType||'';document.getElementById('filter-origin').value=filter.origin||'';document.getElementById('filter-rating-min').value=filter.ratingMin||'';document.getElementById('filter-modal').style.display='flex';}catch(error){console.error('Failed to edit filter:',error);showToast('加载筛选器失败','error');}}asyncfunctionhandleSaveFilter(event){event.preventDefault();constformData=newFormData(document.getElementById('filter-form'));constfilterData={name:formData.get('name'),teaType:formData.get('teaType')||null,origin:formData.get('origin')||null,ratingMin:parseInt(formData.get('ratingMin'))||null,createdAt:newDate().toISOString()};try{if(currentEditingFilterId){awaitdb.updateFilter(currentEditingFilterId,filterData);showToast('筛选器已更新','success');}else{awaitdb.addFilter(filterData);showToast('筛选器已创建','success');}closeFilterModal();renderFilters();}catch(error){console.error('Failed to save filter:',error);showToast('保存失败,请重试','error');}}asyncfunctiondeleteFilter(filterId){if(!confirm('确定要删除这个筛选器吗?')){return;}try{awaitdb.deleteFilter(filterId);showToast('筛选器已删除','success');renderFilters();}catch(error){console.error('Failed to delete filter:',error);showToast('删除失败,请重试','error');}}functioncloseFilterModal(){document.getElementById('filter-modal').style.display='none';currentEditingFilterId=null;}functionshowFilterResults(records){// 导航到记录列表页面,显示筛选结果navigateTo('record-list');// 在记录列表页面显示筛选后的结果}

这段代码实现了完整的筛选器管理功能。renderFilters()加载并渲染筛选器列表。applyFilter()应用筛选器条件。handleSaveFilter()保存新增或修改的筛选器。deleteFilter()删除筛选器。

🔌 OpenHarmony 原生代码

筛选器数据库操作

// entry/src/main/ets/plugins/FilterManager.etsimport{relationalStore}from'@kit.ArkData';exportclassFilterManager{privatestore:relationalStore.RdbStore;asynccreateFilterTable():Promise<void>{constcreateTableSql=`CREATE TABLE IF NOT EXISTS filters ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, tea_type TEXT, origin TEXT, rating_min INTEGER, usage_count INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )`;awaitthis.store.executeSql(createTableSql);}asyncaddFilter(filter:Filter):Promise<number>{constvalues:relationalStore.ValuesBucket={name:filter.name,tea_type:filter.teaType,origin:filter.origin,rating_min:filter.ratingMin,usage_count:0,created_at:newDate().toISOString()};returnawaitthis.store.insert('filters',values);}asyncupdateFilterUsageCount(filterId:number):Promise<void>{constpredicates=newrelationalStore.RdbPredicates('filters');predicates.equalTo('id',filterId);constresultSet=awaitthis.store.query(predicates);if(resultSet.goToFirstRow()){constcurrentCount=resultSet.getColumnValue(resultSet.getColumnIndex('usage_count'))asnumber;constvalues:relationalStore.ValuesBucket={usage_count:currentCount+1};awaitthis.store.update(values,predicates);}resultSet.close();}}interfaceFilter{id?:number;name:string;teaType?:string;origin?:string;ratingMin?:number;usageCount?:number;}

这个类管理筛选器的数据库操作。createFilterTable()创建筛选器表。addFilter()添加新筛选器。updateFilterUsageCount()更新筛选器的使用次数。

📝 总结

筛选器管理模块展示了如何在 Cordova 框架中实现筛选器管理功能。通过 Web 层的用户界面和交互,结合原生层的数据库操作,为用户提供了高效的数据筛选体验。

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

飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机

飞轮储能系统的建模与MATLAB仿真&#xff08;永磁同步电机作为飞轮驱动电机&#xff09;不是模型嘿&#xff0c;各位技术爱好者&#xff01;今天咱们来聊聊飞轮储能系统的建模以及用 MATLAB 进行仿真的事儿&#xff0c;这里的飞轮驱动电机用的是永磁同步电机。飞轮储能系统可是…

作者头像 李华
网站建设 2026/1/14 15:31:14

车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了

你有没有过这种时刻&#xff1f;老板微信一问&#xff1a;进度到哪了&#xff1f;你只能回&#xff1a;正在做。干过车间的都懂&#xff0c;这哪是正在做&#xff0c;分明是不知道 。大部分的车间主管都这样&#xff1a;进度全靠猜&#xff0c;Excel堆满桌面&#xff0c;工人填…

作者头像 李华
网站建设 2026/1/15 4:04:43

如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次

执行。原因很简单&#xff1a;默认情况下&#xff0c;Spring 不会在多个实例之间做调度同步。这篇文章就聊聊怎么用 ShedLock&#xff0c;让定时任务在多实例环境下“同一时刻只跑一次”。顺便一提&#xff0c;它也能作为 Quartz 的替代。Maven 依赖先引入 shedlock-spring 这个…

作者头像 李华
网站建设 2026/1/14 23:48:10

基于MPC的永磁同步电机非线性终端滑模控制仿真研究

基于MPC的永磁同步电机非线性终端滑模控制仿真研究 matlab simulink 无参考文件在电机控制领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;以其高效、高功率密度等优点&#xff0c;广泛应用于工业、交通等诸多领域。为了实现PMSM更加精准、高效的控制&#xff0c;各…

作者头像 李华
网站建设 2026/1/14 20:35:52

ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进

ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数&#xff1a;filter,unints1,units2&#xff0c;学习率&#xff08;可添加&#xff09; 以下是三个主要的改进点&#xff1a; sin混沌映射&#xff1a; sin混沌映射初始化种群&#xff0c;这是一种…

作者头像 李华