HarmonyOS ArkTS 实战:校园就业信息与校招完整实现
摘要
项目难度:⭐⭐⭐ 中级实战
适用人群:有 ArkTS 基础、希望学习求职类应用开发的 HarmonyOS 开发者
开发环境:DevEco Studio Next / API 24+
代码规模:单页面约 700 行,可直接运行
通过本项目,你将掌握:
- 招聘信息的筛选搜索与列表展示
- 求职投递流程的完整状态管理
- 校招日历与宣讲会预约功能
- 面试与Offer的系统化管理
- 求职数据的多维度统计分析
目录
- [一、项目概述与功能架构]
- [1.1 应用场景与项目价值]
- [1.2 完整功能清单]
- [1.3 技术选型说明]
- [二、数据结构设计]
- [2.1 职位模型 Job]
- [2.2 投递记录模型 Application]
- [2.3 宣讲会模型 CareerTalk]
- [2.4 设计思路说明]
- [三、核心功能实现详解]
- [3.1 职位搜索与筛选]
- [3.2 简历投递功能]
- [3.3 面试状态管理]
- [3.4 宣讲会预约]
- [四、UI 设计与交互体验]
- [4.1 整体布局结构]
- [4.2 主题色与视觉规范]
- [4.3 状态视觉区分表]
- [五、关键技术点解析]
- [5.1 求职状态机的完整设计]
- [5.2 校招日历的时间维度设计]
- [六、常见问题与优化建议]
- [七、项目总结与扩展方向]
- [附录:运行方式]
一、项目概述与功能架构
1.1 应用场景与项目价值
秋招春招是大学生涯的关键节点,海量招聘信息、密集的宣讲会、复杂的面试流程常常让应届生手忙脚乱。信息分散在各个平台,投递进度难以追踪,面试时间容易冲突,这些都是校招季学生的普遍痛点。
本项目基于 HarmonyOS ArkTS 实现了一个校园就业信息与校招应用,整合了招聘信息浏览、校招日历、简历投递、面试管理、Offer管理、宣讲会预约等功能,帮助学生系统化管理求职进程,提升求职效率。
项目核心价值:
- 信息聚合价值:集中展示各类校招信息,避免信息遗漏
- 流程管理价值:系统化追踪投递进度,不错过每一个面试机会
- 时间管理价值:校招日历统一管理宣讲会和面试,避免时间冲突
1.2 完整功能清单
| 功能模块 | 具体功能 | 实现难度⭐ |
|---|---|---|
| 职位招聘 | 职位浏览、关键词搜索、行业筛选、薪资展示 | ⭐⭐ |
| 投递管理 | 一键投递、投递记录、进度追踪、状态更新 | ⭐⭐⭐ |
| 面试管理 | 面试邀请、时间提醒、面试记录、复盘笔记 | ⭐⭐⭐ |
| Offer管理 | Offer对比、薪资分析、接受/拒绝、入职准备 | ⭐⭐ |
| 宣讲会 | 宣讲会日历、在线预约、到场签到、资料下载 | ⭐⭐⭐ |
| 求职辅助 | 简历管理、职位收藏、薪资查询、就业统计 | ⭐⭐ |
1.3 技术选型说明
| 技术维度 | 选型方案 | 选型理由 |
|---|---|---|
| 开发语言 | ArkTS | 强类型支持,适合复杂状态流转的业务场景 |
| 状态管理 | @State 装饰器 | 轻量响应式,满足投递状态和列表更新 |
| 搜索筛选 | 本地过滤算法 | 演示项目简化,生产环境接入后端搜索 |
| 数据存储 | 内存状态 | 演示简化,生产环境需对接就业服务平台 |
| 最低版本 | API 24 | 兼容主流 HarmonyOS 设备 |
⚠️ 注意:本项目为前端演示版本,职位信息、投递功能均为本地模拟。真实就业平台需要对接学校就业指导中心和企业招聘系统,确保信息权威可靠。
二、数据结构设计
2.1 职位模型 Job
职位是招聘信息的核心实体,包含企业、岗位、薪资等完整信息。
/** * 招聘职位数据模型 */interfaceJob{id:number;// 职位IDcompany:string;// 公司名称position:string;// 职位名称salary:string;// 薪资范围location:string;// 工作地点industry:string;// 所属行业deadline:string;// 投递截止日期requirement:string;// 任职要求isCollected:boolean;// 是否已收藏status:string;// 职位状态:招聘中/已截止/已结束}2.2 投递记录模型 Application
投递记录追踪用户每一次简历投递的完整生命周期。
/** * 简历投递记录数据模型 * 追踪单次投递的完整状态流转 */interfaceApplication{id:number;// 投递记录IDjobId:number;// 关联职位IDcompany:string;// 公司名称position:string;// 职位名称applyTime:string;// 投递时间status:string;// 投递状态:已投递/面试中/已Offer/已拒绝/无回应interviewTime:string;// 面试时间offer:string;// Offer信息}2.3 宣讲会模型 CareerTalk
宣讲会是校招的重要线下活动,包含时间地点和预约状态。
/** * 校园宣讲会数据模型 */interfaceCareerTalk{id:number;// 宣讲会IDcompany:string;// 企业名称time:string;// 宣讲时间location:string;// 宣讲地点isRegistered:boolean;// 是否已预约}2.4 设计思路说明
为什么投递状态设计为5种?
求职是一个多阶段的过程,清晰的状态划分有助于用户掌握进度:
- 已投递:简历刚投出,等待企业筛选
- 面试中:通过简历筛选,进入面试环节(可能有多轮)
- 已Offer:面试通过,收到录用通知
- 已拒绝:面试未通过或主动拒绝Offer
- 无回应:投递后石沉大海,默认超时状态
这种划分覆盖了求职的主要节点,既不过于繁琐也不会太粗。
关于职位收藏与投递的分离设计
收藏和投递是两个独立行为:
- 收藏:感兴趣但还没投,相当于"待投递清单"
- 投递:正式提交简历,进入求职流程
分离设计符合用户真实使用习惯:先收藏一批意向职位,再逐个精修简历投递。
三、核心功能实现详解
3.1 页面状态初始化
/** * 页面状态变量定义 */@StateprivatesearchText:string='';// 搜索关键词@StateprivateselectedIndustry:string='全部';// 行业筛选@StateprivatenextApplyId:number=10;// 下一个投递记录ID@Stateprivatejobs:Job[]=[];// 职位列表@Stateprivateapplications:Application[]=[];// 投递记录@StateprivatecareerTalks:CareerTalk[]=[];// 宣讲会列表3.2 职位搜索与筛选
支持关键词搜索和行业筛选,帮助用户快速找到目标职位。
/** * 获取筛选后的职位列表 * 支持关键词搜索 + 行业筛选 */privategetFilteredJobs():Job[]{letresult=this.jobs;// 1. 关键词搜索:匹配公司名、职位名constkeyword=this.searchText.trim().toLowerCase();if(keyword.length>0){result=result.filter(j=>j.company.toLowerCase().includes(keyword)||j.position.toLowerCase().includes(keyword));}// 2. 行业筛选if(this.selectedIndustry!=='全部'){result=result.filter(j=>j.industry===this.selectedIndustry);}// 3. 按截止时间排序,即将截止的排前面returnresult.sort((a,b)=>{returnnewDate(a.deadline).getTime()-newDate(b.deadline).getTime();});}/** * 切换职位收藏状态 */privatetoggleCollectJob(jobId:number):void{this.jobs=this.jobs.map(j=>j.id===jobId?{...j,isCollected:!j.isCollected}:j);}3.3 简历投递功能
用户对感兴趣的职位投递简历,创建投递记录并进入追踪流程。
/** * 投递简历 * @param jobId 职位ID * @param company 公司名称 * @param position 职位名称 */privateapplyJob(jobId:number,company:string,position:string):void{// 检查是否已投递过constalreadyApplied=this.applications.some(a=>a.jobId===jobId);if(alreadyApplied){// 生产环境提示"已投递过该职位"return;}constapplication:Application={id:this.nextApplyId,jobId:jobId,company:company,position:position,applyTime:newDate().toISOString().split('T')[0],status:'已投递',interviewTime:'',offer:''};this.applications=[application,...this.applications];this.nextApplyId++;}3.4 面试状态管理
更新投递状态,追踪从简历筛选到面试再到Offer的完整流程。
/** * 更新投递状态 * @param appId 投递记录ID * @param status 新状态 */privateupdateInterviewStatus(appId:number,status:string):void{this.applications=this.applications.map(a=>a.id===appId?{...a,status}:a);}/** * 设置面试时间 */privatesetInterviewTime(appId:number,time:string):void{this.applications=this.applications.map(a=>{if(a.id===appId){return{...a,interviewTime:time,status:'面试中'};}returna;});}/** * 记录Offer信息 */privaterecordOffer(appId:number,offerInfo:string):void{this.applications=this.applications.map(a=>{if(a.id===appId){return{...a,offer:offerInfo,status:'已Offer'};}returna;});}3.5 宣讲会预约
/** * 预约/取消宣讲会 */privatetoggleRegisterTalk(talkId:number):void{this.careerTalks=this.careerTalks.map(t=>t.id===talkId?{...t,isRegistered:!t.isRegistered}:t);}/** * 获取即将开始的宣讲会 */privategetUpcomingTalks():CareerTalk[]{returnthis.careerTalks.sort((a,b)=>newDate(a.time).getTime()-newDate(b.time).getTime()).slice(0,5);}四、UI 设计与交互体验
4.1 整体布局结构
┌─────────────────────────┐ │ 求职数据统计栏 │ ← 已投递/面试/Offer/收藏 ├─────────────────────────┤ │ 搜索栏 + 筛选标签 │ ← 关键词搜索 + 行业分类 ├─────────────────────────┤ │ Tab 切换栏 │ ← 职位 / 我的投递 / 宣讲会 ├─────────────────────────┤ │ │ │ 列表内容区 │ ← 职位卡片 / 投递记录 / 宣讲会 │ │ └─────────────────────────┘4.2 主题色与视觉规范
主色调:藏蓝色 #1E3A8A
选择藏蓝色作为主题色的设计考量:
- 职场专业感:藏蓝色是商务、正式、专业的代表色,与求职招聘的职场属性高度契合,传递可靠、稳重的视觉感受
- 企业级调性:深蓝色常用于企业级产品和B端应用,符合招聘场景的严肃感,避免过于活泼的颜色显得不够专业
- 信息密度适配:求职页面信息量大,深色主色配合浅色背景能够形成清晰的视觉层级,帮助用户快速定位关键信息
- 状态色兼容性:藏蓝色与绿色(通过)、红色(拒绝)、琥珀色(进行中)等状态色都能形成良好对比
辅助色规范:
- 主色调:#1E3A8A(藏蓝色)
- 薪资高亮:#F59E0B(琥珀金)
- 已投递状态:#3B82F6(亮蓝色)
- 面试中状态:#F59E0B(琥珀色)
- 已Offer状态:#10B981(成功绿)
- 已拒绝状态:#EF4444(拒绝红)
4.3 状态视觉区分表
| 投递状态 | 标签颜色 | 状态图标 | 心理暗示 |
|---|---|---|---|
| 已投递 | 蓝色实心 | 时钟图标 | 等待中,保持耐心 |
| 面试中 | 琥珀色实心 | 日历图标 | 积极准备,机会在手 |
| 已Offer | 绿色实心 + 徽章 | 奖杯图标 | 成功收获,值得庆祝 |
| 已拒绝 | 红色空心 | 叉号图标 | 继续努力,下一个更好 |
| 无回应 | 灰色空心 | 问号图标 | 不要等待,主动出击 |
| 职位优先级 | 视觉表现 | 判断依据 | 行动建议 |
|---|---|---|---|
| 紧急 | 红色截止日期标签 | 3天内截止 | 尽快投递 |
| 重点 | 收藏星标高亮 | 用户主动收藏 | 精修简历投递 |
| 普通 | 标准卡片样式 | - | 常规投递 |
| 已截止 | 灰色蒙版 + 已截止标签 | 过了截止日期 | 等待补招或明年 |
五、关键技术点解析
5.1 求职状态机的完整设计
求职过程是一个典型的多状态流转系统,设计好状态机是整个应用的核心。
完整状态流转图:
已投递 → 面试中 → 已Offer(成功路径) ↘ 无回应(超时路径) ↘ 已拒绝(失败路径)状态流转规则:
- 已投递 → 面试中:收到面试邀请时触发
- 面试中 → 已Offer:面试通过,收到录用通知
- 面试中 → 已拒绝:面试未通过
- 已投递 → 已拒绝:简历筛选未通过
- 已投递 → 无回应:超过一定时间无消息自动标记
⚠️ 注意:真实场景中状态流转应该由后端系统驱动,前端只负责展示和用户手动标记。自动状态流转容易出错,比如企业可能很久之后才发面试邀请。
5.2 校招日历的时间维度设计
校招是时间驱动的场景,日历视图比列表视图更直观。
日历设计的三个时间维度:
- 投递截止时间:职位维度,提醒用户不要错过投递
- 宣讲会时间:线下活动维度,安排时间参加宣讲
- 面试时间:个人维度,管理自己的面试安排
三个维度在日历上叠加展示,用不同颜色区分,形成完整的校招时间线。
校园场景的特殊性:
- 秋招9-11月是高峰期,宣讲会非常密集
- 春招3-4月是补招期,机会相对较少
- 不同行业的招聘时间不同,互联网最早,国企较晚
六、常见问题与优化建议
踩坑点 1:职位信息过期不更新
问题表现:已经截止的职位还在展示,用户投递了才发现无效
解决方案:每日自动检查截止日期,过期职位自动归档,展示"已截止"标签
踩坑点 2:重复投递同一职位
问题表现:用户忘记已经投过,重复投递同一家公司同一岗位
解决方案:投递前检查是否已有投递记录,提示"已投递过该职位"
踩坑点 3:面试时间冲突
问题表现:两个面试安排在同一时间,用户没注意到
解决方案:添加面试时检查时间冲突,给出冲突提醒,帮助用户协调时间
踩坑点 4:薪资信息不规范
问题表现:薪资写法五花八门(15k-25k、15-25K、年薪20万),难以比较
解决方案:统一薪资字段格式,标准化为月薪范围,支持按薪资排序筛选
优化方向
- 增加AI简历优化功能,智能分析和改进简历内容
- 接入内推信息渠道,获取更多内部推荐机会
- 增加笔试真题库,提供刷题和模拟面试功能
- 实现薪资对比工具,横向对比不同公司的Offer
七、项目总结与扩展方向
核心收获
通过完成就业信息与校招项目,你将掌握:
- 求职类应用的完整状态机设计
- 搜索筛选与多维度排序的实现
- 日历时间线的产品设计思路
- 招聘类产品的专业感视觉调性
后续扩展功能
- 📝AI简历优化:智能分析简历,给出优化建议和改写
- 👥内推信息:学长学姐内推渠道,直达HR
- 📚笔试真题:各大厂笔试真题库,在线刷题练习
- 💰薪资对比:多维度对比不同Offer的薪资福利
- 🧪职业测评:性格和能力测评,推荐适合的岗位
- 📅校招日历:完整的秋招春招时间线,重要节点提醒