基于Spring Boot的社区医院管理系统毕设稳过秘籍!从需求到测试全流程,新手也能抄作业✨
谁懂啊!去年做社区医院管理系统毕设时,光就诊信息和药品库存的关联就卡了4天——一开始没处理"药品库存扣减"逻辑,医生开药后库存没减少,导师看了直接让我"重写业务层代码"😫 后来踩遍坑才摸出一套能快速落地的流程,今天把需求分析、技术选型、功能实现到测试的全细节说透,宝子们再也不用熬夜改代码,轻松搞定毕设!
一、先搞懂"用户要啥"!需求分析别瞎蒙
刚开始我直接跳过需求分析就写代码,结果做了半个月的"医院资讯推送"功能,导师一句"核心是就诊管理和药品库存,不是资讯"直接打回重改!后来才明白,需求分析得先抓准"谁用系统、要干啥",这步做对,后面少走80%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
社区医院管理系统就四类核心用户:管理员、医生、前台和患者(角色别太多!我当初加了"药剂师"角色,后期调试超麻烦,最后合并到医生角色才轻松):
- 管理员端(必做功能):
- 用户管理:新增/修改患者信息、重置密码、查询用户列表(别漏"身份证号唯一校验"!我当初没加,导致重复注册)
- 医生管理:添加医生信息、分配科室、设置工号(用下拉框选择科室,别让管理员手动输)
- 药品管理:录入药品信息、设置库存和价格、维护药品详情(支持"模糊查询",搜药品名称就能找到)
- 数据统计:查看就诊量、药品使用统计、生成报表
- 医生端(核心功能):
- 患者管理:查看就诊患者、维护健康档案、记录病例信息
- 就诊管理:开具处方、记录检查项目、更新病例状态
- 药品开具:选择药品、设置用量、自动扣减库存
- 前台端(业务处理):
- 挂号管理:患者挂号、分配就诊科室、收取挂号费
- 信息查询:查询患者信息、医生排班、药品库存
- 患者端(基础功能):
- 个人信息:查看健康档案、就诊记录、病例信息
- 家庭医生:选择家庭医生、查看医生信息
2. 需求分析避坑指南(血泪教训!)
- 别光靠"想"!找2个同学模拟患者提意见:比如有同学说"想查看历史就诊记录",我才加了"病例档案"功能,比自己瞎加实用多了
- 一定要画用例图!用DrawIO画简单版就行,标清"医生-开具处方""患者-查看病例",后期跟导师汇报时,比光说"我要做XX功能"直观10倍
- 写"需求规格说明书"!不用太复杂,把"功能描述、约束条件"写清楚(比如"药品库存不能为负""病例信息不能删除"),后期编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问"你这系统可行吗",别只说"我觉得可行",要从3个角度写,显得专业:
- 技术可行性:Spring Boot、Java、MySQL都是课堂学过的,遇到问题能查资料(别选没学过的技术!我当初想试试微服务,结果卡了一周服务调用)
- 经济可行性:所有工具都是免费的!Eclipse、MySQL、Tomcat全是官网下载,答辩时说"开发成本为0",导师会觉得你会控制成本
- 操作可行性:界面用Bootstrap做,按钮布局跟医院HIS系统类似,我找系里老师测试,她5分钟就学会了开处方,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用Spring Cloud+React,结果"服务注册发现"卡了5天——Eureka配置不熟,服务一直无法调用😫 后来换成Spring Boot+JSP+MySQL+Tomcat9,新手友好度直接拉满,调试效率翻了倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选"最新技术",稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Spring Boot | 比SSM配置简单,自带Tomcat,快速开发 | 用Spring Boot 2.7.x,3.x版本兼容性问题多 |
| MySQL 8.0 | 社区医院数据量不大,完全够用 | 安装时设"utf8mb4"编码!避免中文乱码 |
| Tomcat 9.0 | 稳定!和Spring Boot适配性最好 | 别用Tomcat 10!包名变更问题很麻烦 |
| JSP+Bootstrap | 不用学前端框架,快速开发 | Bootstrap用3.x版本!4.x布局问题多 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在"环境配置",其实跟着步骤来超简单:
- 装JDK 1.8:配置JAVA_HOME环境变量
- 装Eclipse:选Enterprise版本,自带Web开发插件
- 装MySQL 8.0:用Navicat管理数据库
- 创建Spring Boot项目:用Spring Initializr,选Web、MySQL、MyBatis依赖
3. 架构图一定要画!答辩加分项
用DrawIO画B/S架构图,标清"浏览器-服务器-数据库"交互逻辑:比如患者挂号→前台录入→医生就诊→药品库存扣减。去年答辩时,评委特意夸这个图"业务逻辑清晰"!
三、数据库设计:别让表关联坑了你
这部分是毕设的"核心骨架",我当初把"病例信息"和"药品信息"没做关联,查"患者用药历史"时要写复杂SQL,调试到凌晨😫 后来按"实体-属性-关系"来设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定系统里的"实体"(患者、医生、药品、病例),再想每个实体有啥"属性"。我整理了必做的8张表:
- 患者表(yonghu):id、yonghu_name(姓名)、yonghu_phone(电话)、yonghu_id_number(身份证号)、yonghu_email(邮箱)
- 医生表(yisheng):id、yisheng_uuid_number(工号)、yisheng_name(姓名)、yisheng_phone(电话)、科室信息
- 药品表(yaopin):id、yaopin_uuid_number(药品编号)、yaopin_name(名称)、yaopin_new_money(价格)、yaopin_kucun_number(库存)
- 病例信息表(bingli):id、bingli_uuid_number(病例编号)、yonghu_id(患者)、yisheng_id(医生)、bingli_bingqing(病情)、yaodan_text(药单)
- 就诊信息表(jiuzhen):id、yonghu_id(患者)、jiuzhen_jiuzhen(就诊号)、jiuzhen_feiyong(费用)、keshi_types(科室)
- 健康档案表(jiuankangdangan):id、yonghu_id(患者)、jiuankangdangan_name(档案标题)、jiuankangdangan_content(健康状况)
- 家庭医生表(qiantai):id、qiantai_name(负责人)、qiantai_phone(电话)、服务患者信息
- 字典表(dictionary):id、dic_code(字段)、dic_name(字段名),用于科室、药品类型等枚举数据
避坑提醒:别把"病例附件"存数据库!存文件路径,比如/static/files/bingli1.pdf。
2. 数据库物理设计(附建表SQL示例)
给宝子们贴一段"药品表"的建表SQL,直接复制到Navicat就能用:
CREATE TABLE `yaopin` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '药品ID',
`yaopin_uuid_number` VARCHAR(100) DEFAULT NULL COMMENT '药品编号',
`yaopin_name` VARCHAR(100) NOT NULL COMMENT '药品名称',
`yaopin_new_money` DECIMAL(10,2) NOT NULL COMMENT '药品价格',
`yaopin_kucun_number` INT NOT NULL DEFAULT 0 COMMENT '药品库存',
`yaopin_zuoyong` VARCHAR(200) DEFAULT NULL COMMENT '主要药效',
`fuzuoyong` VARCHAR(200) DEFAULT NULL COMMENT '副作用',
`yaopin_content` TEXT DEFAULT NULL COMMENT '药品详情',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_yaopin_number` (`yaopin_uuid_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药品表';
3. 表关联测试!别等编码才发现错
建完表测试关联是否正常:
SELECT y.yonghu_name, yis.yisheng_name, b.bingli_bingqing, b.yaodan_text
FROM bingli b
JOIN yonghu y ON b.yonghu_id = y.id
JOIN yisheng yis ON b.yisheng_id = yis.id
WHERE y.id = 1;
能查出"患者名+医生名+病情+药单"说明关联正确。
四、功能实现:核心模块代码+页面设计
不用做所有功能!先搞定4个核心模块,答辩时足够出彩。
1. 医生端:病例信息管理模块(必做!)
这是医生最常用的功能,主要实现"新增病例、修改病例、查看病例"。
(1)核心代码片段(Spring Boot)
Service层(处理病例信息,含药品库存校验):
@Service
public class BingliServiceImpl implements BingliService {
@Autowired
private BingliMapper bingliMapper;
@Autowired
private YaopinMapper yaopinMapper;
@Override
@Transactional
public void addBingli(BingliEntity bingli) {
// 1. 校验患者和医生是否存在
// 2. 处理药品库存扣减
if (bingli.getYaodanText() != null && !bingli.getYaodanText().isEmpty()) {
// 解析药单,扣减库存
String[] yaopinList = bingli.getYaodanText().split(",");
for (String yaopinInfo : yaopinList) {
String[] info = yaopinInfo.split(":");
Integer yaopinId = Integer.parseInt(info[0]);
Integer useCount = Integer.parseInt(info[1]);
YaopinEntity yaopin = yaopinMapper.selectById(yaopinId);
if (yaopin.getYaopinKucunNumber() < useCount) {
throw new RuntimeException(yaopin.getYaopinName() + "库存不足!");
}
// 扣减库存
yaopin.setYaopinKucunNumber(yaopin.getYaopinKucunNumber() - useCount);
yaopinMapper.updateById(yaopin);
}
}
// 3. 保存病例信息
bingli.setBingliUuidNumber(System.currentTimeMillis() + "" + (int)(Math.random()*1000));
bingli.setCreateTime(new Date());
bingliMapper.insert(bingli);
}
}
Controller层:
@Controller
@RequestMapping("/doctor/bingli")
public class DoctorBingliController {
@Autowired
private BingliService bingliService;
@PostMapping("/add")
public String addBingli(BingliEntity bingli, HttpServletRequest request) {
try {
bingliService.addBingli(bingli);
request.setAttribute("msg", "病例添加成功!");
} catch (Exception e) {
request.setAttribute("msg", "病例添加失败:" + e.getMessage());
}
return "redirect:/doctor/bingli/list";
}
}
(2)页面设计要点(Bootstrap)
页面标题:医生-病例信息管理页面
- 病例列表表格:
- 列名:病例编号、患者姓名、病情描述、检查项目、开药情况、操作
- 状态显示:不同病情用不同颜色标签
- 新增病例表单:
- 患者选择(下拉框,从患者表读取)
- 病情描述(文本域,必填)
- 检查项目(多选框:血常规/尿常规/B超等)
- 药品选择(多选下拉,显示库存数量)
- 用药剂量(输入框,配合药品选择)
(3)避坑提醒
- 药品库存实时校验!在Service层处理:
if (yaopin.getYaopinKucunNumber() < useCount) { throw new RuntimeException("药品库存不足!"); } - 病例编号要唯一!用时间戳+随机数生成
2. 药品库存管理模块(核心需求!)
管理员用系统管理药品库存,这个功能要实时准确!
(1)核心代码片段
Service层(药品库存预警):
@Service
public class YaopinServiceImpl implements YaopinService {
@Autowired
private YaopinMapper yaopinMapper;
@Override
public List<YaopinEntity> getLowStockYaopin() {
// 返回库存小于10的药品,用于预警
return yaopinMapper.selectList(
new EntityWrapper<YaopinEntity>()
.lt("yaopin_kucun_number", 10)
.orderBy("yaopin_kucun_number", true)
);
}
@Override
@Transactional
public void updateYaopinStock(Integer yaopinId, Integer stock) {
if (stock < 0) {
throw new RuntimeException("库存不能为负数!");
}
YaopinEntity yaopin = new YaopinEntity();
yaopin.setId(yaopinId);
yaopin.setYaopinKucunNumber(stock);
yaopinMapper.updateById(yaopin);
}
}
(2)页面设计要点
页面标题:管理员-药品信息管理页面
- 药品列表表格:
- 列名:药品编号、药品名称、价格、库存、主要药效、操作
- 库存预警:库存<10标红色,<50标橙色
- 库存修改功能:
- 点击"修改库存"弹出模态框
- 显示当前库存,输入新库存
- 实时校验不能为负
3. 就诊信息管理模块(前台功能)
前台处理患者挂号就诊流程。
页面设计要点
页面标题:前台-就诊信息管理页面
- 挂号功能:
- 患者信息(新患者可现场登记)
- 选择科室(下拉框)
- 选择医生(根据科室动态加载)
- 挂号费用(自动计算)
- 就诊队列:
- 显示待就诊患者列表
- 患者状态:待就诊/就诊中/已就诊
- 叫号功能(可选)
4. 健康档案管理模块(患者功能)
患者查看个人健康信息,体现系统完整性。
页面设计要点
页面标题:患者-健康档案页面
- 个人信息卡片:
- 基本信息:姓名、电话、身份证号
- 过敏史、既往病史等重要信息
- 就诊历史:
- 按时间倒序列出历史就诊记录
- 点击可查看详细病例信息
- 家庭医生信息:
- 显示负责的家庭医生
- 医生联系方式
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得"功能能跑就行",结果答辩时评委一测试就出问题!我当初没测"药品库存为0时开药"的情况,导致医生能开具无库存药品,导师说"不符合医疗逻辑",当场扣分😫
1. 功能测试(必测3个模块)
重点测"核心功能",我整理了测试用例表:
(1)病例开具功能测试
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 药品库存不足 | 医生开具库存为0的药品 | 提示"XXX药品库存不足" |
| 正常开具病例 | 填写完整病例信息提交 | 提示"病例添加成功",药品库存相应减少 |
(2)药品库存管理测试
| 测试场景 | 输入数据 | 预期结果 |
|---|---|---|
| 库存为负 | 药品ID=1,库存=-5 | 提示"库存不能为负数" |
| 库存预警 | 修改库存为5 | 在药品列表中标红显示 |
(3)就诊挂号测试
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 新患者挂号 | 输入新患者信息+选择科室 | 生成就诊号,患者信息入库 |
| 重复挂号 | 同一患者同一天挂同一科室 | 提示"今日已挂号" |
2. 兼容性测试
- 浏览器测试:Chrome、Firefox、Edge
- 分辨率测试:1920×1080、1366×768
- 数据完整性测试:病例与药品、患者的关联关系
3. 测试报告要写好!答辩加分
把测试结果整理成"测试报告":
- 问题总结:"药品库存扣减并发问题,已通过数据库事务解决"
- 测试结论:"核心功能(病例管理、药品库存、就诊挂号)均通过测试"
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!
- 演示流程要顺畅:按"患者挂号→医生就诊→开具处方→药品库存扣减"流程演示
- 重点讲"业务逻辑":比如"用Spring事务保证病例信息和药品库存的数据一致性"
- 准备常见问题:为什么选Spring Boot?数据安全怎么保障?
最后:毕设通关的小私心
以上就是基于Spring Boot的社区医院管理系统从0到1的全流程避坑干货!其实毕设没那么难,关键是抓住医疗业务核心流程。
需要完整源码(带详细注释)、数据库脚本、部署文档的宝子,评论区留言,我会分享给大家!遇到Spring Boot配置或医疗业务逻辑问题也欢迎交流!
点赞收藏这篇指南,你的社区医院管理系统毕设一定能顺利通过! 🏥✨