基于Spring Boot的疾病防控综合系统毕设稳过秘籍!从需求到测试全流程,新手也能抄作业✨

41 阅读19分钟

基于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 实操)

很多宝子卡在“环境配置”,其实跟着步骤来超简单,我当初就是这么搭的,一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置环境变量时“JAVA_HOME”要填对,不然Eclipse认不到
  2. 装Eclipse:选“Enterprise Edition”版本,自带Web开发插件,不用再装Tomcat插件
  3. 装MySQL 8.0:用Navicat管理数据库(可视化工具超方便,新建表时直接选字段类型,比命令行快10倍)
  4. 配置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个规则:

  1. 矩形代表“实体”(比如“用户”“物资”)
  2. 椭圆代表“属性”(比如用户的“姓名”“手机号”)
  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点,导师直接给了“良好”:

  1. 演示流程要顺畅:提前录好演示视频(怕答辩时系统崩),演示时按“用户打卡→申请物资→管理员审批→用户查接种记录”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始物资审批后库存没扣减,后来用Spring事务保证审批和库存更新一致,解决了超量发放问题”,比光说“我用了Spring Boot”更有亮点
  3. 准备常见问题:导师大概率会问“为什么选Spring Boot不选SSM”“如果用户量变大,怎么优化”,提前准备好答案,比如“Spring Boot配置简单,适合快速开发;用户量变大的话,会加Redis缓存热门物资信息,减少数据库压力”

最后:毕设通关的小私心

以上就是基于Spring Boot的疾病防控综合系统从0到1的全流程避坑干货!其实毕设没那么难,关键是找对方法,别盲目跟风做复杂功能。

需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“防控系统”,我私发你;要是卡在某个模块(比如物资审核、日常打卡),也可以留言,我看到必回!

点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