原创

基于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 installnpm run serve,默认访问地址http://localhost:8080/yiyuanguanhaojiuzhen/admin/dist/index.html

      5. 部分代码

      5.1 挂号Controller(GuahaoController.java

      ```java
      /**
    • 前端保存(用户挂号)
      */
      @RequestMapping("/add")
      public R add(@RequestBody GuahaoEntity guahao, HttpServletRequest request){
      logger.debug("add方法:,,Controller:{},,guahao:{}",this.getClass().getName(),guahao.toString());
      Wrapper queryWrapper = new EntityWrapper()
      .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())
      ;
      
      logger.info("sql语句:"+queryWrapper.getSqlSegment());
      GuahaoEntity guahaoEntity = guahaoService.selectOne(queryWrapper);
      if(guahaoEntity==null){
      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();
      
      }else {
      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. 部分截图

img1
img2
img3
img4
img5
img6
img7
img8
img9
img10
img11
img12
img13
img14
img15
img16
img17
img18
img19
img20
img21
img22
img23
img24
img25
img26
img27
img28

7. 项目总结

本项目实现了医院挂号就诊的核心业务流程,包括用户管理、医生管理、在线挂号、健康教育、公告发布、在线咨询等功能。技术选型合理,后端采用Spring Boot + MyBatis-Plus简化开发,前端后台使用Vue+Element UI提升管理效率,前台使用layui保证轻量快速。系统具备以下特点:

  • 角色分明:管理员、医生、用户三级权限隔离,各司其职。
  • 完整的挂号流程:选择医生 → 预约时段 → 自动扣费 → 医生审核 → 就诊状态跟踪。
  • 数据字典支持:所有枚举值通过数据库动态管理,便于扩展。
  • 安全控制:Token验证、SQL注入过滤、逻辑删除保护数据。

该系统可作为中小型医院或诊所的基础信息化平台,具备良好的可维护性和扩展性。

自助获取:https://fifteen.xiaobias.com/source/210

正文到此结束