電子健康紀錄 (EHR) 應用後端模板
長期患者紀錄、就診文件、簽名註解工作流程及可追溯的審計歷史
一個生產就緒的 EHR 後端 在 Back4app,提供全面的患者臨床歷史、版本註解及多簽名批准流程。使用它更快地推送醫療產品至網頁和行動裝置,同時保持可追溯性。
關鍵要點
本範本為病人記錄、就診、筆記修訂和共同簽名流程提供一個準備好的臨床文檔後端,以便團隊可以專注於護理工作流程,而不是重建後端基礎。
- 縱向病人圖表模型 — 組織人口統計、識別碼、就診和臨床條目的結構,建立完整的病歷查看。
- 版本化醫療筆記工作流程 — 追蹤草稿、審查、修訂和簽署的筆記修訂,以確保文檔歷史明確且可查詢。
- 多簽名支持 — 收集參與醫生、住院醫師、專科醫生或監督者的簽名,並進行狀態跟踪和帶時間戳的批准。
- 圖表訪問的可審計性 — 捕捉有意義的訪問和變更事件,以支持內部審查、合規報告和操作故障排除。
- 跨平台交付 — 通過 REST 和 GraphQL 提供門戶、臨床工作站和移動圖表應用程式,並可選擇 Live Queries。
什麼是電子健康記錄 (EHR) 應用程序後端模板?
Back4app 是一個用於快速產品交付的管理後端。電子健康記錄 (EHR) 應用程序後端模板建模患者、就診、筆記版本、簽名和審計事件,使團隊能夠從第一天起實施醫療文件產品,並擁有強大的後端合約。
最佳選擇:
概述
臨床文件系統必須在可用性與可追溯性之間取得平衡。團隊需要完整的病人體驗時間線、結構化的就診記錄、控制的備忘錄修訂和可靠的簽名及修正批准路徑。
此模板定義了病人、就診、醫療備忘錄、備忘錄簽名和審計事件,並包含所有權規則和可選的 Live Queries,以便團隊能夠快速而一致地構建電子健康記錄體驗。
核心 EHR 功能
此中心中的每個技術卡都使用相同的電子健康記錄架構,包括患者、就診、醫療筆記、簽名和稽核事件。
病人主記錄
儲存每位病人的人口統計資料、醫療紀錄號碼、出生日期、聯絡資料和核心圖表元資料。
基於接觸的圖表組織
代表訪問、住院、諮詢或跟進,並附上時間戳、護理背景、狀態和負責醫生的指向。
版本醫療筆記
MedicalNote 儲存筆記類型、內容、修訂號碼、狀態、修訂元數據,以及與病人和就診的連結。
多重簽名批准工作流程
NoteSignature 物件追蹤必須簽名的人、角色、當前狀態、簽署時間戳記以及可選註解。
訪問和變更審核事件
AuditEvent 記錄重要的讀取、寫入、狀態更改和簽名操作,並包含行為者、目標和時間戳數據。
為什麼選擇使用 Back4app 來構建您的電子健康紀錄 (EHR) 應用後端?
Back4app 為醫療文檔流程提供受管理的後端合約,讓您的團隊可以專注於臨床體驗、圖表可用性和領域邏輯,而無需關注基礎設施問題。
- •臨床數據構建 Blocks: 預定義的病人記錄、接觸、備註版本和簽名類別使您可以實施基本的 EHR 流程,而無需從零開始設計整個後端。
- •修訂和批准可追溯性: 帶版本記錄的備註加上明確的簽名對象使得能夠更清晰地表示草稿、審核、修訂和簽署狀態。
- •靈活的應用程序和集成 API: 使用 Live Queries 進行圖表更新,同時為門戶、移動圖表、分析和外部臨床集成公開 REST 和 GraphQL 端點。
通過一個後端合約標準化團隊和平台之間的病人圖表,減少發送安全文檔工作流程所需的時間。
核心好處
一個醫療文檔後端,幫助您更快地移動,同時保留版本歷史和批准可追溯性。
更快速的圖表產品交付
從預構建的患者和筆記模型開始,讓您的團隊能夠專注於圖表審查、文檔和批准屏幕等工作流程。
清晰的修訂歷史
保留明確的筆記版本和修改沿革,以便團隊能夠理解變更的內容、變更的時間和哪個版本是權威的。
簽名工作流程支持
表示審核隊列、所需簽名者、聯簽截止日期和完成狀態,而無需先創建一個單獨的工作流程引擎。
角色感知的訪問模式
應用角色和擁有權規則,讓只有授權的臨床醫生或管理員可以創建、編輯、簽署或查看敏感的病歷內容。
即時病歷反應能力
Live Queries 可以在事件更新、備註修改或所需簽名完成時通知客戶。
可擴展以進行整合
使用 REST 或 GraphQL API 連接日程工具、病人門戶、計費系統或互操作性層。
準備好啟動現代化的電子健康紀錄工作流程了嗎?
讓 Back4app AI 代理為電子健康紀錄後端搭建架構,並從一個提示中填充樣本病人、臨床事件、備註版本和審核事件。
免費開始 — 每月 50 條 AI 代理提示,無需信用卡
技術棧
此 EHR 後端模板包含所有內容。
ER 圖
電子健康紀錄模式的實體關係模型。
涵蓋病人、會診、筆記修訂、簽名和審計事件的模式。
查看圖示來源
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
}
整合流程
病人圖表訪問、會診文檔、版本化筆記更新和簽名工作流的身份驗證到 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)
原始 JSON 架構定義,準備複製到 Back4app 或用作實施參考。
{
"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 代理人從這個模板生成完整的電子健康記錄 (EHR) 應用,包括前端、後端、身份驗證、筆記修訂工作流程和簽名流程。
在 Back4app 上根據這個確切的架構和行為創建電子健康記錄 (EHR) 後端。 架構: 1. 患者:醫療記錄號(字符串,必填),全名(字符串,必填),出生日期(日期),出生時性別(字符串),聯繫方式(JSON),主要臨床醫生(用戶指針,可選),狀態(字符串:活躍,非活躍,已存檔),objectId,創建時間,更新時間。 2. 接觸:患者(指向患者的指針,必填),接觸類型(字符串:門診,住院,緊急,遠程健康),開始時間(日期,必填),結束時間(日期,可選),位置(字符串),主治臨床醫生(用戶指針),狀態(字符串:開放,關閉,取消),objectId,創建時間,更新時間。 3. 醫療筆記:患者(指向患者的指針,必填),接觸(指向接觸的指針,可選),作者(指向用戶的指針,必填),筆記類型(字符串:進展,入院,出院,諮詢,程序),標題(字符串),內容(字符串,必填),版本號(數字,必填),上版本(指向醫療筆記的指針,可選),狀態(字符串:草稿,審核中,已簽署,已修訂),修訂原因(字符串,可選),objectId,創建時間,更新時間。 4. 筆記簽名:筆記(指向醫療筆記的指針,必填),簽名者(指向用戶的指針,必填),簽名者角色(字符串),狀態(字符串:已請求,已簽署,已拒絕),請求時間(日期),簽署時間(日期,可選),評論(字符串,可選),objectId,創建時間,更新時間。 5. 審計事件:參與者(指向用戶的指針),事件類型(字符串),目標類(字符串),目標 ID(字符串),詳細信息(JSON),時間戳(日期)——僅附加。 安全性: - 基於角色的 CLP 和 ACL:只有經身份驗證的醫療團隊用戶才能訪問患者和接觸數據。只有筆記作者或監督角色才能編輯醫療筆記草稿。只有指定的簽名者才能完成筆記簽名操作。審計事件僅限附加,且只讀。 身份驗證: - 臨床醫生通過內建用戶註冊和登錄;角色由管理員分配。 行為: - 驗證用戶,獲取患者圖表,創建或修訂醫療筆記,請求一個或多個筆記簽名批准,並為每個關鍵操作寫入審計事件條目。 交付: - Back4app 應用具有架構、ACL、CLP、雲代碼驗證、種子示例數據和每種選定技術的前端框架。
按下下面的按鈕以使用此模板提示預填的內容打開代理人。
這個基本提示描述了 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 分鐘 | Reactive 網頁介面針對 ehr 系統。 | Typed SDK | 完整 | |
| 少於 5 分鐘 | 針對 ehr 系統的企業網頁應用程式。 | Typed SDK | 完整 | |
| ~2 分鐘 | 針對 ehr 系統的靈活 GraphQL API。 | GraphQL API | 完整 | |
| 少於 2 分鐘 | REST API 整合針對 ehr 系統。 | REST API | 完整 | |
| ~3–5 分鐘 | 針對 ehr 系統的伺服器端 PHP 後端。 | REST API | 完整 | |
| 大約 5 分鐘 | .NET 後端針對 ehr 系統。 | Typed SDK | 完整 |
設置時間反映從專案啟動到首次病人圖表視圖填充遇到和筆記摘要的預期持續時間。
常見問題
有關使用此模板構建EHR後端的常見問題。