HarmonyOS ArkTS 实战:实现一个校园讲座预约与签到应用
HarmonyOS ArkTS 实战实现一个校园讲座预约与签到应用项目效果本文使用 HarmonyOS 和 ArkTS 实现一个校园讲座预约与签到应用。应用可以预约讲座查看讲座信息扫码签到取消预约并提供讲座分类、预约统计和签到率统计等功能。项目使用 DevEco Studio 开发适配 API 23 及以上版本。运行效果功能介绍本项目实现了以下功能浏览讲座信息查看讲座时间地点预约讲座取消预约现场签到生成签到码按分类筛选讲座按状态筛选我的预约统计预约人数、签到人数签到率计算收藏讲座定义数据结构首先定义讲座和预约的数据结构interfaceReservation{id:number;lectureId:number;studentId:string;name:string;college:string;phone:string;status:string;reserveTime:string;checkInTime:string;}interfaceLecture{id:number;title:string;speaker:string;description:string;category:string;time:string;location:string;maxPeople:number;organizer:string;posterColor:string;status:string;reservations:Reservation[];isCollected:boolean;}字段说明如下Reservation预约记录id预约编号lectureId讲座编号studentId学号name姓名college学院phone电话status状态已预约/已签到/已取消reserveTime预约时间checkInTime签到时间Lecture讲座id讲座编号title讲座标题speaker主讲人description讲座简介category分类学术/就业/人文/科技/艺术time讲座时间location地点maxPeople人数上限organizer主办方posterColor海报颜色status状态预约中/进行中/已结束reservations预约列表isCollected是否收藏初始化页面状态使用State保存输入内容、分类选择StateprivatenameText:string;StateprivatestudentIdText:string;StateprivatecollegeText:string;StateprivatephoneText:string;StateprivateselectedCategory:string全部;StateprivatefilterMyStatus:string全部;StateprivatecurrentUserId:string2023001;StateprivatenextReserveId:number10;准备一些初始讲座数据Stateprivatelectures:Lecture[][{id:1,title:HarmonyOS生态与开发前景,speaker:张教授,description:介绍HarmonyOS操作系统的发展历程、技术架构和未来生态,category:科技,time:2026-07-20 14:00,location:图书馆报告厅,maxPeople:200,organizer:计算机学院,posterColor:#BE185D,status:预约中,isCollected:false,reservations:[{id:1,lectureId:1,studentId:2023001,name:王同学,college:计算机学院,phone:138****1234,status:已预约,reserveTime:2026-07-15,checkInTime:}]},{id:2,title:大学生职业规划与求职技巧,speaker:李HR,description:知名企业HR分享简历制作、面试技巧和职业规划经验,category:就业,time:2026-07-22 18:30,location:大学生活动中心,maxPeople:300,organizer:就业指导中心,posterColor:#2563EB,status:预约中,isCollected:true,reservations:[]},{id:3,title:红楼梦与中国传统文化,speaker:王教授,description:从红楼梦看中国传统文化的博大精深,category:人文,time:2026-07-18 19:00,location:文科楼201,maxPeople:100,organizer:文学院,posterColor:#D97706,status:已结束,isCollected:false,reservations:[{id:2,lectureId:3,studentId:2022005,name:赵同学,college:文学院,phone:136****3456,status:已签到,reserveTime:2026-07-10,checkInTime:2026-07-18 18:45}]}];预约讲座用户可以预约讲座privatereserveLecture(lectureId:number):void{constnamethis.nameText.trim();conststudentIdthis.studentIdText.trim();constcollegethis.collegeText.trim();constphonethis.phoneText.trim();if(name.length0||studentId.length0){return;}this.lecturesthis.lectures.map((lecture:Lecture){if(lecture.idlectureIdlecture.status预约中lecture.reservations.lengthlecture.maxPeople){constalreadyReservedlecture.reservations.some(rr.studentIdstudentId);if(alreadyReserved)returnlecture;constnewReserve:Reservation{id:this.nextReserveId,lectureId,studentId,name,college,phone,status:已预约,reserveTime:newDate().toISOString().split(T)[0],checkInTime:};this.nextReserveId1;return{id:lecture.id,title:lecture.title,speaker:lecture.speaker,description:lecture.description,category:lecture.category,time:lecture.time,location:lecture.location,maxPeople:lecture.maxPeople,organizer:lecture.organizer,posterColor:lecture.posterColor,status:lecture.status,reservations:[newReserve,...lecture.reservations],isCollected:lecture.isCollected};}returnlecture;});this.nameText;this.studentIdText;this.collegeText;this.phoneText;}取消预约和签到privatecancelReservation(lectureId:number,reserveId:number):void{this.lecturesthis.lectures.map((lecture:Lecture){if(lecture.idlectureIdlecture.status预约中){return{id:lecture.id,title:lecture.title,speaker:lecture.speaker,description:lecture.description,category:lecture.category,time:lecture.time,location:lecture.location,maxPeople:lecture.maxPeople,organizer:lecture.organizer,posterColor:lecture.posterColor,status:lecture.status,reservations:lecture.reservations.filter(rr.id!reserveId),isCollected:lecture.isCollected};}returnlecture;});}privatecheckIn(lectureId:number,reserveId:number):void{constnownewDate();constcheckInTime${now.getFullYear()}-${String(now.getMonth()1).padStart(2,0)}-${String(now.getDate()).padStart(2,0)}${String(now.getHours()).padStart(2,0)}:${String(now.getMinutes()).padStart(2,0)};this.lecturesthis.lectures.map((lecture:Lecture){if(lecture.idlectureId){constupdatedReserveslecture.reservations.map(r{if(r.idreserveIdr.status已预约){return{id:r.id,lectureId:r.lectureId,studentId:r.studentId,name:r.name,college:r.college,phone:r.phone,status:已签到,reserveTime:r.reserveTime,checkInTime};}returnr;});return{id:lecture.id,title:lecture.title,speaker:lecture.speaker,description:lecture.description,category:lecture.category,time:lecture.time,location:lecture.location,maxPeople:lecture.maxPeople,organizer:lecture.organizer,posterColor:lecture.posterColor,status:lecture.status,reservations:updatedReserves,isCollected:lecture.isCollected};}returnlecture;});}收藏讲座privatetoggleCollect(lectureId:number):void{this.lecturesthis.lectures.map((lecture:Lecture){if(lecture.idlectureId){return{id:lecture.id,title:lecture.title,speaker:lecture.speaker,description:lecture.description,category:lecture.category,time:lecture.time,location:lecture.location,maxPeople:lecture.maxPeople,organizer:lecture.organizer,posterColor:lecture.posterColor,status:lecture.status,reservations:lecture.reservations,isCollected:!lecture.isCollected};}returnlecture;});}筛选讲座privategetFilteredLectures():Lecture[]{if(this.selectedCategory全部){returnthis.lectures;}if(this.selectedCategory我收藏的){returnthis.lectures.filter(ll.isCollected);}returnthis.lectures.filter(ll.categorythis.selectedCategory);}privategetMyReservations():Reservation[]{letmyReserves:Reservation[][];this.lectures.forEach(l{l.reservations.forEach(r{if(r.studentIdthis.currentUserId){if(this.filterMyStatus全部||r.statusthis.filterMyStatus){myReserves.push({...r,lectureTitle:l.title});}}});});returnmyReserves;}分类按钮封装BuilderCategoryButton(text:string){Button(text).height(32).padding({left:14,right:14}).fontSize(12).fontColor(this.selectedCategorytext?Color.White:#344054).backgroundColor(this.selectedCategorytext?#BE185D:#FCE7F3).borderRadius(16).onClick((){this.selectedCategorytext;});}统计数据privategetTotalReservations():number{returnthis.lectures.reduce((sum,l)suml.reservations.length,0);}privategetCheckInCount():number{letcount0;this.lectures.forEach(l{l.reservations.forEach(r{if(r.status已签到)count;});});returncount;}privategetCheckInRate():string{consttotalthis.getTotalReservations();if(total0)return0%;returnMath.round((this.getCheckInCount()/total)*100)%;}顶部统计区域展示讲座总数、预约人数、已签到、签到率this.StatCard(讲座总数,${this.lectures.length},#BE185D,#FDF2F8);this.StatCard(预约人数,${this.getTotalReservations()},#2563EB,#EFF6FF);this.StatCard(已签到,${this.getCheckInCount()},#059669,#ECFDF5);this.StatCard(签到率,this.getCheckInRate(),#D97706,#FFF7E8);设置状态颜色privategetStatusColor(status:string):ResourceColor{if(status预约中||status已预约)return#2563EB;if(status进行中||status已签到)return#059669;if(status已取消)return#6B7280;return#6B7280;}privategetStatusBgColor(status:string):ResourceColor{if(status预约中||status已预约)return#DBEAFE;if(status进行中||status已签到)return#DCFCE7;return#F3F4F6;}蓝色预约中/已预约绿色进行中/已签到灰色已结束/已取消玫红色页面主题色页面设计说明应用使用玫红色作为主题色体现学术讲座、文化活动的氛围。页面主要分为以下区域顶部标题数据统计区域讲座分类筛选讲座列表我的预约预约/签到弹窗页面采用浅灰色背景和白色卡片。讲座使用彩色海报区域主讲人、时间、地点使用图标文字展示预约进度条展示报名情况签到状态使用绿色对勾标记。SDK 配置本项目使用 HarmonyOS API 24满足 API 23 及以上要求{ name: default, compatibleSdkVersion: 6.1.1(24), runtimeOS: HarmonyOS, targetSdkVersion: 6.1.1(24), compileSdkVersion: 6.1.1(24) }运行项目使用 DevEco Studio 打开项目然后找到entry/src/main/ets/pages/Index.ets等待项目同步完成点击右侧的Preview按钮即可查看应用效果。项目总结本文使用 HarmonyOS 和 ArkTS 实现了一个校园讲座预约与签到应用。项目实现了讲座浏览、在线预约、取消预约、现场签到、收藏讲座、分类筛选、签到率统计等功能。通过这个项目可以掌握ArkTS 接口定义和嵌套数据结构State状态管理预约签到流程List和ForEach列表渲染百分比计算和签到率统计进度条展示预约人数自定义Builder组件HarmonyOS 活动类应用布局后续还可以加入扫码签到、讲座提醒、学分认定、讲座评价、讲座回放、座位选择、邀请函生成和讲座日历等功能。

相关新闻

嵌入式系统低功耗设计:SCM模块的OFF模式与唤醒机制详解

嵌入式系统低功耗设计:SCM模块的OFF模式与唤醒机制详解

1. 项目概述:嵌入式系统的“守夜人” 在电池供电的嵌入式设备里,比如你手腕上的智能手表、家里的温湿度传感器,或者野外部署的监测终端,续航能力是决定产品成败的关键。这些设备大部分时间都在“待命”,等待一个指令、…

2026/7/19 2:33:26阅读更多 →
及时做APP开发实战(十四)-专注页面待办选择优化

及时做APP开发实战(十四)-专注页面待办选择优化

及时做APP开发实战(十四)-专注页面待办选择优化本文将介绍如何修复专注页面待办任务只显示5条的BUG,并优化弹窗交互体验。一、问题分析 1.1 问题现象┌─────────────────────────────────────┐ │ 选择待办任务 …

2026/7/19 2:31:26阅读更多 →
嵌入式应届生求职指南:从0项目经验到实战能力构建

嵌入式应届生求职指南:从0项目经验到实战能力构建

最近在嵌入式技术交流群中,经常看到应届生同学提问:"0项目经验找工作,包装简历靠谱吗?" 这确实是一个很现实的问题。作为从嵌入式开发一路走过来的技术人,我理解大家在求职季的焦虑,但更想从行业…

2026/7/19 2:31:26阅读更多 →
知识库主流分片策略

知识库主流分片策略

1、概述将大文件存入知识库,主流的分片策略大致可以分为五类,它们分别适用于不同的文档类型和业务需求。核心思路是在块的大小、语义的完整性和计算成本之间找到平衡点。2、分片策略下表整理了这几类策略的核心原理、优缺点和典型应用场景,可…

2026/7/19 5:07:40阅读更多 →
时间序列分类变量动态编码:解决静态编码导致的模型失灵

时间序列分类变量动态编码:解决静态编码导致的模型失灵

1. 项目概述:为什么时间序列里的分类变量不能“一码了之”你有没有遇到过这样的情况:模型在训练集上效果不错,但一到真实业务场景里,预测就突然“失灵”?比如零售销量预测,上周刚上线的模型,这周…

2026/7/19 5:07:40阅读更多 →
企业数据分类分级操作指南:合规与安全治理实践

企业数据分类分级操作指南:合规与安全治理实践

这次我们来看企业数据分类分级这个关键的数据治理环节。随着《数据安全法》《个人信息保护法》等法规的实施,企业必须建立科学的数据分类分级体系来满足合规要求。这个操作指引将帮助企业系统化地完成数据资产梳理、分类标准制定、分级保护措施落地等核心工作。数据…

2026/7/19 5:07:40阅读更多 →
DM9000以太网控制器原理与WinCE5.0驱动开发详解

DM9000以太网控制器原理与WinCE5.0驱动开发详解

1. DM9000网络控制器基础认知DM9000是一款高度集成的以太网控制器芯片,广泛应用于嵌入式系统中。作为一款10/100M自适应的物理层芯片,它通过简单的总线接口与主控芯片连接,特别适合在资源受限的嵌入式环境中使用。在WinCE5.0这类嵌入式操作系…

2026/7/19 5:07:40阅读更多 →
鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析

鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析

鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析 前言 Book Summary Card 是一个面向 读书总结卡片 的鸿蒙 ArkTS 单页工具。它将主题输入、数量统计、提示备注、智能模式和保存状态组织在同一个移动端页面中。 项目服务于 读者根据摘录生成书籍…

2026/7/19 5:07:40阅读更多 →
为什么说“稳,就是最大的冒险”,工作怎么选-永远不要放弃“离开的能力”? 风险和机会并存-在风险中的

为什么说“稳,就是最大的冒险”,工作怎么选-永远不要放弃“离开的能力”? 风险和机会并存-在风险中的

怎么选:体制内的“稳”和私企的“险”,全都是表层假象 真正的代价和收益,都藏在水面之下。 一、先拆穿两个最常见的认知误区 误区1:公务员/事业编=绝对稳定,一劳永逸 很多人考公的底层逻辑是“进去了就一辈子无忧”,这是典型的把“阶段性稳定”当成了“永久安全”。 …

2026/7/19 5:05:39阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →