毕业设计实战:基于Spring Boot的医院挂号就诊系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

94 阅读18分钟

毕业设计实战:基于Spring Boot的医院挂号就诊系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

谁懂啊!当初做医院挂号就诊系统毕设时,光用户表和挂号表的关联就卡了3天——一开始没设外键,查某用户的挂号记录时数据全错乱,导师看了直接让我“重画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!

一、先搞懂“医院挂号要啥”!需求分析别瞎蒙

刚开始我跳过需求分析就写代码,花两周做了个“病历档案管理功能”,结果导师一句“核心是挂号流程与医生管理,不是档案存储”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。

1. 核心用户&功能拆解(踩坑后总结版)

医院挂号就诊系统就三类核心用户:管理员患者医生(别加“护士角色”!我当初加了后,权限逻辑混乱,最后砍掉才顺畅):

  • 管理员端(必做功能):
    • 用户管理:新增患者信息、重置患者密码、模糊查询患者(支持按姓名/手机号搜,我当初没加,查患者要翻几十页)
    • 医生管理:维护医生信息(科室/职称/挂号价格)、上传医生头像、启用/禁用医生账号(用下拉框选“内科/外科”,别让管理员手动输,效率翻倍)
    • 挂号管理:查看挂号申请、审核挂号状态、生成就诊识别码(要支持“逻辑删除”,删挂号记录用0/1标记,别真删数据,导师会夸你考虑周全)
    • 公告管理:发布就诊通知、修改公告内容、删除过期公告(加“公告类型”字段,比如“挂号须知/停诊通知”,方便筛选)
  • 医生端(核心功能):
    • 个人信息管理:修改联系方式/挂号须知、查看个人挂号记录(关联挂号表,实时显示待接诊患者)
    • 挂号审核:查看患者挂号申请、通过/驳回挂号、填写审核意见(我当初没加“审核意见”,患者不知道为啥被驳回,全是投诉)
  • 患者端(核心功能):
    • 在线挂号:选择科室/医生、预约挂号时间、提交挂号申请(按“挂号价格”排序,方便患者选择,我当初没加,患者选医生要翻半天)
    • 挂号记录:查看历史挂号记录、挂号审核状态、就诊识别码(用不同颜色标注“待审核/已通过/已驳回”,直观清晰)
    • 公告查看:浏览医院通知、搜索特定公告(按“发布时间”倒序,最新公告放最前,方便患者获取信息)

2. 需求分析避坑指南(血泪教训!)

  • 别光靠“空想”!找2个同学模拟患者和医生提意见:比如有同学说“想快速找到擅长骨科的医生”,我才加了“科室筛选功能”,比自己瞎加“就诊日历”实用多了
  • 一定要画用例图!用DrawIO画简单版就行,标清“管理员-审核挂号”“患者-在线挂号”,后期跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听20分钟还没get到逻辑)
  • 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“患者手机号不能重复”“挂号价格不能为0”),编码时对着做,不会跑偏

3. 可行性分析别敷衍!3点写清楚就能过

导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个角度写,显得专业:

  • 技术可行性:Spring Boot、Java、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《MySQL数据库应用》,遇到问题能查资料(别选Vue3!我当初想尝试,环境配置卡了一周,最后换回JSP才顺利)
  • 经济可行性:所有工具全免费!IDEA(社区版)、MySQL、Tomcat官网直接下载,不用花一分钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
  • 操作可行性:界面用Bootstrap做,按钮布局跟医院常用系统类似,我找系里老师测试,她3分钟就学会了在线挂号,导师直接认可

二、技术选型别跟风!这套组合稳到爆

刚开始我跟风用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”编码!我当初用默认编码,患者姓名含特殊符号时乱码,查了2小时才解决
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”环境变量时别填错,不然IDEA认不到
  2. 装IDEA(社区版):选“Community Edition”,免费且够用,自带Spring Boot插件,不用手动装
  3. 装MySQL 8.0:用Navicat管理数据库(可视化工具超方便,新建表时直接选字段类型,比命令行快10倍)
  4. 配置Spring Boot项目:在IDEA里选“Spring Initializr”,勾选“Spring Web”“MySQL Driver”“MyBatis Framework”,启动时看到“Started Application in XXX seconds”就是成功

3. 架构图一定要画!答辩加分项

用DrawIO画三层架构图(像论文里的“系统架构图”),标清“表现层-业务层-数据访问层”的交互逻辑:比如患者在浏览器提交挂号申请→Controller接收请求→Service校验医生是否出诊→Mapper操作MySQL存储挂号记录。去年答辩时,评委特意夸这个图“逻辑清晰”,比光说“我用了Spring Boot”专业多了!

三、数据库设计:别让表关联坑了你

这部分是毕设的“核心骨架”,我当初把“挂号表”和“医生表”没做关联,查“某医生的挂号记录”时要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。

1. 核心实体&属性(附ER图绘制技巧)

先确定系统里的“实体”(比如患者、医生、挂号记录),再想每个实体的“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:

  • 患者表(yonghu):id(主键)、yonghu_name(姓名)、yonghu_phone(手机号,唯一)、yonghu_id_number(身份证号,唯一)、yonghu_email(邮箱)、password(密码,MD5加密!存明文会被导师说“不安全”)
  • 医生表(yisheng):id(主键)、yisheng_uuid_number(医生工号,唯一)、yisheng_name(姓名)、yisheng_types(科室)、yisheng_zhichneg(职称)、yisheng_new_money(挂号价格)
  • 挂号表(guahao):id(主键)、guahao_uuin_number(就诊识别码,唯一)、yonghu_id(关联患者表)、yisheng_id(关联医生表)、guahao_time(挂号时间)、guahao_yesno_types(审核状态:0待审核/1通过/2驳回)
  • 公告表(news):id(主键)、news_name(公告标题)、news_types(公告类型)、news_content(公告详情)、insert_time(发布时间)
  • 在线咨询表(chat):id(主键)、yonghu_id(关联患者表)、chat_issue(问题)、chat_reply(回复)、zhuangtai_types(状态:0未回复/1已回复)
  • 健康教育表(jiankangjiaoyu):id(主键)、jiankangjiaoyu_name(标题)、jiankangjiaoyu_types(类型)、jiankangjiaoyu_content(详情)、insert_time(发布时间)
  • 字典表(dictionary):id(主键)、dic_code(字段)、dic_name(字段名)、index_name(编码名字)、super_id(父字段id)
  • 管理员表(admin):id(主键)、username(账号)、password(密码)、role(角色)、addtime(新增时间)

画ER图用Visio或亿图,记住3个规则:

  1. 矩形代表“实体”(比如“患者”“医生”)
  2. 椭圆代表“属性”(比如患者的“姓名”“手机号”)
  3. 菱形代表“关系”(比如“患者-挂号-医生”是多对多,一个患者能挂多个医生的号,一个医生能接多个患者的号) 避坑提醒:别把“医生头像、公告图片”存数据库!我当初存二进制导致数据库崩溃,后来改成存“文件路径”(比如/static/photo/yisheng1.jpg)才对。

2. 数据库物理设计(附建表SQL示例)

ER图画好后,转成实际数据库表,字段类型和约束别瞎设!比如“挂号价格”要用DECIMAL(10,2),别用INT,不然没法存“50.50元”;“就诊识别码”要设UNIQUE约束,避免重复。

给宝子们贴一段“挂号表”的建表SQL,复制到Navicat就能用:

CREATE TABLE `guahao` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '挂号ID',
  `guahao_uuin_number` VARCHAR(50) NOT NULL COMMENT '就诊识别码(唯一)',
  `yonghu_id` INT DEFAULT NULL COMMENT '关联患者ID',
  `yisheng_id` INT DEFAULT NULL COMMENT '关联医生ID',
  `guahao_time` DATETIME DEFAULT NULL COMMENT '挂号时间',
  `guahao_types` INT DEFAULT NULL COMMENT '时间类型:1上午/2下午/3晚上',
  `guahao_status_types` INT DEFAULT 0 COMMENT '挂号状态:0未就诊/1已就诊/2已取消',
  `guahao_yesno_types` INT DEFAULT 0 COMMENT '审核状态:0待审核/1通过/2驳回',
  `guahao_yesno_text` VARCHAR(200) DEFAULT NULL COMMENT '审核意见',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `fk_yonghu` (`yonghu_id`), -- 外键关联患者表
  KEY `fk_yisheng` (`yisheng_id`), -- 外键关联医生表
  UNIQUE KEY `uk_uuin` (`guahao_uuin_number`) -- 就诊识别码唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='挂号表';

