基于springboot2+vue3的医院挂号就诊系统
温馨提示:
本文最后更新于 2026年05月28日,已超过 13 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
1. 资源
浏览全文可获取
2. 项目简介
本项目是一个医院挂号就诊系统,基于Spring Boot + MyBatis-Plus + MySQL + Vue + layui等技术栈开发。系统主要面向三类角色:管理员、医生、用户(患者)。系统提供以下核心功能:
- 用户(患者)注册、登录、个人信息管理、余额充值。
- 医生管理:包括医生信息(姓名、科室、职位、职称、头像、联系方式、挂号价格、履历介绍等)的增删改查。
- 挂号管理:用户选择医生、时间类型(上午/下午)、挂号日期,生成就诊识别码,提交挂号申请。系统会校验用户余额,自动扣费,并生成审核记录。
- 健康教育:发布和管理健康教育文章(标题、类型、图片、详情),支持分类展示。
- 公告管理:发布医院公告信息。
- 在线咨询:用户可以在线提问,管理员/医生可以回复。
- 字典数据管理:对科室、职位、性别、挂号状态、审核状态等下拉选项进行统一维护。
- 轮播图管理:管理前台首页轮播图。
- 后台报表统计(柱状图、饼状图)等。
系统采用前后端分离架构,后端提供RESTful API,前端分为后台管理(Vue+Element UI)和前台用户端(layui+HTML)。
3. 技术栈
| 层级 | 技术 |
|---|---|
| 后端框架 | Spring Boot 2.2.2.RELEASE, MyBatis-Plus 2.3, Apache Shiro 1.3.2 |
| 数据库 | MySQL 5.7.32-log |
| 前端后台管理 | Vue 2.x, Element UI, ECharts, vue-router, axios |
| 前端用户端 | layui, Vue.js (部分), jQuery, Bootstrap, Swiper |
| 工具库 | Hutool, Fastjson, Commons-lang3, Commons-io, POI (Excel导入导出), |
4. 详细介绍
4.1 模块划分
4.1.1 用户模块 (yonghu)
- 注册/登录:用户名、密码、手机号、身份证号、邮箱,默认密码123456。
- 个人信息维护:头像上传、修改资料。
- 余额充值:支持微信支付、支付宝、银行卡等模拟支付方式。
- 我的挂号:查看本人的挂号记录,审核状态(审核中、通过、拒绝)。
4.1.2 医生模块 (yisheng)
- 医生信息管理:医生工号、账户、密码、姓名、科室、职位、职称、头像、手机、邮箱、挂号价格、挂号须知、履历介绍。
- 医生登录后可以查看自己的挂号列表,并可进行审核处理(通过/拒绝并填写审核意见)。
4.1.3 挂号模块 (guahao)
- 用户选择医生、挂号日期、上午/下午时段,系统生成就诊识别码(时间戳随机数)。
- 自动扣除挂号费用(从用户余额中减去医生设置的挂号价格)。
- 提交后生成审核记录(状态为“审核中”),由医生或管理员审核。
- 挂号状态分为“未就诊”、“已就诊”,审核状态分为“审核中”、“通过”、“拒绝”。
- 支持按时间类型、医生科室、用户等条件筛选查询。
4.1.4 健康教育模块 (jiankangjiaoyu)
- 发布健康教育文章:标题、类型、图片、发布时间、详情内容(富文本)。
- 支持假删除(逻辑删除),前台只展示未删除的文章。
- 类型字典管理。
4.1.5 公告管理 (news)
- 发布公告:标题、图片、类型、发布时间、详情内容。
- 前台按公告类型分类展示。
4.1.6 在线咨询 (chat)
- 用户提问:填写问题内容,状态为“未回复”。
- 管理员/医生在后台回复:回复后状态变为“已回复”,数据类型区分“问题”和“回复”。
- 实时刷新对话列表(前端定时轮询)。
4.1.7 字典管理 (dictionary)
- 维护系统内所有枚举值:科室、职位、性别、挂号时间类型、挂号状态、审核状态、健康教育类型、公告类型、在线咨询状态及数据类型等。
- 支持动态新增/编辑字典项。
4.1.8 系统管理
- 管理员管理 (
users):管理员账号的增删改查。 - 轮播图管理 (
config):配置首页轮播图图片地址。 - 文件上传:支持图片、Excel文件上传。
4.2 数据库设计
主要数据表(来源于db.sql):
| 表名 | 说明 |
|---|---|
yonghu |
用户表,存储账户、密码、姓名、手机、身份证、邮箱、性别、余额、逻辑删除标记 |
yisheng |
医生表,存储工号、账户、密码、姓名、科室、职位、职称、头像、电话、挂号价格、履历等 |
guahao |
挂号表,关联医生和用户,记录挂号时间、时间类型、挂号状态、审核状态、审核结果、就诊识别码 |
jiankangjiaoyu |
健康教育表,标题、类型、图片、发布时间、内容、逻辑删除 |
news |
公告信息表,标题、图片、类型、发布时间、内容 |
chat |
在线咨询表,提问用户、问题、问题时间、回复、回复时间、状态、数据类型 |
dictionary |
字典表,字段编码、编码值、索引名称等,用于所有下拉选项 |
config |
配置表,存储轮播图等系统配置 |
users |
管理员表 |
token |
用户登录token表 |
4.3 关键业务逻辑
- 挂号扣费:用户在
guahao/add接口提交挂号时,后端先查询用户余额是否足够支付医生挂号价格,若不足返回错误;若足够则扣除余额,并插入挂号记录(审核状态默认为“审核中”,挂号状态默认为“未就诊”)。 - 医生审核:医生登录后,在挂号管理列表中可以看到待审核的挂号,填写审核意见并通过/拒绝。通过后用户可看到挂号成功。
- 字典转换:后端通过
DictionaryService.dictionaryConvert方法,根据dictionaryMap(项目启动时从数据库加载存入ServletContext)将数字类型字段(如yishengTypes)转换为对应的中文名称(如yishengValue),方便前端展示。 - 权限控制:使用Shiro + 自定义
AuthorizationInterceptor,通过Token验证用户身份;注解@IgnoreAuth标记的接口可免登录访问(如前端首页列表、登录注册接口)。 - 文件上传:
FileController接收multipart文件,保存到/upload/目录下,返回文件名,用于图片存储。
4.4 部署说明
- 环境要求:JDK 1.8, MySQL 5.7, Maven, Node.js (前端后台构建)。
- 数据库初始化:执行
db.sql文件创建数据库和表,并插入基础数据(字典数据、管理员账号admin/admin、测试医生和用户等)。 - 修改配置文件:
application.yml中修改数据库连接地址、用户名、密码。 - 后端启动:运行
yiyuanguanhaojiuzhenApplication类的main方法,默认端口8080,上下文路径/yiyuanguanhaojiuzhen。 - 前端启动:
- 后台管理:进入
src/main/resources/admin/admin目录,执行npm install,npm run serve,默认访问地址http://localhost:8080/yiyuanguanhaojiuzhen/admin/dist/index.html。5. 部分代码
5.1 挂号Controller(
```javaGuahaoController.java)
/** - 前端保存(用户挂号)
*/
@RequestMapping("/add")
public R add(@RequestBody GuahaoEntity guahao, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,guahao:{}",this.getClass().getName(),guahao.toString());
WrapperqueryWrapper = new EntityWrapper ()
logger.info("sql语句:"+queryWrapper.getSqlSegment());.eq("yisheng_id", guahao.getYishengId()) .eq("yonghu_id", guahao.getYonghuId()) .eq("guahao_uuin_number", guahao.getGuahaoUuinNumber()) .eq("guahao_types", guahao.getGuahaoTypes()) .eq("guahao_status_types", guahao.getGuahaoStatusTypes()) .eq("guahao_yesno_types", guahao.getGuahaoYesnoTypes()) .eq("guahao_yesno_text", guahao.getGuahaoYesnoText()) ;
GuahaoEntity guahaoEntity = guahaoService.selectOne(queryWrapper);
if(guahaoEntity==null){
}else {guahao.setGuahaoYesnoTypes(1); guahao.setCreateTime(new Date()); YonghuEntity userId = yonghuService.selectById((Integer) request.getSession().getAttribute("userId")); YishengEntity yishengEntity = yishengService.selectById(guahao.getYishengId()); if(userId.getNewMoney()<yishengEntity.getYishengNewMoney()){ return R.error("余额不足请充值"); } userId.setNewMoney(userId.getNewMoney()-yishengEntity.getYishengNewMoney()); boolean b = yonghuService.updateById(userId); if(!b){ return R.error(); } guahaoService.insert(guahao); return R.ok();
}return R.error(511,"表中有相同数据");
}
```
- 后台管理:进入
5.2 字典表转换工具(DictionaryServiceImpl.java)
public void dictionaryConvert(Object obj, HttpServletRequest request) {
// 获取所有Types字段,通过反射将其值转换为对应的中文名称
List<String> fieldNameList = new ArrayList<>();
// ... 反射获取字段
ServletContext servletContext = request.getServletContext();
Map<String, Map<Integer, String>> dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
for (String s : fieldNameList) {
Field types = obj.getClass().getDeclaredField(s);
Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value"));
types.setAccessible(true);
value.setAccessible(true);
int codeIndex = Integer.parseInt(String.valueOf(types.get(obj)));
// 根据dicCode获取映射表
String dicCode = s.replace("Types","").replaceAll("([A-Z])", "_$1").toLowerCase();
String indexName = dictionaryMap.get(dicCode).get(codeIndex);
value.set(obj, indexName);
}
}
5.3 用户注册接口(YonghuController.java)
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody YonghuEntity yonghu){
Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>()
.eq("username", yonghu.getUsername())
.or()
.eq("yonghu_phone", yonghu.getYonghuPhone())
.or()
.eq("yonghu_id_number", yonghu.getYonghuIdNumber())
.eq("yonghu_delete", 1);
YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);
if(yonghuEntity != null)
return R.error("账户或者用户手机号或者用户身份证号已经被使用");
yonghu.setNewMoney(0.0);
yonghu.setYonghuDelete(1);
yonghu.setCreateTime(new Date());
yonghuService.insert(yonghu);
return R.ok();
}
5.4 前端挂号添加页面(add.html部分)
<form class="layui-form layui-form-pane add" lay-filter="myForm">
<div class="layui-form-item">
<label class="layui-form-label">就诊识别码</label>
<div class="layui-input-block">
<input v-model="detail.guahaoUuinNumber" type="text" readonly>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">挂号时间</label>
<div class="layui-input-block">
<input type="text" name="guahaoTime" id="guahaoTime" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">时间状态</label>
<div class="layui-input-block">
<select name="guahaoTypes" id="guahaoTypesList">
<option value="">请选择</option>
<option v-for="item in guahaoTypesList" :value="item.codeIndex">{{ item.indexName }}</option>
</select>
</div>
</div>
<button lay-submit lay-filter="thisSubmit">提交</button>
</form>
6. 部分截图




























7. 项目总结
本项目实现了医院挂号就诊的核心业务流程,包括用户管理、医生管理、在线挂号、健康教育、公告发布、在线咨询等功能。技术选型合理,后端采用Spring Boot + MyBatis-Plus简化开发,前端后台使用Vue+Element UI提升管理效率,前台使用layui保证轻量快速。系统具备以下特点:
- 角色分明:管理员、医生、用户三级权限隔离,各司其职。
- 完整的挂号流程:选择医生 → 预约时段 → 自动扣费 → 医生审核 → 就诊状态跟踪。
- 数据字典支持:所有枚举值通过数据库动态管理,便于扩展。
- 安全控制:Token验证、SQL注入过滤、逻辑删除保护数据。
该系统可作为中小型医院或诊所的基础信息化平台,具备良好的可维护性和扩展性。
正文到此结束
- 本文标签: Spring Boot Java 毕业设计
- 本文链接: https://blog.xiaobias.com/article/17
- 版权声明: 本文由十五喵原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
