환자 포털
AI 에이전트로 구축
환자 포털 백엔드

환자 포털 앱 백엔드 템플릿
검사 결과 제공, 치료 계획 관리 및 안전한 의사-환자 메시징 활성화

생산 준비 완료 환자 포털 백엔드 on Back4app 안전한 검사 결과 전달, 치료 계획 관리, 임상의 메시징, 예약 연결 및 중앙 집중식 감사 로그 포함. ER 다이어그램, 데이터 사전, JSON 스키마, API 놀이터 및 빠른 부트를 위한 AI 에이전트 프롬프트 포함.

주요 포인트

안전한 접근 제어, 실험실 버전 관리, 치료 계획 이력, 스레드 메시징 및 감사 추적이 포함된 환자 대면 백엔드를 배포하여 제품 팀이 UX 및 규정 준수에 집중할 수 있도록 합니다.

  1. 환자 중심 데이터 모델환자 신원, 실험실 결과, 치료 및 메시지가 명확한 출처 및 권한 부여를 위해 서로 연결되지만 별도로 모델링됩니다.
  2. 안전한 메시징명확한 읽은 확인 및 보존 제어가 있는 환자와 Provider 간의 스레드형, 첨부 파일 친화적인 메시지입니다.
  3. 버전 관리된 실험실 결과출처 및 버전 메타데이터와 함께 실험실 결과를 저장하여 업데이트된 보고서와 추가 설명서를 추적합니다.
  4. 치료 계획 생애 주기Provider의 치료 계획 초안, 승인, 환자 확인 및 버전 기록을 관리합니다.
  5. 규정 준수에 적합한 로깅중앙 집중식 AuditLog 클래스는 검토, 모니터링 및 규정 준수를 위한 민감한 이벤트를 기록합니다.

환자 포털 앱 백엔드 템플릿이란 무엇인가?

Back4app는 신속한 제공을 위한 백엔드 서비스(BaaS)입니다. 환자 포털 앱 백엔드 템플릿은 환자 프로필, 실험실 결과, 치료 계획, 안전한 메시징, 약속 및 감사 로그를 위한 사전 구축된 스키마입니다. 선호하는 프론트엔드(React, Flutter, Next.js, 등)를 연결하고 더 빠르게 배송하세요.

최고의 사용처:

환자 포털원격 건강 메시징안전한 실험실 결과 전달치료 계획 관리의사와 환자 간의 커뮤니케이션HIPAA 인식 프로토타입 구축팀

개요

환자 포털은 강력한 데이터 경계, 감사 가능한 변경 사항 및 실험실 결과와 치료 계획과 같은 민감한 항목의 신뢰할 수 있는 전달이 필요합니다.

이 템플릿은 PatientProfile, LabResult, TreatmentPlan, Message, ProviderProfile, Appointment 및 AuditLog를 소유권 및 역할 기반 규칙으로 정의하여 팀이 환자 포털을 신속하고 안전하게 구현할 수 있도록 합니다.

핵심 환자 포털 기능

이 허브에 있는 모든 기술 카드는 PatientProfile, LabResult, TreatmentPlan, Message, ProviderProfile, Appointment 및 AuditLog와 함께 동일한 환자 포털 백엔드 스키마를 사용합니다.

환자 프로필 및 인증

PatientProfile은 인증된 사용자에 대한 포인터와 함께 신원, 연락처 세부정보 및 선호도를 저장합니다.

버전 관리된 실험실 결과

LabResult은 테스트 유형, 원시 결과 페이로드, 보고 일자, 버전 및 Provider 출처를 저장합니다.

치료 계획 라이프사이클

TreatmentPlan은 계획 내용을 저장하고, Provider 승인자, 상태(초안, 활성, 완료), 및 유효 기간을 저장합니다.

안전한 의사–환자 메시징

메시지는 스레드, 첨부 파일, 발신자/수신자 포인터, 그리고 배달/읽기 상태를 지원합니다.

약속 연결

약속은 환자, Provider, 예정된 시간, 및 방문 컨텍스트에 대한 상태를 연결합니다.

중앙 집중식 감사 로그