3. 表关联测试!别等编码才发现错

建完表一定要测试关联是否正常!比如在“挂号表”插入一条数据(患者ID=1,医生ID=1),用JOIN查询:

SELECT y.yonghu_name, y.yonghu_phone, ys.yisheng_name, ys.yisheng_types, g.guahao_yesno_types
FROM guahao g
JOIN yonghu y ON g.yonghu_id = y.id
JOIN yisheng ys ON g.yisheng_id = ys.id
WHERE g.id = 1;

如果能查出“患者姓名+手机号+医生姓名+科室+审核状态”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。

四、功能实现:核心模块代码+页面设计

不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,宝子们直接套就行。

1. 患者端:在线挂号模块(必做!)

这是患者最常用的功能,实现“选择医生、预约时间、提交挂号申请”,重点说“医生出诊状态校验”逻辑——别漏了“避免挂满的医生被重复预约”,我当初就是这里踩了大坑!

(1)核心代码片段(Spring Boot)

Controller层(处理挂号提交请求):

@Controller
@RequestMapping("/patient/guahao")
public class PatientGuahaoController {
    @Autowired
    private GuahaoService guahaoService;
    @Autowired
    private YishengService yishengService;

    // 提交挂号申请
    @PostMapping("/add")
    public String addGuahao(Guahao guahao, HttpSession session, HttpServletRequest request) {
        // 1. 获取当前登录患者
        Yonghu patient = (Yonghu) session.getAttribute("loginPatient");
        if (patient == null) {
            return "redirect:/patient/login"; // 未登录跳登录页
        }
        // 2. 校验医生是否存在且启用
        Yisheng yisheng = yishengService.getById(guahao.getYishengId());
        if (yisheng == null) {
            request.setAttribute("msg", "所选医生不存在!");
            return "patient/guahao/add";
        }
        // 3. 校验该医生当天挂号是否已满(假设每个医生每天限挂20个号)
        int todayGuahaoCount = guahaoService.countTodayByYisheng(guahao.getYishengId());
        if (todayGuahaoCount >= 20) {
            request.setAttribute("msg", "该医生今日号源已挂满,请选择其他医生或日期!");
            return "patient/guahao/add";
        }
        // 4. 设置挂号信息
        guahao.setYonghuId(patient.getId()); // 关联患者
        guahao.setGuahao_uuin_number(generateUuin()); // 生成唯一就诊识别码
        guahao.setGuahao_yesno_types(0); // 待审核
        guahao.setGuahao_status_types(0); // 未就诊
        // 5. 保存挂号记录
        guahaoService.save(guahao);
        request.setAttribute("msg", "挂号申请提交成功,等待医生审核!");
        return "redirect:/patient/guahao/list";
    }

    // 生成唯一就诊识别码(前缀+日期+随机数)
    private String generateUuin() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateStr = sdf.format(new Date());
        return "JH" + dateStr + (int)(Math.random()*10000);
    }
}
(2)页面设计要点(Bootstrap)

页面标题:患者-在线挂号页面
(插入图片位置:此处放“在线挂号页面截图”,需包含以下元素)

  • 筛选条件:
    • 科室下拉框(加载所有科室,必填)
    • 医生下拉框(根据科室联动加载医生,必填)
    • 挂号时间选择器(只能选未来7天,必填)
  • 表单元素:
    • 患者姓名(默认当前登录患者姓名,不可改)
    • 联系电话(默认当前登录患者手机号,可修改)
    • 就诊症状描述(文本域,选填,提示“简要描述病情,方便医生提前了解”)
  • 按钮:“提交挂号”(绿色btn-success)和“重置”(灰色btn-default)
  • 提示信息:红色字体显示“提交失败”,绿色显示“提交成功”
