毕业设计实战:基于SSM的医疗报销系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

50 阅读18分钟

毕业设计实战:基于SSM的医疗报销系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

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

一、先搞懂“医疗报销系统要啥”!需求分析别瞎蒙

刚开始我跳过需求分析就写代码,花两周加了个“医疗知识分享功能”,结果导师一句“核心是报销单管理与审核流程,不是知识科普”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。

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

医疗报销系统就两类核心用户:管理员普通用户(别加“访客角色”!我当初加了后,权限逻辑混乱,未登录就能看报销数据,最后砍掉才顺畅):

  • 管理员端(必做功能):
    • 用户管理:查看用户列表、新增用户、重置密码(支持按姓名/手机号模糊查,我当初没加,查用户要翻几十页)
    • 报销单管理:查看所有报销单、审核报销申请(通过/驳回)、填写审核意见、导出报销统计报表(用下拉框选“月度/季度”筛选,效率翻倍)
    • 人员管理:维护财会审核人员、领导信息(新增/修改/删除,关联报销单审核流程)
    • 基础数据管理:维护字典表(如病情类型、费用类型)、管理公告信息(发布/修改/删除报销通知)
  • 用户端(核心功能):
    • 报销操作:提交报销单(填报销人信息、上传身份证正反面/凭证)、查看报销审核进度、修改未审核的报销单
    • 信息查询:查看个人报销记录、浏览系统公告、查看管理员回复的审核意见
    • 个人中心:修改个人信息(头像、手机号)、更新登录密码、管理报销凭证附件

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

  • 别光靠“空想”!找2个同学模拟管理员和用户提意见:比如有用户说“想快速知道报销是否通过”,我才加了“审核状态标色”(待审核黄色/已通过绿色/已驳回红色),比瞎加“知识分享功能”实用多了
  • 一定要画用例图!用DrawIO画简单版,标清“管理员-审核报销单”“用户-提交报销申请”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听20分钟还没get到逻辑)
  • 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“报销金额不能为负”“凭证仅支持PDF/JPG”),编码时对着做,不会跑偏

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

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

  • 技术可行性:SSM、JSP、MySQL都是课堂学过的,图书馆有《SSM框架实战》《MySQL数据库设计》,遇到问题能查资料(别选Vue!我当初想试,前后端联调卡了一周,换回JSP才顺利)
  • 经济可行性:所有工具全免费!IDEA(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
  • 操作可行性:界面参考政务报销系统,按钮布局简洁,我找同学测试,3分钟就学会提交报销单,导师直接认可
  • 时间可行性:预留2个月开发,从需求分析到测试,每天投入3小时,能完成核心功能(我当初合理规划,提前1周完成)
  • 法律可行性:开发用的资料来自图书馆和开源社区,无侵权风险;代码独立编写,无抄袭,符合毕业设计要求

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

刚开始我跟风用SSM+Vue+Redis,结果“报销单缓存”卡了5天——Redis的持久化配置没设对,重启后数据全丢😫 后来换成SSM(Spring+SpringMVC+MyBatis)+JSP+MySQL+Tomcat9,新手友好度拉满,调试效率翻两倍!

1. 技术栈详细对比(附避坑提醒)

宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了5个核心工具的选择理由和坑点,直接抄:

技术工具为啥选它避坑提醒!(重点!)
SSM框架三层架构清晰,适合管理系统开发,学习资料多别用最新版依赖!Spring 5.2.x+MyBatis 3.5.x就行,高版本兼容性差,会报“配置文件解析错误”
MySQL 8.0占内存小,存用户、报销单、人员数据足够用安装时设“utf8mb4”编码!我当初用默认编码,用户姓名含生僻字乱码,查2小时才解决
Tomcat 9.0稳定!和SSM、JSP适配最好,支持热部署别用Tomcat 10!会出现“Servlet API包名变更”,答辩时系统崩了就完了
JSP上手简单,不用单独学前端框架,适合后端新手别用EL表达式老版本!用JSTL 1.2,避免“表达式无法解析”报错
IDEA 2022对SSM支持好,自带代码提示,调试方便别更到2023+版本!高版本对老电脑兼容性差,经常卡顿闪退

2. 开发环境搭建(step by step 实操)

很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量别写错,不然IDEA认不到JDK
  2. 装IDEA(社区版):选“Community Edition”,免费够用,首次打开勾选“SSM”“Maven”插件,自动安装
  3. 装MySQL 8.0:用Navicat管理(可视化工具超方便,新建表直接选字段类型,比命令行快10倍),新建数据库“medical_reimbursement”,编码设“utf8mb4”
  4. 配Tomcat 9.0:在IDEA中添加服务器,选“Apache Tomcat v9.0”,关联安装路径,启动后看到“Server startup in XX ms”就是成功
  5. 导入SSM依赖:在pom.xml中添加Spring、SpringMVC、MyBatis依赖,注意版本匹配(附依赖代码片段)

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

用DrawIO画SSM三层架构图(像论文里的“系统架构图”),标清“表现层(JSP/Controller)-业务层(Service)-数据访问层(Mapper)”:比如用户点“提交报销单”→JSP页面传请求→SpringMVC Controller接收→Service校验数据→MyBatis Mapper存MySQL。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SSM”专业多了!

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

这部分是毕设的“核心骨架”,我当初没关联“用户表”和“报销单表”,查“某用户的月度报销”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。

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

先确定“实体”(用户、报销单、财会审核人员、公告),再想“属性”,别漏关键字段!我整理了必做的6张表,直接照着画ER图:

  • 用户表(yonghu):id(主键)、yonghu_name(姓名)、yonghu_phone(手机号,唯一)、yonghu_id_number(身份证号)、yonghu_photo(头像路径)、create_time(创建时间)
  • 报销单表(baoxiaodan):id(主键)、yonghu_id(关联用户,外键)、caikuai_id(关联财会人员,外键)、baoxiaodan_uuid_number(报销单编号,唯一)、baoxiaodan_baoxiaoren_name(报销人姓名)、baoxiaodan_baoxiaoren_shenfenzhengz_photo(身份证正面路径)、baoxiaodan_new_jine(报销金额)、baoxiaodan_yesno_types(审核状态)
  • 财会审核人员表(caikuai):id(主键)、caikuai_name(姓名)、caikuai_phone(手机号)、caikuai_account(账号)、caikuai_password(密码)
  • 公告表(gonggao):id(主键)、gonggao_name(公告名称)、gonggao_content(公告内容)、gonggao_fabushijian(发布时间)

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

  1. 矩形代表“实体”(比如“用户”“报销单”)
  2. 椭圆代表“属性”(比如用户的“姓名”“手机号”)
  3. 菱形代表“关系”(比如“用户-提交-报销单”是一对多,一个用户能提交多个报销单;“财会人员-审核-报销单”是一对多,一个财会人员能审核多个报销单) 避坑提醒:别把“身份证照片、报销凭证”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/img/shenfenzheng1.jpg)才对。

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