AuditLog는 규정 준수를 위해 액터의 신원, 작업 유형, 엔터티 맥락 및 페이로드 메타데이터를 캡처합니다.

왜 Back4app 로 환자 포털 앱 백엔드를 구축해야 할까요?

Back4app 는 보안, 지속성, API 및 실시간과 같은 백엔드 기본 사항을 처리하므로 환자 경험, 프라이버시 워크플로 및 임상 통합에 집중할 수 있습니다.

  • 클리니컬 데이터의 안전한 전달: 내장된 인증 및 ACL/CLP 패턴을 통해 어떤 사용자가 각 실험실 결과, 치료 계획 또는 메시지를 볼 수 있는지를 정확하게 제어할 수 있습니다.
  • 감사 및 출처: AuditLog는 누가 민감한 기록을 보거나, 게시하거나, 수정했는지를 기록하여 준수 및 디버깅을 지원할 수 있도록 합니다.
  • 메시징 및 알림: 스레드 메시지, 첨부 파일 및 선택적인 실시간 업데이트가 임상 의사와 환자 간의 대화를 원활하고 시기적절하게 만듭니다.

신속하게 안전한 환자 포털 백엔드를 배포하고 백엔드 배관 대신 임상 워크플로를 반복합니다.

핵심 이점

개인정보, 출처 및 빠른 제공을 강조하는 환자 포털 백엔드입니다.

가속화된 환자 경험

검증된 백엔드 계약을 재사용하여 실험실 결과 보기, 치료 계획 제공 및 안전한 메시징을 더 빠르게 배송합니다.

강력한 데이터 출처

버전 실험실 결과 및 치료 계획이 임상 변경 사항을 감사하고 추적할 수 있도록 합니다.

세분화된 권한

ACL/CLP 및 역할 검사를 통해 민감한 항목을 보호하여 허가된 임상의와 환자만 액세스할 수 있습니다.

통합 메시징

첨부 파일이 있는 스레드형 메시지와 선택적 실시간 업데이트가 임상-환자 협업을 개선합니다.

준수 준비 로그

중앙 집중식 감사 로그가 검토, 사건 조사 및 준수 보고를 지원합니다.

AI 지원 부트스트랩

스키마, ACL 및 기본 통합 코드를 스캐폴딩하는 선별된 AI 에이전트 프롬프트로 개발을 시작합니다.

안전한 환자 포털을 구축할 준비가 되셨습니까?

Back4app AI 에이전트가 귀하의 환자 포털 백엔드를 설계하고, 하나의 프롬프트에서 환자 프로필, 검사 결과, 치료 계획, 메시징 및 감사 로그를 생성하게 하십시오.

무료 시작 — 월 50개 AI 에이전트 프롬프트, 신용카드 필요 없음

기술 스택

이 환자 포털 백엔드 템플릿에 포함된 모든 것.

프론트엔드
13개 이상의 기술
백엔드
Back4app
데이터베이스
MongoDB
인증
내장 인증 + 세션
API
REST 및 GraphQL
실시간
Live Queries

ER 다이어그램

환자 포털 백엔드 스키마를 위한 개체 관계 모델입니다.

다이어그램 소스 보기
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 Patient
  participant App as Patient Portal App
  participant Clinician
  participant Back4app as Back4app Cloud

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

  Patient->>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)

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

  Patient->>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-->>Patient: Real-time notification (new message / result available)

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

데이터 사전

환자 포털 스키마의 모든 클래스에 대한 전체 필드 수준 참조입니다.

필드유형설명필수
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을 적용하고 Provider가 지정된 환자 데이터를 볼 수 있도록 합니다; CLP는 무단 클래스 작업을 방지합니다.

암호화된 페이로드 및 첨부 파일

서명된 URL 뒤에 민감한 블롭(실험실 첨부 파일, PDF)을 저장하고, 저장소 수준 암호화를 사용하여 저장 중 보호합니다.

추가 전용 감사 로그

서버 측 Cloud Code에서 AuditLog 항목을 작성하여 사용자가 과거의 준수 기록을 조작할 수 없도록 합니다.

스키마 (JSON)