(3)避坑提醒
  • 防止重复挂号!同一患者同一天不能挂同一医生的号:
    if (guahaoService.existsByPatientYishengDate(patient.getId(), guahao.getYishengId(), guahao.getGuahao_time())) {
        request.setAttribute("msg", "您已预约该医生当天的号源,请勿重复提交!");
        return "patient/guahao/add";
    }
    
  • 挂号时间格式统一!用SimpleDateFormat格式化:
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    guahao.setGuahao_time(sdf.parse(request.getParameter("guahaoTime")));
    

2. 管理员端:挂号审核模块(核心需求!)

管理员用系统的核心需求是“管控挂号流程”,这个功能别搞复杂!流程要简单:查看挂号申请→选择审核结果→填写意见→提交,我当初加了“二次审核”功能,代码量翻倍,其实“一次审核”更实用。

(1)核心代码片段

Service层(处理挂号审核):

@Service
public class AdminGuahaoService {
    @Autowired
    private GuahaoMapper guahaoMapper;

    @Override
    @Transactional // 事务管理,确保审核状态更新一致
    public void auditGuahao(Integer id, Integer status, String opinion) {
        // 1. 查询挂号记录是否存在
        Guahao guahao = guahaoMapper.selectById(id);
        if (guahao == null) {
            throw new RuntimeException("挂号记录不存在!");
        }
        // 2. 防重复审核
        if (guahao.getGuahao_yesno_types() != 0) {
            throw new RuntimeException("该挂号申请已审核,无需重复操作!");
        }
        // 3. 更新审核状态和意见
        guahao.setGuahao_yesno_types(status); // 0待审核/1通过/2驳回
        guahao.setGuahao_yesno_text(opinion);
        guahaoMapper.updateById(guahao);
    }
}

Controller层(接收审核请求):

@Controller
@RequestMapping("/admin/guahao")
public class AdminGuahaoController {
    @Autowired
    private AdminGuahaoService adminGuahaoService;

    @PostMapping("/audit")
    public String auditGuahao(Integer id, Integer status, String opinion, HttpServletRequest request) {
        try {
            adminGuahaoService.auditGuahao(id, status, opinion);
            request.setAttribute("msg", "挂号审核完成!");
        } catch (Exception e) {
            request.setAttribute("msg", e.getMessage());
        }
        return "redirect:/admin/guahao/list";
    }
}
(2)页面设计要点

页面标题:管理员-挂号审核页面
(插入图片位置:此处放“挂号审核页面截图”,需包含以下元素)

  • 筛选条件:
    • 审核状态下拉框(待审核/已通过/已驳回,默认“待审核”)
    • 日期选择器(筛选指定日期的挂号申请)
  • 挂号列表表格:
    • 列名:就诊识别码、患者姓名、医生姓名、挂号时间、审核状态、操作
    • 状态显示:待审核(橙色)、已通过(绿色)、已驳回(红色)
    • 操作:“查看详情”“审核”按钮
  • 审核弹窗:点击“审核”按钮弹出,包含:
    • 审核结果(单选框:通过/驳回,必填)
    • 审核意见(文本域,必填,比如“通过:号源充足”“驳回:医生当天停诊”)
    • 按钮:“确认审核”(绿色btn-success)和“取消”(灰色btn-default)
(3)避坑提醒
  • 审核时要记录操作日志!方便后续追溯(需新增操作日志表):
    // 审核后添加日志
    Log log = new Log();
    log.setAdminId(adminId); // 当前管理员ID
    log.setOperateContent("审核挂号申请:" + guahao.getGuahao_uuin_number());
    log.setOperateTime(new Date());
    logMapper.insert(log);
    
  • 支持“批量审核”!减少管理员操作次数:
    @PostMapping("/batchAudit")
    public String batchAudit(@RequestParam List<Integer> ids, Integer status, String opinion) {
        for (Integer id : ids) {
            auditGuahao(id, status, opinion);
        }
        return "redirect:/admin/guahao/list";
    }
    

3. 管理员端:医生信息管理模块(答辩亮点!)

这个功能最能体现系统的“医院属性”,导师超爱问!核心是“维护医生信息、设置挂号价格”,别漏了“医生账号启用/禁用”,不然离职医生的号源还能被预约。