ER图画好后,转成实际表,字段类型和约束别瞎设!比如“报销金额”用DECIMAL(10,2),别用INT,不然无法存小数;“用户手机号”设UNIQUE约束,避免重复注册。

给宝子们贴“报销单表”的建表SQL,复制到Navicat就能用:

CREATE TABLE `baoxiaodan` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '报销单ID',
  `yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
  `caikuai_id` INT DEFAULT NULL COMMENT '关联财会审核人员ID(外键)',
  `baoxiaodan_uuid_number` VARCHAR(50) DEFAULT NULL COMMENT '报销单唯一编号',
  `baoxiaodan_name` VARCHAR(200) NOT NULL COMMENT '报销单名称',
  `baoxiaodan_baoxiaoren_name` VARCHAR(50) NOT NULL COMMENT '报销人姓名',
  `baoxiaodan_baoxiaoren_photo` VARCHAR(200) DEFAULT NULL COMMENT '报销人头像照片路径',
  `baoxiaodan_baoxiaoren_shenfenzhengz_photo` VARCHAR(200) DEFAULT NULL COMMENT '身份证正面路径',
  `baoxiaodan_baoxiaoren_shenfenzhengf_photo` VARCHAR(200) DEFAULT NULL COMMENT '身份证反面路径',
  `baoxiaodan_baoxiaoren_phone` VARCHAR(20) DEFAULT NULL COMMENT '报销人联系方式',
  `baoxiaodan_baoxiaoren_id_number` VARCHAR(20) DEFAULT NULL COMMENT '报销人身份证号',
  `baoxiaodan_renyuan_types` INT DEFAULT NULL COMMENT '人员状态(1-在职,2-离职,3-退休)',
  `baoxiaodan_bingqing_types` INT DEFAULT NULL COMMENT '病情类型(1-普通疾病,2-重大疾病)',
  `baoxiaodan_yiliaofeiyong_types` INT DEFAULT NULL COMMENT '费用类型(1-门诊,2-住院,3-零售药店)',
  `baoxiaodan_new_jine` DECIMAL(10,2) NOT NULL COMMENT '报销金额',
  `baoxiaodan_file` VARCHAR(200) DEFAULT NULL COMMENT '相关报销凭证路径',
  `baoxiaodan_content` VARCHAR(500) DEFAULT NULL COMMENT '其他备注',
  `insert_time` DATETIME DEFAULT NULL COMMENT '申请时间',
  `baoxiaodan_yesno_types` INT DEFAULT 0 COMMENT '审核状态(0-待审核,1-已通过,2-已驳回)',
  `baoxiaodan_yesno_text` VARCHAR(500) DEFAULT NULL COMMENT '审核意见',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `fk_yonghu_baoxiaodan` (`yonghu_id`), -- 外键关联用户表
  KEY `fk_caikuai_baoxiaodan` (`caikuai_id`), -- 外键关联财会审核人员表
  UNIQUE KEY `uk_baoxiaodan_uuid` (`baoxiaodan_uuid_number`) -- 报销单编号唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报销单表';

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

建完表一定要测关联!比如在“报销单表”插数据(用户ID=1,财会ID=1,金额=500.00),用JOIN查询“某用户的报销单及审核人员信息”:

SELECT u.yonghu_name, b.baoxiaodan_name, b.baoxiaodan_new_jine, c.caikuai_name, b.baoxiaodan_yesno_types, b.baoxiaodan_yesno_text
FROM baoxiaodan b
JOIN yonghu u ON b.yonghu_id = u.id
JOIN caikuai c ON b.caikuai_id = c.id
WHERE u.id = 1;

如果能查出“用户名+报销单名称+金额+财会人员姓名+审核状态+审核意见”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。

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

不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。

1. 用户端:报销单提交模块(必做!)

这是用户的核心功能,实现“填信息、传凭证、提申请”,重点说“数据校验”和“凭证上传”——别漏这两步,我当初就是这里踩了大坑!

(1)关键操作逻辑
  1. 提交报销前,先校验“报销金额≥0.01”“身份证正反面已上传”(缺一项则提示“请完善必填信息”);
  2. 选择“病情类型”“费用类型”时,下拉框加载字典表数据,避免手动输入出错;
  3. 提交后,自动生成唯一报销单编号(格式:用户ID+日期+随机数),审核状态设为“待审核”(标黄色)。
(2)页面设计要点(JSP+Bootstrap)

页面标题:用户-报销单提交页面
(插入图片位置:此处放“报销单提交页面截图”,需包含以下元素)

  • 表单元素:
    • 报销单名称(输入框,必填,提示“如:2024年9月门诊报销”)
    • 报销人姓名(输入框,必填,默认带当前用户名,可修改)
    • 身份证正反面(上传框,必填,支持预览,仅允许JPG/PNG)
    • 报销人联系方式(输入框,必填,正则校验手机号格式)
    • 人员状态(下拉框,选“在职/离职/退休”,必填)
    • 病情类型(下拉框,选“普通疾病/重大疾病”,必填)
    • 费用类型(下拉框,选“门诊/住院/零售药店”,必填)
    • 报销金额(输入框,必填,正则校验“正数且最多2位小数”)
    • 报销凭证(上传框,选填,支持PDF/JPG,≤10MB)
    • 其他备注(文本域,选填,提示“补充报销说明”)
  • 按钮:“提交申请”(绿色btn-success)、“保存草稿”(蓝色btn-primary)、“重置”(灰色btn-default)
  • 提示信息:红色显“金额格式错误/必填项为空”,绿色显“报销单提交成功,待审核!”
(3)避坑提醒
  • 禁止无效金额提交!加校验逻辑:
    BigDecimal amount = baoxiaodan.getBaoxiaodanNewJine();
    if (amount.compareTo(new BigDecimal("0.01")) < 0) {
        return Result.warn("报销金额不能小于0.01元,请重新输入!");
    }
    
  • 生成唯一报销单编号!避免重复:
    // 格式:用户ID_yyyyMMdd_随机数(6位)
    String uuid = baoxiaodan.getYonghuId() + "_" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "_" + (int)(Math.random()*1000000);
    baoxiaodan.setBaoxiaodanUuidNumber(uuid);
    

2. 管理员端:报销单审核模块(核心需求!)

管理员用系统的核心是“把控报销流程”,流程别复杂:查待审核列表→看报销详情→批通过/驳回→填意见,我当初加“多级审核”,代码量翻倍,其实“单级审核+意见记录”更实用。

(1)关键操作逻辑
  1. 审核前,查看完整报销信息(含报销人资料、凭证附件),支持在线预览身份证和报销凭证;
  2. 审核时,选“通过”或“驳回”,驳回需必填审核意见(避免用户不知驳回原因);
  3. 审核后,同步更新报销单状态(通过标绿色/驳回标红色),并记录审核时间和审核人员。
(2)页面设计要点(JSP+Bootstrap)

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

  • 筛选条件:审核状态(下拉框“待审核/已通过/已驳回”)、报销人姓名(模糊查)、申请时间(日期范围)
  • 报销单列表表格:列名“报销单编号、报销人姓名、报销金额、申请时间、审核状态、操作”,待审核标黄色、已通过标绿色、已驳回标红色
  • 操作按钮:“查看详情”(蓝色btn-info)、“审核”(橙色btn-warning)
  • 审核弹窗:
    • 报销详情区:只读显示报销人信息、金额、凭证预览图
    • 审核操作区:单选框“通过”“驳回”、审核意见输入框(驳回时必填,提示“说明驳回原因”)、“提交审核”按钮(绿色)
(3)避坑提醒
  • 驳回必须填意见!加校验逻辑:
    if (baoxiaodan.getBaoxiaodanYesnoTypes() == 2) { // 2代表驳回
        if (StringUtils.isEmpty(baoxiaodan.getBaoxiaodanYesnoText())) {
            return Result.error("驳回需填写审核意见,告知用户原因!");
        }
    }
    
  • 记录审核信息!方便后续追溯:
    baoxiaodan.setBaoxiaodanYesnoTime(new Date()); // 审核时间
    baoxiaodan.setCaikuaiId(currentAdminId); // 当前审核人员ID
    baoxiaodanMapper.updateById(baoxiaodan);
    

3. 管理员端:基础数据管理模块(答辩亮点!)

这个功能体现“系统灵活性”,导师超爱问!核心是“维护字典表和公告”,别漏“数据联动”——比如新增“费用类型”后,用户提交报销单时下拉框能自动加载新类型。

页面设计要点

页面标题:管理员-基础数据管理页面
(插入图片位置:此处放“基础数据管理页面截图”,需包含以下元素)

  • 字典管理 tab:
    • 病情类型列表:列名“类型编码、类型名称、操作”,支持“新增/修改/删除”
    • 费用类型列表:同上,新增时校验“类型名称不重复”
  • 公告管理 tab:
    • 公告列表:列名“公告标题、发布时间、操作”,支持“新增/修改/删除”
    • 新增公告弹窗:标题输入框(必填)、富文本编辑器(填公告内容,支持插入图片)、发布时间(默认当前时间,可修改) 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

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

很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“驳回报销单不填意见”,导致系统允许无理由驳回,导师说“不符合管理逻辑”,当场扣分😫 测试一定要针对性做!

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

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

(1)报销单提交测试(表1:报销提交测试用例)
测试场景操作步骤预期结果实际结果测试结论
报销金额为0填金额0元→传身份证→选类型→提交提示“报销金额不能小于0.01元,请重新输入!”
未上传身份证正面填金额500元→不传身份证→选类型→提交提示“请上传身份证正面照片!”
正常提交填金额500元→传身份证→选类型→提交提示“报销单提交成功,待审核!”,状态为待审核
(2)报销单审核测试(表2:审核测试用例)
测试场景操作步骤预期结果实际结果测试结论
驳回不填意见选待审核报销单→选“驳回”→不填意见→提交提示“驳回需填写审核意见,告知用户原因!”
正常审核通过选待审核报销单→看详情→选“通过”→提交提示“审核成功!”,状态变为已通过(绿色)
审核后查状态审核通过后→筛选“已通过”→查该报销单列表中该报销单状态标绿色,显示审核人员
(3)用户登录测试(表3:登录测试用例)
测试场景操作步骤预期结果实际结果测试结论
密码错误账号:user1→密码:1234(正确123456)→登录提示“账号或密码不正确!”
未填手机号账号:空→密码:123456→登录提示“请输入手机号!”
管理员角色登录账号:admin→密码:admin123→登录登录成功,跳管理员首页(显报销单审核入口)

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

别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果报销单列表的状态标色显示错乱,赶紧加兼容性CSS才好:

  • 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
  • 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的响应式布局)

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

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

  • 问题总结:“IE浏览器下状态标色错乱,通过添加IE专属CSS修复;未登录用户能访问审核页面,加Spring Security拦截器控制”
  • 测试结论:“核心功能(报销提交、审核、登录)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”

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

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

  1. 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“用户提交报销单→管理员审核通过→用户查看审核结果”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始报销单编号重复,改成‘用户ID+日期+随机数’生成唯一编号;驳回无理由,加校验强制填意见”,比光说“我用了SSM”有亮点
  3. 准备常见问题:导师大概率问“为啥选SSM不选Spring Boot”“数据多了怎么优化”,提前答:“SSM学习资料多,适合毕业设计;数据多就加索引(如报销单表的yonghu_id和insert_time联合索引),优化查询速度”

最后:毕设通关的小私心

以上就是基于SSM的医疗报销系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。

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

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