HarmonyOS ArkTS 实战:实现一个校园投票与问卷调查应用
HarmonyOS ArkTS 实战实现一个校园投票与问卷调查应用项目效果本文使用 HarmonyOS 和 ArkTS 实现一个校园投票与问卷调查应用。应用可以发起投票和问卷参与投票答题查看实时统计结果并提供问卷分类、参与状态筛选和结果可视化等功能。项目使用 DevEco Studio 开发适配 API 23 及以上版本。运行效果功能介绍本项目实现了以下功能发起投票/问卷设置投票标题和选项设置单选/多选设置截止时间参与投票提交问卷答案查看实时结果查看投票统计按状态筛选按类型筛选统计进行中、已结束、我参与的数量匿名投票支持定义数据结构首先定义投票和投票选项的数据结构interfaceVoteOption{id:number;text:string;votes:number;voters:string[];}interfaceVote{id:number;title:string;description:string;type:string;isMultiple:boolean;isAnonymous:boolean;creator:string;createTime:string;endTime:string;status:string;options:VoteOption[];totalVotes:number;}字段说明如下VoteOption投票选项id选项编号text选项内容votes票数voters投票人列表Vote投票/问卷id投票编号title标题description描述type类型投票/问卷/评选isMultiple是否多选isAnonymous是否匿名creator发起人createTime创建时间endTime截止时间status状态进行中/已结束options选项列表totalVotes总票数初始化页面状态使用State保存输入内容、类型选择、筛选条件StateprivatetitleText:string;StateprivatedescText:string;StateprivateendTimeText:string;StateprivateoptionTexts:string[][,];StateprivateselectedType:string投票;StateprivateisMultiple:booleanfalse;StateprivateisAnonymous:booleanfalse;StateprivatefilterStatus:string全部;StateprivatecurrentUserId:string2023001;StateprivatenextVoteId:number5;StateprivatenextOptionId:number20;StateprivateselectedOptions:number[][];准备一些初始投票数据Stateprivatevotes:Vote[][{id:1,title:校园十佳歌手投票,description:选出你心中的校园十佳歌手每人可投3票,type:评选,isMultiple:true,isAnonymous:false,creator:学生会,createTime:2026-07-10,endTime:2026-07-25,status:进行中,totalVotes:256,options:[{id:1,text:1号选手 张三,votes:89,voters:[]},{id:2,text:2号选手 李四,votes:76,voters:[]},{id:3,text:3号选手 王五,votes:91,voters:[2023001]}]},{id:2,title:食堂新增菜品调查,description:你最希望食堂新增什么菜品,type:问卷,isMultiple:false,isAnonymous:true,creator:后勤处,createTime:2026-07-12,endTime:2026-07-20,status:进行中,totalVotes:189,options:[{id:4,text:麻辣香锅,votes:67,voters:[]},{id:5,text:螺蛳粉,votes:82,voters:[]},{id:6,text:汉堡薯条,votes:40,voters:[]}]},{id:3,title:运动会吉祥物投票,description:选择你喜欢的运动会吉祥物设计方案,type:投票,isMultiple:false,isAnonymous:false,creator:体育部,createTime:2026-07-01,endTime:2026-07-10,status:已结束,totalVotes:512,options:[{id:7,text:方案A运动小狮子,votes:234,voters:[]},{id:8,text:方案B奔跑小鹿,votes:278,voters:[]}]}];发起投票用户可以发起新的投票privatecreateVote():void{consttitlethis.titleText.trim();constdescthis.descText.trim();constendTimethis.endTimeText.trim();constvalidOptionsthis.optionTexts.map(tt.trim()).filter(tt.length0);if(title.length0||validOptions.length2){return;}constoptions:VoteOption[]validOptions.map(text({id:this.nextOptionId,text,votes:0,voters:[]}));constvote:Vote{id:this.nextVoteId,title,description:desc,type:this.selectedType,isMultiple:this.isMultiple,isAnonymous:this.isAnonymous,creator:我,createTime:newDate().toISOString().split(T)[0],endTime:endTime||2026-12-31,status:进行中,totalVotes:0,options};this.votes[vote,...this.votes];this.nextVoteId1;this.titleText;this.descText;this.endTimeText;this.optionTexts[,];this.isMultiplefalse;this.isAnonymousfalse;}至少需要2个选项才能创建投票。添加选项创建投票时可以添加更多选项privateaddOption():void{if(this.optionTexts.length10){this.optionTexts[...this.optionTexts,];}}privateupdateOptionText(index:number,text:string):void{constnewTexts[...this.optionTexts];newTexts[index]text;this.optionTextsnewTexts;}最多支持10个选项。参与投票用户可以选择选项进行投票privatetoggleOption(optionId:number):void{if(this.selectedOptions.includes(optionId)){this.selectedOptionsthis.selectedOptions.filter(idid!optionId);}else{if(this.isMultiple){this.selectedOptions[...this.selectedOptions,optionId];}else{this.selectedOptions[optionId];}}}privatesubmitVote(voteId:number):void{if(this.selectedOptions.length0){return;}this.votesthis.votes.map((vote:Vote){if(vote.idvoteIdvote.status进行中){consthasVotedvote.options.some(oo.voters.includes(this.currentUserId));if(hasVoted)returnvote;constupdatedOptionsvote.options.map((opt:VoteOption){if(this.selectedOptions.includes(opt.id)){return{id:opt.id,text:opt.text,votes:opt.votes1,voters:[...opt.voters,this.currentUserId]};}returnopt;});return{id:vote.id,title:vote.title,description:vote.description,type:vote.type,isMultiple:vote.isMultiple,isAnonymous:vote.isAnonymous,creator:vote.creator,createTime:vote.createTime,endTime:vote.endTime,status:vote.status,options:updatedOptions,totalVotes:vote.totalVotesthis.selectedOptions.length};}returnvote;});this.selectedOptions[];}单选只能选一个多选可以选多个每人只能投一次。结束投票发起人可以手动结束投票privateendVote(voteId:number):void{this.votesthis.votes.map((vote:Vote){if(vote.idvoteIdvote.status进行中){return{id:vote.id,title:vote.title,description:vote.description,type:vote.type,isMultiple:vote.isMultiple,isAnonymous:vote.isAnonymous,creator:vote.creator,createTime:vote.createTime,endTime:vote.endTime,status:已结束,options:vote.options,totalVotes:vote.totalVotes};}returnvote;});}筛选投票支持按状态和类型筛选privategetFilteredVotes():Vote[]{if(this.filterStatus全部){returnthis.votes;}if(this.filterStatus我参与的){returnthis.votes.filter((v:Vote)v.options.some(oo.voters.includes(this.currentUserId)));}returnthis.votes.filter((v:Vote)v.statusthis.filterStatus);}筛选按钮封装BuilderFilterButton(text:string){Button(text).height(32).padding({left:14,right:14}).fontSize(12).fontColor(this.filterStatustext?Color.White:#344054).backgroundColor(this.filterStatustext?#9333EA:#F3E8FF).borderRadius(16).onClick((){this.filterStatustext;});}计算选项百分比计算每个选项的得票百分比privategetPercentage(votes:number,total:number):number{if(total0)return0;returnMath.round((votes/total)*100);}用于进度条展示投票结果。统计数据统计进行中、已结束、我参与的数量privategetActiveCount():number{returnthis.votes.filter((v:Vote)v.status进行中).length;}privategetEndedCount():number{returnthis.votes.filter((v:Vote)v.status已结束).length;}privategetMyVotedCount():number{returnthis.votes.filter((v:Vote)v.options.some(oo.voters.includes(this.currentUserId))).length;}顶部统计区域展示总投票、进行中、已结束、我参与的this.StatCard(总投票,${this.votes.length},#9333EA,#FAF5FF);this.StatCard(进行中,${this.getActiveCount()},#16A34A,#F0FDF4);this.StatCard(已结束,${this.getEndedCount()},#6B7280,#F3F4F6);this.StatCard(我参与,${this.getMyVotedCount()},#2563EB,#EFF6FF);设置状态颜色不同状态使用不同颜色privategetStatusColor(status:string):ResourceColor{if(status进行中){return#16A34A;}return#6B7280;}privategetStatusBgColor(status:string):ResourceColor{if(status进行中){return#DCFCE7;}return#F3F4F6;}绿色进行中灰色已结束紫色页面主题色使用列表展示投票使用List和ForEach渲染投票列表List({space:12}){ForEach(this.getFilteredVotes(),(vote:Vote){ListItem(){this.VoteCard(vote)}},(vote:Vote)vote.id.toString());}.width(100%).layoutWeight(1).scrollBar(BarState.Off);每个投票卡片包含标题、描述、发起人、截止时间、状态、选项列表带进度条和投票按钮。页面设计说明应用使用紫色作为主题色体现投票民主、庄重的氛围。页面主要分为以下区域顶部标题数据统计区域发起投票表单状态筛选区域投票列表投票选择弹窗页面采用浅灰色背景和白色卡片。投票结果使用彩色进度条直观展示各选项占比选项选中状态使用紫色勾选标记单选/多选使用不同图标区分。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) }entry 模块中的运行系统也要保持一致{ apiType: stageMode, targets: [ { name: default, runtimeOS: HarmonyOS } ] }运行项目使用 DevEco Studio 打开项目然后找到entry/src/main/ets/pages/Index.ets等待项目同步完成点击右侧的Preview按钮即可查看应用效果。项目总结本文使用 HarmonyOS 和 ArkTS 实现了一个校园投票与问卷调查应用。项目实现了发起投票、添加选项、单选多选、匿名投票、参与投票、实时结果统计、进度条展示、状态筛选等功能。通过这个项目可以掌握ArkTS 接口定义和嵌套数据结构State状态管理投票逻辑和防重复投票List和ForEach列表渲染百分比计算和进度条动态添加选项自定义Builder组件HarmonyOS 投票类应用布局后续还可以加入图片投票、评论功能、投票分享、定时自动结束、结果导出Excel、问卷模板、必填项设置和数据可视化图表等功能。

相关新闻

【企业级邮件合并SOP】:从数据清洗→模板变量绑定→发送追踪→GDPR日志归档,一文闭环

【企业级邮件合并SOP】:从数据清洗→模板变量绑定→发送追踪→GDPR日志归档,一文闭环

更多请点击: https://intelliparadigm.com 第一章:Copilot 邮件合并的核心定位与企业级价值全景 Copilot 邮件合并并非传统意义上的模板填充工具,而是融合自然语言理解、上下文感知与企业数据权限体系的智能协同引擎。它深度集成于 Microso…

2026/7/19 13:12:32阅读更多 →
深入解析TMS320F28003x ADC寄存器:从原理到电机控制实战

深入解析TMS320F28003x ADC寄存器:从原理到电机控制实战

1. 项目概述与ADC核心概念在嵌入式实时控制领域,尤其是电机驱动、数字电源和精密仪器等应用场景,模数转换器(ADC)扮演着连接物理世界与数字处理核心的桥梁角色。它的任务是将连续的模拟信号(如电压、电流、温度&#x…

2026/7/19 13:12:32阅读更多 →
Copilot公式效率翻倍的5个隐藏技巧:从入门到日均节省3.2小时的硬核实践

Copilot公式效率翻倍的5个隐藏技巧:从入门到日均节省3.2小时的硬核实践

更多请点击: https://kaifayun.com 第一章:Copilot公式效率翻倍的底层逻辑与认知重构 Copilot 并非简单地“补全代码”,其效率跃迁源于对开发者意图建模方式的根本性转变——从语法驱动转向语义意图驱动。传统代码补全依赖局部上下文&#x…

2026/7/19 13:12:32阅读更多 →
AI工作流框架选型指南:Prompt-based、LangGraph、Temporal、n8n深度对比

AI工作流框架选型指南:Prompt-based、LangGraph、Temporal、n8n深度对比

当你准备构建一个复杂的AI工作流时,面对Prompt-based、LangGraph、Temporal、n8n这四种主流框架,是否感到选择困难?每个框架的宣传都看起来很美好,但实际项目中选错框架的代价可能远超想象——可能是团队协作效率低下,…

2026/7/19 20:30:24阅读更多 →
Unity与Visual Studio关联失败:系统性诊断与修复指南

Unity与Visual Studio关联失败:系统性诊断与修复指南

1. 项目概述:当Unity与Visual Studio“失联”时作为一名在游戏开发一线摸爬滚打了十多年的老程序员,我敢说,几乎每个Unity开发者都遇到过这个让人血压飙升的瞬间:在Unity编辑器里双击一个C#脚本,结果Visual Studio&…

2026/7/19 20:30:24阅读更多 →
猫抓插件:浏览器视频下载的终极免费解决方案

猫抓插件:浏览器视频下载的终极免费解决方案

猫抓插件:浏览器视频下载的终极免费解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的精彩视频无法保存而烦恼吗&…

2026/7/19 20:30:24阅读更多 →
ARM PMU性能监控单元原理与AM62L寄存器级实战指南

ARM PMU性能监控单元原理与AM62L寄存器级实战指南

1. ARM PMU性能监控单元:从理论到AM62L实战 在嵌入式开发和系统级性能调优领域,我们常常需要回答一些“灵魂拷问”:为什么我的应用在这颗CPU上跑得不如预期快?瓶颈究竟是在指令执行、内存访问,还是缓存效率上&#xff…

2026/7/19 20:30:24阅读更多 →
Windows 11优化终极指南:用Win11Debloat让你的系统重获新生

Windows 11优化终极指南:用Win11Debloat让你的系统重获新生

Windows 11优化终极指南:用Win11Debloat让你的系统重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter a…

2026/7/19 20:30:24阅读更多 →
SonarQube 7代码扫描数据获取与API集成指南

SonarQube 7代码扫描数据获取与API集成指南

1. SonarQube 7版本代码扫描数据获取概述 在当今快速迭代的软件开发环境中,代码质量与安全性的持续监控已成为DevOps流程中不可或缺的环节。SonarQube作为业界领先的静态代码分析平台,其7.x版本在传统代码质量门禁基础上,强化了对安全漏洞的检…

2026/7/19 20:28:23阅读更多 →
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/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/19 18:50:36阅读更多 →