PROJECT 04 / 11
原生鸿蒙人卫 · 医学考试
鸿蒙开发工程师2025.09 — 2025.12
开发学生答题、教师监考、日历备忘和应用内拍照,覆盖医学考试的主要业务流程。
核心技术栈
ArkTS + ArkUI、MVVM架构、状态管理V2,ScanKit,Navigation,emitter.on,阿里云实人认证SDK(ZIMFacade),onWindowFocusChanged,AES-GCM加密+url编码,bindSheet,RelationalStore数据库,轻量化富文本解析工具,CalendarTool日历工具类
具体项目经历
学生端
1. 扫码加入考试功能:通过集成 HarmonyOS ScanKit SDK,使用 scanBarcode.startScanForResult() 扫码,decodeURIComponent 解码并 JSON.parse 解析考试信息,实现扫码快速加入考试。
2. 考试答题页面实现:通过使用 @ComponentV2 和 @Local 状态管理,emitter 事件总线监听题目切换,NavDestination 实现全屏沉浸式,重写 onBackPressed() 防止误退出考试。
3. 人脸识别认证功能:通过集成阿里云 ZIMFacade SDK,调用 studentFaceVerify 获取 certifyId 启动活体检测,使用 AES-GCM 加密设备信息,实现三阶段人脸验证防替考。
4. 防切屏功能:通过重写 onWindowFocusChanged、onPause、onMultiWindowModeChanged 监听焦点变化,Handler.postDelayed 延迟检查避免误判,调用 saveCutScreenInfo 记录切屏行为。
5. 加密请求功能:通过在 HttpClient 实现 encryptHandler 和 decryptHandler 拦截器,使用 AES-GCM 算法和 CipherUtils 工具类加密请求参数和设备信息,防止抓包攻击。
6. 考试须知和身份确认页面:通过调用 getExamGuidelines 和 getIdentityConfirmation 接口获取考试规则和身份信息,使用 bindSheet 半模态弹窗选择班级,完成考前身份确认流程。
7. 考试答案提交和数据同步:通过使用 RelationalStore 本地数据库实时保存答题数据,调用 submitExamPaper 接口提交试卷,使用事务保证一致性,实现断点续答和断网重连。
8. 将后端的H5字段用自定义富文本工具轻量化解析,避免三方包的冗余,且能定义各个属性的样式,在展示的图片和视频点击后可以展示并改造一个第三方SDK使图片可以自由缩放。
教师端
1. 考试监考列表页面:通过继承 BaseViewModel 实现下拉刷新上拉加载,使用 @ObservedV2 和 @Trace 状态管理,调用 getExamInvigilationList 接口获取监考列表并支持分页。
2. 考试详情页面(学生状态监控):通过调用 getExamDetailStudentList 接口获取学生状态,Grid 布局展示学生卡片,bindSheet 实现筛选,实时显示答题进度、切屏、人脸验证统计信息。
3. 学生考试信息详情页面:通过调用 getExamInformation 接口获取学生详细信息,使用 Tabs 组件切换基本信息、切屏记录、人脸验证记录标签页,展示完整监考证据。
4. 上拉加载下拉刷新封装:通过实现 BaseViewModel 基类封装 isRefreshing、isLoadingMore 通用状态,定义 refreshLoadData 和 loadMoreData 抽象方法,配合 RefreshBuilder 实现代码复用。
日历备忘
1. 日历备忘功能:通过使用 @ComponentV2 和 @Local 状态管理,Swiper 组件实现月份滑动切换,CalendarTool 工具类生成日历矩阵,调用 memoList 接口获取备忘数据,实现日历视图展示和备忘管理。
2. 备忘数据存储:通过 CalendarVModel 调用后端API,使用 AES-GCM 加密请求参数,数据模型使用 MemoListEntity(包含date和plans数组)和 Plan 实体(包含id、content、isComplete、memoTime等字段),实现备忘的增删改查和标记完成功能。
3. 事件驱动刷新机制:通过 emitter 事件总线监听备忘变更事件(eventId: 31),实现新增、删除、标记完成后的实时刷新,复用 reload5 逻辑刷新所有已加载月份数据,保持当前显示位置不跳转。
4. 智能排序和状态管理:通过 Array.sort 实现多条件排序(未完成在前、已完成在后,相同状态按完成时间倒序),使用 planState 和 planSignal 双数组管理备忘状态,TextDecorationType.LineThrough 实现删除线效果,确保状态一致性。
5. 弹窗管理和交互优化:通过 bindSheet 半模态弹窗展示备忘列表,constraintSize 限制弹窗最大高度(70%)和列表最大高度(60%),支持滚动查看,删除后无备忘时自动关闭弹窗,有备忘时保持打开并刷新列表。
学生答题拍照功能
由于考试的防切屏限制不能拉起该应用以外的相机,故封装了应用内部的相机拉起避免防切屏
1. 拍照功能实现和预览机制
在富文本编辑器工具栏中添加拍照按钮,点击后跳转到自定义相机页面。拍照完成后,系统通过回调函数接收拍照结果,立即停止相机预览并保存图片对象。将拍照得到的图片对象转换为可显示的预览图,在页面上展示拍照结果,同时显示"确认"和"取消"按钮。用户可以查看预览图后选择确认使用或取消重拍,确保拍照质量符合要求后再进行后续处理,提升了用户体验和拍照成功率。
2. 自定义相机拍照功能
基于HarmonyOS自定义相机开发,实现完整的相机预览和拍照功能。支持屏幕旋转、折叠屏等不同设备适配,应用进入后台时自动释放相机资源节省电量,30秒无操作自动休眠避免资源浪费。拍照完成后返回图片对象,便于后续上传和处理。
3. 图片选择和数据转换功能
封装相机和相册选择功能,提供统一的图片选择接口。用户可以选择拍照或从相册选择图片,系统自动处理权限申请流程。将拍照得到的图片对象转换为可上传的数据格式,完成图片数据的格式转换,为后续上传做准备。
4. 图片上传服务功能
实现图片上传到服务器的功能,支持两种上传方式:直接上传文件路径或上传图片数据。上传过程中实时显示上传进度,让用户了解上传状态。上传成功后返回图片的网络地址,上传失败时提供友好的错误提示,确保用户能够正常使用。
5. 图片插入和富文本编辑功能
将上传成功的图片地址插入到富文本编辑器中,实现图文混排效果。通过WebView加载富文本编辑器,使用JavaScript桥接技术实现ArkTS和WebView之间的通信。插入图片后保持编辑器焦点,学生可以在答题过程中插入数学公式、图表、手写答案等图片内容,提升答题效率和体验。