跳转到内容
Go back

校园打卡(教师端)——完整方案与实施指南

Edit page

校园打卡(教师端)——完整方案与实施指南

目标:为教师提供基于安卓端的到课打卡与人脸识别核验应用,支持 WebDAV 云端同步、离线可用、班级/学生管理、调试评估、可视化动画展示与项目级工程化实践。


1. 需求分析(SRS 摘要)

1.1 用户角色

1.2 功能需求

  1. 账户体系
    • 本地 SQLite 保存教师账户资料(加密后的凭据),并使用 WebDAV 作为远端存储:上传/下载 users.sqlite 与头像/学生照片等静态资源。
    • 支持:注册、登录、注销、修改密码、找回密码(通过教师的 WebDAV 账号/邮箱验证或管理员复核)。
    • 登录流程:本地输入 → 与云端(WebDAV 上的 users.sqlite)比对 → 返回验证结构(通过/失败/需重置)。
  2. 班级/学生管理
    • 教师登录后按 teacherId 读取其班级;增删改查班级与学生。
    • 对应学生的人脸底库(人脸特征/头像)同步至本地;支持相册/拍照导入、批量导入(ZIP)与质量检测(清晰度、人脸可见度)。
  3. 打卡与识别
    • 模式 A:合照打卡(教师一次拍整班合照/短视频帧 → 人数检测 → 人脸分割/对齐 → 人脸特征提取 → 与底库比对 → 出席名单/缺席名单/未识别名单)。
    • 模式 B:学生自助(学生端或教师端“学生模式”拍照 → 提交识别结果 → 教师审阅后计入)。
    • 打卡会话持久化:包含时间、地点(可选 GPS)、照片、识别日志、人工修正记录。
  4. 调试与评估(演示必备)
    • Debug 面板:人脸检测框/分割遮罩、对齐关键点、匹配相似度、阈值滑杆、耗时分布。
    • 评价指标:准确率、召回率、F1、人数误差;支持验证集/交叉验证与小型可复现实验。
  5. 同步与离线
    • 双向同步(WebDAV):班级/学生信息 SQLite、底库存储(头像、特征)、打卡记录、日志。
    • 冲突解决策略(见 5.4)。
  6. UI/UE
    • 高科技、简洁风:Jetpack Compose + Material 3,深浅色、霓虹描边/玻璃拟态(适度)。
    • 拍照页提供分割/识别过程动画:人脸热区涌动、分割轮廓描绘、识别成功的粒子高亮。
    • 多状态可视化:出席/缺席/未识别使用统一色谱与动态图标。

1.3 非功能需求


2. 总体架构

2.1 技术栈

2.2 模块划分

2.3 架构风格


3. 关键流程(顺序图/状态机)

注:以下使用 Mermaid 语法示例,便于导出文档后渲染。

3.1 登录与云端校验(WebDAV + SQLite 比对)

sequenceDiagram
  participant U as 教师
  participant V as ViewModel
  participant R as AuthRepository
  participant WD as WebDAV
  participant DB as Local Room
  U->>V: 输入账号/密码
  V->>R: login()
  R->>WD: 下载 users.sqlite(If-None-Match)
  R->>DB: 读取/更新本地用户表
  R->>R: 本地哈希(盐)+云端哈希比对
  R-->>V: 结果(成功/失败/需重置)
  V-->>U: 导航到首页/错误提示

3.2 合照打卡识别

sequenceDiagram
  participant T as 教师
  participant C as CameraX
  participant VZ as VisionEngine
  participant REP as AttendanceRepo
  participant DB as Room
  T->>C: 拍摄合照
  C->>VZ: 图像帧
  VZ->>VZ: 人脸检测/分割/对齐/特征
  VZ->>DB: 读取底库特征
  VZ-->>REP: 匹配结果(名单+相似度)
  REP->>DB: 保存会话与结果
  REP->>WD: 异步上传(照片+日志)

3.3 学生自助/复核流程

stateDiagram-v2
  [*] --> 待提交
  待提交 --> 已识别: 阈值通过
  待提交 --> 人工复核: 阈值低/冲突
  人工复核 --> 通过
  人工复核 --> 驳回
  通过 --> [*]
  驳回 --> [*]

4. 数据设计

4.1 ER 图(概念)

