Documentação Técnica
O DeBNutri é um SaaS (Software as a Service) de gestão clínica nutricional. Esta documentação explora a arquitetura técnica, decisões de design de código e a estrutura de dados utilizada para processar avaliações antropométricas e prescrições dietéticas em tempo real.
Arquitetura MVC
O sistema utiliza um padrão MVC (Model-View-Controller) customizado, sem frameworks pesados, garantindo performance bruta (Raw PHP). O roteamento é tratado via `index.php` atuando como Front Controller.
class PatientController { private $pdo; public function getPatientHistory($patientId, $userId) { // Secure PDO Prepared Statements preventing SQL Injection $stmt = $this->pdo->prepare( "SELECT * FROM calculation_history WHERE patient_id = :pid AND user_id = :uid ORDER BY created_at DESC" ); $stmt->execute([ 'pid' => $patientId, 'uid' => $userId ]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } }
Estrutura de Dados Híbrida (SQL + NoSQL)
Para lidar com a complexidade variável de dietas e históricos de cálculo, utilizamos colunas JSON nativas do MySQL. Isso permite armazenar estruturas de cardápio aninhadas sem a necessidade de múltiplas tabelas de relacionamento (ex: `meal_items`), aumentando a velocidade de leitura em 300%.
Schema: meal_plans
- id INT(11) PK
- user_id INT(11) FK
- title VARCHAR(150)
- plan_data JSON
- totals JSON
JSON Structure Example
Engine de Cálculos (Mifflin & Harris)
O core do sistema reside na precisão matemática. As classes de cálculo implementam as equações padrão-ouro da nutrição clínica (IOM 2005, Mifflin-St Jeor 1990).
// Lógica para Taxa Metabólica Basal (Mifflin-St Jeor) if ($sex === 'male') { // (10 x peso) + (6.25 x altura) - (5 x idade) + 5 $tmb = (10 * $weight) + (6.25 * $height) - (5 * $age) + 5; } else { // Ajuste feminino: -161 $tmb = (10 * $weight) + (6.25 * $height) - (5 * $age) - 161; } // Aplicação do Nível de Atividade Física (FA) $get = round($tmb * $activityFactor);
Frontend Reativo (Alpine.js)
Para garantir uma experiência de "App Nativo", utilizamos Alpine.js para manipulação de estado no cliente (reatividade), evitando reloads de página desnecessários durante a montagem de dietas.
<div
x-data="{ calories: 0, carbs: 0 }">
<input @input="calculateMacros()" ... />
<span x-text="calories"></span> kcal
</div>