Back4app에 복사할 준비가 된 원시 JSON 스키마 정의 또는 구현 참조로 사용할 수 있습니다.

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 에이전트를 사용하여 이 템플릿에서 진료 포털 앱을 생성합니다. 여기에는 백엔드 스키마, ACL 및 시작 프론트엔드 통합이 포함됩니다.

Back4app AI 에이전트
구축할 준비 완료
Back4app에서 이 정확한 스키마와 동작으로 Patient Portal 백엔드를 생성하세요.

스키마:
1. PatientProfile: 사용자 (User에 대한 포인터, 필수), fullName (문자열, 필수), dob (날짜, 선택), contact (객체), medicalRecordNumber (문자열, 필수, 고유); objectId, createdAt, updatedAt.
2. ProviderProfile: 사용자 (User에 대한 포인터, 필수), specialty (문자열), clinic (문자열), contact (객체); objectId, createdAt, updatedAt.
3. LabResult: 환자 (PatientProfile에 대한 포인터, 필수), Provider (Pointer to ProviderProfile, 필수), reportType (문자열), resultData (객체), reportedAt (날짜, 필수), version (숫자, 기본값 1), attachments (파일 배열), visibility (문자열: 환자 전용, Provider 전용, 공유); objectId, createdAt, updatedAt.
4. TreatmentPlan: 환자 (PatientProfile에 대한 포인터, 필수), Provider (Pointer to ProviderProfile, 필수), summary (문자열), details (객체), status (문자열: 초안, 활성, 완료), effectiveFrom (날짜), effectiveTo (날짜), version (숫자); objectId, createdAt, updatedAt.
5. Message: 발신자 (User에 대한 포인터, 필수), 수신자 (User에 대한 포인터, 필수), threadId (문자열, 필수), body (문자열), attachments (파일 배열), status (문자열: 전송, 배달, 읽음), sentAt (날짜); objectId, createdAt, updatedAt.
6. Appointment: 환자 (PatientProfile에 대한 포인터, 필수), Provider (Pointer to ProviderProfile, 필수), scheduledAt (날짜, 필수), status (문자열: 예정, 취소, 완료), location (문자열); objectId, createdAt, updatedAt.
7. AuditLog: 액터 (User에 대한 포인터, 필수), action (문자열, 필수), entityType (문자열, 필수), entityId (문자열, 필수), payload (객체, 선택적), createdAt (날짜); objectId, createdAt, updatedAt.

보안:
- 환자가 본인의 LabResult 및 TreatmentPlan 레코드만 읽을 수 있게 ACL을 적용합니다. Provider는 할당된 환자를 봅니다. 민감한 전환을 위해 Cloud Code를 사용하고 서버 측에서 AuditLog 항목을 기록합니다. 서명된 URL 및 스토리지 암호화로 첨부파일을 보호합니다.

인증:
- 환자와 Provider의 회원가입을 지원합니다; 역할 할당; 보안 로그인 및 세션 관리.

동작:
- 환자가 로그인하고 최신 LabResult 버전 및 TreatmentPlans를 가져오고, Provider 스레드에 메시지를 보내고, 알림을 받습니다. Provider은 실험 결과 및 치료 계획을 게시합니다; 시스템은 게시 작업에 대한 AuditLog 항목을 작성합니다.

배달:
- 스키마, CLP, ACL, 게시 및 감사 로깅을 위한 Cloud Code 후크, 환자 및 Provider 뷰를 위한 시작 프론트엔드 통합이 포함된 Back4app 앱.

아래 버튼을 눌러 이 템플릿 프롬프트가 미리 채워진 에이전트를 열어주세요.

이것은 기술 접미사가 없는 기본 프롬프트입니다. 생성된 프론트엔드 스택은 이후에 조정할 수 있습니다.

몇 분 안에 배포한 달에 50개의 무료 프롬프트신용카드 필요 없음

API 플레이그라운드

환자 포털 스키마에 대해 REST 및 GraphQL 엔드포인트를 시도해 보세요. 응답은 모의 데이터를 사용하며 Back4app 계정이 필요하지 않습니다.

common.loadingPlayground

이 템플릿과 동일한 스키마를 사용합니다.

