毕设实战:基于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个加分技巧
-
演示要专业:
- 按“学生打卡→异常预警→管理员处理→健康跟踪”完整流程演示
- 准备真实场景:早高峰打卡、返校审核季、疫情突发处理
- 展示特色功能:地图轨迹、健康趋势图、智能预警
-
突出疫情防控专业性:
- “我解决了并发打卡问题,使用Redis消息队列削峰填谷”
- “实现了位置防伪校验,确保打卡数据真实性”
- “设计了智能预警机制,体温异常自动触发处理流程”
-
准备常见问题:
- Q:如何保证打卡数据真实?
- A:位置校验+时间校验+数据范围校验三重保障
- Q:系统如何应对突发疫情?
- A:预警机制+应急预案+快速响应流程
- Q:数据安全如何保障?
- A:数据加密+权限控制+操作日志
七、部署上线注意事项(疫情系统特别重要)
-
服务器配置要求高:
- 应用服务器:8核16G × 2台(集群部署)
- 数据库服务器:16核32G × 2台(主从+读写分离)
- Redis集群:4核8G × 3台(保证高可用)
- CDN加速:静态资源加速访问
-
监控告警完善:
- 业务监控:打卡成功率、预警处理率、系统活跃度
- 性能监控:响应时间、服务器资源、数据库性能
- 安全监控:异常访问、数据泄露风险、系统漏洞
-
应急预案必须全:
- 系统宕机:快速切换备用服务器
- 数据丢失:实时备份+快速恢复
- 网络故障:多线路备份,自动切换
- 疫情突发:应急预案启动流程
八、疫情系统开发特别提醒
1. 数据准确性是第一要务
- 体温数据范围校验(35.0-42.0)
- 位置信息真实性校验
- 时间戳防止篡改
- 数据完整性检查
2. 用户体验要考虑周全
- 打卡流程尽量简化
- 异常情况明确提示
- 操作反馈及时清晰
- 支持离线后补录
3. 系统可靠性要求高
- 关键服务冗余部署
- 数据多重备份
- 故障快速恢复
- 定期压力测试
最后:真心建议(疫情系统特别版)
- 代码质量要严格:关键功能必须单元测试,代码审查要严格
- 文档要齐全:除了技术文档,要有操作手册、应急预案、培训材料
- 测试要充分:功能测试、压力测试、安全测试都要做
- 备份要定期:疫情数据每天备份,备份保留90天以上
特别提醒:
- 健康数据必须准确,这是疫情防控的基础!
- 系统必须7×24小时可用,疫情不等人!
- 操作日志必须完整,便于问题追溯和审计!
需要疫情系统合规文档、部署checklist、应急预案模板的同学,可以在评论区留言。遇到具体问题(如位置校验、并发处理等)也可以问我。
祝大家疫情系统毕设顺利,答辩一次过!🏥
小贴士:答辩时准备一份《系统在真实场景中的应用数据》,展示系统在疫情防控中的实际效果,这是最好的证明!