基于Spring Boot的疾病防控综合系统毕设稳过秘籍!从需求到测试全流程,新手也能抄作业✨
谁懂啊!去年做疾病防控综合系统毕设时,光用户表和核酸检测表的关联就卡了3天——一开始没设外键,查用户核酸记录时全是错乱数据,导师看了直接让我“重画E-R图”😫 后来踩遍坑才摸出一套能快速落地的流程,今天把需求分析、技术选型、功能实现到测试的全细节说透,宝子们再也不用熬夜改代码,轻松搞定毕设!
一、先搞懂“防控要啥”!需求分析别瞎蒙
刚开始我直接跳过需求分析就写代码,结果做了半个月的“疫情数据可视化”功能,导师一句“核心是记录管理与物资统筹,不是数据展示”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走80%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
疾病防控综合系统就两类核心用户:管理员和普通用户(别加“社区网格员”角色!我当初加了后,权限逻辑乱成一团,最后砍掉才轻松):
- 管理员端(必做功能):
- 核酸检测管理:新增/修改检测记录、筛选检测结果(阳性/阴性)、导出统计报表(别漏“检测时间筛选”!我当初没加,查某周数据时翻半天,全是投诉)
- 接种记录管理:维护接种信息、关联用户档案、生成接种编号(用下拉框选择接种类型,比如“第一针/加强针”,别让管理员手动输,效率更高)
- 物资管理:录入物资信息(口罩、消毒液)、更新库存数量、上传物资照片(支持“模糊查询”,搜“口罩”就能找到对应物资,我当初没加,查物资时翻页到手软)
- 物资申请审核:查看用户申请、审批申请状态(同意/驳回)、填写回复意见(要显示“申请理由”,方便管理员判断是否符合需求,我当初没加,审批时全靠猜)
- 出入记录管理:查看用户出入信息、核验健康码照片、添加备注(支持按“出入类型”筛选,比如“进入/离开”,快速定位重点记录)
- 用户端(核心功能):
- 日常打卡:上传打卡照片、填写健康状态、查看打卡历史(别让用户填太多!只留“照片+备注”,我当初加了“体温详情”,用户嫌麻烦根本不填)
- 接种记录查询:查看个人接种类型、接种时间、接种编号(支持按“年份”筛选,方便用户查“2023年加强针记录”)
- 物资申请:选择申请物资、填写申请数量、提交申请理由(要关联物资库存!比如库存10个只让申请≤10,避免超量申请)
- 社区疫情查看:浏览社区疫情公告、查看疫情防控通知(公告标题标红,重要信息别被忽略,我当初没标,用户漏看关键通知)
2. 需求分析避坑指南(血泪教训!)
- 别光靠“想”!找2个同学模拟管理员和用户提意见:比如有同学说“想快速找到自己的核酸记录”,我才加了“个人核酸记录专属列表”,比自己瞎加“疫情地图”实用多了
- 一定要画用例图!用DrawIO画简单版就行,标清“管理员-审核物资申请”“用户-日常打卡”,后期跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听了15分钟还没get到我的逻辑)
- 写“需求规格说明书”!不用太复杂,把“功能描述、约束条件”写清楚(比如“接种编号不能重复”“物资申请数量不能为0”),后期编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,要从3个角度写,显得专业:
- 技术可行性:Spring Boot、Java、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《MySQL数据库应用》,遇到问题能查资料(别选Vue3!我当初想试试,结果环境配置卡了一周,最后换回JSP才顺利)
- 经济可行性:所有工具都是免费的!Eclipse、MySQL、Tomcat全是官网下载,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你会控制成本
- 操作可行性:界面用Bootstrap做,按钮布局跟社区防控平台类似,我找系里老师测试,她4分钟就学会了审批物资申请,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用Spring Boot+Vue+Redis,结果“物资库存缓存”卡了5天——Redis的key-value存储逻辑不熟,库存更新后缓存不同步😫 后来换成Spring Boot+JSP+MySQL+Tomcat9,新手友好度直接拉满,调试效率翻了倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Spring Boot | 比SSM配置简单,自带依赖管理,不用手动整合 | 别用3.x版本!2.7.x就行,3.x和JSP兼容性差,会报“视图解析器错误” |
| MySQL 8.0 | 占内存小,存储用户、核酸记录足够用 | 安装时一定要设“utf8mb4”编码!我当初用默认编码,用户姓名含特殊符号时乱码,查了3小时才解决 |
| Tomcat 9.0 | 稳定!和Spring Boot、JSP适配性最好 | 别用Tomcat 10!会出现“Servlet API包名变更”问题,答辩时崩了就完了 |
| JSP+Bootstrap | 不用单独学前端框架,上手快 | Bootstrap用3.x版本!4.x版本按钮样式错乱,物资列表页会变成“竖排”,巨丑 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,其实跟着步骤来超简单,我当初就是这么搭的,一次成功:
- 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置环境变量时“JAVA_HOME”要填对,不然Eclipse认不到
- 装Eclipse:选“Enterprise Edition”版本,自带Web开发插件,不用再装Tomcat插件
- 装MySQL 8.0:用Navicat管理数据库(可视化工具超方便,新建表时直接选字段类型,比命令行快10倍)
- 配置Spring Boot项目:在Eclipse里选“Spring Starter Project”,勾选“Spring Web”“MySQL Driver”“MyBatis Framework”,启动时看到“Started Application in XXX seconds”就是成功
3. 架构图一定要画!答辩加分项
用DrawIO画三层架构图(就像论文里的“图2.1 系统架构图”),标清“表现层-业务层-数据访问层”的交互逻辑:比如用户在浏览器提交物资申请→Controller接收请求→Service校验库存→Mapper操作MySQL存储申请信息。去年答辩时,评委特意夸这个图“逻辑清晰”,比光说“我用了Spring Boot”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初把“物资申请表”和“物资表”没做关联,查“某物资的申请记录”时要写3层嵌套SQL,调试到凌晨2点😫 后来按“实体-属性-关系”来设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定系统里的“实体”(比如用户、核酸检测、物资),再想每个实体有啥“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、username(账号,唯一)、password(密码,MD5加密!不然存明文,导师会说“不安全”)、yonghu_name(姓名)、yonghu_phone(手机号)、yonghu_id_number(身份证号,唯一)、yonghu_photo(头像路径)
- 核酸检测表(hesuanjiance):id(主键)、yonghu_id(关联用户表)、jiance_time(检测时间)、jiance_types(检测结果:0阴性/1阳性)、hesuanjiance_content(备注)、create_time(创建时间)
- 接种记录表(jiezhongjilu):id(主键)、yonghu_id(用户)、jiezhongjilu_uuid_number(接种编号,唯一)、jiezhong_time(接种时间)、jiezhong_types(接种类型:1第一针/2第二针/3加强针)
- 物资表(wuzi):id(主键)、wuzi_name(物资名称)、wuzi_danwei(单位:个/瓶)、wuzi_photo(照片路径)、wuzi_kucun_number(库存数量)、wuzi_types(物资类型:1口罩/2消毒液)
- 物资申请表(wuzishenqing):id(主键)、wuzi_id(关联物资表)、yonghu_id(用户)、wuzishenqing_number(申请数量)、wuzishenqing_content(申请理由)、wuzishenqing_yesno_types(审核状态:0待审核/1同意/2驳回)
- 打卡表(daka):id(主键)、yonghu_id(用户)、daka_photo(打卡照片路径)、daka_content(备注)、insert_time(打卡日期)
- 出入记录表(churujilu):id(主键)、yonghu_id(用户)、churujilu_types(出入类型:1进入/2离开)、churujilu_photo(健康码路径)、churu_time(出入时间)
- 管理员表(admin):id(主键)、username(账号)、password(密码)、role(角色)、addtime(新增时间)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“物资”)
- 椭圆代表“属性”(比如用户的“姓名”“手机号”)
- 菱形代表“关系”(比如“用户-申请-物资”是多对一,一个用户能申请多种物资,一种物资能被多个用户申请) 避坑提醒:别把“健康码、打卡照片”存数据库!我当初直接存图片二进制,数据库炸了,后来改成存“文件路径”(比如/static/photos/healthcode1.jpg)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,要转成实际的数据库表,字段类型和约束别瞎设!比如“物资库存”要用INT,别用VARCHAR,不然没法做减法;“接种编号”要设UNIQUE约束,避免重复。
给宝子们贴一段“物资申请表”的建表SQL,直接复制到Navicat就能用:
CREATE TABLE `wuzishenqing` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '申请ID',
`wuzi_id` INT DEFAULT NULL COMMENT '关联物资ID',
`yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID',
`wuzishenqing_number` INT NOT NULL COMMENT '申请数量',
`wuzishenqing_content` TEXT DEFAULT NULL COMMENT '申请理由',
`wuzishenqing_paifa_types` INT DEFAULT NULL COMMENT '派发地点',
`insert_time` TIMESTAMP DEFAULT NULL COMMENT '申请时间',
`wuzishenqing_yesno_types` INT DEFAULT 0 COMMENT '审核状态:0待审核/1同意/2驳回',
`wuzishenqing_yesno_text` TEXT DEFAULT NULL COMMENT '回复意见',
`update_time` TIMESTAMP DEFAULT NULL COMMENT '审核时间',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_wuzi` (`wuzi_id`), -- 外键关联物资表
KEY `fk_yonghu_shenqing` (`yonghu_id`) -- 外键关联用户表
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物资申请表';
3. 表关联测试!别等编码才发现错
建完表一定要测试关联是否正常!比如在“物资申请表”插入一条数据(用户ID=1,物资ID=1),然后用JOIN查询:
SELECT y.yonghu_name, w.wuzi_name, s.wuzishenqing_number, s.wuzishenqing_yesno_types
FROM wuzishenqing s
JOIN yonghu y ON s.yonghu_id = y.id
JOIN wuzi w ON s.wuzi_id = w.id
WHERE y.id = 1;
如果能查出“用户名+物资名+申请数量+审核状态”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。
四、功能实现:核心模块代码+页面设计
不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,宝子们直接套就行。
1. 管理员端:物资申请审核模块(必做!)
这是管理员最常用的功能,主要实现“查看申请、审批状态、填写意见”,重点说“审批逻辑”——别漏了“库存校验”和“状态防重复修改”,我当初就是这里踩了大坑!
(1)核心代码片段(Spring Boot)
Service层(处理物资申请审批):
@Service
public class WuziShenqingServiceImpl implements WuziShenqingService {
@Autowired
private WuziShenqingMapper shenqingMapper;
@Autowired
private WuziMapper wuziMapper;
@Override
@Transactional // 事务管理,确保审批和库存更新一致
public void auditShenqing(Integer id, Integer status, String意见, Integer adminId) {
// 1. 查询申请记录
WuziShenqing shenqing = shenqingMapper.selectById(id);
if (shenqing == null) {
throw new RuntimeException("申请记录不存在!");
}
// 2. 防重复审批
if (shenqing.getWuzishenqingYesnoTypes() != 0) {
throw new RuntimeException("该申请已审批,无需重复操作!");
}
// 3. 若同意,校验库存是否充足
if (status == 1) { // 1表示同意
Wuzi wuzi = wuziMapper.selectById(shenqing.getWuziId());
if (wuzi.getWuziKucunNumber() < shenqing.getWuzishenqingNumber()) {
throw new RuntimeException("物资库存不足,当前库存:" + wuzi.getWuziKucunNumber());
}
// 4. 扣减库存
wuzi.setWuziKucunNumber(wuzi.getWuziKucunNumber() - shenqing.getWuzishenqingNumber());
wuziMapper.updateById(wuzi);
}
// 5. 更新审批状态和意见
shenqing.setWuzishenqingYesnoTypes(status);
shenqing.setWuzishenqingYesnoText(意见);
shenqing.setUpdateTime(new Date());
shenqingMapper.updateById(shenqing);
}
}
Controller层(接收前端请求):
@Controller
@RequestMapping("/admin/shenqing")
public class AdminShenqingController {
@Autowired
private WuziShenqingService shenqingService;
@PostMapping("/audit")
public String auditShenqing(Integer id, Integer status, String意见, HttpServletRequest request) {
try {
// 获取当前管理员(简化,实际从Session取)
Integer adminId = 1;
shenqingService.auditShenqing(id, status, 意见, adminId);
request.setAttribute("msg", "审批完成!");
} catch (Exception e) {
request.setAttribute("msg", e.getMessage());
}
return "redirect:/admin/shenqing/list";
}
}
(2)页面设计要点(Bootstrap)
页面标题:管理员-物资申请审核页面
(插入图片位置:此处放“物资申请审核页面截图”,需包含以下元素)
- 申请列表表格:
- 列名:用户名、物资名称、申请数量、申请理由、申请时间、审核状态、操作
- 状态显示:待审核(橙色)、同意(绿色)、驳回(红色)
- 审批弹窗:点击“审核”按钮弹出,包含:
- 审批状态(单选框:同意/驳回,必填)
- 回复意见(文本域,必填,比如“同意:库存充足”“驳回:申请理由不充分”)
- 按钮:“确认审批”(绿色btn-success)和“取消”(灰色btn-default)
- 提示信息:红色字体显示“审批失败”,绿色显示“审批成功”
(3)避坑提醒
- 审批时要记录管理员ID!方便后续追溯:
shenqing.setAdminId(adminId); // 需在物资申请表加admin_id字段 - 支持“批量审批”!减少管理员操作次数:
@PostMapping("/batchAudit") public String batchAudit(@RequestParam List<Integer> ids, Integer status, String意见) { for (Integer id : ids) { auditShenqing(id, status, 意见, adminId); } return "redirect:/admin/shenqing/list"; }
2. 用户端:日常打卡模块(核心需求!)
用户用系统就是为了“完成每日健康打卡”,这个功能别搞复杂!流程要简单:上传照片→填备注→提交,我当初加了“体温曲线统计”,代码量翻倍,其实“纯打卡记录”更实用。
(1)核心代码片段
Controller层(处理打卡提交):
@Controller
@RequestMapping("/user/daka")
public class UserDakaController {
@Autowired
private DakaService dakaService;
@PostMapping("/add")
public String addDaka(Daka daka, @RequestParam("file") MultipartFile file,
HttpSession session, HttpServletRequest request) {
// 1. 获取当前登录用户
Yonghu user = (Yonghu) session.getAttribute("loginUser");
if (user == null) {
return "redirect:/user/login"; // 未登录跳登录页
}
// 2. 处理打卡照片上传
if (file.isEmpty()) {
request.setAttribute("msg", "请上传打卡照片!");
return "user/daka/add";
}
try {
String filePath = request.getServletContext().getRealPath("/static/photos/daka/");
String fileName = System.currentTimeMillis() + file.getOriginalFilename();
File dest = new File(filePath + fileName);
file.transferTo(dest);
daka.setDakaPhoto("/static/photos/daka/" + fileName); // 存路径
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("msg", "照片上传失败!");
return "user/daka/add";
}
// 3. 设置打卡信息
daka.setYonghuId(user.getId());
daka.setInsertTime(new Date()); // 打卡日期
daka.setCreateTime(new Date());
// 4. 保存打卡记录
dakaService.insert(daka);
request.setAttribute("msg", "打卡成功!");
return "redirect:/user/daka/list";
}
}
(2)页面设计要点
页面标题:用户-日常打卡页面
(插入图片位置:此处放“日常打卡页面截图”,需包含以下元素)
- 表单元素:
- 打卡照片(文件上传框,支持JPG/PNG,提示“拍摄健康码或个人健康状态”)
- 打卡备注(文本域,选填,提示“如:今日体温36.5℃,无不适”)
- 打卡日期(只读输入框,默认当前日期,不可修改)
- 按钮:“提交打卡”(绿色btn-success)和“重置”(灰色btn-default)
- 提示信息:红色字体显示“打卡失败”,绿色显示“打卡成功”
- 历史打卡列表:在页面下方显示近7天打卡记录,包含“照片、日期、备注”,方便用户回溯
(3)避坑提醒
- 限制每日只能打卡1次!在Service层加校验:
Date today = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if (dakaService.countToday(user.getId(), sdf.format(today)) > 0) { throw new RuntimeException("今日已打卡,无需重复提交!"); } - 照片上传限制大小!在application.properties配置:
spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=10MB
3. 管理员端:核酸检测管理模块(提升专业性)
管理员需要“管控核酸检测记录”,这个功能能体现系统的“数据管理能力”,答辩时多提一句,导师会觉得你考虑周全。
页面设计要点
页面标题:管理员-核酸检测管理页面
(插入图片位置:此处放“核酸检测管理页面截图”,需包含以下元素)
- 筛选条件:按“用户姓名”模糊查询、按“检测结果”下拉筛选(阴性/阳性)
- 检测记录表格:
- 列名:用户名、手机号、身份证号、检测时间、检测结果、备注、操作
- 结果显示:阴性(绿色)、阳性(红色),重点突出异常记录
- 操作按钮:“新增记录”(蓝色btn-primary)、“修改”(橙色btn-warning)、“删除”(红色btn-danger)
- 统计卡片:在页面顶部显示“总检测数、阳性数、阴性数”,直观展示整体情况
4. 用户端:接种记录查询模块(答辩亮点!)
这个功能最能体现系统的“实用性”,导师超爱问!核心是“查询个人接种详情”,别漏了“接种编号复制功能”,方便用户报销或办事时使用。
页面设计要点
页面标题:用户-接种记录查询页面
(插入图片位置:此处放“接种记录查询页面截图”,需包含以下元素)
- 筛选条件:按“接种年份”下拉筛选(2022/2023/2024)
- 接种记录表格:
- 列名:接种编号、接种类型、接种时间、备注、操作
- 操作:“复制编号”按钮(点击后提示“复制成功”,无需手动选中)
- 空记录提示:无接种记录时显示“暂无接种记录,可前往社区接种点咨询”(附社区联系方式,更显贴心)
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测试就出问题!我当初没测“物资库存为0时申请”的情况,导致用户能提交超量申请,导师说“不符合防控逻辑”,当场扣了分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果就行:
(1)物资申请审核测试(表1:物资申请审核测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 同意申请(库存充足) | 选“待审核”申请→选“同意”→填意见→提交 | 申请状态变为“同意”,物资库存扣减 | ||
| 同意申请(库存不足) | 选“待审核”申请(申请5个,库存3个)→同意 | 提示“物资库存不足,当前库存:3” | ||
| 重复审核 | 选“已同意”申请→再次审核 | 提示“该申请已审批,无需重复操作!” |
(2)日常打卡测试(表2:日常打卡测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 未上传照片 | 不选照片→填备注→提交 | 提示“请上传打卡照片!” | ||
| 今日已打卡 | 上传照片→提交(当日已打一次) | 提示“今日已打卡,无需重复提交!” | ||
| 正常打卡 | 上传照片→填备注→提交(当日首次) | 提示“打卡成功!”,列表显示该记录 |
(3)核酸检测查询测试(表3:核酸检测查询测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 筛选阳性结果 | 选“检测结果=阳性”→点击查询 | 只显示阳性检测记录 | ||
| 用户名不存在 | 输入不存在的用户名→查询 | 提示“未找到相关检测记录” | ||
| 正常查询 | 输入正确用户名→查询 | 显示该用户所有检测记录(按时间倒序) |
2. 兼容性测试(容易忽略的点)
别只在自己电脑上测!答辩时评委可能用不同浏览器,我当初没测IE浏览器,结果物资列表排版错乱,赶紧改了CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(笔记本常用分辨率,别让页面出现横向滚动条)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,包含“测试目的、测试范围、测试用例、测试结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下打卡照片预览不显示,已通过添加CSS的display:block解决;未登录能访问物资申请页,已加拦截器解决”
- 测试结论:“核心功能(物资申请审核、日常打卡、核酸检测查询)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给了“良好”:
- 演示流程要顺畅:提前录好演示视频(怕答辩时系统崩),演示时按“用户打卡→申请物资→管理员审批→用户查接种记录”的流程来,别跳步
- 重点讲“你解决了啥问题”:比如“一开始物资审批后库存没扣减,后来用Spring事务保证审批和库存更新一致,解决了超量发放问题”,比光说“我用了Spring Boot”更有亮点
- 准备常见问题:导师大概率会问“为什么选Spring Boot不选SSM”“如果用户量变大,怎么优化”,提前准备好答案,比如“Spring Boot配置简单,适合快速开发;用户量变大的话,会加Redis缓存热门物资信息,减少数据库压力”
最后:毕设通关的小私心
以上就是基于Spring Boot的疾病防控综合系统从0到1的全流程避坑干货!其实毕设没那么难,关键是找对方法,别盲目跟风做复杂功能。
需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“防控系统”,我私发你;要是卡在某个模块(比如物资审核、日常打卡),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