기술 선택하기

각 카드를 확장하여 통합 단계, 상태 패턴, 데이터 모델 예제 및 오프라인 노트를 확인하세요.

Flutter 환자 포털 백엔드

React 환자 포털 백엔드

React 네이티브 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

__브랜드0__ 환자 포털 백엔드

각 기술로 얻는 것

모든 스택은 동일한 환자 포털 백엔드 스키마 및 API 계약을 사용합니다.

통합된 환자 데이터 구조

하나의 스키마에서 모든 환자 정보를 쉽게 관리하고 접근합니다.

환자 포털를 위한 안전한 메시징

환자와 의료 Provider 간의 안전한 커뮤니케이션을 촉진합니다.

실시간 약속 예약

환자가 원활하게 약속을 예약하고 관리할 수 있도록 허용합니다.

종합적인 실험실 결과 추적

환자가 자신의 실험실 결과를 안전하게 보고 추적할 수 있도록 합니다.

민감한 데이터에 대한 접근 제어

권한이 있는 직원만 환자 기록을 볼 수 있도록 합니다.

REST/GraphQL API를 위한 환자 포털

유연한 API를 사용하여 다양한 프론트엔드와 쉽게 통합합니다.

환자 포털 프레임워크 비교

모든 지원 기술에 걸쳐 설정 속도, SDK 스타일 및 AI 지원을 비교합니다.

프레임워크설정 시간환자 포털 혜택SDK 유형AI 지원
빠른 (5분) 설정모바일과 웹에서 환자 포털을 위한 단일 코드베이스.Typed SDK전체
~5분환자 포털을 위한 빠른 웹 대시보드.Typed SDK전체
약 5분환자 포털을 위한 크로스 플랫폼 모바일 앱.Typed SDK전체
5분 이내환자 포털을 위한 서버 렌더링 웹 앱.Typed SDK전체
~3분환자 포털을 위한 경량 웹 통합.Typed SDK전체
빠른 (5분) 설정Android의 네이티브 환자 포털 앱.Typed SDK전체
~5분iOS의 네이티브 환자 포털 앱.Typed SDK전체
약 5분React의 환자 포털을 위한 웹 UI.Typed SDK전체
5분 이내환자 포털을 위한 엔터프라이즈 웹 앱.Typed SDK전체
빠른 (2분) 설정환자 포털을 위한 유연한 GraphQL API.GraphQL API전체
~2분REST API의 환자 포털 통합.REST API전체
5분 이내환자 포털을 위한 서버 측 PHP 백엔드.REST API전체
약 5분.NET의 환자 포털 백엔드.Typed SDK전체

설정 시간은 이 템플릿 스키마를 사용하여 프로젝트 시작부터 첫 환자 로그인 및 lab 결과 쿼리까지 예상되는 기간을 반영합니다.

자주 묻는 질문

이 템플릿을 사용하여 환자 포털 백엔드를 구축하는 것에 대한 일반적인 질문입니다.

환자 포털 백엔드란 무엇인가요?
환자 포털 템플릿에는 무엇이 포함되어 있나요?
환자 포털에 Back4app를 사용하는 이유는 무엇인가요?
단일 쿼리에서 최신 검사 결과와 그 Provider를 어떻게 가져오나요?
메시지를 읽은 것으로 표시하려면 어떻게 하나요?
React Native가 오프라인 사용을 위해 치료 계획을 캐시할 수 있나요?
실험실 PDF의 무단 공유를 어떻게 방지할 수 있습니까?
모바일에서 약속 내용을 표시하는 가장 좋은 방법은 무엇입니까?
감사 로그 흐름은 어떻게 end-to-end로 작동합니까?
환자가 치료 계획을 승인하도록 어떻게 지원합니까?

전 세계 개발자들에 의해 신뢰받는

Back4app 템플릿으로 더 빠르게 안전한 환자 포털을 배송하는 팀에 참여하세요

G2 Users Love Us Badge

환자 포털 앱을 구축할 준비가 되었나요?

몇 분 안에 환자 포털 프로젝트를 시작하세요. 신용카드 필요 없음.

기술 선택하기