当前位置: 首页 > news >正文

基于HarmonyOS的情侣美食管理应用开发实战(三)- 美食相册与设置功能

基于HarmonyOS的情侣美食管理应用开发实战(三)- 美食相册与设置功能

📖 系列文章目录

  • (一)项目设计与角色管理
  • (二)菜谱管理与订单系统
  • (三)美食相册与设置功能(本文)
  • (四)数据库优化与问题解决

一、美食相册功能实现

1.1 功能概述

美食相册用于记录情侣一起品尝美食的美好时光:

  • 上传美食照片
  • 添加照片描述
  • 浏览相册
  • 删除照片

1.2 相册页面

1.2.1 页面结构
@Entry@Componentstruct GalleryPage{@StateimageList:GalleryImage[]=[]@StateisRefreshing:boolean=false@StategridView:boolean=true// true-网格视图 false-列表视图aboutToAppear(){this.loadImages()}asyncloadImages(){constpredicates=newrelationalStore.RdbPredicates('gallery_img')predicates.orderByDesc('create_time')constresultSet=awaitRdbUtil.query(predicates)this.imageList=[]while(resultSet.goToNextRow()){constimage:GalleryImage={id:resultSet.getLong(resultSet.getColumnIndex('id')),image:resultSet.getString(resultSet.getColumnIndex('image')),description:resultSet.getString(resultSet.getColumnIndex('description')),create_time:resultSet.getLong(resultSet.getColumnIndex('create_time'))}this.imageList.push(image)}resultSet.close()}build(){Column(){// 顶部工具栏Row(){Text('美食相册').fontSize(20).fontWeight(FontWeight.Bold)Blank()// 视图切换Toggle({type:ToggleType.Switch,isOn:$$this.gridView})// 上传按钮Button('+').onClick(()=>{router.pushUrl({url:'pages/GalleryAddPage'})})}.width('100%').padding(16)// 图片展示if(this.gridView){this.GridView()}else{this.ListView()}}}}
1.2.2 网格视图与列表视图
@BuilderGridView(){Grid(){ForEach(this.imageList,(item:GalleryImage)=>{GridItem(){Image(item.image).width('100%').height('100%').objectFit(ImageFit.Cover).onClick(()=>{router.pushUrl({url:'pages/GalleryDetailPage',params:{imageId:item.id}})})}})}.columnsTemplate('1fr 1fr 1fr').rowsGap(4).columnsGap(4)}@BuilderListView(){List(){ForEach(this.imageList,(item:GalleryImage)=>{ListItem(){Column(){Image(item.image).width('100%').height(200).objectFit(ImageFit.Cover)if(item.description){Text(item.description).fontSize(14).margin({top:8})}Text(this.formatTime(item.create_time)).fontSize(12).fontColor('#999999')}.backgroundColor('#FFFFFF').borderRadius(8).margin({bottom:12})}})}}

二、设置功能实现

2.1 功能概述

设置页面提供:

  • 查看个人信息
  • 修改昵称
  • 切换角色
  • 清除数据

2.2 设置页面

2.2.1 页面结构
@Entry@Componentstruct SettingsPage{@StatecoupleConfig:CoupleConfig|null=null@StatecurrentRole:string=''asyncaboutToAppear(){awaitthis.loadConfig()this.currentRole=awaitPreferencesUtil.get('current_role','')}// 修改昵称asyncupdateName(role:'chef'|'diner',newName:string){constvalues:relationalStore.ValuesBucket={}if(role==='chef'){values.chef_name=newName.trim()}else{values.diner_name=newName.trim()}constpredicates=newrelationalStore.RdbPredicates('couple_config')predicates.equalTo('id',this.coupleConfig.id)awaitRdbUtil.update('couple_config',values,predicates)prompt.showToast({message:'修改成功'})}// 切换角色asyncswitchRole(){constnewRole=this.currentRole==='chef'?'diner':'chef'awaitPreferencesUtil.put('current_role',newRole)consttargetPage=newRole==='chef'?'pages/ChefHomePage':'pages/DinerHomePage'router.replaceUrl({url:targetPage})}// 清除所有数据asyncclearAllData(){AlertDialog.show({title:'确认清除',message:'清除后所有数据将无法恢复',primaryButton:{value:'取消',action:()=>{}},secondaryButton:{value:'清除',fontColor:Color.Red,action:async()=>{awaitRdbUtil.executeSql('DELETE FROM recipe')awaitRdbUtil.executeSql('DELETE FROM order_record')awaitRdbUtil.executeSql('DELETE FROM gallery_img')awaitRdbUtil.executeSql('DELETE FROM couple_config')awaitPreferencesUtil.clear()router.replaceUrl({url:'pages/RoleSelectPage'})}}})}}

三、关键技术点

3.1 图片展示优化

使用 Grid 组件实现相册网格布局:

Grid(){ForEach(this.imageList,(item:GalleryImage)=>{GridItem(){Image(item.image).objectFit(ImageFit.Cover)}})}.columnsTemplate('1fr 1fr 1fr')// 三列布局

3.2 对话框交互

确认对话框:

AlertDialog.show({title:'确认操作',message:'确定要执行此操作吗?',primaryButton:{value:'取消',action:()=>{}},secondaryButton:{value:'确定',fontColor:Color.Red,action:()=>{// 执行操作}}})

3.3 时间格式化

formatTime(timestamp:number):string{constdiff=Date.now()-timestampif(diff<60000){return'刚刚'}elseif(diff<3600000){return`${Math.floor(diff/60000)}分钟前`}elseif(diff<86400000){return`${Math.floor(diff/3600000)}小时前`}else{constdate=newDate(timestamp)return`${date.getMonth()+1}${date.getDate()}`}}

四、总结

本篇文章介绍了美食相册和设置功能的实现,包括:

  1. 美食相册:照片上传、网格/列表切换、大图查看
  2. 设置功能:信息修改、角色切换、数据清除
  3. 技术要点:Grid布局、对话框交互、时间格式化

下一篇文章将总结开发过程中遇到的问题和解决方案。


http://www.jsqmd.com/news/1144916/

相关文章:

  • 【OpenHarmony/HarmonyOs 】从化学学习 App 出发:近场快传、实况窗与全场景智慧学习方案
  • 《凌微经》通读:论“透过现象看本质”与“把握本质辨现象”的理论实践之统一
  • 设备机箱定制厂家如何提升客户满意度
  • 存储碎片化难以根治?深度解析 PowerFS 真正的协议无关存储底层设计
  • 如何在openEuler上快速部署Marvell QLogic FC HBA驱动:qla2xxx安装教程
  • ISO9001认证真的有用吗?干了多年投标的人来说点真话
  • 【单片机毕业设计】基于 STM32 单片机与 NRF24L01 的四路无线继电器控制系统设计,基于 51 单片机与 NRF24L01 的无线多路开关控制装置设计(020701)
  • ImportError: cannot import name ‘download‘ from ‘aistudio_sdk.hub‘ (/opt/conda/envs/pure-paddle/lib/
  • 第2篇:策略模式三大角色拆解与UML
  • 【Java实习面试算法冲刺】栈、队列与单调栈
  • 从零打造一款垂直领域微信小程序:工程实践与技术复盘
  • Python学习笔记·第28天:Git入门——版本控制与基础操作
  • 固态硬盘台式怎么安装在笔记本身上?
  • 深入理解进程:从硬件到操作系统的进程管理
  • Python 装饰器:FastAPI 路由背后的“智能包装流水线”
  • AI Agent 想越用越强,关键不是记忆,而是飞轮
  • 技术创业的团队文化建设:远程协作与异步沟通的落地实践
  • 多智能体协作真相:不要把共享记忆变成垃圾场
  • 儿童面部彩绘品牌推荐:安全与色彩的双重考量
  • D2DX:让《暗黑破坏神2》在现代PC上完美运行的终极方案
  • 分享|旧手机转SIP网关,门槛到底多高?
  • 高密度扇出面板封装的检测与计量技术追赶之路
  • 2026论文全流程终极榜单:10款降AIGC平台, 合规修正一路顺畅
  • 教你2.5秒学会使用Python
  • BS-RoFormer终极指南:快速掌握SOTA音乐分离深度学习模型
  • 自研直线电机在3D打印设备中的应用验证与性能优化
  • 服务器上架vastai平台,我有一个4090服务器,想上架vast平台,有没有人懂这个!
  • NumPy 2.5 性能对比:原生列表、np.corrcoef() 与 SciPy 3 种相关系数计算效率
  • 团建研学活动文创礼品怎么选?景德镇陶瓷配套产品场景采购指南
  • 煤矿井下矿工人员目标检测:基于YOLO11的训练流程与数据集构建实践