Arquitetura do Sistema
O Chef-OS foi desenvolvido utilizando uma arquitetura monolítica simplificada baseada em PHP Nativo e MySQL. O foco do projeto foi performance, segurança e uma experiência de usuário (UX) fluida sem a necessidade de frameworks pesados.
1. Autenticação & Segurança
O sistema implementa controle de acesso baseado em roles (RBAC) para diferenciar Chefs de Clientes. As senhas são armazenadas utilizando hash moderno (`PASSWORD_DEFAULT`), e todas as consultas ao banco utilizam Prepared Statements para prevenir SQL Injection.
// Verificação segura de senha
if ($user && password_verify($password, $user['password_hash'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_role'] = $user['role'];
// Redirecionamento baseado na Role
if ($user['role'] === 'client') {
header("Location: my_events.php");
} else {
header("Location: dashboard.php");
}
}
2. Cálculo Dinâmico de Custos
Um dos diferenciais técnicos é o cálculo de custo da ficha técnica feito diretamente na query SQL. Isso evita loops desnecessários no PHP (o problema N+1), garantindo performance mesmo com receitas complexas.
SELECT r.*,
(
-- Subquery para somar (Preço do Insumo * Quantidade usada)
SELECT COALESCE(SUM(i.price * ri.quantity), 0)
FROM recipe_ingredients ri
JOIN ingredients i ON ri.ingredient_id = i.id
WHERE ri.recipe_id = r.id
) as total_cost
FROM recipes r
WHERE r.chef_id = ?
ORDER BY r.id DESC
3. Transações ACID (Integridade)
Para operações críticas, como a exclusão de um prato que possui vínculos em outras tabelas (ingredientes e eventos), utilizamos transações de banco de dados. Isso garante que, se uma etapa falhar, nada é apagado (Rollback), mantendo a integridade dos dados.
try {
$pdo->beginTransaction(); // Inicia a transação
// 1. Remove dependências
$pdo->prepare("DELETE FROM recipe_ingredients WHERE recipe_id = ?")->execute([$delId]);
// 2. Remove o prato
$pdo->prepare("DELETE FROM recipes WHERE id = ?")->execute([$delId]);
$pdo->commit(); // Efetiva as mudanças
// Só apaga a imagem se o banco confirmou
if (file_exists($imgUrl)) unlink($imgUrl);
} catch (Exception $e) {
$pdo->rollBack(); // Desfaz tudo se der erro
die("Erro ao excluir: " . $e->getMessage());
}
4. UI/UX: Responsividade Híbrida
Para oferecer a melhor experiência tanto em desktops quanto em dispositivos móveis, o layout adapta sua navegação estruturalmente, não apenas esteticamente.
- Desktop: Sidebar lateral fixa para acesso rápido e profissional.
- Mobile: Menu inferior estilo "App" (Bottom Navigation), facilitando o uso com uma mão.
Sidebar (Desktop)
hidden md:flex
Bottom Bar (Mobile)
md:hidden fixed bottom-0