1. 项目背景与核心需求分析
宠物医疗行业近年来呈现爆发式增长,根据2023年宠物医疗行业白皮书显示,全国宠物医院数量已突破3万家,年就诊量增长率保持在25%以上。在这样的市场背景下,传统电话预约方式暴露出诸多痛点:高峰时段占线严重、预约信息记录易出错、医生排班难以可视化等。这正是我们开发"猫狗宠物领养医院预约展示系统"的核心驱动力。
这个系统需要同时满足三类用户的差异化需求:
- 宠物主人:能够实时查看医生排班、在线预约特定时段、查询历史就诊记录
- 医院管理员:需要管理医生信息、处理预约冲突、生成各类统计报表
- 前台接待人员:快速办理现场登记、处理预约变更、打印就诊单据
技术选型上采用SpringBoot+Vue3的组合,主要基于以下考量:
- SpringBoot的自动配置特性可快速搭建医院业务微服务
- Vue3的Composition API更适合处理复杂的预约状态管理
- 前后端分离架构便于后续扩展移动端应用
- 宠物医院的特殊业务场景(如急诊插队处理)需要灵活的技术架构支持
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈全景图
本系统采用经典的三层架构,具体技术组件如下:
code复制前端层:
- Vue 3.2 + Composition API
- Element Plus组件库
- Axios HTTP客户端
- Vue Router 4.x
- Pinia状态管理
后端层:
- Spring Boot 2.7.x
- Spring Security + JWT
- MyBatis-Plus 3.5.x
- Redis 6.x缓存
- Quartz定时任务
数据层:
- MySQL 8.0关系型数据库
- MongoDB 5.0(存储非结构化诊疗记录)
- MinIO对象存储(宠物影像资料)
2.2 核心业务流程设计
预约业务的状态机设计尤为关键,我们定义了7种核心状态:
mermaid复制stateDiagram-v2
[*] --> 待支付
待支付 --> 已预约: 支付成功
已预约 --> 就诊中: 签到
就诊中 --> 已完成: 医生确认
已预约 --> 已取消: 用户取消
已预约 --> 已过期: 超时未签到
就诊中 --> 已退款: 特殊情况
特别注意:实际开发中需要处理并发的状态变更问题,建议采用乐观锁机制。我们在初期版本就遇到过多个终端同时修改状态导致数据不一致的情况。
2.3 数据库关键表结构
2.3.1 医生排班表设计
sql复制CREATE TABLE `schedule` (
`id` bigint NOT NULL AUTO_INCREMENT,
`doctor_id` bigint NOT NULL COMMENT '关联医生ID',
`clinic_id` int NOT NULL COMMENT '诊室编号',
`start_time` datetime NOT NULL COMMENT '排班开始时间',
`end_time` datetime NOT NULL COMMENT '排班结束时间',
`max_appointments` int DEFAULT '15' COMMENT '最大预约数',
`current_appointments` int DEFAULT '0' COMMENT '当前预约数',
`status` tinyint DEFAULT '1' COMMENT '0-停诊 1-正常',
`version` int DEFAULT '0' COMMENT '乐观锁版本号',
PRIMARY KEY (`id`),
KEY `idx_doctor_time` (`doctor_id`,`start_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3.2 预约订单表设计
sql复制CREATE TABLE `appointment` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '预约单号',
`pet_id` bigint NOT NULL COMMENT '宠物ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`schedule_id` bigint NOT NULL COMMENT '关联排班ID',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0-待支付 1-已预约 2-就诊中 3-已完成 4-已取消',
`symptoms` varchar(500) DEFAULT NULL COMMENT '症状描述',
`amount` decimal(10,2) DEFAULT NULL COMMEN
