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

HarmonyOS ArkTS 实战:实现一个校园食堂排队取餐记录应用

项目效果

本文实现一个基于 HarmonyOS 和 ArkTS 的校园食堂排队取餐记录应用。应用可以记录不同食堂窗口的排队时间、用餐时段和口味评价,并支持取餐状态切换、推荐窗口筛选、长队统计和平均等待时间统计。

最终运行效果如下:

页面功能包括:

  • 记录食堂窗口名称;
  • 记录早餐、午餐、晚餐时段;
  • 记录等待分钟数;
  • 标记推荐、一般、避雷;
  • 标记排队中或已取餐;
  • 按全部、已取餐、排队中、推荐筛选;
  • 统计已取餐数量、平均等待时间、长队窗口数量。

前言

校园食堂经常会出现某些窗口排队特别久、某些窗口味道稳定、某些窗口偶尔踩雷的情况。对学生来说,如果能记录每次排队和取餐体验,就能逐渐整理出自己的“食堂选择参考”。

这个项目的业务场景比较轻量,但很适合练习 ArkTS 状态管理。它涉及表单输入、数组新增、状态切换、条件筛选、列表渲染和动态统计,能够覆盖单页面应用中常见的数据处理方式。


一、核心数据结构

每一条取餐记录使用MealRecord表示:

interfaceMealRecord{id:number;windowName:string;mealType:string;waitMinutes:number;taste:string;finished:boolean;}

其中:

  • windowName表示食堂窗口;
  • mealType表示早餐、午餐或晚餐;
  • waitMinutes表示等待时间;
  • taste表示推荐、一般或避雷;
  • finished表示是否已经取餐。

二、页面状态设计

页面使用@State保存输入内容、筛选条件和记录列表:

@StateprivatewindowText:string='';@StateprivatewaitText:string='';@StateprivatemealType:string='午餐';@StateprivatetasteType:string='推荐';@StateprivatefilterType:string='全部';@StateprivatenextId:number=5;@Stateprivaterecords:MealRecord[]=[{id:1,windowName:'一食堂盖浇饭窗口',mealType:'午餐',waitMinutes:12,taste:'推荐',finished:true},{id:2,windowName:'二食堂面馆窗口',mealType:'晚餐',waitMinutes:18,taste:'一般',finished:false},{id:3,windowName:'早餐包子窗口',mealType:'早餐',waitMinutes:6,taste:'推荐',finished:true},{id:4,windowName:'麻辣烫窗口',mealType:'晚餐',waitMinutes:25,taste:'避雷',finished:false}];

这些状态变化后,ArkUI 会自动刷新页面。


三、添加取餐记录

添加记录时,需要读取窗口名称和等待时间,并把等待时间从字符串转换成数字:

privateaddRecord():void{constwindowName:string=this.windowText.trim();constwaitMinutes:number=Number(this.waitText);if(windowName.length===0||Number.isNaN(waitMinutes)||waitMinutes<=0){return;}constrecord:MealRecord={id:this.nextId,windowName,mealType:this.mealType,waitMinutes,taste:this.tasteType,finished:false};this.records=[record,...this.records];this.nextId+=1;this.windowText='';this.waitText='';}

这里把新记录放在数组最前面,方便用户优先看到最新添加的窗口。


四、状态切换和删除

点击“完成取餐”时,只需要切换当前记录的finished状态:

privatetoggleFinished(id:number):void{this.records=this.records.map((item:MealRecord)=>{if(item.id===id){return{id:item.id,windowName:item.windowName,mealType:item.mealType,waitMinutes:item.waitMinutes,taste:item.taste,finished:!item.finished};}returnitem;});}

删除记录使用filter()

privatedeleteRecord(id:number):void{this.records=this.records.filter((item:MealRecord)=>item.id!==id);}

五、筛选和统计

筛选逻辑如下:

privategetFilteredRecords():MealRecord[]{if(this.filterType==='已取餐'){returnthis.records.filter((item:MealRecord)=>item.finished);}if(this.filterType==='排队中'){returnthis.records.filter((item:MealRecord)=>!item.finished);}if(this.filterType==='推荐'){returnthis.records.filter((item:MealRecord)=>item.taste==='推荐');}returnthis.records;}

平均等待时间和长队窗口数量也直接从数组计算:

privategetAverageWait():number{if(this.records.length===0){return0;}lettotal:number=0;this.records.forEach((item:MealRecord)=>{total+=item.waitMinutes;});returnMath.round(total/this.records.length);}privategetLongWaitCount():number{returnthis.records.filter((item:MealRecord)=>item.waitMinutes>=15).length;}

六、页面布局说明

页面主要由四部分组成:

  1. 顶部标题卡片:展示应用名称和说明;
  2. 统计卡片:展示已取餐、平均等待、长队窗口;
  3. 添加表单:输入窗口名称和等待时间,选择时段和口味;
  4. 记录列表:展示每条窗口记录,并支持取餐状态切换和删除。

列表使用ListForEach渲染:

List(){ForEach(this.getFilteredRecords(),(item:MealRecord)=>{ListItem(){this.MealCard(item);}},(item:MealRecord)=>item.id.toString());}

当筛选结果为空时,页面显示空状态提示,避免列表区域空白。


七、运行测试

在 DevEco Studio 中打开项目,进入:

entry/src/main/ets/pages/Index.ets

使用 Preview 预览页面。测试步骤如下:

  1. 输入食堂窗口名称;
  2. 输入等待分钟数;
  3. 选择早餐、午餐或晚餐;
  4. 选择推荐、一般或避雷;
  5. 点击“添加记录”;
  6. 点击“完成取餐”切换状态;
  7. 使用筛选按钮查看不同记录;
  8. 删除单条记录;
  9. 检查统计卡片是否同步变化。

经过测试,添加记录、状态切换、筛选、删除和统计功能均可正常运行。


八、总结

本文基于 HarmonyOS 和 ArkTS 实现了一个校园食堂排队取餐记录应用。项目通过@State管理页面数据,使用 ArkUI 完成页面布局,并实现了取餐记录添加、状态切换、口味评价、筛选展示和动态统计等功能。

这个项目虽然是单页面应用,但业务场景具体,交互逻辑完整,适合用来练习 ArkTS 中的表单输入、数组操作、条件渲染和列表渲染。后续可以继续扩展本地存储、窗口评分、食堂分类和历史趋势统计等功能。

http://www.gsyq.cn/news/1640650.html

相关文章:

  • 华为HarmonyOS设备上如何轻松配置microG服务框架:完整指南
  • OpenBMC:服务器的带外管理
  • Claude Code那些高级功(一)
  • 个人分享|小区物业管理系统源码与配套论文,课设毕设参考素材!
  • 第21讲:自定义类型:联合和枚举
  • LeRobot + LIBERO 机器人仿真评估全流程:模型下载、环境搭建与踩坑指南
  • Mi-Create终极教程:免费打造小米手表专属表盘的完整指南
  • 系统安全核心要素——构建“铜墙铁壁“的系统
  • Zed 新特性:Git面板视图重构,像VS Code看齐了。
  • 编译原理:高级程序语言的定义
  • 二极管、三极管、mos管
  • QA-GraphRAG:面向多跳推理的查询自适应即插即用检索框架
  • 会议复盘小知识:结构化导图梳理会议内容的技巧
  • 202638读书笔记|《商场B1,挤满“白吃白喝”的年轻人》——白吃白喝,热闹背后并非单纯的慷慨,免费的才是最贵的
  • APK安装器:在Windows上无缝安装安卓应用的终极解决方案
  • Appium移动端自动化测试入门:环境搭建、脚本编写与实战指南
  • Android 高级工程师面试:Java 多线程与并发 近1年高频追问 22 题
  • 接口测试全流程解析:从核心原理到Postman、JMeter、Apifox实战
  • GetQzonehistory:如何一键完整导出QQ空间说说并永久保存青春回忆
  • 终极Windows系统优化神器:五分钟让你的电脑焕然一新
  • 小小五子棋
  • 从PCF到Xenium:空间蛋白组与空间转录组如何互补解析GBM组织生态
  • 抖店一件代发怎么做?抖掌柜一键下单保姆级实操教程
  • 【信息科学与工程学】【制造工程】第八十七篇 制造工程中的热学01
  • 神经肿瘤免疫研究如何设计空间蛋白组课题?从Cell案例看PCF80应用
  • Fate/Grand Automata:终极Android自动化工具,告别FGO重复刷本
  • 【每天认识一个国家 | 摩洛哥】
  • 鸿蒙物理 108 篇 第六十八篇 五行反向相克机理
  • leecodecode【面试150】【2026.7.2打卡-java版本】
  • 为什么内向者会“话题终结者”?