RPM 应用
与 AI Agent 一起构建
RPM 应用后端

远程患者监测应用后端模板
提供来自家庭 IoT 医疗设备对患者数据的安全访问,以实现有效监测

一个在 Back4app 上的生产就绪的 RPM 应用后端,用于从 IoT 设备安全访问患者数据,包含监测日志和用户消息,并具有集中审计日志。其特色包括 ER 图、数据字典、JSON 模式、API 游乐场,以及用于快速引导的 AI代理 提示。

关键要点

交付一个用于远程患者监控的后端,具备安全访问控制、物联网数据检索和监控日志,以便您的产品团队可以专注于用户体验和合规性。

  1. 以物联网为首的数据模型保持患者身份、设备数据和监控日志明显区分但在身份验证和授权上相互关联。
  2. 安全消息传递患者与临床医生之间的线程消息,带有明确的已读回执和保留控制。
  3. 版本化设备数据存储带有版本元数据的设备数据,确保更新的读数和通知得到有效跟踪。
  4. 监控日志生命周期高效管理监控日志,记录用户交互和设备状态。
  5. 合规审计日志集中式审计日志捕获敏感事件以供审核和遵守健康法规。

RPM 应用后端模板是什么?

Back4app 是一种后端即服务 (BaaS),用于快速交付。RPM 应用后端模板提供了一个预构建的患者档案、物联网设备数据、监控日志、安全消息和审计日志的架构。连接您喜欢的前端(React,Flutter,Next.js 等)并加快交付。

最佳适用:

远程患者监控应用物联网设备数据访问为临床医生提供安全消息服务患者监测团队构建合规的医疗原型

概述

RPM 应用需要强大的数据边界、可审计的交易和对从物联网设备收集的敏感患者信息的可靠传递。

此模板定义了 PatientProfile、DeviceData、MonitoringLog、UserMessage 和 AuditLog 类,拥有所有权和基于角色的规则,以便团队可以快速而安全地实现 RPM 应用。

核心 RPM 应用功能

该中心的每个技术卡片都利用相同的 RPM 应用后端架构,包含 PatientProfile、DeviceData、MonitoringLog、UserMessage 和 AuditLog。

患者档案与身份验证

PatientProfile 存储身份信息、联系详情和偏好,以及与已认证用户的链接。

版本化设备数据

DeviceData 存储设备类型、原始数据、记录时间、版本和用户来源。

监控日志管理

监控日志按时间顺序跟踪患者交互及状态记录。

安全的临床医生与患者的消息传递

用户消息支持 Provider 与患者之间的交流,支持附件和交付/阅读状态。

集中审计日志

审计日志捕获用户所采取行动的见解,确保明确的责任。

为什么要使用Back4app构建您的 RPM 应用后端?

Back4app 管理后端基本功能——安全、数据持久性、API 和实时更新——使您能够优先考虑用户体验、隐私和临床集成。

  • 安全传输患者数据: 内置认证和访问控制使您能够限制每个设备阅读、监控日志或消息的特定用户可见性。
  • 审计和来源追踪: AuditLog 记录谁访问、发布或修改了敏感数据,以确保合规性。
  • 消息和实时通知: 线程消息、附件和可选的实时更新促进了患者与医疗 Provider 之间的顺畅沟通。

快速部署安全的 RPM 应用后端,专注于迭代临床工作流程,而不是后端复杂性。

核心优势

一个优先考虑数据隐私、来源和敏捷交付的 RPM 应用后端。

更快的患者体验

通过利用经过预验证的后端结构,快速交付设备数据视图、监控功能和安全消息。

强大的数据来源

维护设备数据和日志的版本控制,以便临床操作可以审计。

细粒度权限

通过基于角色的访问控制保护敏感记录,确保只有授权人员可以查看特定数据。

集成消息

线程消息和实时更新改善了患者与医疗专业人员之间的沟通。

合规准备日志记录

集中式审计日志保留详细的医疗合规和商业智能记录。

AI辅助初始配置

通过策划的AI代理提示启动开发,以搭建模式、权限和基本集成代码。

准备好构建安全的RPM应用程序了吗?

允许Back4app AI代理搭建您的RPM应用程序后端,从一个提示中生成患者档案、设备数据、监控日志和审计日志。

免费开始 - 每月50个AI代理提示,无需信用卡

技术栈

此RPM应用程序后端模板中包含所有内容。

