# 患者注册路由说明 ## 概述 根据软件框架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 表结构 ```sql 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 表结构(简化后) ```sql 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` 已更新,支持患者用户登录。 ## 响应格式 ### 成功响应 ```json { "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": "注册成功并自动登录" } ``` ### 错误响应示例 **重复注册**: ```json { "status": "error", "code": 400, "message": "Username Already Exists", "error_details": { "type": "duplicate_username", "description": "该就诊号已被注册" } } ``` **参数验证失败**: ```json { "status": "error", "code": 400, "message": "Invalid Parameters", "error_details": { "type": "validation_error", "description": "参数验证失败", "fields": { "dob": "出生日期格式必须是 YYYY-MM-DD", "height_cm": "身高必须是数字" } } } ``` ## 测试 使用提供的测试脚本 `test_register.py` 可以验证注册功能: ```bash python test_register.py ``` 测试包括: 1. 患者注册功能 2. 患者登录功能 3. 重复注册检查 ## 集成说明 ### 1. 路由注册 在 `app/main.py` 中已添加: ```python from app.routers import register app.include_router(register.router, prefix="/api/v3") ``` ### 2. 数据库初始化 在应用启动时会自动初始化患者数据库表: ```python 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. 可以添加患者和管理员之间的关联查询