毕设实战:基于Spring Boot的疫情健康打卡系统,从零到一高效通关!

44 阅读12分钟

毕设实战:基于Spring Boot的疫情健康打卡系统,从零到一高效通关!

家人们谁懂啊!做疫情健康打卡系统时,光并发打卡数据处理就让我卡了整整3天——一开始没做数据校验,几千学生同时打卡导致服务器崩溃,导师看了直接说“这系统关键时刻掉链子”😫。后来熬夜优化才总结出这套实战经验,今天把需求、技术、实现到测试的细节全公开,帮你轻松搞定毕设!

一、先搞懂“疫情打卡系统要啥”!需求分析别跑偏

刚开始我直接写代码,花了两周做了个“学生社交圈”功能,结果导师一句“核心是健康数据收集和疫情监控,不是社交”直接打回重做!后来才明白,疫情系统要先抓住“谁用系统、要干啥”,这步做对了,后面能少走90%弯路。

1. 核心用户&功能拆解(实战总结版)

疫情健康打卡系统主要有两类核心用户:管理员学生(别乱加“辅导员角色”!我当初加了后,数据统计逻辑全乱了):

  • 管理员端(核心管理):

    • 健康监控:查看学生健康打卡数据、异常体温预警(支持图表展示,我当初没加,手动筛查2000个学生数据到手酸)
    • 返校审核:审核学生返校申请(健康码/行程码/核酸报告三合一审核)
    • 疫情统计:生成疫情日报、风险地区统计、导出报表(用地图热力图展示,直观明了)
    • 通知管理:发布防疫通知、设置重要公告(紧急通知红标提醒)
  • 学生端(每日必用):

    • 每日打卡:体温上报、位置签到、健康状态(支持定位打卡,防止代打卡)
    • 返校申请:上传三码、填写行程信息、查看审核进度(状态流:提交→待审核→已通过/驳回)
    • 疫情自查:在线健康评测、查看风险等级(支持一键自查,三步完成)
    • 信息查看:防疫通知、疫情动态、个人健康档案(支持健康趋势图)

2. 需求分析避坑指南(疫情系统特别重要!)

  • 别空想需求!找几位同学模拟使用提意见:有同学说“想快速补打卡”,我才加了“补打卡申请”功能
  • 一定要画流程图!用DrawIO画出核心流程:“每日打卡→异常预警→管理员跟进→健康跟踪”
  • 写需求文档!疫情系统要特别注意: 1. 数据准确性(体温范围校验、位置真实性) 2. 时效性要求(每日必须打卡、逾期提醒) 3. 异常处理(体温异常自动预警) 4. 数据安全(个人健康隐私保护)

3. 可行性分析要实在!

  • 技术可行性:Spring Boot + MySQL + Redis,技术成熟,并发处理方案明确
  • 社会可行性:解决学校疫情防控实际问题,符合政策要求
  • 操作可行性:界面简洁,操作简单,适合大规模使用

二、技术选型要靠谱!疫情系统更严谨

技术工具选择理由疫情系统特别注意事项
Spring Boot 2.7快速开发,配置简单必须做好数据验证,保证健康数据准确
MySQL 8.0事务支持,数据可靠定时备份,疫情数据不能丢失
Redis 6.x缓存打卡数据,提高并发防止高峰期系统崩溃
百度地图API位置校验,防伪打卡必须校验位置真实性
微信小程序移动端便捷访问支持小程序快捷打卡

系统架构设计思路

学生端(微信/Web) → 负载均衡 → 应用集群 → Redis缓存队列 → MySQL主从 → 预警服务

三、数据库设计:疫情数据要严谨

我当初没设计好“打卡-健康-位置”关联,统计学生轨迹要手动写SQL,调试到凌晨😫。

1. 核心表结构设计(精简版)

-- 学生表(核心)
CREATE TABLE `student` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `student_id` VARCHAR(20) UNIQUE COMMENT '学号',
  `student_name` VARCHAR(50) NOT NULL COMMENT '姓名',
  `phone` VARCHAR(20) COMMENT '手机号',
  `class_id` INT COMMENT '班级ID',
  `is_active` TINYINT DEFAULT 1 COMMENT '是否在校:1是/0否'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 每日打卡表(关键业务表)
