医院预约挂号系统
创建于 2025 年 6 月 1 日
项目介绍
医院预约挂号系统是一套完整的就医流程管理系统,覆盖了从”患者想看诊”到”办理住院”的整个闭环。患者注册登录后,可以在挂号大厅按科室筛选当天在诊的医生卡片,查看医生的介绍、挂号费和剩余号数,一键挂号并从余额中扣费;医生登录后可以看到挂了自己号的患者名单,逐个叫号,叫号后系统自动生成一条就诊记录,医生再为患者填写富文本医嘱病历;管理员则负责维护科室、医生、排班、公告等基础数据,并为医嘱需要住院的患者办理住院登记。
项目分为 springboot 后端工程和 vue 前端工程两个部分,配套 xm_hospital_manager.sql 数据库脚本,MySQL 8 建库导入即可运行,种子数据中预置了管理员(admin/123456)、医生(zhang 等五位,密码 123456)和患者(zhangsan 等,密码 123456)账号,登录即用。
项目架构
后端基于 Spring Boot 2.5.9 + Java 8,数据访问层采用 MyBatis(mybatis-spring-boot-starter 2.2.1)配合 XML Mapper 文件,用 PageHelper 1.4.6 做分页,工具库使用 Hutool 5.8.18,身份认证使用 Auth0 java-jwt 4.3.0,服务端口 9090。代码按 Controller、Service、Mapper 三层组织,实体上通过 Account 基类抽象出 Admin、Doctor、User 三类账号,统一用 Result 包装返回、GlobalExceptionHandler 处理异常。
认证方面,登录接口 POST /login 按角色分发到各自的 Service 校验密码,成功后用 TokenUtils.createToken 签发 JWT:token 的 audience 载荷存 id-ROLE,以用户密码作为 HMAC256 签名密钥,有效期 2 小时;JwtInterceptor 拦截请求后从 header 或参数取 token,反解出用户并验签,TokenUtils.getCurrentUser() 供 Service 层获取当前登录人,实现数据级权限隔离——患者分页查挂号记录只能看到自己,医生只能看到挂了自己号的患者。
数据库共 9 张表:admin(管理员)、department(科室)、doctor(医生,含挂号费、职位、科室外键)、plan(排班:医生、就诊数量、周几)、reserve(预约挂号:患者、医生、时间、状态)、record(就诊记录:医嘱病历、是否住院)、registration(住院登记:房号、费用、缴费状态、是否医保、住院状态)、notice(公告)、user(患者,含余额字段)。
前端是 Vue CLI 5 构建的 Vue 2.6 单页应用,UI 组件库使用 Element UI 2.15,路由 vue-router 3.5,网络层基于 axios 封装了统一请求实例;病历编辑集成 wangEditor 4 富文本编辑器,图片上传走后端的 /files/wang/upload 接口。路由分为后台管理(/,侧边菜单按角色 v-if 控制显隐)和前台(/front,顶部轮播公告)两套布局,页面通过 localStorage 缓存登录用户。
核心功能
- 三角色账号体系:登录页下拉选择管理员 / 医生 / 患者三种角色,注册接口只开放患者注册;侧边菜单按角色渲染,例如”医生排班”仅管理员可增删改,“住院登记”对医生隐藏,患者进入预约挂号页时角色非 USER 会被拦截提示
- 科室与医生管理:管理员维护科室列表;医生信息包含头像(文件上传,以”时间戳-文件名”落盘并返回 URL)、简介、职位、入职时间、挂号费和所属科室,医生列表通过
left join department带出科室名称 - 按星期排班:
plan表记录医生在每周几出诊、当天可就诊数量(如星期四、20 人);挂号页调用/doctor/selectPage2,后端用LocalDate的getDayOfWeek().getDisplayName(TextStyle.FULL_STANDALONE, Locale.CHINA)算出当天是星期几,只查出当天在诊的医生,再以”排班数量 − 当天已挂该医生的号数”实时计算每个医生剩余号数,剩余 0 时前端禁用挂号按钮 - 预约挂号与余额扣费:
ReserveService.add中先校验”当天是否已挂过该医生”(重复挂号直接抛异常”您今天已经挂号该医生的号了”),再校验余额是否低于挂号费(不足则提示去个人中心充值),通过后插入记录(状态为”未叫号”)并同步扣除患者余额;取消挂号(仅限未叫号且患者本人)时自动把挂号费退回余额 - 医生叫号与就诊记录:医生在”患者挂号”页对未叫号的记录点击叫号,状态更新为”已叫号”,同时前端调用
/record/add自动同步生成一条当天就诊记录;医生随后用 wangEditor 富文本填写医嘱病历并标记”是否住院”,患者可在”我的就诊”中查看 - 住院登记:管理员对”医嘱为住院且尚未登记”的患者点击住院登记,填写房号、费用、缴费状态(已缴费/未缴费)、是否医保、住院状态(住院中/已出院);
RegistrationService.add会先检查该患者是否已有住院记录,避免重复开单 - 公告轮播:管理员发布公告,前台头部每 2.5 秒轮播一条公告内容,后台首页用 Element UI 时间线展示公告列表
功能截图
暂无运行截图。
快速上手
- 在 MySQL 中新建数据库并导入
xm_hospital_manager.sql(库名xm_hospital_manager,含全部表结构与种子数据),修改springboot/src/main/resources/application.yml中的数据库用户名密码; - 后端在
xm_hospital_manager/springboot目录执行mvn spring-boot:run,服务启动在 9090 端口,首次运行会在工程目录下自动创建files/目录用于存储上传的头像和编辑器图片; - 前端在
xm_hospital_manager/vue目录执行npm install后npm run serve,开发服务器运行在 8080 端口,通过vue.config.js中的代理把/api请求转发到后端 9090(.env.development中VUE_APP_BASEURL=http://localhost:9090); - 浏览器打开
http://localhost:8080,用管理员 admin/123456 体验科室、医生、排班维护,用医生 zhang/123456 体验叫号与病历填写,用患者 zhangsan/123456(余额 200 元)体验挂号、充值与查看病历。
总结
这个项目最大的价值在于把”挂号”这一个动作做成了完整的业务闭环:排班决定可挂什么号,余额决定能不能挂,重复挂号有拦截,取消挂号可退费,叫号后自动落到就诊记录,医嘱住院还能继续流转到住院登记,每一个环节的数据都有对应的表和接口承接,逻辑完整、边界清晰。技术上它是典型的 Spring Boot + MyBatis + Vue 前后端分离教学项目样板:JWT 认证、角色数据隔离、PageHelper 分页、MyBatis 动态 SQL 联表查询、文件上传、富文本编辑一应俱全,非常适合作为学习 SSM 全栈开发的入门参考;后续也可以在此基础上扩展号源时段、短信通知、在线缴费等更贴近真实医院的业务能力。