You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

6.6 KiB

患者注册路由说明

概述

根据软件框架V2文档的要求,我们为第一个页面(用户注册页面-扫码)创建了独立的路由。这个路由专门处理患者的自助注册功能,适用于现场排队等候的场景。

重要说明:系统中只有两种用户类型:

  • 患者用户:通过扫码注册,使用就诊号+身份证后六位登录
  • 管理员用户:通过管理后台创建,用于系统管理

路由信息

  • 路由: /api/v3/register
  • 方法: POST
  • 文件位置: app/routers/register.py

功能特点

1. 独立的路由系统

  • 患者注册功能完全独立于管理员注册
  • 使用独立的数据库表 patient_info
  • 独立的JWT令牌生成和验证

2. 完整的患者信息字段

根据软件框架V2文档,支持以下字段:

必需字段:

  • medical_record_number: 就诊号(将作为登录用户名)
  • id_last_six: 身份证后六位(将作为登录密码)
  • name: 姓名
  • gender: 性别
  • dominant_hand: 利手
  • diagnosis: 诊断
  • dob: 出生年月(格式: YYYY-MM-DD)
  • height_cm: 身高(cm)
  • weight_kg: 体重(kg)
  • contact: 联系方式

可选字段:

  • inpatient_number: 住院号
  • bed_number: 床号
  • education_level: 教育程度
  • education_years: 教育年数
  • remarks: 备注

3. 数据验证

  • 必需字段验证
  • 数据类型验证(数字、日期格式)
  • 重复注册检查(就诊号唯一性)

4. 自动登录

  • 注册成功后自动生成JWT令牌
  • 返回完整的用户信息
  • 无需额外登录步骤

数据库设计

patient_info 表结构

CREATE TABLE patient_info (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(50) UNIQUE NOT NULL,
    medical_record_number VARCHAR(50) UNIQUE NOT NULL,
    id_last_six VARCHAR(6) NOT NULL,
    name VARCHAR(100) NOT NULL,
    gender VARCHAR(10) NOT NULL,
    dominant_hand VARCHAR(10) NOT NULL,
    diagnosis TEXT,
    dob DATE,
    height_cm INTEGER,
    weight_kg DECIMAL(5,2),
    contact VARCHAR(20),
    inpatient_number VARCHAR(50),
    bed_number VARCHAR(20),
    education_level VARCHAR(50),
    education_years INTEGER,
    remarks TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

user_info 表结构(简化后)

CREATE TABLE user_info (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    hashed_password VARCHAR(255) NOT NULL,
    department VARCHAR(100),
    position VARCHAR(100),
    is_admin BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

用户类型说明

患者用户

  • 注册方式: 扫码自助注册
  • 登录方式: 就诊号 + 身份证后六位
  • 数据存储: patient_info
  • 权限: 普通用户权限,可进行测试

管理员用户

  • 注册方式: 管理后台创建
  • 登录方式: 用户名 + 密码
  • 数据存储: user_info 表(简化后只存储管理员)
  • 权限: 管理员权限,可查看所有测试记录

登录支持

患者用户可以通过以下方式登录:

  • 用户名: 就诊号
  • 密码: 身份证后六位

登录接口 /api/v3/login 已更新,支持患者用户登录。

响应格式

成功响应

{
    "status": "success",
    "code": 200,
    "data": {
        "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
        "token_type": "Bearer",
        "is_admin": false,
        "user_info": {
            "user_id": "user-abc-123",
            "medical_record_number": "J0012345",
            "name": "张三",
            "gender": "男",
            "dominant_hand": "右",
            "diagnosis": "无",
            "dob": "1960-01-15",
            "height_cm": 175,
            "weight_kg": 70.5,
            "contact": "13800138000",
            "inpatient_number": "Z67890",
            "bed_number": "503",
            "education_level": "本科",
            "education_years": 16,
            "remarks": ""
        }
    },
    "message": "注册成功并自动登录"
}

错误响应示例

重复注册:

{
    "status": "error",
    "code": 400,
    "message": "Username Already Exists",
    "error_details": {
        "type": "duplicate_username",
        "description": "该就诊号已被注册"
    }
}

参数验证失败:

{
    "status": "error",
    "code": 400,
    "message": "Invalid Parameters",
    "error_details": {
        "type": "validation_error",
        "description": "参数验证失败",
        "fields": {
            "dob": "出生日期格式必须是 YYYY-MM-DD",
            "height_cm": "身高必须是数字"
        }
    }
}

测试

使用提供的测试脚本 test_register.py 可以验证注册功能:

python test_register.py

测试包括:

  1. 患者注册功能
  2. 患者登录功能
  3. 重复注册检查

集成说明

1. 路由注册

app/main.py 中已添加:

from app.routers import register
app.include_router(register.router, prefix="/api/v3")

2. 数据库初始化

在应用启动时会自动初始化患者数据库表:

await register.init_register_database()

3. 登录支持

app/routers/auth.py 中的登录接口已更新,支持患者用户登录。

数据库架构优势

1. 表结构分离

  • user_info 表:专门存储管理员用户,结构简化
  • patient_info 表:专门存储患者用户,包含完整的医疗信息

2. 安全性提升

  • 管理员和患者数据完全分离
  • 不同的认证方式(bcrypt vs 身份证后六位)
  • 独立的权限管理

3. 维护性增强

  • 表结构清晰,职责明确
  • 便于后续功能扩展
  • 数据查询和统计更方便

注意事项

  1. 安全性: 身份证后六位作为密码,在生产环境中应考虑更安全的认证方式
  2. 数据验证: 前端应进行适当的数据验证,后端提供二次验证
  3. 错误处理: 所有错误都有详细的错误信息,便于前端处理
  4. 令牌管理: JWT令牌有效期为7天,可根据需要调整
  5. 用户类型: 系统中只有患者和管理员两种用户类型,概念要清晰
  6. 数据库: 确保两个表都正确创建和初始化

后续开发

  1. 可以考虑添加患者信息的更新接口
  2. 可以添加患者信息的查询接口(管理员权限)
  3. 可以添加患者数据的导出功能
  4. 可以添加更复杂的密码策略
  5. 可以添加患者和管理员之间的关联查询