CREATE TABLE `daily_check` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `student_id` INT NOT NULL COMMENT '学生ID',
  `check_date` DATE COMMENT '打卡日期',
  `temperature` DECIMAL(3,1) COMMENT '体温',
  `health_status` TINYINT COMMENT '健康状态:1正常/2异常',
  `location` VARCHAR(200) COMMENT '打卡位置',
  `location_lng` DECIMAL(10,6) COMMENT '经度',
  `location_lat` DECIMAL(10,6) COMMENT '纬度',
  `symptoms` VARCHAR(500) COMMENT '症状描述',
  `check_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_student_date` (`student_id`, `check_date`) -- 防止重复打卡
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 返校申请表(重要审核)
CREATE TABLE `return_apply` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `student_id` INT NOT NULL COMMENT '学生ID',
  `apply_date` DATE COMMENT '申请返校日期',
  `health_code_img` VARCHAR(500) COMMENT '健康码图片',
  `travel_code_img` VARCHAR(500) COMMENT '行程码图片',
  `nucleic_img` VARCHAR(500) COMMENT '核酸报告图片',
  `travel_info` TEXT COMMENT '行程信息',
  `apply_status` TINYINT DEFAULT 0 COMMENT '状态:0待审核/1通过/2拒绝',
  `review_comment` TEXT COMMENT '审核意见',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 健康评测表
CREATE TABLE `health_exam` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `student_id` INT NOT NULL COMMENT '学生ID',
  `exam_date` DATE COMMENT '评测日期',
  `q1_fever` TINYINT COMMENT '是否发热',
  `q2_cough` TINYINT COMMENT '是否咳嗽',
  `q3_contact` TINYINT COMMENT '是否接触风险',
  `total_score` INT COMMENT '评测分数',
  `risk_level` TINYINT COMMENT '风险等级:1低/2中/3高',
  `suggestions` TEXT COMMENT '健康建议'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 预警记录表
CREATE TABLE `alert_record` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `student_id` INT NOT NULL COMMENT '学生ID',
  `alert_type` TINYINT COMMENT '预警类型:1体温异常/2未打卡/3风险接触',
  `alert_level` TINYINT COMMENT '预警等级:1低/2中/3高',
  `alert_content` TEXT COMMENT '预警内容',
  `handle_status` TINYINT DEFAULT 0 COMMENT '处理状态:0未处理/1已处理',
  `handler_id` INT COMMENT '处理人',
  `handle_comment` TEXT COMMENT '处理意见',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. Redis数据结构设计(提高并发)

今日打卡状态:check:today:{studentId} -> 1
异常体温预警:alert:temperature:{date} -> [studentId1, studentId2]
未打卡名单:check:missing:{date} -> [studentId1, studentId2]
热门通知:notice:hot -> [noticeId1, noticeId2]

四、核心功能实现思路(疫情系统精华版)

1. 打卡核心逻辑

Spring Boot打卡Service关键点

@Service
@Transactional
public class CheckInService {
    
    // 学生打卡:必须数据校验
    public Result dailyCheck(CheckInDTO dto) {
        // 1. 校验体温范围(35.0-42.0)
        if (dto.getTemperature() < 35.0 || dto.getTemperature() > 42.0) {
            return Result.error("体温数据异常,请重新测量");
        }
        
        // 2. 校验是否已打卡(防重复)
        if (isCheckedToday(dto.getStudentId())) {
            return Result.error("今日已打卡,无需重复提交");
        }
        
        // 3. 位置校验(防伪打卡)
        if (!validateLocation(dto.getLocationLng(), dto.getLocationLat())) {
            return Result.error("位置信息异常,请开启定位");
        }
        
        // 4. 保存打卡记录
        DailyCheck record = saveCheckRecord(dto);
        
        // 5. 体温异常预警
        if (dto.getTemperature() > 37.3) {
            alertService.sendTemperatureAlert(record);
        }
        
        return Result.success("打卡成功");
    }
    
    // 批量处理补打卡
    public Result batchSupplement(List<Integer> studentIds) {
        // 处理批量补打卡申请
        // 记录补打卡日志
        // 更新统计报表
    }
}

2. 前端打卡页面

Vue.js学生打卡组件关键点