erDiagram
  TEACHER ||--o{ CLASS : manages
  CLASS ||--o{ STUDENT : has
  STUDENT ||--o{ FACE_EMBEDDING : owns
  CLASS ||--o{ ATTENDANCE_SESSION : holds
  ATTENDANCE_SESSION ||--o{ ATTENDANCE_RESULT : contains
  ATTENDANCE_RESULT }o--|| STUDENT : for
  PHOTO_ASSET }o--|| ATTENDANCE_SESSION : captured
  SYNC_LOG }o--|| TEACHER : generatedBy

4.2 主要表结构(Room 实体示例)

4.3 索引与约束

4.4 持久化与加密


5. WebDAV 同步设计

5.1 目录结构(示例)

/dav-root/
  /teachers/{teacherId}/
    users.sqlite                # 账户库(管理员维护或公共)
    roster.sqlite               # 班级与学生、特征等(或拆分为多库)
    /classes/{classId}/
      /students/
        {studentId}/avatar.jpg
        {studentId}/embeddings/{modelVer}.bin
      /attendance/
        {sessionId}/photo.jpg
        {sessionId}/results.json
        {sessionId}/debug/

5.2 同步策略

5.3 安全

5.4 同步流程(伪代码)

for each pending SyncLog:
  if op == UPSERT:
    PUT file or PATCH sqlite page
  else if op == DELETE:
    DELETE path
  verify via PROPFIND (ETag)
  mark success or retry with backoff

6. 识别算法与调试

6.1 流程

  1. 预处理:人脸检测(边框/关键点)→ 分割(可选)→ 对齐(仿射到标准模板)。
  2. 特征:MobileFaceNet/ArcFace 轻量模型(FP16,Android NNAPI/GPU);
  3. 匹配:计算与底库向量的余弦相似度;Top-K + 阈值裁决;
  4. 多脸投票:同一学生若多帧命中,取最高分或时序稳定性投票;
  5. 去重:同一张合照中避免同一学生重复计入(IoU/轨迹约束)。

6.2 阈值与度量

6.3 验证集/交叉验证/训练

6.4 调试面板(演示项)


7. 界面与交互(UI/UE)

7.1 设计语言

7.2 关键页面

  1. 登录/注册:支持扫码填充 WebDAV 地址;密码强度提示;
  2. 首页:我的班级、最近打卡、同步状态、模型版本提醒;
  3. 班级管理:列表/搜索/导入导出;学生详情(头像、特征质量、样本数);
  4. 打卡取景:实时帧预览、识别播放条、人数计数;
  5. 结果复核:三列分栏(出席/缺席/未识别),拖拽修正;
  6. 自助通道:学生扫码进入临时页面拍照 → 待教师审批;
  7. 调试:指标面板、阈值滑杆、日志导出。

7.3 动效建议


8. 实现要点(代码层面建议)

8.1 Room(ORM)

8.2 CameraX 与图像管线

8.3 WebDAV 客户端

8.4 安全


9. 测试方案

9.1 等价类 & 边界值

9.2 自动化

9.3 评估报告


10. 项目管理与计划

10.1 规模与成本(粗估)

小组 3–5 人,历时约 8–12 周可交付演示级产品。

10.2 工作分解(WBS)

  1. 需求/原型(PRD/交互稿)
  2. 架构搭建(DI、Room、导航、主题)
  3. WebDAV 同步模块
  4. 班级/学生管理与底库
  5. 相机与视觉管线
  6. 打卡会话与结果页
  7. 自助通道与审批
  8. 调试/评估工具
  9. 安全加密与容错
  10. 测试与性能优化
  11. 文档与演示

10.3 甘特图(文字版示例,周为单位)

模块W1W2W3W4W5W6W7W8W9W10W11W12
需求/原型
架构/基础
WebDAV 同步
班级/学生
相机/视觉
打卡/结果
自助通道
调试/评估
安全/加密
测试优化
文档演示

10.4 计划跟踪与质量保证

10.5 风险管理

10.6 人员构成


11. 原型接口与伪代码(片段)

11.1 Room 实体(Kotlin 片段)

@Entity data class Student(
  @PrimaryKey val id: String,
  val classId: String,
  val name: String,
  val sid: String,
  val avatarUri: String?,
  val createdAt: Long
)

@Entity data class FaceEmbedding(
  @PrimaryKey val id: String,
  val studentId: String,
  val modelVer: String,
  val vector: ByteArray,
  val quality: Float,
  val createdAt: Long
)

11.2 同步仓库接口

interface DavSyncRepository {
  suspend fun pullRoster(teacherId: String): Result<Unit>
  suspend fun pushRoster(teacherId: String): Result<Unit>
  suspend fun uploadSession(sessionId: String): Result<Unit>
}

11.3 识别接口

interface VisionEngine {
  fun detectFaces(image: ImageProxy): List<FaceBox>
  fun extractEmbedding(bitmap: Bitmap): FloatArray
  fun match(embedding: FloatArray, gallery: List<Pair<String, FloatArray>>): MatchResult
}

12. 交付物清单


13. 实施建议与里程碑


14. 附:演示场景脚本(建议)

  1. 教师首次注册 → 与 WebDAV 成功同步 → 导入班级 CSV/ZIP → 生成底库
  2. 进班拍照合照 → 动画展示分割与识别 → 一键生成出勤名单
  3. 发现 2 人未识别 → 老师点名复核 → 学生到前台单独拍照确认
  4. 打卡结果与日志自动同步到 WebDAV → 导出评估报告

本方案面向演示级小规模实用落地,后续可扩展到校级 SSO、集中式对象存储、跨端(Web/桌面)与更高级的人像质量控制与防攻击(活体/防替换)。


Edit page
Share this post on:

Previous Post
GitHub Actions 自动合并更新脚本
Next Post
Live2D 桌面宠物 学习开发计划:从模型到Unity实现