ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java医院预约挂号系统源码实战:SpringBoot+微信小程序号源扣减与避坑指南

Java医院预约挂号系统源码实战:SpringBoot+微信小程序号源扣减与避坑指南 简介这是一套面向Java后端与微信小程序开发者的医院预约挂号系统完整源码采用SpringBoot MyBatisPlus MySQL Redis架构前台基于uni-app与Vue构建微信小程序适合作为课程设计、毕业设计或全栈练手项目。系统分为用户端、管理员后台与医生后台三部分用户端支持注册登录、预约挂号、核酸检测预约与记录查询、查看医院公告与坐诊信息、管理就诊人及导航到院管理员可管理用户、排班、预约记录、科室、疾病、职位、医生、医院信息与公告医生端则可设置排班并查看预约订单。资源包共185个文件以113个vue组件、41个js脚本、10个scss样式为主另含json配置、md说明与字体图标等压缩包约517KB结构清晰便于二次开发。目前已有2378人学习下载可帮助读者快速理解预约挂号业务闭环与前后端分离实现思路。1. 从一份 Java 医院预约挂号系统源码说起它到底能跑通什么很多做 Java 后端的同行简历上写着熟悉 SpringBoot 整合微信小程序但真到面试被追问预约挂号怎么防重复下单医生排班和号源怎么扣减时往往答不上来。这份 Java 医院预约挂号系统 - 微信小程序源码恰好是一个能把这些链路跑通的完整工程后台用 SpringBoot MyBatisPlus MySQL Redis前台是 uni-app Vue 编译出的微信小程序。它覆盖了患者端注册登录、预约记录、核酸检测、医院公告、坐诊信息、就诊人管理、导航到院管理员端有用户、排班、预约记录、科室、疾病、职位、医生、医院信息、公告等模块医生端能设置排班、查看预约自己的订单。适合正在做医疗类小程序毕设、想补一套完整业务闭环的后端以及需要参考号源与排班模型的产品同学。下面我按能跑起来 → 能改得动 → 不踩坑的顺序拆一遍。2. 环境搭建与工程结构把 SpringBoot 后端和 uni-app 小程序分别拉起来拿到压缩包后别急着双击运行先看清楚它其实是两个工程一个 Java 后端Maven 项目一个 uni-app 前端编译到微信小程序。这两块的环境依赖完全不同混在一起配环境是新手最容易翻车的地方。我一般会先把后端跑通、接口能返回 JSON再去动前端否则前端报错你根本分不清是接口没起还是小程序配置问题。2.1 后端依赖版本与数据库初始化后端是标准的 SpringBoot 工程持久层用 MyBatisPlus缓存走 Redis。JDK 建议 1.8 或 11Maven 3.6。数据库先建库再导表字符集用 utf8mb4否则医院名称、科室描述里的生僻字会变问号。# 1. 建库字符集必须是 utf8mb4不然中文和 emoji 会乱码 mysql -uroot -p -e CREATE DATABASE hospital_reg DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 2. 导入源码里的 sql 文件一般在 doc 或 sql 目录下 mysql -uroot -p hospital_reg hospital_reg.sql # 3. 确认表是否齐全重点看这几张核心表 mysql -uroot -p hospital_reg -e SHOW TABLES;导入后重点确认user用户、doctor医生、schedule排班、appointment预约记录、department科室这几张表存在。MyBatisPlus 默认开启驼峰映射数据库字段用下划线、实体类用驼峰即可不用额外写 resultMap。Redis 默认连本地 6379如果本机没装 Redis要么装一个要么在配置文件里把缓存相关 Bean 暂时注释掉否则启动会直接抛连接异常。2.2 配置文件里必须改的四个参数application.yml里有几处是拿到手就必须改的不改连不上spring: datasource: url: jdbc:mysql://localhost:3306/hospital_reg?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root # 改成你自己的数据库账号 password: your_password # 改成你自己的密码 redis: host: localhost port: 6379 database: 0 server: port: 8080 # 后端端口前端请求地址要和它一致serverTimezoneAsia/Shanghai这个参数别省少了它预约时间会差 8 小时排班日期直接错位这是血泪经验。端口 8080 如果被占用改成 8081 后记得同步改前端请求的 baseURL两边不一致就是 404。2.3 uni-app 前端编译到微信小程序前端是 uni-app Vue需要用 HBuilderX 打开或者用 CLI 方式编译。编译目标选微信小程序产物在unpackage/dist/dev/mp-weixin目录然后用微信开发者工具导入这个目录。# CLI 方式编译如果工程支持 npm install npm run dev:mp-weixin # 产物目录unpackage/dist/dev/mp-weixin导入微信开发者工具后第一件事是在详情 → 本地设置里勾选不校验合法域名因为本地后端是 http 且没有备案域名不勾选请求会被拦截。前端请求的 baseURL 一般写在common/request.js或config.js里把它改成http://localhost:8080。注意微信开发者工具里 localhost 指向的是你本机能通但真机预览时 localhost 不通得换成局域网 IP这是两码事。3. 核心业务链路拆解登录、排班、预约、号源扣减怎么串起来环境跑通只是第一步真正值钱的是这套系统怎么把用户登录 → 选科室 → 选医生 → 选排班 → 下单预约 → 扣号源这条链路串起来。这部分逻辑如果理解不透改需求时就会到处打补丁。我按数据流顺序拆。3.1 微信小程序登录与手机号获取小程序登录不是传统的账号密码而是wx.login拿 code后端拿 code 去换 openid再生成自己的 token。源码里登录逻辑一般在这几个文件前端pages/login后端LoginControllerWxService。// 前端先拿 code再发给后端换 token wx.login({ success: (res) { // res.code 是一次性凭证5 分钟内有效 uni.request({ url: baseUrl /wx/login, method: POST, data: { code: res.code }, success: (r) { // 后端返回 token存本地后续请求带上 uni.setStorageSync(token, r.data.data.token) } }) } })后端拿到 code 后调用微信接口换 openid再用 openid 查user表存在就签发 token不存在就自动注册一条。token 一般用 JWT 或存 Redis源码里若用 Redis 存 token注意设置过期时间否则用户量上来内存会涨。手机号获取是另一个接口getPhoneNumber需要用户点击按钮授权前端拿到加密的encryptedData和iv后端解密后写入用户表。这里有个坑手机号授权是付费能力个人小程序账号用不了测试时先用假数据绕过。3.2 排班模型与号源扣减的并发处理排班表schedule一般存医生 ID、科室 ID、坐诊日期、时段上午/下午、总号源数、剩余号源数。医生端设置排班就是往这张表插记录患者端查看坐诊信息就是按科室和日期查这张表。预约下单时核心是扣减剩余号源。如果只是UPDATE schedule SET remain remain - 1 WHERE id ?高并发下会超卖。正确做法是加条件判断让数据库层面保证不会扣成负数-- 关键WHERE 里带 remain 0影响行数为 0 就说明号源已抢完 UPDATE schedule SET remain remain - 1 WHERE id #{scheduleId} AND remain 0;在 Service 层判断这个 UPDATE 的返回行数等于 0 就抛号源已约满等于 1 才继续插appointment记录。这样即使两个请求同时进来数据库行锁也会保证只有一个成功。如果源码里没做这个判断直接扣减那就是个隐藏的坑上线前必须补。Redis 在这里通常用来缓存科室列表、公告这类读多写少的数据减少数据库压力但号源扣减不建议只靠 Redis最终一致性还是落库为准。3.3 预约记录与就诊人管理的数据关系一个用户可以有多个就诊人自己、家人所以appointment表里存的是就诊人 ID 而不是用户 ID。就诊人表patient存姓名、身份证、手机号和user表是一对多。查我的预约记录时要按当前登录用户关联出他名下所有就诊人的预约SQL 大概是appointmentjoinpatientonpatient.user_id 当前用户。-- 查当前用户的所有预约记录含就诊人信息 SELECT a.*, p.name AS patient_name, d.name AS doctor_name, s.work_date FROM appointment a LEFT JOIN patient p ON a.patient_id p.id LEFT JOIN doctor d ON a.doctor_id d.id LEFT JOIN schedule s ON a.schedule_id s.id WHERE p.user_id #{userId} ORDER BY a.create_time DESC;这里注意如果就诊人被删除历史预约记录不能跟着消失所以appointment里最好冗余存一份就诊人姓名快照或者用逻辑删除。源码里如果直接物理删除就诊人历史订单会查不到名字这是个常见设计缺陷。4. 避坑与常见问题排查启动失败、跨域、时间错乱的定位思路这套系统涉及 Java 后端、MySQL、Redis、微信小程序四端任何一端配置不对都跑不起来。下面几条是我实际部署这类项目时最常遇到的按现象 → 原因 → 解决整理照着排查能省不少时间。4.1 后端启动报 Redis 连接异常现象SpringBoot 启动直接失败日志里一堆Unable to connect to Redis。原因本机没装 Redis或者端口不是 6379或者 Redis 设了密码但配置里没写。解决先redis-cli ping确认 Redis 活着没装就装一个或者把用到缓存的 Service 里Cacheable之类注解先注释掉让项目能起来再补。别硬扛着不装缓存这块后面调试还会用到。4.2 小程序请求全部 404 或跨域现象前端页面能打开但所有数据都是空的控制台报 404 或不在以下 request 合法域名列表中。原因baseURL 写错、后端没起、或者微信开发者工具没关域名校验。解决先在浏览器直接访问http://localhost:8080/接口路径能返回 JSON 说明后端没问题然后检查前端 baseURL 端口是否和后端一致最后确认开发者工具里勾了不校验合法域名。真机预览时把 localhost 换成电脑局域网 IP手机和电脑连同一个 WiFi。4.3 预约时间差 8 小时现象用户选的上午 9 点存进数据库变成凌晨 1 点或者排班日期整体偏移一天。原因JDBC 连接串没配serverTimezone或者实体类时间字段用了java.util.Date而没做格式化。解决连接串加上serverTimezoneAsia/Shanghai实体类时间字段统一用LocalDateTime或LocalDateMyBatisPlus 对这两个类型支持更好别混用 Date。4.4 号源被约超现象明明只剩 1 个号两个人同时点预约都成功了。原因扣减号源的 SQL 没带remain 0条件或者先查再改中间有时间窗口。解决改成UPDATE ... WHERE id ? AND remain 0用返回行数判断成败不要先 SELECT 再 UPDATE。这是并发场景的经典坑面试也常问。4.5 手机号授权拿不到数据现象点授权按钮没反应或者后端解密报错。原因个人小程序账号没有手机号获取权限或者session_key过期。解决开发阶段先用假手机号跳过或者用测试号session_key有效期短解密前要确保是刚 login 拿到的别缓存太久。5. 二次开发与验证技巧怎么确认你改的号源逻辑真的生效把项目跑起来只是及格能验证自己改的逻辑对不对才算过关。号源扣减这种并发逻辑光看代码不放心我一般会写个简单的压测脚本或者用工具并发打接口看最终剩余号源和预约记录数是否对得上。# 用 Python 并发打预约接口验证号源不会超卖 import threading, requests BASE http://localhost:8080 TOKEN 你的测试token SCHEDULE_ID 1 # 假设这个排班只剩 1 个号 def book(): r requests.post(f{BASE}/appointment/book, json{scheduleId: SCHEDULE_ID, patientId: 1}, headers{token: TOKEN}) print(r.json().get(msg)) # 开 10 个线程同时抢 threads [threading.Thread(targetbook) for _ in range(10)] for t in threads: t.start() for t in threads: t.join()跑完去数据库查SELECT remain FROM schedule WHERE id 1如果结果是 0且appointment表只多了 1 条记录说明扣减逻辑是安全的如果 remain 变成负数或者预约记录多了好几条说明还有并发漏洞回去检查 SQL 的 WHERE 条件。这个验证方法比盯着代码看靠谱得多。另外几个二次开发时常用的技巧科室、公告这类数据改动不频繁可以加 Redis 缓存但改完数据记得清缓存否则页面不更新医生排班如果要做停诊不要删记录加个状态字段标记否则已预约的用户记录会关联不上小程序顶部导航栏高度在不同机型不一样用uni.getSystemInfoSync().statusBarHeight动态算别写死。我自己的习惯是每次改完涉及号源、金额、库存这类核心逻辑都强制走一遍并发压测 数据库核对这两步不靠肉眼判断。这套医院预约挂号系统源码结构清晰业务闭环完整拿来练手或者做毕设都够用但上面这些坑该补的还得补。希望帮到你。本文还有配套的精品资源点击获取
返回列表