Arquitetura
Visão Geral
graph TB
subgraph Cliente
B[Browser]
end
subgraph Frontend
N[Nuxt 3 SSR]
V[Vuetify 3]
end
subgraph Backend
D[Django 5]
DRF[Django REST Framework]
JWT[SimpleJWT]
end
subgraph Dados
PG[(PostgreSQL 16)]
end
B --> N
N --> V
N -->|REST API| DRF
DRF --> D
D --> JWT
D --> PG
Estrutura de Diretórios
django-nuxt-clinic/
├── backend/
│ ├── accounts/ # Usuários e autenticação
│ ├── audit/ # Logs de auditoria
│ ├── billing/ # Pagamentos
│ ├── catalog/ # Serviços oferecidos
│ ├── clinical/ # Prontuários e atendimentos
│ ├── config/ # Configurações Django
│ ├── core/ # Clínicas (multi-tenant)
│ ├── patients/ # Pacientes
│ └── scheduling/ # Agendamentos
├── frontend/
│ └── app/
│ ├── components/ # Componentes Vue
│ ├── composables/# Hooks reutilizáveis
│ ├── layouts/ # Layouts de página
│ ├── middleware/ # Middleware de autenticação
│ └── pages/ # Rotas da aplicação
├── docs/ # Esta documentação
└── docker-compose.yml
Multi-Tenancy
O sistema suporta múltiplas clínicas com isolamento de dados:
graph LR
subgraph Clínica A
PA[Pacientes A]
AA[Agendamentos A]
EA[Prontuários A]
end
subgraph Clínica B
PB[Pacientes B]
AB[Agendamentos B]
EB[Prontuários B]
end
U[Usuário] -->|Header X-Clinic-ID| API
API --> Clínica A
API --> Clínica B
Como funciona
- Usuário faz login e recebe token JWT
- Frontend envia header
X-Clinic-IDem cada request - Middleware Django filtra dados pela clínica
- Usuário só vê dados da clínica selecionada
Fluxo de Atendimento
stateDiagram-v2
[*] --> Agendado: Criar agendamento
Agendado --> Confirmado: Confirmar
Confirmado --> Aguardando: Check-in
Aguardando --> EmAtendimento: Iniciar consulta
EmAtendimento --> Concluido: Finalizar
Agendado --> Cancelado: Cancelar
Confirmado --> Cancelado: Cancelar
Confirmado --> NaoCompareceu: Não veio
Modelo de Dados Simplificado
erDiagram
Clinic ||--o{ User : has
Clinic ||--o{ Patient : has
Clinic ||--o{ Service : offers
Clinic ||--o{ Appointment : has
Patient ||--o{ Appointment : schedules
User ||--o{ Appointment : attends
Service ||--o{ Appointment : for
Appointment ||--o| Encounter : generates
Encounter ||--o{ Diagnosis : contains
Encounter ||--o{ Prescription : contains