<template>
  <div class="checkin-page">
    <!-- 打卡状态提示 -->
    <div class="status-card" :class="getStatusClass(todayStatus)">
      <div class="status-icon">
        <i :class="getStatusIcon(todayStatus)"></i>
      </div>
      <div class="status-info">
        <h3>{{ getStatusText(todayStatus) }}</h3>
        <p>今日打卡时间:{{ todayCheckTime || '尚未打卡' }}</p>
      </div>
    </div>
    
    <!-- 打卡表单 -->
    <div class="checkin-form">
      <el-form ref="form" :model="formData" :rules="rules">
        <!-- 体温输入 -->
        <el-form-item label="当前体温" prop="temperature">
          <el-input-number
            v-model="formData.temperature"
            :min="35.0"
            :max="42.0"
            :step="0.1"
            :precision="1"
            placeholder="请输入体温">
          </el-input-number>
          <span class="unit">°C</span>
          
          <!-- 体温提示 -->
          <div class="temperature-tips">
            <span v-if="formData.temperature < 36.0" class="low">体温偏低</span>
            <span v-else-if="formData.temperature <= 37.2" class="normal">体温正常</span>
            <span v-else-if="formData.temperature <= 38.0" class="warning">低热</span>
            <span v-else class="danger">发热</span>
          </div>
        </el-form-item>
        
        <!-- 健康状态 -->
        <el-form-item label="健康状态" prop="healthStatus">
          <el-radio-group v-model="formData.healthStatus">
            <el-radio :label="1">
              <span class="status-option healthy">
                <i class="el-icon-success"></i> 健康
              </span>
            </el-radio>
            <el-radio :label="2">
              <span class="status-option unwell">
                <i class="el-icon-warning"></i> 不适
              </span>
            </el-radio>
          </el-radio-group>
        </el-form-item>
        
        <!-- 症状选择 -->
        <el-form-item label="症状选择" v-if="formData.healthStatus === 2">
          <el-checkbox-group v-model="formData.symptoms">
            <el-checkbox label="发热">发热</el-checkbox>
            <el-checkbox label="咳嗽">咳嗽</el-checkbox>
            <el-checkbox label="乏力">乏力</el-checkbox>
            <el-checkbox label="其他">其他</el-checkbox>
          </el-checkbox-group>
        </el-form-item>
        
        <!-- 位置信息 -->
        <el-form-item label="当前位置" prop="location">
          <el-input
            v-model="formData.location"
            placeholder="自动获取位置信息"
            readonly>
            <template slot="append">
              <el-button @click="getLocation" :loading="locating">
                <i class="el-icon-location"></i> 获取位置
              </el-button>
            </template>
          </el-input>
          
          <!-- 地图显示 -->
          <div v-if="showMap" class="location-map">
            <div id="map-container"></div>
            <p class="map-tip">定位精度:{{ locationAccuracy }}米</p>
          </div>
        </el-form-item>
        
        <!-- 提交按钮 -->
        <el-form-item>
          <el-button
            type="primary"
            :loading="submitting"
            @click="submitCheckIn"
            :disabled="!canSubmit">
            {{ todayStatus === 1 ? '更新打卡' : '提交打卡' }}
          </el-button>
          
          <!-- 异常上报 -->
          <el-button
            type="danger"
            v-if="formData.temperature > 37.3"
            @click="reportEmergency">
            <i class="el-icon-bell"></i> 体温异常上报
          </el-button>
        </el-form-item>
      </el-form>
    </div>
    
    <!-- 打卡日历 -->
    <div class="checkin-calendar">
      <h3>本月打卡记录</h3>
      <el-calendar v-model="currentDate">
        <template #dateCell="{data}">
          <div class="calendar-day" :class="getDayStatus(data.day)">
            {{ data.day.split('-').slice(2).join('-') }}
            <div class="day-status">
              <i v-if="getDayStatus(data.day) === 'checked'" 
                 class="el-icon-success success-icon"></i>
              <i v-else-if="getDayStatus(data.day) === 'missed'" 
                 class="el-icon-error error-icon"></i>
            </div>
          </div>
        </template>
      </el-calendar>
    </div>
  </div>
</template>

3. 健康评测功能

在线评测Service设计

@Service
public class HealthExamService {
    
    // 自动评测健康风险
    public ExamResult autoEvaluate(ExamAnswer answer) {
        int score = 0;
        StringBuilder suggestions = new StringBuilder();
        
        // 评测逻辑
        if (answer.isFever()) {
            score += 30;
            suggestions.append("检测到发热症状,建议立即就医。");
        }
        
        if (answer.isCough()) {
            score += 20;
            suggestions.append("有咳嗽症状,请做好防护。");
        }
        
        if (answer.hasRiskContact()) {
            score += 50;
            suggestions.append("有风险接触史,建议居家观察。");
        }
        
        // 确定风险等级
        String riskLevel = determineRiskLevel(score);
        
        return new ExamResult(score, riskLevel, suggestions.toString());
    }
    
    // 生成健康建议
    private String generateSuggestions(int score) {
        if (score >= 70) return "高风险,立即上报并就医";
        if (score >= 40) return "中风险,建议居家观察";
        return "低风险,保持良好卫生习惯";
    }
}

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、系统测试要全面!疫情系统更严格

1. 功能测试用例(疫情重点)

