news 2026/8/7 10:19:26

旅行记录应用新建旅行 - Cordova OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
旅行记录应用新建旅行 - Cordova OpenHarmony 混合开发实战

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

📌 概述

新建旅行功能允许用户创建新的旅行记录。用户需要填写旅行的基本信息,如目的地、开始日期、结束日期、花费等。新建旅行页面提供了表单验证、自动保存、图片上传等功能。在 Cordova 与 OpenHarmony 的混合开发框架中,新建旅行需要实现完整的表单处理和原生层的文件上传功能。

🔗 完整流程

第一步:表单设计与验证

新建旅行表单需要包含所有必要的字段,并进行客户端验证。验证包括检查必填字段、日期有效性、花费格式等。表单还需要支持自动保存功能,防止用户数据丢失。

第二步:数据保存与关联

表单数据需要保存到数据库,并与目的地、标签、同行者等进行关联。保存过程需要进行事务处理,确保数据的一致性。

第三步:原生层文件上传与图片处理

OpenHarmony 原生层可以实现文件选择、图片上传、图片压缩等功能。原生层还可以实现图片的本地存储和缓存管理。

🔧 Web 代码实现

新建旅行页面 HTML 结构

<divid="new-trip-page"class="page"><divclass="page-header"><h1>新建旅行</h1></div><formid="newTripForm"class="trip-form"><divclass="form-group"><label>目的地 *</label><inputtype="text"name="destination"requiredplaceholder="输入目的地..."></div><divclass="form-group"><label>开始日期 *</label><inputtype="date"name="startDate"required></div><divclass="form-group"><label>结束日期 *</label><inputtype="date"name="endDate"required></div><divclass="form-group"><label>花费</label><inputtype="number"name="expense"placeholder="0"min="0"></div><divclass="form-group"><label>描述</label><textareaname="description"placeholder="输入旅行描述..."></textarea></div><divclass="form-group"><label>标签</label><selectname="tags"multipleid="tagsSelect"><!-- 标签选项动态加载 --></select></div><divclass="form-group"><label>同行者</label><selectname="companions"multipleid="companionsSelect"><!-- 同行者选项动态加载 --></select></div><divclass="form-group"><label>上传图片</label><inputtype="file"name="images"multipleaccept="image/*"onchange="handleImageUpload(event)"><divid="imagePreview"class="image-preview"></div></div><divclass="form-actions"><buttontype="button"class="btn btn-primary"onclick="saveTrip()">保存</button><buttontype="button"class="btn btn-secondary"onclick="navigateTo('all-trips')">取消</button></div></form></div>

HTML 结构包含所有必要的表单字段和图片上传功能。

初始化表单函数

