0代码开发医疗挂号小程序
使用Claude code +IDEA(全程0编码,全靠AI)
gitee地址:https://gitee.com/LtAo857/hos
语雀地址:开发文档










项目概述
医疗预约挂号系统 - 一个全栈医院预约挂号平台,包含三个核心模块:
- backend:Spring Boot REST API(Java 17)
- admin:Vue 3 管理后台
- hos_uniapp:UniApp 移动端小程序
运行应用
后端(Spring Boot)
bash
cd backend
mvn spring-boot:run # 启动开发服务器(端口 8080)
mvn clean package # 打包生成 JAR 文件
mvn compile -DskipTests # 编译代码(跳过测试)
mvn test # 运行测试用例
前置条件:必须先启动 MySQL、Redis、RabbitMQ
- MySQL 数据库:
hos(数据库表结构见sql/hos.sql) - Redis:localhost:6379
- RabbitMQ:配置信息在
application.yml中
管理前端(Vue 3)
bash
cd admin
npm run dev # 启动开发服务器(端口 5173)
npm run build # 生产环境打包
npm run preview # 预览生产打包结果
开发服务器会将 /api 请求代理到 http://localhost:8080
移动端应用(UniApp)
在 HBuilderX 中打开 hos_uniapp 目录,或使用 UniApp 命令行工具。该应用可编译为微信小程序、H5 或原生应用。
系统架构
后端架构
包结构:
controller:REST API 接口层service:业务逻辑层mapper:MyBatis-Plus 数据访问层entity:数据库实体类dto:请求数据传输对象vo:响应视图对象config:Spring 配置类(Redis、RabbitMQ 等)mq:RabbitMQ 消费者task:定时任务exception:自定义异常及异常处理器
核心技术栈:
- Spring Boot 3.1.5 + Java 17
- MyBatis-Plus 3.5.5(自带自动 CRUD 的 ORM 框架)
- Redis(号源缓存 + Lua 脚本)
- RabbitMQ(异步订单处理)
- Druid 数据库连接池
- SpringDoc OpenAPI(Swagger UI 访问地址:
/swagger-ui.html)
核心业务逻辑
号源管理(高并发场景):
- 号源缓存于 Redis,Key 格式:
medical:stock:{scheduleId} - 扣减号源使用 Lua 脚本(
RedisConfig.stockDeductScript())保证原子性操作 - 通过 Redis 原子递减操作防止超卖
- 定时任务(
StockSyncTask)每 60 秒将 Redis 号源同步至 MySQL - 订单取消时,号源会释放回 Redis
订单处理(异步流程):
- 用户提交订单 → Redis 原子扣减号源
- 订单发送至 RabbitMQ 队列(
medical.order.queue) OrderConsumer异步将订单写入 MySQL- 采用手动确认模式防止消息丢失
- 支付超时时间:900 秒(15 分钟)
数据流向:
客户端请求 → Controller → Service → Redis(号源校验)
↓
RabbitMQ → OrderConsumer → MySQL
前端架构
管理后台(Vue 3):
- Vue Router 实现路由导航
- Pinia 进行状态管理
- Element Plus UI 组件库
- Axios 处理 HTTP 请求(配置在
src/utils/request.js) - 视图按功能模块组织:科室、医生、排班、订单
UniApp 移动端:
- 页面包括:登录、首页、科室、医生、排班、订单、支付、个人中心
- 底部 Tab 导航:首页、我的订单、个人中心
- 数据存储:使用
uni.setStorageSync()存储 token、userId、username、phone、realName、isRealAuth - API 调用封装在
utils/api.js和utils/request.js
数据库表结构
主要数据表:
medical_user:用户账户表medical_department:医院科室表(树形结构,含 parent_id 字段)medical_doctor:医生信息表medical_schedule:医生排班表(日期 + 时间段)medical_stock:预约号源库存表(关联排班表)medical_order:预约订单表medical_payment:支付记录表medical_patient:患者信息表(实名认证)
开发规范
后端服务层
服务层遵循标准 Spring 开发模式:
@Service+@RequiredArgsConstructor(Lombok 构造器注入)- 事务方法添加
@Transactional(rollbackFor = Exception.class) - 业务逻辑错误抛出
BusinessException - 使用
LambdaQueryWrapper进行 MyBatis-Plus 查询
示例代码模板:
java
@Service
@RequiredArgsConstructor
public class XxxServiceImpl implements XxxService {
private final XxxMapper mapper;
private final RedisTemplate<String, Object> redisTemplate;
@Override
@Transactional(rollbackFor = Exception.class)
public void someMethod() {
// 业务逻辑实现
}
}
Redis 操作规范
号源操作必须 使用 Lua 脚本(定义在 RedisConfig 中)保证原子性:
stockDeductScript:原子递减操作,返回 1(成功)或 0(库存不足)stockReleaseScript:订单取消时的原子递增操作
禁止使用分离的 GET + DECR 操作处理号源 - 这会导致并发问题。
RabbitMQ 消息处理
消费者使用手动确认模式:
- 处理成功时调用
channel.basicAck() - 处理失败时调用
channel.basicNack(deliveryTag, false, true)(重新入队) - 必须使用 try-catch 包裹处理逻辑,防止消息丢失
前端 API 调用规范
UniApp 端在 utils/api.js 中集中定义 API:
- 所有请求通过
utils/request.js拦截器处理 - 请求头自动添加 Token
- 错误处理逻辑集中管理
- 存储键值:token、userId、username、phone、realName、isRealAuth
配置说明
后端配置(application.yml)
关键配置项:
- 服务器端口:8080(默认)
- 数据库:
jdbc:mysql://localhost:3306/hos - Redis:localhost:6379
- RabbitMQ:手动确认模式,prefetch=1
- MyBatis-Plus:自动生成 ID,开启逻辑删除
- 自定义配置项:
medical.order.payment-timeout:900 秒medical.stock.sync-interval:60000ms(1 分钟)medical.aes.secret-key:AES 加密密钥
API 文档
SpringDoc OpenAPI 访问地址:
- Swagger UI:
http://localhost:8080/swagger-ui.html - API 文档 JSON:
http://localhost:8080/v3/api-docs
重要注意事项
- 号源同步:高并发场景下以 Redis 为数据基准,每 60 秒通过定时任务同步至 MySQL
- 订单创建:必须通过 RabbitMQ 异步处理,禁止在请求链路中直接写入 MySQL
- 支付超时:未支付订单 15 分钟后自动取消(由定时任务处理)
- 登出行为 :UniApp 端登出需清空 6 个存储键,并通过
uni.reLaunch()跳转到登录页 - 科室结构 :基于 parent_id 的树形结构,使用
getDepartmentTree()获取层级数据 - 实名认证:创建预约订单时必须完成实名认证(校验 isRealAuth 标识)
总结
- 该文档完整翻译了医疗预约挂号系统的开发指引,涵盖项目运行、架构设计、核心业务逻辑、开发规范等核心内容;
- 保持了原文档的结构和技术细节准确性,同时将所有英文内容转换为符合中文技术文档习惯的表述;
- 重点保留了高并发号源管理、异步订单处理等核心业务的关键实现细节,确保技术指引的完整性。