页面设计要点

页面标题:管理员-医生信息管理页面
(插入图片位置:此处放“医生信息管理页面截图”,需包含以下元素)

  • 筛选条件:
    • 科室下拉框(加载所有科室,可筛选)
    • 医生姓名模糊查询(可筛选)
  • 医生列表表格:
    • 列名:医生工号、姓名、科室、职称、挂号价格、账号状态、操作
    • 状态显示:启用(绿色)、禁用(灰色)
    • 操作:“修改”“禁用/启用”“查看挂号记录”按钮
  • 新增医生弹窗:包含“医生工号、姓名、科室、职称、挂号价格、联系方式、挂号须知”等字段,提交前校验“医生工号唯一”

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

五、测试别敷衍!这3步让答辩不翻车

很多宝子觉得“功能能跑就行”,结果答辩时评委一测试就出问题!我当初没测“医生号源挂满”的情况,导致患者能挂超过限额的号,导师说“不符合医院挂号逻辑”,当场扣了分😫 测试一定要针对性做!

1. 功能测试(必测3个模块)

别全测!重点测“核心功能”,我整理了测试用例表,直接填结果就行:

(1)在线挂号测试(表1:在线挂号测试用例)
测试场景操作步骤预期结果实际结果测试结论
医生号源已满选已挂满的医生→填信息→提交提示“该医生今日号源已挂满,请选择其他医生或日期!”
重复挂号同一患者挂同一医生当天的号→再次提交提示“您已预约该医生当天的号源,请勿重复提交!”
正常挂号选未满医生→填信息→提交提示“挂号申请提交成功,等待医生审核!”
(2)挂号审核测试(表2:挂号审核测试用例)
测试场景操作步骤预期结果实际结果测试结论
审核通过选待审核挂号→选“通过”→填“号源充足”→提交挂号状态变为“已通过”,显示绿色
审核驳回选待审核挂号→选“驳回”→填“医生停诊”→提交挂号状态变为“已驳回”,显示红色
重复审核选已通过挂号→再次审核提示“该挂号申请已审核,无需重复操作!”
(3)医生管理测试(表3:医生管理测试用例)
测试场景操作步骤预期结果实际结果测试结论
禁用医生选启用的医生→点击“禁用”医生状态变为“禁用”,患者看不到该医生
医生工号重复新增医生→填已存在的工号→提交提示“医生工号已存在,请勿重复添加!”
正常新增医生填唯一工号→选科室→设价格→提交提示“医生新增成功!”,列表显示该医生

2. 兼容性测试(容易忽略的点)

别只在自己电脑上测!答辩时评委可能用不同浏览器,我当初没测IE浏览器,结果挂号时间选择器不显示,赶紧改了JS代码才好:

  • 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
  • 分辨率测试:1920×1080、1366×768(笔记本常用分辨率,别让页面出现横向滚动条)

3. 测试报告要写好!答辩加分

把测试结果整理成“测试报告”,包含“测试目的、测试范围、测试用例、测试结果、问题总结”,导师会觉得你“做事严谨”。比如:

  • 问题总结:“IE浏览器下挂号时间选择器不显示,已通过添加兼容性JS代码解决;未登录能访问挂号页面,已加拦截器控制”
  • 测试结论:“核心功能(在线挂号、挂号审核、医生管理)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”

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

毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给了“良好”:

  1. 演示流程要顺畅:提前录好演示视频(怕答辩时系统崩),演示时按“患者提交挂号→管理员审核→患者查看结果”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始医生头像存数据库导致加载慢,改成存文件路径后,访问速度提升70%”,比光说“我用了Spring Boot”更有亮点
  3. 准备常见问题:导师大概率会问“为什么选MySQL不选Oracle”“如果患者变多,怎么优化”,提前准备答案,比如“MySQL轻量适合小型系统;患者变多的话,会加Redis缓存热门医生信息,减少数据库压力”

最后:毕设通关的小私心

以上就是基于Spring Boot的医院挂号就诊系统从0到1的全流程避坑干货!其实毕设没那么难,关键是找对方法,别盲目做复杂功能。

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

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