- 点餐清单与提交订单)
基于HarmonyOS的情侣美食管理应用开发实战十- 点餐清单与提交订单 系列文章目录一项目设计与角色管理二菜谱管理与订单系统三美食相册与设置功能四数据库优化与问题解决五数据持久化问题修复六图片显示问题修复七菜谱详情页面开发八收藏功能实现九食客菜谱浏览功能十点餐清单与提交订单本文十一主厨订单处理功能十二双向订单记录查询一、功能概述1.1 需求分析食客在浏览菜谱后需要能够发起正式的点餐请求。本章节将实现完整的点餐流程包括菜谱详情展示展示菜谱的完整信息食材、步骤备注功能食客可以添加口味偏好和特殊要求快捷备注提供常用备注选项一键添加订单提交将点餐信息保存到数据库1.2 功能特点✅信息完整展示菜谱的所有相关信息✅备注灵活支持自定义备注和快捷选择✅交互友好卡片式布局操作便捷✅数据准确订单信息完整保存到数据库二、订单数据模型2.1 Order模型定义exportclassOrder{id:number0recipeId:number0// 菜谱IDrecipeName:string// 菜谱名称recipeImage:string// 菜谱图片status:number0// 订单状态remark:string// 口味备注orderTime:number0// 下单时间acceptTime:number0// 接单时间completeTime:number0// 完成时间createTime:number0// 创建时间updateTime:number0// 更新时间}2.2 订单状态定义在CommonConstant中定义订单状态常量/** * 订单状态 */exportconstORDER_STATUS_PENDING0// 待处理exportconstORDER_STATUS_ACCEPTED1// 已接受exportconstORDER_STATUS_COOKING2// 制作中exportconstORDER_STATUS_COMPLETED3// 已完成exportconstORDER_STATUS_CANCELLED4// 已取消三、页面结构设计3.1 页面布局┌─────────────────────────────┐ │ 导航栏返回 菜名 │ ├─────────────────────────────┤ │ 菜谱图片 │ ├─────────────────────────────┤ │ 基本信息 │ │ - 菜名、类型、烹饪时长 │ │ - 描述 │ ├─────────────────────────────┤ │ 食材列表 │ │ - 食材名称 用量 │ ├─────────────────────────────┤ │ 制作步骤 │ │ - 步骤编号 描述 │ ├─────────────────────────────┤ │ 口味备注 │ │ - 备注输入框 │ │ - 快捷备注按钮 │ ├─────────────────────────────┤ │ 提交订单按钮 │ └─────────────────────────────┘3.2 状态变量定义EntryComponentstruct DinerOrderPage{Staterecipe:Recipe|nullnullStateremark:string// 备注内容StatequickRemarks:string[][// 快捷备注选项少辣,不辣,多放葱,不要香菜,少盐]StateselectedQuickRemarks:string[][]// 已选快捷备注privaterecipeId:number0privatecontext:common.UIAbilityContext|nullnull}四、菜谱信息加载4.1 数据库查询方法在RdbUtil中添加根据ID查询菜谱的方法staticasyncqueryRecipeById(id:number):PromiseRecipe|null{try{constpredicatesnewrelationalStore.RdbPredicates(recipe)predicates.equalTo(id,id)constresultSetawaitthis.rdbStore.query(predicates)if(resultSet.goToFirstRow()){constrecipeRecipe.fromJson({...})resultSet.close()returnrecipe}resultSet.close()returnnull}catch(err){LogUtil.error(RdbUtil,查询菜谱失败:${err})returnnull}}4.2 页面初始化aboutToAppear(){try{this.contextgetContext(this)ascommon.UIAbilityContext// 获取路由参数constparamsrouter.getParams()asRecordstring,Objectif(paramsparams[recipeId]){this.recipeIdparams[recipeId]asnumberthis.loadRecipe()}}catch(err){LogUtil.error(DinerOrderPage,初始化失败:${err})}}五、备注功能实现5.1 备注输入框****BuilderRemarkSection(){Column(){Text(口味备注).fontSize(18).fontWeight(FontWeight.Bold).fontColor(CommonStyle.TEXT_COLOR_PRIMARY).width(100%)// 备注输入框TextArea({placeholder:请输入口味偏好或特殊要求...,text:this.remark}).width(100%).height(80).backgroundColor(CommonStyle.BG_COLOR_GRAY).borderRadius(CommonStyle.BORDER_RADIUS_MD).onChange((value:string){this.remarkvalue}).margin({top:12})// 快捷备注Row(){ForEach(this.quickRemarks,(item:string){Text(item).fontSize(14).fontColor(this.selectedQuickRemarks.includes(item)?CommonStyle.TEXT_COLOR_WHITE:CommonStyle.TEXT_COLOR_PRIMARY).backgroundColor(this.selectedQuickRemarks.includes(item)?RoleStyle.DINER_COLOR:CommonStyle.BG_COLOR_GRAY).borderRadius(CommonStyle.BORDER_RADIUS_ROUND).padding({left:12,right:12,top:6,bottom:6}).onClick((){this.toggleQuickRemark(item)})})}.width(100%).justifyContent(FlexAlign.Start).margin({top:8})}.width(100%).padding(16).backgroundColor(CommonStyle.BG_COLOR_WHITE).borderRadius(CommonStyle.BORDER_RADIUS_MD).margin({top:12})}5.2 快捷备注逻辑toggleQuickRemark(remark:string){constindexthis.selectedQuickRemarks.indexOf(remark)if(index-1){// 已选中取消选择this.selectedQuickRemarks.splice(index,1)}else{// 未选中添加选择this.selectedQuickRemarks.push(remark)}// 更新备注内容this.updateRemarkContent()}六、订单提交功能6.1 订单插入方法在RdbUtil中添加插入订单的方法staticasyncinsertOrder(order:Order):Promiseboolean{try{constvalueBucket:relationalStore.ValuesBucket{recipe_id:order.recipeId,recipe_name:order.recipeName,recipe_image:order.recipeImage,status:order.status,remark:order.remark,order_time:order.orderTime,accept_time:order.acceptTime,complete_time:order.completeTime,create_time:Date.now(),update_time:Date.now()}constrowIdawaitthis.rdbStore.insert(order,valueBucket)returnrowId0}catch(err){LogUtil.error(RdbUtil,插入订单失败:${err})returnfalse}}6.2 提交订单逻辑****asyncsubmitOrder(){if(!this.recipe){promptAction.showToast({message:菜谱信息加载失败,duration:2000})return}// 创建订单对象constordernewOrder()order.recipeIdthis.recipe.id order.recipeNamethis.recipe.name order.recipeImagethis.recipe.image||order.statusCommonConstant.ORDER_STATUS_PENDING// 待处理order.remarkthis.remark order.orderTimeDate.now()order.acceptTime0order.completeTime0try{constsuccessawaitRdbUtil.insertOrder(order)if(success){promptAction.showToast({message:下单成功,duration:2000})// 返回上一页router.back()}}catch(err){LogUtil.error(DinerOrderPage,提交订单失败:${err})}}七、技术要点总结7.1 路由参数传递// 发送方router.pushUrl({url:pages/DinerOrderPage,params:{recipeId:recipe.id}})// 接收方constparamsrouter.getParams()asRecordstring,Objectif(paramsparams[recipeId]){this.recipeIdparams[recipeId]asnumber}7.2 快捷备注交互设计思路提供常用备注选项减少输入支持多选自动拼接点击切换选中状态实时更新备注内容7.3 订单状态初始化order.statusCommonConstant.ORDER_STATUS_PENDING// 待处理order.orderTimeDate.now()// 当前时间戳order.acceptTime0// 未接单order.completeTime0// 未完成八、总结通过本篇文章我们完成了点餐清单与提交订单功能的开发✅菜谱详情完整展示图片、信息、食材、步骤✅备注功能灵活支持自定义和快捷选择✅订单提交可靠数据完整保存到数据库✅交互体验友好卡片式布局操作便捷下一篇文章将介绍主厨订单处理功能的实现敬请期待