前端
13+ 技术
后端
Back4app
数据库
MongoDB
身份验证
内置身份验证 + 会话
API
REST 和 GraphQL
实时
Live Queries

ER 图

RPM 应用后台架构的实体关系模型。

查看图表源
Mermaid
erDiagram
    PatientProfile ||--o{ LabResult : "has"
    PatientProfile ||--o{ TreatmentPlan : "receives"
    PatientProfile ||--o{ Message : "context for"
    PatientProfile ||--o{ Appointment : "scheduled in"
    _User ||--o{ Message : "sends/receives"
    _User ||--o{ TreatmentPlan : "authors"
    _User ||--o{ Appointment : "provides"

    PatientProfile {
        String objectId PK
        Pointer user FK
        String medicalRecordNumber
        String displayName
        Date dateOfBirth
        String primaryClinic
        Boolean isActive
        Date createdAt
        Date updatedAt
    }

    LabResult {
        String objectId PK
        Pointer patient FK
        Pointer orderedBy FK
        String testCode
        String testName
        String resultValue
        String units
        String referenceRange
        String status
        Date publishedAt
        Array attachments
        Date createdAt
        Date updatedAt
    }

    TreatmentPlan {
        String objectId PK
        Pointer patient FK
        Pointer createdBy FK
        String summary
        String details
        String status
        Date startDate
        Date endDate
        Date createdAt
        Date updatedAt
    }

    Message {
        String objectId PK
        String conversationId
        Pointer from FK
        Pointer to FK
        Pointer patient FK
        String body
        Array attachments
        Boolean isRead
        Date sentAt
        Date createdAt
        Date updatedAt
    }

    Appointment {
        String objectId PK
        Pointer patient FK
        Pointer provider FK
        Date startAt
        Date endAt
        String location
        String status
        String reason
        Date createdAt
        Date updatedAt
    }

    AuditLog {
        String objectId PK
        Pointer actor FK
        String entityType
        String entityId
        String action
        String summary
        Object metadata
        Date createdAt
        Date updatedAt
    }

集成流程

身份验证、数据检索、监控更新和消息传递的典型运行流程。

查看图表源
Mermaid
sequenceDiagram
  participant User as Patient
  participant App as RPM Dashboard App
  participant Clinician
  participant Back4app as Back4app Cloud

  User->>App: Sign in with email or SSO
  App->>Back4app: POST /login (credentials/SSO token)
  Back4app-->>App: Return Session Token + Patient context

  User->>App: Open Dashboard (profile & recent labs)
  App->>Back4app: GET /classes/PatientProfile?where={"user":Pointer("_User", "u123")}
  Back4app-->>App: PatientProfile object
  App->>Back4app: GET /classes/LabResult?where={"patient":Pointer("PatientProfile","p123")}&order=-publishedAt
  Back4app-->>App: List of LabResult (latest first)

  User->>App: View active Treatment Plan
  App->>Back4app: GET /classes/TreatmentPlan?where={"patient":Pointer("PatientProfile","p123"),"status":"active"}
  Back4app-->>App: TreatmentPlan object

  User->>App: Send secure message to clinician
  App->>Back4app: POST /classes/Message (conversationId, body, to: Pointer(_User, clinicianId))
  Back4app-->>App: Message objectId

  Back4app-->>App: LiveQuery -> new Message or LabResult update
  App-->>User: Real-time notification (new message / result available)

  Clinician->>Back4app: Update LabResult (finalize)
  Back4app-->>App: LiveQuery event -> App fetches updated LabResult
  App-->>User: Alert: "New lab result available"

数据字典

RPM应用程序架构中每个类的完整字段级参考。

字段类型描述必需
objectIdStringAuto-generated unique identifier自动
userPointer<_User>Linked Back4app user account
medicalRecordNumberStringUnique MRN for the patient
displayNameStringPatient full name shown in UI
dateOfBirthDatePatient date of birth
primaryClinicStringPrimary clinic or provider group
isActiveBooleanActive portal access flag
createdAtDateAuto-generated creation timestamp自动
updatedAtDateAuto-generated last-update timestamp自动

9字段在PatientProfile中

安全性和权限

ACL、CLP和加密策略如何保护患者数据、物联网数据、消息和审计日志。

基于角色的访问和所有权

应用访问控制列表(ACL),以便患者可以查看自己的设备数据和监控日志,而临床医生可以查看与其指定患者相关的数据;CLP防止对类的未经授权的操作。

加密的有效负载和附件

安全存储敏感数据,使用加密,并利用签名URL安全访问大型文件。

仅追加的审计记录

记录来自服务器端函数的审计日志事件,以保护历史合规数据免受篡改。

模式(JSON)

原始JSON模式定义,准备复制到Back4app或用作实施参考。

JSON
{
  "classes": [
    {
      "className": "PatientProfile",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "user": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "medicalRecordNumber": {
          "type": "String",
          "required": true
        },
        "displayName": {
          "type": "String",
          "required": true
        },
        "dateOfBirth": {
          "type": "Date",
          "required": false
        },
        "primaryClinic": {
          "type": "String",
          "required": false
        },
        "isActive": {
          "type": "Boolean",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "LabResult",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "patient": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PatientProfile"
        },
        "orderedBy": {
          "type": "Pointer",
          "required": false,
          "targetClass": "_User"
        },
        "testCode": {
          "type": "String",
          "required": false
        },
        "testName": {
          "type": "String",
          "required": true
        },
        "resultValue": {
          "type": "String",
          "required": false
        },
        "units": {
          "type": "String",
          "required": false
        },
        "referenceRange": {
          "type": "String",
          "required": false
        },
        "status": {
          "type": "String",
          "required": true
        },
        "publishedAt": {
          "type": "Date",
          "required": false
        },
        "attachments": {
          "type": "Array",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "TreatmentPlan",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "patient": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PatientProfile"
        },
        "createdBy": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "summary": {
          "type": "String",
          "required": true
        },
        "details": {
          "type": "String",
          "required": false
        },
        "status": {
          "type": "String",
          "required": true
        },
        "startDate": {
          "type": "Date",
          "required": false
        },
        "endDate": {
          "type": "Date",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Message",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "conversationId": {
          "type": "String",
          "required": true
        },
        "from": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "to": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "patient": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PatientProfile"
        },
        "body": {
          "type": "String",
          "required": true
        },
        "attachments": {
          "type": "Array",
          "required": false
        },
        "isRead": {
          "type": "Boolean",
          "required": true
        },
        "sentAt": {
          "type": "Date",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Appointment",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "patient": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PatientProfile"
        },
        "provider": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "startAt": {
          "type": "Date",
          "required": true
        },
        "endAt": {
          "type": "Date",
          "required": true
        },
        "location": {
          "type": "String",
          "required": false
        },
        "status": {
          "type": "String",
          "required": true
        },
        "reason": {
          "type": "String",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "AuditLog",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "actor": {
          "type": "Pointer",
          "required": true,
          "targetClass": "_User"
        },
        "entityType": {
          "type": "String",
          "required": true
        },
        "entityId": {
          "type": "String",
          "required": true
        },
        "action": {
          "type": "String",
          "required": true
        },
        "summary": {
          "type": "String",
          "required": true
        },
        "metadata": {
          "type": "Object",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    }
  ]
}

使用AI代理构建

使用Back4app AI代理根据此模板生成RPM应用,包括后端模式、访问控制和初始前端集成。

Back4app AI代理
准备构建
在Back4app上创建一个具有此架构和行为的RPM应用后端。

架构:
1. PatientProfile: user(指向用户的指针,必填),fullName(字符串,必填),dob(日期,选填),contact(对象),medicalRecordNumber(字符串,必填,唯一);objectId,createdAt,updatedAt。
2. DeviceData: patient(指向PatientProfile的指针,必填),deviceType(字符串),dataPayload(对象),recordedAt(日期,必填),version(数字,默认为1);objectId,createdAt,updatedAt。
3. MonitoringLog: patient(指向PatientProfile的指针,必填),data(指向DeviceData的指针,必填),timestamp(日期,必填),status(字符串,必填);objectId,createdAt,updatedAt。
4. UserMessage: sender(指向用户的指针,必填),recipient(指向用户的指针,必填),threadId(字符串,必填),body(字符串),attachments(文件数组),status(字符串:已发送,已发送,已阅读),sentAt(日期);objectId,createdAt,updatedAt。
5. AuditLog: actor(指向用户的指针,必填),action(字符串,必填),entityType(字符串,必填),entityId(字符串,必填),payload(对象,选填),createdAt(日期);objectId,createdAt,updatedAt。

安全性:
- 强制执行ACL,使患者只能读取他们的DeviceData和MonitoringLog记录。临床医生查看指定的患者。对敏感过渡使用云代码并在服务器端编写审计日志条目。使用加密保护您的数据。

身份验证:
- 支持患者和临床医生注册;角色分配;安全登录和会话管理。

行为:
- 患者登录,获取最新的DeviceData和MonitoringLogs,向临床医生线程发送消息,并接收通知。临床医生发布设备数据和监控日志;系统为发布操作写入审计日志条目。

交付:
- 带有架构、CLPs、ACLs、用于发布和审计日志的云代码钩子的Back4app应用,以及用于患者和临床医生视图的初始前端集成。

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

这是没有技术后缀的基本提示。您可以在之后调整生成的前端栈。

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

API 演示区

尝试对 RPM 应用程序架构使用 REST 和 GraphQL 端点。响应使用模拟数据,不需要 Back4app 账户。

common.loadingPlayground

使用与此模板相同的架构。

选择您的技术

展开每个卡片以获取集成步骤、状态模式、数据模型示例和离线备注。

Flutter RPM 应用后端

React RPM 应用后端

React 原生 RPM 应用后端

Next.js RPM 应用后端

JavaScript RPM 应用后端

Android RPM 应用后端

iOS RPM 应用后端

Vue RPM 应用后端

Angular RPM 应用后端

GraphQL RPM 应用后端

REST API RPM 应用后端

PHP RPM 应用后端

.NET RPM 应用后端

您从每种技术中获得的内容

每个技术栈使用相同的 RPM 应用后端模式和 API 规则。

预构建的患者档案模式

通过统一的rpm仪表板结构轻松管理和访问患者数据。

物联网设备数据集成

无缝连接和监控物联网设备以获取实时的rpm仪表板见解。

为rpm仪表板提供安全消息

通过加密消息安全地与患者和Provider沟通。

综合监控日志

通过详细的日志跟踪患者活动和健康指标,以获得rpm仪表板的信息。

REST/GraphQL APIs支持

灵活的API选项,使您能够高效地与您的rpm仪表板后端进行交互。

合规审计日志

通过详细的审计记录维护所有rpm仪表板活动的合规性。

Rpm仪表板框架比较

评估所有支持的技术栈的设置速度、SDK样式和AI支持。

框架设置时间Rpm仪表板的好处SDK 类型AI 支持
~3–7分钟移动和Web上rpm仪表板的单一代码库。Typed SDK完整
快速(5分钟)设置rpm仪表板的快速Web仪表板。Typed SDK完整
~5分钟rpm仪表板的跨平台移动应用。Typed SDK完整
大约5分钟rpm仪表板的服务器渲染Web应用。Typed SDK完整
~3分钟rpm仪表板的轻量级Web集成。Typed SDK完整
~3–7分钟Android的本地应用用于rpm仪表板。Typed SDK完整
快速(5分钟)设置iOS的本地应用用于rpm仪表板。Typed SDK完整
~5分钟Reactive的Web UI用于rpm仪表板。Typed SDK完整
大约5分钟rpm仪表板的企业Web应用。Typed SDK完整
快速(2分钟)设置灵活的GraphQL API用于rpm仪表板。GraphQL API完整
~2分钟REST API集成用于rpm仪表板。REST API完整
少于5分钟rpm仪表板的服务器端PHP后端。REST API完整
~5分钟.NET后端用于rpm仪表板。Typed SDK完整

设置时间表示从项目初始化到首次患者登录和使用此模板模式查询设备数据的预期持续时间。

常见问题

有关使用此模板构建 RPM 应用后端的常见咨询。

什么是RPM应用程序后端?
RPM应用程序模板包含什么?
为什么选择 Back4app 作为RPM应用程序?
如何在一次调用中检索最新的设备数据及其状态?
我如何将消息标记为已读?
React Native 能否缓存监控日志以供离线使用?
我如何防止未授权访问敏感的设备数据?
将监控日志与消息连接的最佳策略是什么?
审计日志机制从头到尾是如何工作的?
我该如何处理监控日志中的患者确认?

全球开发者信赖的

加入使用Back4app模板快速部署安全RPM应用的团队。

G2 Users Love Us Badge

准备好构建您的RPM应用了吗?

只需几分钟即可启动您的RPM应用项目。无需信用卡。

选择技术