电子健康记录(EHR)应用程序后端模板
纵向患者记录、访问信息文档、签署笔记工作流和可追溯审计历史
一个在 Back4app 上准备投入生产的 EHR 后端,用于全面患者临床历史、版本化笔记和多签名审批流程。使用它可以更快地跨网络和移动设备发布医疗产品,同时保持可追溯性。
关键要点
该模板为患者记录、就诊、笔记修订和共同签名流程提供了一个适合临床文档的后端,使团队可以专注于护理工作流程,而不是重建后端基础。
- 纵向患者图表模型 — 以适合完整患者历史视图的结构组织人口统计、标识符、就诊记录和临床条目。
- 版本化医学笔记工作流程 — 跟踪草稿、审核、修订和签署的笔记修订,使文档历史保持明确和可查询。
- 多重签名支持 — 收集医生、住院医师、专家或监督员的签名,并进行状态跟踪和有时间戳的批准。
- 审核图表访问的能力 — 捕捉有意义的访问和变更事件,以支持内部审查、合规报告和运营故障排除。
- 跨平台交付 — 通过 REST 和 GraphQL 提供门户、临床医生工作站和移动图表应用程序,并可选配 Live Queries。
电子健康记录 (EHR) 应用后端模板是什么?
Back4app 是一个托管后端,用于快速产品交付。电子健康记录 (EHR) 应用后端模板建模患者、接触、记录版本、签名和审计事件,以便团队能够从第一天起实施强大的后端合同的医疗文档产品。
最佳适用:
概述
临床文档系统必须在可用性与可追溯性之间取得平衡。团队需要完整的患者时间线、结构化的接诊记录、受控的笔记修订以及可靠的签名和修正路径。
此模板定义了患者、接诊、医疗笔记、笔记签名和审计事件的所有权规则和可选的 Live Queries,这样团队可以快速且一致地构建 EHR 体验。
核心 EHR 功能
该中心中的每个技术卡片都使用相同的EHR架构,包括患者、接触、医疗记录、记录签名和审核事件。
患者主记录
存储每位患者的人口统计信息、医疗记录编号、出生日期、联系方式以及核心图表元数据。
基于接触的图表组织
以时间戳、护理背景、状态和负责临床医生指向表示访问、住院、咨询或随访。
版本化的医疗笔记
MedicalNote 存储笔记类型、内容、修订号、状态、修订元数据以及与患者和就诊的链接。
多重签名批准工作流
NoteSignature 对象跟踪必须签署的人、角色、当前状态、签署时间戳和可选评论。
访问和变更审计事件
AuditEvent 记录重要的读取、写入、状态变更和签署操作,以及执行者、目标和时间戳数据。
为什么要用 Back4app 构建您的电子健康记录 (EHR) 应用后端?
Back4app 为医疗文档流程提供托管的后端合同,让您的团队可以专注于临床体验、表单可用性和领域逻辑,而不是基础设施的管道工作。
- •临床数据构建 Blocks: 预定义的患者记录、就诊、笔记版本和签名的类,让您可以在不从零开始设计整个后端的情况下实现基本的 EHR 流程。
- •修订和批准可追溯性: 版本化的笔记记录加上明确的签名对象,使得清晰地表示草稿、审查、修订和签署状态变得更容易。
- •灵活的应用和集成 API: 在更新图表时使用 Live Queries,同时为门户、移动图表、分析和外部临床集成暴露 REST 和 GraphQL 端点。
通过一个后端合同在团队和平台之间标准化患者图表,并减少交付安全文档工作流程所需的时间。
核心优势
一个医疗文档后台,帮助您以更快的速度工作,同时保留版本历史和批准可追溯性。
更快的图表交付产品
从预构建的患者和记录模型开始,以便您的团队可以专注于图表审查、文档和批准屏幕等工作流程。
清晰的修订历史
保留明确的记录版本和修订血统,以便团队可以理解发生了什么变化、何时发生变化以及哪个版本是权威的。
签名工作流支持
表示审核队列、必需签名者、共同签名截止日期和完成状态,而无需首先发明一个单独的工作流引擎。
角色感知访问模式
应用角色和所有权规则,以便仅授权的临床医生或管理员可以创建、编辑、签署或查看敏感病历内容。
实时病历响应性
Live Queries可以在遇到更新、注释修改或完成所需签名时通知客户。
可扩展以进行集成
使用REST或GraphQL APIs连接到调度工具、患者门户、账单系统或互操作性层。
准备好启动现代电子健康记录工作流程了吗?
让Back4app AI代理搭建电子健康记录后端,并从一个提示中生成样本患者、临床遭遇、注释版本和审计事件。
免费开始 - 每月50个AI代理提示,无需信用卡
技术栈
此EHR后端模板中包含所有内容。
ER 图
EHR架构的实体关系模型。
涵盖患者、遭遇、记录修订、签名和审计事件的架构。
查看图表源
erDiagram
User ||--o{ Patient : "primary_clinician_for"
Patient ||--o{ Encounter : "has"
Patient ||--o{ MedicalNote : "chart_contains"
Encounter ||--o{ MedicalNote : "context_for"
MedicalNote ||--o{ NoteVersion : "versioned_as"
MedicalNote ||--o{ Signature : "requires"
NoteVersion ||--o{ Signature : "attests"
Patient ||--o{ Attachment : "owns"
Encounter ||--o{ Attachment : "context_for"
MedicalNote ||--o{ Attachment : "references"
User ||--o{ MedicalNote : "authors"
User ||--o{ NoteVersion : "edits"
User ||--o{ Signature : "signs"
User ||--o{ AuditEvent : "actor_of"
Patient ||--o{ AuditEvent : "chart_activity"
Patient {
String objectId PK
String mrn
String fullName
Date dateOfBirth
String sexAtBirth
Array allergies
Pointer primaryClinician FK
String status
Date createdAt
Date updatedAt
}
Encounter {
String objectId PK
Pointer patient FK
String encounterNumber
String type
String department
Pointer admittingClinician FK
Date startedAt
Date endedAt
String status
Date createdAt
Date updatedAt
}
MedicalNote {
String objectId PK
Pointer patient FK
Pointer encounter FK
Pointer author FK
String title
String noteType
Number currentVersionNumber
String status
Boolean requiresCosign
Date createdAt
Date updatedAt
}
NoteVersion {
String objectId PK
Pointer medicalNote FK
Number versionNumber
Pointer editor FK
String subjective
String objective
String assessment
String plan
String changeSummary
Boolean isAddendum
Date createdAt
Date updatedAt
}
Signature {
String objectId PK
Pointer medicalNote FK
Pointer noteVersion FK
Pointer signer FK
String signatureRole
String status
Date signedAt
String comment
Date createdAt
Date updatedAt
}
Attachment {
String objectId PK
Pointer patient FK
Pointer encounter FK
Pointer medicalNote FK
File file
String category
Pointer uploadedBy FK
Date createdAt
Date updatedAt
}
AuditEvent {
String objectId PK
Pointer actor FK
Pointer patient FK
String eventType
String targetClass
String targetId
String details
String ipAddress
Date timestamp
}
集成流程
用于患者图表访问、遭遇文档、版本化记录更新和签名工作流程的Auth-to-CRUD流程。
查看图表源
sequenceDiagram
participant User as Clinician
participant App as Electronic Health Record (EHR) App
participant Back4app as Back4app Cloud
User->>App: Sign in to access patient chart
App->>Back4app: POST /login (username, password)
Back4app-->>App: Session token + user role
User->>App: Open patient timeline
App->>Back4app: GET /classes/Patient + /classes/Encounter + /classes/MedicalNote
Back4app-->>App: Patient chart, active encounters, note list
User->>App: Create amended progress note
App->>Back4app: POST /classes/MedicalNote (patient, encounter, author, status)
Back4app-->>App: MedicalNote objectId
App->>Back4app: POST /classes/NoteVersion (medicalNote, versionNumber, SOAP content)
Back4app-->>App: NoteVersion saved
User->>App: Request attending co-signature
App->>Back4app: POST /classes/Signature (medicalNote, noteVersion, signer, role)
Back4app-->>App: Signature request created
App->>Back4app: POST /classes/AuditEvent (eventType: sign_request, targetClass: MedicalNote)
Back4app-->>App: Audit event saved
Back4app-->>App: Live Query events (new versions, signature status changes)
App-->>User: Real-time chart refresh and signer updates数据字典
电子健康记录(EHR)模式中每个类的完整字段级参考。
| 字段 | 类型 | 描述 | 必填 |
|---|---|---|---|
| objectId | String | Auto-generated unique identifier | 自动 |
| username | String | Login username for clinicians, scribes, and administrators | |
| String | User email address | ||
| password | String | Hashed password (write-only) | |
| role | String | Role (admin, physician, nurse, scribe, auditor) | |
| displayName | String | Full display name used in signatures and chart headers | — |
| licenseNumber | String | Clinical license or credential identifier | — |
| createdAt | Date | Auto-generated creation timestamp | 自动 |
| updatedAt | Date | Auto-generated last-update timestamp | 自动 |
9 字段在 User 中
安全性和权限
ACL、角色和 CLP 策略如何保护患者图表、注释修订、签名和审计事件。
基于角色的图表访问
使用临床医生、主治医生、审阅者和管理员等角色来界定谁可以查看患者记录、撰写注释、请求签名或管理访问权限。
拥有权和签名责任
将注释编辑限制为授权作者或主管,同时仅允许指定的签名者完成分配给他们的NoteSignature记录。
受保护的审计记录
AuditEvent条目应为追加式并受到严格控制,以便图表访问历史和关键更改无法从客户端应用程序中篡改。
架构(JSON)
准备好复制到Back4app的原始JSON架构定义或用作实现参考。
{
"classes": [
{
"className": "User",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"username": {
"type": "String",
"required": true
},
"email": {
"type": "String",
"required": true
},
"password": {
"type": "String",
"required": true
},
"role": {
"type": "String",
"required": true
},
"displayName": {
"type": "String",
"required": false
},
"licenseNumber": {
"type": "String",
"required": false
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "Patient",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"mrn": {
"type": "String",
"required": true
},
"fullName": {
"type": "String",
"required": true
},
"dateOfBirth": {
"type": "Date",
"required": true
},
"sexAtBirth": {
"type": "String",
"required": false
},
"allergies": {
"type": "Array",
"required": false
},
"primaryClinician": {
"type": "Pointer",
"required": false,
"targetClass": "User"
},
"status": {
"type": "String",
"required": true
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "Encounter",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"patient": {
"type": "Pointer",
"required": true,
"targetClass": "Patient"
},
"encounterNumber": {
"type": "String",
"required": true
},
"type": {
"type": "String",
"required": true
},
"department": {
"type": "String",
"required": false
},
"admittingClinician": {
"type": "Pointer",
"required": false,
"targetClass": "User"
},
"startedAt": {
"type": "Date",
"required": true
},
"endedAt": {
"type": "Date",
"required": false
},
"status": {
"type": "String",
"required": true
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "MedicalNote",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"patient": {
"type": "Pointer",
"required": true,
"targetClass": "Patient"
},
"encounter": {
"type": "Pointer",
"required": true,
"targetClass": "Encounter"
},
"author": {
"type": "Pointer",
"required": true,
"targetClass": "User"
},
"title": {
"type": "String",
"required": true
},
"noteType": {
"type": "String",
"required": true
},
"currentVersionNumber": {
"type": "Number",
"required": true
},
"status": {
"type": "String",
"required": true
},
"requiresCosign": {
"type": "Boolean",
"required": false
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "NoteVersion",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"medicalNote": {
"type": "Pointer",
"required": true,
"targetClass": "MedicalNote"
},
"versionNumber": {
"type": "Number",
"required": true
},
"editor": {
"type": "Pointer",
"required": true,
"targetClass": "User"
},
"subjective": {
"type": "String",
"required": false
},
"objective": {
"type": "String",
"required": false
},
"assessment": {
"type": "String",
"required": false
},
"plan": {
"type": "String",
"required": false
},
"changeSummary": {
"type": "String",
"required": false
},
"isAddendum": {
"type": "Boolean",
"required": false
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "Signature",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"medicalNote": {
"type": "Pointer",
"required": true,
"targetClass": "MedicalNote"
},
"noteVersion": {
"type": "Pointer",
"required": true,
"targetClass": "NoteVersion"
},
"signer": {
"type": "Pointer",
"required": true,
"targetClass": "User"
},
"signatureRole": {
"type": "String",
"required": true
},
"status": {
"type": "String",
"required": true
},
"signedAt": {
"type": "Date",
"required": false
},
"comment": {
"type": "String",
"required": false
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "Attachment",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"patient": {
"type": "Pointer",
"required": true,
"targetClass": "Patient"
},
"encounter": {
"type": "Pointer",
"required": false,
"targetClass": "Encounter"
},
"medicalNote": {
"type": "Pointer",
"required": false,
"targetClass": "MedicalNote"
},
"file": {
"type": "File",
"required": true
},
"category": {
"type": "String",
"required": true
},
"uploadedBy": {
"type": "Pointer",
"required": true,
"targetClass": "User"
},
"createdAt": {
"type": "Date",
"required": false
},
"updatedAt": {
"type": "Date",
"required": false
}
}
},
{
"className": "AuditEvent",
"fields": {
"objectId": {
"type": "String",
"required": false
},
"actor": {
"type": "Pointer",
"required": true,
"targetClass": "User"
},
"patient": {
"type": "Pointer",
"required": false,
"targetClass": "Patient"
},
"eventType": {
"type": "String",
"required": true
},
"targetClass": {
"type": "String",
"required": false
},
"targetId": {
"type": "String",
"required": false
},
"details": {
"type": "String",
"required": false
},
"ipAddress": {
"type": "String",
"required": false
},
"timestamp": {
"type": "Date",
"required": true
}
}
}
]
}与AI代理一起构建
使用 Back4app AI Agent 从此模板生成完整的 EHR 应用,包括前端、后端、身份验证、笔记修订工作流和签名流程。
在 Back4app 上使用此确切的架构和行为创建电子健康记录(EHR)后端。 架构: 1. 病人:医疗记录编号(字符串,必需),全名(字符串,必需),出生日期(日期),出生时性别(字符串),联系方式(JSON),主治医师(指向用户的指针,可选),状态(字符串:活动、非活动、已归档),对象 ID,创建时间,更新时间。 2. 就诊:病人(指向病人的指针,必需),就诊类型(字符串:门诊、住院、急诊、远程医疗),开始时间(日期,必需),结束时间(日期,可选),地点(字符串),主治医生(指向用户的指针),状态(字符串:开放、关闭、取消),对象 ID,创建时间,更新时间。 3. 医疗笔记:病人(指向病人的指针,必需),就诊(指向就诊的指针,可选),作者(指向用户的指针,必需),笔记类型(字符串:进展,入院,出院,咨询,程序),标题(字符串),内容(字符串,必需),版本号(数字,必需),上一版本(指向医疗笔记的指针,可选),状态(字符串:草稿,审查中,已签署,已修订),修订原因(字符串,可选),对象 ID,创建时间,更新时间。 4. 笔记签名:笔记(指向医疗笔记的指针,必需),签署者(指向用户的指针,必需),签署者角色(字符串),状态(字符串:请求中,已签署,已拒绝),请求时间(日期),签署时间(日期,可选),评论(字符串,可选),对象 ID,创建时间,更新时间。 5. 审计事件:参与者(指向用户的指针),事件类型(字符串),目标类别(字符串),目标 ID(字符串),详情(JSON),时间戳(日期) — 仅附加。 安全性: - 基于角色的 CLP 和 ACL:仅经过身份验证的护理团队用户可以访问病人和就诊数据。只有笔记作者或监督角色可以编辑医疗笔记草稿。仅分配的签署者可以完成笔记签名操作。审计事件仅附加且仅限阅读。 身份验证: - 临床医生通过内置用户注册和登录;角色由管理员分配。 行为: - 认证用户,获取病人档案,创建或修订医疗笔记,请求一个或多个笔记签名批准,并为每个关键操作写入审计事件条目。 交付: - Back4app 应用,带架构、ACL、CLP、云代码验证、种子样本数据,以及每种选择技术的前端脚手架。
按下面的按钮打开带有此模板提示预填充的 Agent。
此基础提示描述了 EHR 架构和行为;您可以之后选择特定技术的后缀。
API 游乐场
尝试 REST 和 GraphQL 端点与 EHR 架构。响应使用模拟数据,无需 Back4app 帐户。
使用与此模板相同的架构。
选择您的技术
展开每个卡片以获取集成步骤、状态模式、数据模型示例和离线备注。
Flutter EHR 后端
React EHR 后端
React 本地 EHR 后端
Next.js EHR 后端
JavaScript EHR 后端
Android EHR 后端
iOS EHR 后端
Vue EHR 后端
Angular EHR 后端
GraphQL EHR 后端
REST API EHR 后端
PHP EHR 后端
.NET EHR 后端
每项技术的收获
每个技术栈使用相同的 EHR 后端模式和 API 合同。
综合患者记录
轻松管理 ehr 系统 的完整患者历史记录。
安全的数据存储
通过强大的 ehr 系统 数据保护确保患者机密性。
合规性审计轨迹
维护所有 ehr 系统 交互的准确日志以符合监管要求。
REST/GraphQL APIs
通过现代 API 无缝访问和操作 ehr 系统 数据。
笔记的版本控制
通过有效的笔记版本管理跟踪 ehr 系统 文档中的变化。
可自定义的工作流程
通过灵活的后端解决方案以满足独特的 ehr 系统 需求调整流程。
Ehr 系统框架比较
比较所有支持技术的设置速度、SDK 风格和 AI 支持。
| 框架 | 设置时间 | Ehr 系统的好处 | SDK 类型 | AI 支持 |
|---|---|---|---|---|
| 快速(5 分钟)设置 | 移动和网络上的 ehr 系统单一代码库。 | Typed SDK | 完整 | |
| ~5 分钟 | 针对 ehr 系统的快速网页仪表板。 | Typed SDK | 完整 | |
| 大约 5 分钟 | 针对 ehr 系统的跨平台移动应用程序。 | Typed SDK | 完整 | |
| 少于 5 分钟 | 针对 ehr 系统的服务器渲染网页应用程序。 | Typed SDK | 完整 | |
| 少于 5 分钟 | 针对 ehr 系统的轻量级网页集成。 | Typed SDK | 完整 | |
| 快速(5 分钟)设置 | 针对 ehr 系统的本地 Android 应用程序。 | Typed SDK | 完整 | |
| ~5 分钟 | 针对 ehr 系统的本地 iOS 应用程序。 | Typed SDK | 完整 | |
| 大约 5 分钟 | React 的网页 UI 适用于 ehr 系统。 | Typed SDK | 完整 | |
| 少于 5 分钟 | 针对 ehr 系统的企业网页应用程序。 | Typed SDK | 完整 | |
| ~2 分钟 | 灵活的 GraphQL API 适用于 ehr 系统。 | GraphQL API | 完整 | |
| 少于 2 分钟 | REST API 整合在 ehr 系统中。 | REST API | 完整 | |
| ~3–5 分钟 | 针对 ehr 系统的服务器端 PHP 后端。 | REST API | 完整 | |
| 大约 5 分钟 | .NET 后端适用于 ehr 系统。 | Typed SDK | 完整 |
设置时间反映了从项目启动到第一个病人病历视图填充遇见和笔记摘要的预期持续时间。
常见问题
有关使用此模板构建EHR后端的常见问题。