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.

246 lines
6.6 KiB

6 months ago
  1. # 患者注册路由说明
  2. ## 概述
  3. 根据软件框架V2文档的要求,我们为第一个页面(用户注册页面-扫码)创建了独立的路由。这个路由专门处理患者的自助注册功能,适用于现场排队等候的场景。
  4. **重要说明**:系统中只有两种用户类型:
  5. - **患者用户**:通过扫码注册,使用就诊号+身份证后六位登录
  6. - **管理员用户**:通过管理后台创建,用于系统管理
  7. ## 路由信息
  8. - **路由**: `/api/v3/register`
  9. - **方法**: POST
  10. - **文件位置**: `app/routers/register.py`
  11. ## 功能特点
  12. ### 1. 独立的路由系统
  13. - 患者注册功能完全独立于管理员注册
  14. - 使用独立的数据库表 `patient_info`
  15. - 独立的JWT令牌生成和验证
  16. ### 2. 完整的患者信息字段
  17. 根据软件框架V2文档,支持以下字段:
  18. **必需字段**:
  19. - `medical_record_number`: 就诊号(将作为登录用户名)
  20. - `id_last_six`: 身份证后六位(将作为登录密码)
  21. - `name`: 姓名
  22. - `gender`: 性别
  23. - `dominant_hand`: 利手
  24. - `diagnosis`: 诊断
  25. - `dob`: 出生年月(格式: YYYY-MM-DD)
  26. - `height_cm`: 身高(cm)
  27. - `weight_kg`: 体重(kg)
  28. - `contact`: 联系方式
  29. **可选字段**:
  30. - `inpatient_number`: 住院号
  31. - `bed_number`: 床号
  32. - `education_level`: 教育程度
  33. - `education_years`: 教育年数
  34. - `remarks`: 备注
  35. ### 3. 数据验证
  36. - 必需字段验证
  37. - 数据类型验证(数字、日期格式)
  38. - 重复注册检查(就诊号唯一性)
  39. ### 4. 自动登录
  40. - 注册成功后自动生成JWT令牌
  41. - 返回完整的用户信息
  42. - 无需额外登录步骤
  43. ## 数据库设计
  44. ### patient_info 表结构
  45. ```sql
  46. CREATE TABLE patient_info (
  47. id SERIAL PRIMARY KEY,
  48. user_id VARCHAR(50) UNIQUE NOT NULL,
  49. medical_record_number VARCHAR(50) UNIQUE NOT NULL,
  50. id_last_six VARCHAR(6) NOT NULL,
  51. name VARCHAR(100) NOT NULL,
  52. gender VARCHAR(10) NOT NULL,
  53. dominant_hand VARCHAR(10) NOT NULL,
  54. diagnosis TEXT,
  55. dob DATE,
  56. height_cm INTEGER,
  57. weight_kg DECIMAL(5,2),
  58. contact VARCHAR(20),
  59. inpatient_number VARCHAR(50),
  60. bed_number VARCHAR(20),
  61. education_level VARCHAR(50),
  62. education_years INTEGER,
  63. remarks TEXT,
  64. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  65. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  66. );
  67. ```
  68. ### user_info 表结构(简化后)
  69. ```sql
  70. CREATE TABLE user_info (
  71. id SERIAL PRIMARY KEY,
  72. username VARCHAR(50) UNIQUE NOT NULL,
  73. email VARCHAR(255) UNIQUE NOT NULL,
  74. hashed_password VARCHAR(255) NOT NULL,
  75. department VARCHAR(100),
  76. position VARCHAR(100),
  77. is_admin BOOLEAN DEFAULT TRUE,
  78. created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  79. updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
  80. );
  81. ```
  82. ## 用户类型说明
  83. ### 患者用户
  84. - **注册方式**: 扫码自助注册
  85. - **登录方式**: 就诊号 + 身份证后六位
  86. - **数据存储**: `patient_info`
  87. - **权限**: 普通用户权限,可进行测试
  88. ### 管理员用户
  89. - **注册方式**: 管理后台创建
  90. - **登录方式**: 用户名 + 密码
  91. - **数据存储**: `user_info` 表(简化后只存储管理员)
  92. - **权限**: 管理员权限,可查看所有测试记录
  93. ## 登录支持
  94. 患者用户可以通过以下方式登录:
  95. - **用户名**: 就诊号
  96. - **密码**: 身份证后六位
  97. 登录接口 `/api/v3/login` 已更新,支持患者用户登录。
  98. ## 响应格式
  99. ### 成功响应
  100. ```json
  101. {
  102. "status": "success",
  103. "code": 200,
  104. "data": {
  105. "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  106. "token_type": "Bearer",
  107. "is_admin": false,
  108. "user_info": {
  109. "user_id": "user-abc-123",
  110. "medical_record_number": "J0012345",
  111. "name": "张三",
  112. "gender": "男",
  113. "dominant_hand": "右",
  114. "diagnosis": "无",
  115. "dob": "1960-01-15",
  116. "height_cm": 175,
  117. "weight_kg": 70.5,
  118. "contact": "13800138000",
  119. "inpatient_number": "Z67890",
  120. "bed_number": "503",
  121. "education_level": "本科",
  122. "education_years": 16,
  123. "remarks": ""
  124. }
  125. },
  126. "message": "注册成功并自动登录"
  127. }
  128. ```
  129. ### 错误响应示例
  130. **重复注册**:
  131. ```json
  132. {
  133. "status": "error",
  134. "code": 400,
  135. "message": "Username Already Exists",
  136. "error_details": {
  137. "type": "duplicate_username",
  138. "description": "该就诊号已被注册"
  139. }
  140. }
  141. ```
  142. **参数验证失败**:
  143. ```json
  144. {
  145. "status": "error",
  146. "code": 400,
  147. "message": "Invalid Parameters",
  148. "error_details": {
  149. "type": "validation_error",
  150. "description": "参数验证失败",
  151. "fields": {
  152. "dob": "出生日期格式必须是 YYYY-MM-DD",
  153. "height_cm": "身高必须是数字"
  154. }
  155. }
  156. }
  157. ```
  158. ## 测试
  159. 使用提供的测试脚本 `test_register.py` 可以验证注册功能:
  160. ```bash
  161. python test_register.py
  162. ```
  163. 测试包括:
  164. 1. 患者注册功能
  165. 2. 患者登录功能
  166. 3. 重复注册检查
  167. ## 集成说明
  168. ### 1. 路由注册
  169. `app/main.py` 中已添加:
  170. ```python
  171. from app.routers import register
  172. app.include_router(register.router, prefix="/api/v3")
  173. ```
  174. ### 2. 数据库初始化
  175. 在应用启动时会自动初始化患者数据库表:
  176. ```python
  177. await register.init_register_database()
  178. ```
  179. ### 3. 登录支持
  180. `app/routers/auth.py` 中的登录接口已更新,支持患者用户登录。
  181. ## 数据库架构优势
  182. ### 1. 表结构分离
  183. - `user_info` 表:专门存储管理员用户,结构简化
  184. - `patient_info` 表:专门存储患者用户,包含完整的医疗信息
  185. ### 2. 安全性提升
  186. - 管理员和患者数据完全分离
  187. - 不同的认证方式(bcrypt vs 身份证后六位)
  188. - 独立的权限管理
  189. ### 3. 维护性增强
  190. - 表结构清晰,职责明确
  191. - 便于后续功能扩展
  192. - 数据查询和统计更方便
  193. ## 注意事项
  194. 1. **安全性**: 身份证后六位作为密码,在生产环境中应考虑更安全的认证方式
  195. 2. **数据验证**: 前端应进行适当的数据验证,后端提供二次验证
  196. 3. **错误处理**: 所有错误都有详细的错误信息,便于前端处理
  197. 4. **令牌管理**: JWT令牌有效期为7天,可根据需要调整
  198. 5. **用户类型**: 系统中只有患者和管理员两种用户类型,概念要清晰
  199. 6. **数据库**: 确保两个表都正确创建和初始化
  200. ## 后续开发
  201. 1. 可以考虑添加患者信息的更新接口
  202. 2. 可以添加患者信息的查询接口(管理员权限)
  203. 3. 可以添加患者数据的导出功能
  204. 4. 可以添加更复杂的密码策略
  205. 5. 可以添加患者和管理员之间的关联查询