13. 医院预约挂号系统(technical-architecture)

alt

1. 架构设计

alt

2. 技术栈说明

  • 前端: React@18 + Ant Design@5 (或 Ant Design Mobile) + TypeScript + Vite
  • UI框架: Tailwind CSS (用于布局和细节调整) + Ant Design (使用其成熟的表单、日历、列表组件)
  • 后端: Supabase (BaaS)
  • 数据库: PostgreSQL
  • 认证: Supabase Auth (手机号/邮箱登录)
  • 状态管理: Zustand
  • 路由: React Router@6
  • 日期处理: Day.js

3. 路由定义

路由 用途
/ 首页,科室导航
/login 登录/注册
/doctors 医生列表页 (含筛选)
/doctors/:id 医生详情页 (含排班)
/appointment/:scheduleId 预约挂号填写页
/my-appointments 我的预约记录
/health-profile 健康档案管理
/consultation 在线咨询列表
/consultation/:id 具体咨询对话框

4. API 定义

4.1 基础数据 API

获取科室列表

GET /rest/v1/departments

获取医生列表

GET /rest/v1/doctors?select=*,departments(name)

Query Parameters:

  • department_id: 科室筛选
  • title: 职称筛选

4.2 预约相关 API

获取医生排班

GET /rest/v1/schedules?doctor_id=eq.{id}&date=gte.{today}

提交预约

POST /rest/v1/appointments

Request Body:

{
  "user_id": "uuid",
  "schedule_id": "uuid",
  "patient_name": "珊",
  "patient_id_card": "110101...",
  "patient_phone": "xxx",
  "status": "pending"
}

4.3 健康档案 API

获取/更新健康档案

GET /rest/v1/health_profiles?user_id=eq.{uid}
POST /rest/v1/health_profiles

5. 数据模型

5.1 ER 图

alt

5.2 数据定义语言 (DDL)

科室表 (departments)

CREATE TABLE departments (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(100) NOT NULL,
  description TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

医生表 (doctors)

CREATE TABLE doctors (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  department_id UUID REFERENCES departments(id),
  name VARCHAR(100) NOT NULL,
  title VARCHAR(50), -- 主任医师, 副主任医师, 主治医师
  avatar_url TEXT,
  introduction TEXT,
  consultation_fee DECIMAL(10,2) DEFAULT 0,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

排班表 (schedules)

CREATE TABLE schedules (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  doctor_id UUID REFERENCES doctors(id),
  work_date DATE NOT NULL,
  start_time TIME NOT NULL,
  end_time TIME NOT NULL,
  max_count INTEGER DEFAULT 20,
  booked_count INTEGER DEFAULT 0,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

预约表 (appointments)

CREATE TABLE appointments (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES auth.users(id),
  schedule_id UUID REFERENCES schedules(id),
  patient_name VARCHAR(100) NOT NULL,
  patient_id_card VARCHAR(18),
  patient_phone VARCHAR(20) NOT NULL,
  status VARCHAR(20) DEFAULT 'pending', -- pending, confirmed, completed, cancelled
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

6. 关键技术实现

6.1 日期与排班选择

  • 使用 Ant Design 的 Calendar 或 DatePicker 组件定制。
  • 前端需处理日期的格式化与展示,区分“上午”、“下午”或具体时间段。
  • 逻辑:点击医生 -> 获取 schedules -> 渲染日历上可预约的日期 -> 点击日期显示具体时间段号源。

6.2 表单验证

  • 引入 async-validator 或使用 Ant Design Form 内置校验。
  • 身份证校验:严格校验18位身份证格式及校验位。
  • 手机号校验:正则匹配。
  • 防重复提交:提交按钮点击后置灰,或使用防抖(debounce)处理。

6.3 预约并发控制

  • 乐观锁或数据库约束:在 schedules 表增加 booked_count 字段。
  • 预约时执行 SQL 事务或原子更新:
    UPDATE schedules 
    SET booked_count = booked_count + 1 
    WHERE id = {schedule_id} AND booked_count < max_count;
    
  • 若更新行数为0,则提示“号源已满”。

6.4 实时咨询 (可选)

  • 利用 Supabase Realtime 订阅 consultation_messages 表的 INSERT 事件。
  • 实现简单的聊天界面,消息自动滚动到底部。
20大项目拆解:从PRD到架构 文章被收录于专栏

想独立做出一个完整的项目却不知从何下手?本专栏是你的终极路线图。我们由浅入深,通过20个经典项目案例,手把手带你走过产品构思、需求撰写、功能设计、技术选型、架构搭建的全过程。从&ldquo;音乐播放器&rdquo;到&ldquo;企业后台&rdquo;,你将逐步建立对软件系统的完整认知,完成从理论到实践、从单一技能到复合能力的飞跃。

全部评论

相关推荐

头像
01-29 18:11
海南大学 Java
奔跑的suechil...:单从项目看这个简历不怕被问穿吗 带微服务的项目需要相当多的项目理解和经验诶
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务