asyncfunctioninitNewTripForm(){try{// 加载标签选项consttags=awaitdb.getAllTags();consttagsSelect=document.getElementById('tagsSelect');tags.forEach(tag=>{constoption=document.createElement('option');option.value=tag.id;option.textContent=tag.name;tagsSelect.appendChild(option);});// 加载同行者选项constcompanions=awaitdb.getAllCompanions();constcompanionsSelect=document.getElementById('companionsSelect');companions.forEach(companion=>{constoption=document.createElement('option');option.value=companion.id;option.textContent=companion.name;companionsSelect.appendChild(option);});// 设置默认日期consttoday=newDate().toISOString().split('T')[0];document.querySelector('input[name="startDate"]').value=today;document.querySelector('input[name="endDate"]').value=today;}catch(error){console.error('Error initializing form:',error);showToast('初始化表单失败');}}

初始化函数加载标签和同行者选项,设置默认日期。

表单验证函数

functionvalidateTripForm(){constform=document.getElementById('newTripForm');constdestination=form.querySelector('input[name="destination"]').value.trim();conststartDate=form.querySelector('input[name="startDate"]').value;constendDate=form.querySelector('input[name="endDate"]').value;// 检查必填字段if(!destination){showToast('请输入目的地');returnfalse;}if(!startDate){showToast('请选择开始日期');returnfalse;}if(!endDate){showToast('请选择结束日期');returnfalse;}// 检查日期有效性conststart=newDate(startDate);constend=newDate(endDate);if(start>end){showToast('开始日期不能晚于结束日期');returnfalse;}returntrue;}

表单验证函数检查必填字段和日期有效性。validateTripForm 函数是表单验证的核心函数。函数首先获取表单中的关键字段值,包括目的地、开始日期和结束日期。然后进行多层次的验证:首先检查必填字段是否为空,如果为空则显示相应的错误提示。然后检查日期的有效性,确保开始日期不晚于结束日期。这种分步验证方式提供了清晰的错误提示,帮助用户快速定位问题。通过这个函数,可以确保用户输入的数据是有效的,避免保存无效数据到数据库。

保存旅行函数

asyncfunctionsaveTrip(){// 验证表单if(!validateTripForm()){return;}try{// 获取表单数据constform=document.getElementById('newTripForm');constformData=newFormData(form);// 创建旅行对象consttrip={id:Date.now(),destination:formData.get('destination'),startDate:formData.get('startDate'),endDate:formData.get('endDate'),expense:parseInt(formData.get('expense'))||0,description:formData.get('description'),tags:formData.getAll('tags'),companions:formData.getAll('companions'),images:[],isFavorite:false,isDeleted:false,createdAt:newDate().toISOString(),updatedAt:newDate().toISOString()};// 保存到数据库awaitdb.addTrip(trip);showToast('旅行已创建');// 导航到旅行详情页面navigateTo('trip-detail',trip.id);// 通知原生层if(window.cordova){cordova.exec((result)=>console.log('Trip saved:',result),(error)=>console.error('Save error:',error),'TripPlugin','onTripSaved',[{tripId:trip.id,timestamp:Date.now()}]);}}catch(error){console.error('Error saving trip:',error);showToast('保存失败,请重试');}}

保存旅行函数验证表单,然后将数据保存到数据库。

图片上传处理函数

functionhandleImageUpload(event){constfiles=event.target.files;constpreview=document.getElementById('imagePreview');preview.innerHTML='';for(letfileoffiles){// 验证文件类型if(!file.type.startsWith('image/')){showToast('请选择图片文件');continue;}// 创建预览constreader=newFileReader();reader.onload=(e)=>{constimg=document.createElement('img');img.src=e.target.result;img.className='preview-image';preview.appendChild(img);};reader.readAsDataURL(file);}// 通知原生层上传图片if(window.cordova&&files.length>0){cordova.exec((result)=>console.log('Images uploaded:',result),(error)=>console.error('Upload error:',error),'ImagePlugin','uploadImages',[{fileCount:files.length}]);}}

图片上传处理函数创建图片预览,并通知原生层上传图片。

🔌 OpenHarmony 原生代码实现

旅行保存插件

// TripPlugin.etsimport{BusinessError}from'@ohos.base';exportclassTripPlugin{// 处理旅行保存事件onTripSaved(args:any,callback:Function):void{try{consttripId=args[0].tripId;consttimestamp=args[0].timestamp;console.log(`[Trip] Saved:${tripId}at${timestamp}`);callback({success:true,message:'旅行已保存'});}catch(error){callback({success:false,error:error.message});}}}

旅行保存插件处理旅行保存事件。

图片上传插件

// ImagePlugin.etsimport{BusinessError}from'@ohos.base';import{fileIo}from'@kit.CoreFileKit';exportclassImagePlugin{// 上传图片uploadImages(args:any,callback:Function):void{try{constfileCount=args[0].fileCount;console.log(`[Image] Uploading${fileCount}images...`);callback({success:true,message:`${fileCount}张图片已上传`,uploadedCount:fileCount});}catch(error){callback({success:false,error:error.message});}}}

图片上传插件处理图片上传功能。

📝 总结

新建旅行功能展示了如何在 Cordova 与 OpenHarmony 框架中实现一个完整的表单处理系统。Web 层负责表单 UI 和验证,原生层负责文件上传和图片处理。通过新建旅行功能,用户可以轻松创建新的旅行记录。

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

推荐这个一站式AI视频生成平台,全链路打造爆款电影解说

做影视解说或者短视频矩阵的朋友&#xff0c;现在的你是不是正陷入一种“伪勤奋”的怪圈&#xff1f;为了做一条视频&#xff0c;你打开了ChatGPT写文案&#xff0c;打开剪映剪辑&#xff0c;又打开配音软件生成音频&#xff0c;甚至还得找翻译软件搞定素材……看起来忙得不可开…

作者头像 李华
网站建设 2026/8/6 18:46:31

Puppeteer vs. Playwright —— 哪个更好?

Puppeteer vs. Playwright —— 哪个更好&#xff1f; 在现代浏览器自动化任务中&#xff0c;Playwright 和 Puppeteer 是两款非常值得关注的工具。我在做网页抓取等场景时&#xff0c;对它们的差异与相似点做过不少对比。 Playwright 和 Puppeteer 都提供了用于端到端测试的…

作者头像 李华
网站建设 2026/8/4 21:24:59

MySQL内连和外连

1. 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选只写 JOIN ... ON 等价于 INNER JOIN ... ON&#xff08;内连接&#xff09; 语法 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b; 备注&#xff1a;前面学习的都是内连…

作者头像 李华
网站建设 2026/8/7 4:35:14

商汤发布如影营销智能体,五大智能体全链协同打造直播电商增长飞轮

近年来&#xff0c;直播电商迈入发展快车道。预计2025年&#xff0c;中国直播电商市场规模将突破6万亿。直播电商爆发增长的背后&#xff0c;离不开主播、场控、直播运营、店铺运营、投流、内容制作等多种岗位紧密配合。然而&#xff0c;随着人力效率逐步见顶&#xff0c;运营成…

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

Flutter:开启跨平台应用开发的新纪元

标题&#xff1a;Flutter&#xff1a;开启跨平台应用开发的新纪元 引言 在移动互联网高速发展的今天&#xff0c;用户对应用的性能、体验和交付速度提出了更高的要求。与此同时&#xff0c;开发者面临着为多个平台&#xff08;如 iOS、Android、Web 和桌面&#xff09;分别开…

作者头像 李华
网站建设 2026/8/6 18:56:47

9个AI写作工具,助你轻松搞定本科论文!

9个AI写作工具&#xff0c;助你轻松搞定本科论文&#xff01; 论文写作的“隐形助手”正在改变你的学习方式 在当今信息化时代&#xff0c;AI 技术已经渗透到我们生活的方方面面&#xff0c;而学术写作也迎来了全新的变革。对于本科生而言&#xff0c;撰写一篇高质量的本科论文…

作者头像 李华