表1:打卡流程测试
测试场景操作步骤预期结果特别关注
正常打卡学生正常体温→提交打卡成功,记录保存数据准确性
异常体温体温38.5℃提交打卡成功,触发预警预警及时性
重复打卡同一天第二次打卡提示“今日已打卡”防止数据重复
位置异常位置获取失败提示“请开启定位”位置真实性
表2:返校审核测试
测试场景测试内容预期结果
材料齐全三码齐全申请审核通过
材料缺失缺少核酸报告审核驳回
风险地区来自风险地区特殊审核
紧急返校特殊情况申请加急处理
表3:并发测试
测试场景并发操作预期结果
打卡高峰8:00-9:00千名学生打卡系统稳定,响应及时
批量审核管理员批量审核返校数据处理正常
预警并发多个异常同时预警预警不遗漏

2. 性能测试指标

1. 响应时间:打卡操作 < 1秒
2. 并发支持:> 3000学生同时在线
3. 数据处理:每秒处理100+打卡数据
4. 系统可用:99.9%可用性(疫情系统不能宕机)

3. 测试报告模板

## 疫情健康打卡系统测试报告

### 一、测试概述
- 测试时间:2024年3月
- 测试环境:模拟真实使用场景
- 测试重点:打卡功能、数据统计、系统性能

### 二、测试结果
1. 功能测试:通过率99%
   - 打卡功能:通过(数据准确)
   - 返校审核:通过(流程完整)
   - 预警机制:通过(及时有效)
   
2. 性能测试:满足疫情管理需求
   - 3000并发打卡:响应时间0.8秒
   - 数据准确性:100%无误
   - 系统稳定性:7×24小时无故障

### 三、疫情特别测试
1. 异常数据处理:体温异常数据正确预警
2. 位置验证测试:防伪打卡机制有效
3. 紧急情况处理:应急预案执行正常

### 四、测试结论
系统功能完整,性能稳定,满足学校疫情防控需求,可正式上线使用。

六、答辩准备:3个加分技巧

  1. 演示要专业

    • 按“学生打卡→异常预警→管理员处理→健康跟踪”完整流程演示
    • 准备真实场景:早高峰打卡、返校审核季、疫情突发处理
    • 展示特色功能:地图轨迹、健康趋势图、智能预警
  2. 突出疫情防控专业性

    • “我解决了并发打卡问题,使用Redis消息队列削峰填谷”
    • “实现了位置防伪校验,确保打卡数据真实性”
    • “设计了智能预警机制,体温异常自动触发处理流程”
  3. 准备常见问题

    • Q:如何保证打卡数据真实?
    • A:位置校验+时间校验+数据范围校验三重保障
    • Q:系统如何应对突发疫情?
    • A:预警机制+应急预案+快速响应流程
    • Q:数据安全如何保障?
    • A:数据加密+权限控制+操作日志

七、部署上线注意事项(疫情系统特别重要)

  1. 服务器配置要求高

    • 应用服务器:8核16G × 2台(集群部署)
    • 数据库服务器:16核32G × 2台(主从+读写分离)
    • Redis集群:4核8G × 3台(保证高可用)
    • CDN加速:静态资源加速访问
  2. 监控告警完善

    • 业务监控:打卡成功率、预警处理率、系统活跃度
    • 性能监控:响应时间、服务器资源、数据库性能
    • 安全监控:异常访问、数据泄露风险、系统漏洞
  3. 应急预案必须全

    • 系统宕机:快速切换备用服务器
    • 数据丢失:实时备份+快速恢复
    • 网络故障:多线路备份,自动切换
    • 疫情突发:应急预案启动流程

八、疫情系统开发特别提醒

1. 数据准确性是第一要务

  • 体温数据范围校验(35.0-42.0)
  • 位置信息真实性校验
  • 时间戳防止篡改
  • 数据完整性检查

2. 用户体验要考虑周全

  • 打卡流程尽量简化
  • 异常情况明确提示
  • 操作反馈及时清晰
  • 支持离线后补录

3. 系统可靠性要求高

  • 关键服务冗余部署
  • 数据多重备份
  • 故障快速恢复
  • 定期压力测试

最后:真心建议(疫情系统特别版)

  1. 代码质量要严格:关键功能必须单元测试,代码审查要严格
  2. 文档要齐全:除了技术文档,要有操作手册、应急预案、培训材料
  3. 测试要充分:功能测试、压力测试、安全测试都要做
  4. 备份要定期:疫情数据每天备份,备份保留90天以上

特别提醒

  • 健康数据必须准确,这是疫情防控的基础!
  • 系统必须7×24小时可用,疫情不等人!
  • 操作日志必须完整,便于问题追溯和审计!

需要疫情系统合规文档部署checklist应急预案模板的同学,可以在评论区留言。遇到具体问题(如位置校验、并发处理等)也可以问我。

祝大家疫情系统毕设顺利,答辩一次过!🏥


小贴士:答辩时准备一份《系统在真实场景中的应用数据》,展示系统在疫情防控中的实际效果,这是最好的证明!