EHR 后端

电子健康记录(EHR)应用程序后端模板
纵向患者记录、访问信息文档、签署笔记工作流和可追溯审计历史

一个在 Back4app 上准备投入生产的 EHR 后端,用于全面患者临床历史、版本化笔记和多签名审批流程。使用它可以更快地跨网络和移动设备发布医疗产品,同时保持可追溯性。

关键要点

该模板为患者记录、就诊、笔记修订和共同签名流程提供了一个适合临床文档的后端,使团队可以专注于护理工作流程,而不是重建后端基础。

  1. 纵向患者图表模型以适合完整患者历史视图的结构组织人口统计、标识符、就诊记录和临床条目。
  2. 版本化医学笔记工作流程跟踪草稿、审核、修订和签署的笔记修订,使文档历史保持明确和可查询。
  3. 多重签名支持收集医生、住院医师、专家或监督员的签名,并进行状态跟踪和有时间戳的批准。
  4. 审核图表访问的能力捕捉有意义的访问和变更事件,以支持内部审查、合规报告和运营故障排除。
  5. 跨平台交付通过 REST 和 GraphQL 提供门户、临床医生工作站和移动图表应用程序,并可选配 Live Queries。

电子健康记录 (EHR) 应用后端模板是什么?

Back4app 是一个托管后端,用于快速产品交付。电子健康记录 (EHR) 应用后端模板建模患者、接触、记录版本、签名和审计事件,以便团队能够从第一天起实施强大的后端合同的医疗文档产品。

最佳适用:

电子健康记录软件临床文档系统患者历史时间线进展记录和图表工具住院医生与主治医生联合签字工作流程医疗 MVP 和内部工具

概述

临床文档系统必须在可用性与可追溯性之间取得平衡。团队需要完整的患者时间线、结构化的接诊记录、受控的笔记修订以及可靠的签名和修正路径。

此模板定义了患者、接诊、医疗笔记、笔记签名和审计事件的所有权规则和可选的 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后端模板中包含所有内容。

前端
13+ 技术
后端
Back4app
数据库
MongoDB
认证
内置认证 + 角色
API
REST 和 GraphQL
实时
Live Queries

ER 图

EHR架构的实体关系模型。

查看图表源
Mermaid
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流程。

查看图表源
Mermaid
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)模式中每个类的完整字段级参考。

字段类型描述必填
objectIdStringAuto-generated unique identifier自动
usernameStringLogin username for clinicians, scribes, and administrators
emailStringUser email address
passwordStringHashed password (write-only)
roleStringRole (admin, physician, nurse, scribe, auditor)
displayNameStringFull display name used in signatures and chart headers
licenseNumberStringClinical license or credential identifier
createdAtDateAuto-generated creation timestamp自动
updatedAtDateAuto-generated last-update timestamp自动

9 字段在 User 中

安全性和权限

ACL、角色和 CLP 策略如何保护患者图表、注释修订、签名和审计事件。

基于角色的图表访问

使用临床医生、主治医生、审阅者和管理员等角色来界定谁可以查看患者记录、撰写注释、请求签名或管理访问权限。

拥有权和签名责任

将注释编辑限制为授权作者或主管,同时仅允许指定的签名者完成分配给他们的NoteSignature记录。

受保护的审计记录

AuditEvent条目应为追加式并受到严格控制,以便图表访问历史和关键更改无法从客户端应用程序中篡改。

架构(JSON)

准备好复制到Back4app的原始JSON架构定义或用作实现参考。

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 AI Agent
准备好构建
在 Back4app 上使用此确切的架构和行为创建电子健康记录(EHR)后端。

架构:
1. 病人:医疗记录编号(字符串,必需),全名(字符串,必需),出生日期(日期),出生时性别(字符串),联系方式(JSON),主治医师(指向用户的指针,可选),状态(字符串:活动、非活动、已归档),对象 ID,创建时间,更新时间。
2. 就诊:病人(指向病人的指针,必需),就诊类型(字符串:门诊、住院、急诊、远程医疗),开始时间(日期,必需),结束时间(日期,可选),地点(字符串),主治医生(指向用户的指针),状态(字符串:开放、关闭、取消),对象 ID,创建时间,更新时间。
3. 医疗笔记:病人(指向病人的指针,必需),就诊(指向就诊的指针,可选),作者(指向用户的指针,必需),笔记类型(字符串:进展,入院,出院,咨询,程序),标题(字符串),内容(字符串,必需),版本号(数字,必需),上一版本(指向医疗笔记的指针,可选),状态(字符串:草稿,审查中,已签署,已修订),修订原因(字符串,可选),对象 ID,创建时间,更新时间。
4. 笔记签名:笔记(指向医疗笔记的指针,必需),签署者(指向用户的指针,必需),签署者角色(字符串),状态(字符串:请求中,已签署,已拒绝),请求时间(日期),签署时间(日期,可选),评论(字符串,可选),对象 ID,创建时间,更新时间。
5. 审计事件:参与者(指向用户的指针),事件类型(字符串),目标类别(字符串),目标 ID(字符串),详情(JSON),时间戳(日期) — 仅附加。

安全性:
- 基于角色的 CLP 和 ACL:仅经过身份验证的护理团队用户可以访问病人和就诊数据。只有笔记作者或监督角色可以编辑医疗笔记草稿。仅分配的签署者可以完成笔记签名操作。审计事件仅附加且仅限阅读。

身份验证:
- 临床医生通过内置用户注册和登录;角色由管理员分配。

行为:
- 认证用户,获取病人档案,创建或修订医疗笔记,请求一个或多个笔记签名批准,并为每个关键操作写入审计事件条目。

交付:
- Back4app 应用,带架构、ACL、CLP、云代码验证、种子样本数据,以及每种选择技术的前端脚手架。

按下面的按钮打开带有此模板提示预填充的 Agent。

此基础提示描述了 EHR 架构和行为;您可以之后选择特定技术的后缀。

几分钟内部署每月 50 个免费提示不需要信用卡

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后端的常见问题。

什么是电子健康记录后端?
此 EHR 模板包含哪些内容?
Live Queries 如何帮助临床应用程序?
我如何防止对之前签名的笔记进行直接编辑?
哪些字段对笔记可追溯性最重要?
我可以在同一模式中支持多种笔记类型吗?
AI 代理如何帮助处理样本临床数据?
处理患者访问审计的推荐方法是什么?
如何支持签署后对备注的修改?

受到数字健康团队的信任

加入使用 Back4app 模板构建结构化、可审计的临床工作流程的医疗软件团队

G2 Users Love Us Badge

准备好构建您的电子健康记录(EHR)应用程序了吗?

在几分钟内启动您的临床文档项目。无需信用卡。

选择技术