这次我们来看一个完整的医院挂号预约小程序项目。这个项目基于 Spring Boot + Vue + UniApp 技术栈,是一个典型的“前后端分离 + 跨端小程序”的实战案例,非常适合作为计算机相关专业的毕业设计、课程设计,或者用于学习全栈开发流程。
项目最核心的价值在于它提供了一个可直接运行、功能闭环的医院挂号业务场景。它不是一个简单的 Demo,而是包含了用户端小程序、后台管理界面、完整的后端 API 以及数据库设计。对于正在寻找毕设选题的同学,或者想深入理解 Spring Boot、Vue 和 UniApp 如何协同工作的开发者来说,这个项目能让你快速上手,避免从零搭建的繁琐。
本文将带你从零开始,完成这个项目的环境搭建、本地运行、功能测试以及部署上线的全流程。我们会重点关注几个关键点:如何快速启动前后端服务、如何配置微信开发者工具、核心业务接口的调用逻辑、以及在实际部署中可能遇到的典型问题。无论你是想直接复用这个项目,还是想学习其架构设计,这篇文章都能提供清晰的指引。
1. 核心能力速览
在深入代码之前,我们先通过一个表格快速了解这个项目的整体情况和技术规格,让你判断它是否符合你的需求。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 全栈 Web 应用 + 微信小程序 |
| 技术栈 | 后端:Spring Boot + MyBatis-Plus + MySQL 前端管理端:Vue 2.x / 3.x + Element UI 用户小程序端:UniApp (Vue语法) |
| 核心功能 | 用户端:登录注册、科室医生查询、在线挂号、预约记录、取消预约、个人中心 管理端:用户管理、科室管理、医生管理、排班管理、预约订单管理、数据统计 |
| 部署方式 | 本地开发:IDEA + Node.js + 微信开发者工具 服务器部署:可打包为 Jar (后端) 和静态资源 (前端),支持 Docker 容器化 |
| 数据交互 | 前后端完全分离,通过 RESTful API 通信,使用 JWT 进行用户认证与授权 |
| 适合场景 | 计算机专业毕业设计、课程设计、全栈开发学习、微信小程序入门实战 |
| 学习价值 | 理解多端协同开发、掌握 Spring Boot 后端 API 设计、熟悉 UniApp 跨端开发、实践完整的业务流程 |
2. 适用场景与使用边界
这个项目主要服务于以下几类人群:
- 高校学生(毕设/课设):如果你正在为计算机科学、软件工程等专业的毕业设计或课程设计寻找一个“业务清晰、技术栈主流、代码完整”的项目,那么这个医院挂号系统是一个绝佳的选择。它避免了从零构思业务的痛苦,让你能专注于技术实现和论文撰写。
- 全栈开发初学者:对于想学习如何将 Spring Boot、Vue 和微信小程序串联起来的开发者,本项目提供了一个完整的脚手架。你可以清晰地看到用户在小程序点击“挂号”后,请求是如何经过 UniApp、到达 Spring Boot 后端、再操作数据库并返回结果的完整链路。
- 微信小程序开发者:如果你有 Vue 基础,想尝试用 UniApp 开发微信小程序,这个项目展示了如何组织小程序页面、调用后端 API、处理用户授权登录等常见场景。
使用边界与注意事项:
- 非生产级:该项目作为学习/毕设用途,在安全性(如 SQL 注入防护、XSS 攻击)、高并发处理、支付集成(如需真实支付,需申请微信支付商户号并合规开发)等方面可能未做深度优化,不建议直接用于线上商业运营。
- 数据合规:项目涉及用户手机号、预约记录等敏感信息。在实际部署时,必须考虑《个人信息保护法》等相关法规,做好数据加密存储、访问日志记录和用户隐私协议。
- 功能完整性:作为教学项目,它实现了核心挂号流程。但真实的医院系统还涉及号源同步、叫号系统、医保对接、报告查询等复杂模块,这些需要根据实际需求进行二次开发。
3. 环境准备与前置条件
要成功运行本项目,你的开发环境需要满足以下条件。请务必在开始前逐一检查。
1. 后端开发环境:
- JDK:版本 1.8 或 11(推荐 1.8,兼容性最好)。在终端输入
java -version验证。 - Maven:用于管理 Spring Boot 项目依赖。在终端输入
mvn -v验证。 - IDE:IntelliJ IDEA(推荐)或 Eclipse。
- MySQL:版本 5.7 或 8.0。需要提前安装并启动服务。
2. 前端开发环境:
- Node.js:版本 14.x 或 16.x(建议使用 LTS 版本)。在终端输入
node -v和npm -v验证。 - 包管理工具:npm 或 yarn(推荐使用 npm,与项目默认配置一致)。
- IDE:Visual Studio Code(推荐)或 WebStorm。
3. 微信小程序端环境:
- 微信开发者工具:前往微信公众平台官网下载并安装最新稳定版。
- 微信小程序账号:需要注册一个微信小程序账号,获取唯一的
AppID,用于真机调试和上传。
4. 其他工具:
- Git:用于克隆项目代码。
- Postman 或 Apifox:用于测试后端 API 接口。
- Redis(可选):如果项目中使用 Redis 做缓存或会话管理,则需要安装。本项目基础版本可能未包含,请根据实际代码判断。
4. 安装部署与启动方式
我们按照“后端 -> 前端管理端 -> 微信小程序端”的顺序启动整个系统。
4.1 后端 Spring Boot 服务启动
步骤 1:获取项目代码假设项目已托管在 Git 仓库(如 Gitee 或 GitHub)。使用 Git 克隆到本地。
git clone [项目仓库地址] cd hospital-booking-backend # 进入后端项目目录步骤 2:导入数据库
- 在 MySQL 中创建一个新的数据库,例如
hospital_booking。 - 在项目目录的
/sql或/doc文件夹下找到数据库脚本文件(通常是hospital_booking.sql)。 - 使用 MySQL 客户端或命令行工具执行该 SQL 文件,初始化表结构和基础数据(如管理员账号、科室信息等)。
-- 示例:在 MySQL 命令行中执行 mysql -u root -p hospital_booking < /path/to/hospital_booking.sql步骤 3:修改配置文件找到后端项目的配置文件,通常是src/main/resources/application.yml或application.properties。修改其中的数据库连接信息、Redis配置(如有)等。
# application.yml 示例配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hospital_booking?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: your_password # 如果项目包含文件上传,可能需要配置上传路径 servlet: multipart: max-file-size: 10MB max-request-size: 100MB # JWT 密钥配置(需与前端一致) jwt: secret: your_jwt_secret_key_here # 请修改为一个复杂的随机字符串 expire: 604800 # token 过期时间(秒),例如7天步骤 4:启动后端服务在 IDEA 中直接找到主启动类(通常命名为Application或*Application),右键运行即可。或者使用 Maven 命令启动:
# 在项目根目录下执行 mvn spring-boot:run看到控制台输出类似Started Application in 5.123 seconds (JVM running for 5.789)的日志,且没有报错,说明后端启动成功。默认端口可能是8080,你可以在配置文件中修改server.port。
4.2 前端 Vue 管理端启动
步骤 1:进入前端项目目录通常项目结构会有一个admin-frontend或vue-admin的文件夹。
cd ../hospital-booking-admin # 进入前端管理端目录步骤 2:安装依赖
npm install # 或使用淘宝镜像加速 # npm install --registry=https://registry.npmmirror.com此过程会下载所有依赖包,可能需要一些时间。
步骤 3:配置 API 地址找到前端项目的配置文件,通常是src/config/index.js、.env.development或vue.config.js。将其中指向后端 API 的地址修改为你本地启动的后端地址。
// src/config/index.js 示例 module.exports = { baseUrl: 'http://localhost:8080/api/', // 确保这里指向正确的后端地址和端口 // ... 其他配置 }步骤 4:启动开发服务器
npm run serve启动成功后,命令行会提示访问地址,通常是http://localhost:8081。用浏览器打开此地址,即可看到管理后台登录界面。
4.3 微信小程序 UniApp 端启动
步骤 1:进入小程序项目目录进入uni-app或mp-weixin目录。
cd ../hospital-booking-mp # 进入小程序端目录步骤 2:安装依赖
npm install步骤 3:配置小程序信息
- 在
manifest.json文件中,配置你的微信小程序AppID。 - 在项目根目录或
config文件夹下,找到 API 配置文件(如config.js),将后端 API 地址修改为本地地址。注意:微信小程序要求 HTTPS 或本地 IP(如http://127.0.0.1),不能直接使用localhost。开发阶段,可以在微信开发者工具中开启“不校验合法域名”选项。
// config.js 示例 const baseUrl = 'http://127.0.0.1:8080/api/'; // 使用IP地址 export default { baseUrl };步骤 4:运行与预览
- 在 HBuilderX(如果使用)或命令行中,运行
npm run dev:mp-weixin,项目将被编译到dist/dev/mp-weixin目录。 - 打开微信开发者工具,选择“导入项目”,目录指向上述编译生成的
dist/dev/mp-weixin文件夹,并填入你的小程序 AppID。 - 在微信开发者工具中点击“编译”,即可在模拟器中看到小程序界面。
5. 功能测试与效果验证
系统启动后,我们需要验证核心业务流程是否通畅。我们从管理员后台和用户小程序两个角度进行测试。
5.1 管理员后台功能测试
测试目标:验证管理员能否通过后台管理系统对基础数据和预约订单进行管理。
登录测试:
- 操作:访问
http://localhost:8081,使用初始化的管理员账号(通常在数据库脚本中设置,如admin/123456)登录。 - 预期:成功跳转到后台管理首页,侧边栏菜单正常加载。
- 失败排查:检查后端服务是否运行、数据库连接是否正确、密码是否匹配。
- 操作:访问
科室与医生管理测试:
- 操作:在后台找到“科室管理”和“医生管理”菜单,尝试新增一个科室(如“皮肤科”),然后在该科室下新增一位医生,填写姓名、职称、简介、头像(可上传测试图片)等信息。
- 预期:新增成功,列表页能立即看到新增的记录。这验证了后端
CRUD接口和前端的表单提交、图片上传功能是否正常。 - 失败排查:检查文件上传路径权限、后端接口日志、前端网络请求(F12开发者工具查看Console和Network)。
排班管理测试:
- 操作:为刚才新增的医生设置排班,选择日期、时间段(上午/下午)、可预约总数。
- 预期:排班信息创建成功。这是挂号业务的基石。
预约订单查看测试:
- 操作:在“预约管理”或“订单管理”菜单中查看所有预约记录。
- 预期:能够看到预约列表,包含用户信息、医生信息、预约时间、状态(待就诊/已取消/已完成)等。尝试操作“取消预约”或“完成就诊”。
- 失败排查:确保小程序端有用户成功创建了预约订单。
5.2 微信小程序端功能测试
测试目标:模拟真实用户完成从登录到挂号的完整流程。
微信登录授权测试:
- 操作:在微信开发者工具模拟器中,点击小程序首页的“登录”或“我的”页面触发登录。
- 预期:弹出微信授权窗口(模拟),授权后,小程序成功获取到
openid或unionid并发送到后端,后端生成JWT Token返回,小程序本地存储Token,界面显示已登录状态(如显示昵称和头像)。 - 失败排查:这是最常见的坑。检查小程序
AppID配置、后端登录接口逻辑(接收code调用微信接口换取openid)、JWT生成和返回格式。
首页与科室浏览测试:
- 操作:登录后,浏览首页推荐的科室或医生,点击进入科室列表页。
- 预期:页面正常渲染,数据来自后端接口。滑动流畅,无白屏或错误。
核心挂号流程测试:
- 操作:
- 选择一个科室,进入医生列表。
- 选择一位有排班的医生,进入医生详情页。
- 选择可预约的日期和时间段。
- 点击“立即预约”,确认订单信息并提交。
- 预期:提交后,页面提示“预约成功”,并跳转到“我的预约”页面。在该页面能看到刚创建的、状态为“待就诊”的订单。
- 失败排查:这是业务核心。重点检查:选择时间段时,前端是否正确传递了
doctor_id、schedule_id;提交订单时,请求体是否包含必要的患者信息(如姓名、手机号,可从登录用户信息带出);后端接口是否校验了号源余量并进行了减库存操作。
- 操作:
取消预约测试:
- 操作:在“我的预约”页面,找到刚才创建的订单,点击“取消预约”。
- 预期:弹出确认框,确认后订单状态变为“已取消”。同时,后台该时间段的号源余量应恢复(如果业务逻辑如此设计)。
- 失败排查:检查取消接口的逻辑,是否做了状态校验(如只能取消“待就诊”的订单)和库存回滚。
6. 接口 API 与批量任务
理解项目的 API 设计是深入学习和二次开发的关键。本项目采用 RESTful 风格,前后端通过 JSON 格式交换数据。
6.1 核心 API 接口示例
以下是一些关键接口的调用示例,你可以使用 Postman 进行独立测试。
1. 用户登录(微信静默登录/密码登录):
POST /api/auth/login HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "code": "微信小程序登录凭证 code", // 用于微信登录 // 或使用账号密码登录 // "username": "patient01", // "password": "123456" }成功响应:
{ "code": 200, "msg": "登录成功", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "userInfo": { "userId": 1, "nickname": "微信用户", "avatar": "https://..." } } }后续请求需要在Header中携带Authorization: Bearer {token}。
2. 查询某科室下的医生列表(带分页):
GET /api/doctor/list?deptId=1&pageNum=1&pageSize=10 HTTP/1.1 Host: localhost:8080 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...3. 查询医生的排班信息:
GET /api/schedule/doctor/3?date=2023-10-27 HTTP/1.1 Host: localhost:8080 Authorization: Bearer {token}4. 创建预约订单:
POST /api/order/create HTTP/1.1 Host: localhost:8080 Authorization: Bearer {token} Content-Type: application/json { "doctorId": 3, "scheduleId": 15, "patientName": "张三", "patientPhone": "13800138000", "appointmentDate": "2023-10-27", "timeSlot": "上午" }6.2 后台批量任务处理
在实际医院场景中,可能存在批量任务需求,本项目虽未直接实现,但可以基于现有架构扩展:
- 批量导入医生/排班:可以在管理后台开发一个功能,允许上传 Excel 文件,后端解析后批量插入数据库。Spring Boot 可以使用
EasyExcel或Apache POI库实现。 - 定时任务:使用 Spring Boot 的
@Scheduled注解实现定时任务,例如:- 每晚清理过期预约:将超过预约时间未支付的订单自动取消,释放号源。
- 生成每日统计报表:统计各科室的预约量、取消率等。
// 示例:每天凌晨1点执行 @Component public class ScheduleTask { @Scheduled(cron = "0 0 1 * * ?") public void cancelExpiredOrders() { // 1. 查询所有状态为“待支付”且已过期的订单 // 2. 批量更新状态为“已取消” // 3. 对应排班的号源余量增加 System.out.println("执行取消过期订单任务..."); } }- 消息队列(高级):对于高并发下的预约请求,可以引入消息队列(如 RabbitMQ、RocketMQ)进行削峰填谷,将下单请求异步处理,提高系统稳定性。
7. 资源占用与性能观察
作为一个教学级项目,在本地开发环境下资源占用通常不高,但了解如何观察和优化对学习很有帮助。
- 后端 (Spring Boot Jar 包):
- 内存:启动后,根据堆内存设置(
-Xmx),通常占用 300MB - 800MB。可以使用jconsole、jvisualvm或Arthas工具监控。 - CPU:在无并发请求时几乎无占用。在接口压测时,CPU 使用率会上升,主要消耗在业务逻辑处理和数据库 I/O。
- 内存:启动后,根据堆内存设置(
- 前端开发服务器 (Node.js):
- 内存:
npm run serve启动的 dev server 通常占用 100MB - 200MB。 - CPU:主要在代码热重载(HMR)时有短暂波动。
- 内存:
- 数据库 (MySQL):
- 数据量不大时,内存占用很小。性能瓶颈通常出现在复杂的联表查询上,需要为高频查询字段(如
doctor_id,schedule_date)建立索引。
- 数据量不大时,内存占用很小。性能瓶颈通常出现在复杂的联表查询上,需要为高频查询字段(如
- 微信开发者工具:
- 工具本身会占用一定内存和 CPU,模拟器运行小程序也会消耗资源。
性能优化建议:
- 数据库索引:确保
order表的user_id,schedule_id,status等字段有索引。 - API 响应优化:对于列表查询,务必使用分页。避免一次性查询大量数据。
- 静态资源缓存:将前端 Vue 项目打包后,将静态文件(JS、CSS、图片)部署到 Nginx 并配置缓存策略,或使用 CDN。
- JVM 参数调优(生产环境):根据服务器内存调整 Spring Boot 应用的启动参数,例如
-Xms512m -Xmx1024m。
8. 常见问题与排查方法
在部署和运行过程中,你可能会遇到以下问题。这里提供系统的排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 后端启动失败,端口被占用 | 8080 端口已被其他程序(如另一个Spring Boot应用、Tomcat)使用。 | 1. 查看启动日志中的错误信息。 2. 使用命令 netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Mac/Linux) 查找占用进程。 | 1. 终止占用端口的进程。 2. 修改 application.yml中的server.port为其他端口,如8082。 |
| 前端管理端运行后,页面空白或接口404 | 1. 后端服务未启动或地址错误。 2. 前端配置的 API 地址不对。 3. 跨域问题(CORS)。 | 1. 检查后端服务日志是否正常。 2. 浏览器 F12 打开开发者工具,查看 Console 和 Network 标签页,确认请求的 URL 和响应状态码。 3. 检查后端是否配置了 CORS。 | 1. 确保后端服务运行在正确的 IP 和端口。 2. 修改前端配置文件中的 baseUrl。3. 在后端 Spring Boot 主类或配置类中添加全局 CORS 配置。 |
| 微信小程序无法登录,提示“登录失败” | 1. 小程序 AppID 配置错误。 2. 后端登录接口未正确处理微信 code。3. 微信服务器网络问题(较少见)。 | 1. 核对manifest.json和微信开发者工具中的 AppID。2. 查看后端登录接口日志,看是否成功调用微信接口 https://api.weixin.qq.com/sns/jscode2session并获取到openid。3. 检查后端配置的微信小程序 AppSecret是否正确。 | 1. 使用正确的 AppID 和 AppSecret。 2. 在后端代码中,确保使用 code、AppID、AppSecret三个参数去请求微信接口。3. 开发阶段,可在微信开发者工具中开启“不校验合法域名”临时测试。 |
| 预约时提示“号源不足”或“排班不存在” | 1. 前端传递的schedule_id错误。2. 后端业务逻辑未正确校验或更新号源余量。 3. 高并发下出现超卖(教学项目可能未处理)。 | 1. 检查前端在选择时间段时,是否将正确的排班ID传递到了确认页面和提交接口。 2. 查看后端创建订单的接口代码,是否先查询余量 >0,再执行“减余量+创建订单”的事务操作。 | 1. 确保前端数据传递正确。 2. 在后端使用数据库事务和乐观锁(如 version字段)或悲观锁(SELECT ... FOR UPDATE)来防止超卖。 |
| 上传医生头像或图片失败 | 1. 前端未正确组装 FormData。 2. 后端文件上传路径不存在或没有写权限。 3. 文件大小超过配置限制。 | 1. 浏览器 F12 查看上传请求的Payload是否是FormData格式。2. 查看后端日志,是否有文件保存的异常信息。 3. 检查 application.yml中的spring.servlet.multipart.max-file-size配置。 | 1. 确保前端使用uni.uploadFile或FormData上传。2. 在服务器创建对应的上传目录,并赋予写权限。 3. 调整配置文件中的文件大小限制。 |
| 管理后台页面样式错乱 | 1. Element UI 等前端依赖未正确安装或版本冲突。 2. 浏览器缓存了旧版本资源。 | 1. 检查package.json中 Element UI 的版本,并重新npm install。2. 浏览器 F12 的 Network 标签页禁用缓存后刷新,或强制刷新页面(Ctrl+F5)。 | 1. 删除node_modules和package-lock.json,重新npm install。2. 确保引用的 CSS 和 JS 文件路径正确。 |
9. 最佳实践与使用建议
为了让这个项目更好地服务于你的学习或毕设,这里有一些进阶建议:
代码阅读与理解:
- 先跑通,再深究。不要一开始就陷入所有代码细节。先按照本文步骤让项目成功运行起来,体验完整流程。
- 按模块学习。例如,先重点看“用户登录授权”模块(涉及小程序、后端、微信接口三方交互),再看“预约下单”模块(涉及库存扣减、事务管理)。
- 善用调试。在 IDEA 和 VS Code 中打断点调试,是理解代码执行流程最有效的方式。
二次开发与定制:
- 修改业务逻辑:例如,将简单的“号源余量”改为更复杂的“分时段号源”,或者增加“预约后15分钟内支付”的限制。
- 增加新功能:例如,增加“就诊后评价”模块、医生在线咨询(WebSocket)、健康知识推送等。
- 更换前端UI:如果你觉得管理后台的 Element UI 不够美观,可以尝试替换为 Ant Design Vue 或其它 UI 框架。小程序端也可以使用更丰富的 UniApp 插件。
部署上线(用于演示):
- 后端:使用
mvn clean package打包成jar文件,在服务器上通过java -jar your-app.jar --spring.profiles.active=prod命令启动。建议使用nohup或配置为系统服务。 - 前端管理端:使用
npm run build打包,将生成的dist文件夹内的静态文件部署到 Nginx 或 Apache 服务器。 - 微信小程序:在微信开发者工具中点击“上传”,提交到微信小程序平台审核。审核通过后,即可发布体验版或正式版。注意:后端 API 地址需要配置为已备案的域名(HTTPS)。
- 后端:使用
毕设/课设报告撰写:
- 项目介绍部分:可以直接引用本项目的背景和意义。
- 技术选型部分:详细阐述为什么选择 Spring Boot、Vue、UniApp,以及它们的优势。
- 系统设计部分:画出系统架构图、功能模块图、数据库 E-R 图。本项目已提供实体和表结构,你可以用工具(如 PDManer)反向生成 E-R 图。
- 核心代码部分:挑选 2-3 个最复杂的业务逻辑(如创建订单的事务处理、微信登录流程)进行详细分析和代码展示。
- 测试与部署部分:记录你的功能测试过程、遇到的问题及解决方法,并展示最终部署上线的成果。
这个医院挂号预约小程序项目提供了一个非常扎实的起点。它的价值不仅在于一套可运行的代码,更在于展示了一个现代 Web 应用的标准开发范式。通过动手部署、调试和修改它,你能够将 Spring Boot、Vue、UniApp 这些孤立的技术点串联成线,形成完整的全栈开发能力。建议你在成功运行的基础上,尝试至少进行一项功能扩展或优化,这会让你的学习或毕设成果更加出彩。