Um App de Nutrição Para Restaurantes Universitários!
Tecnologias e Ferramentas:
Sumário
O Admin NutriCampus é uma plataforma desenvolvida especialmente para a comunidade da Universidade Federal de Uberlândia (UFU), com foco nos usuários dos Restaurantes Universitários (R.U.s). Seu objetivo é ajudar estudantes, professores e funcionários a gerenciarem de forma prática e eficiente sua alimentação e os nutrientes consumidos no dia a dia na faculdade.
- Gestão de Dados: Agregação de dados de consumo de múltiplas tabelas, permitindo aos usuários rastrear sua ingestão diária e visualizar informações nutricionais detalhadas.
- Planejamento de Refeições: Criação, atualização e exclusão de planos de refeições, incluindo ingredientes associados e informações nutricionais.
- Autenticação de Usuários: Autenticação e autorização seguras, garantindo que apenas usuários autorizados tenham acesso a dados sensíveis.
- Análise de Dados: Recursos avançados de análise para fornecer insights sobre hábitos alimentares e apoiar decisões informadas.
Benefícios
Ao oferecer uma plataforma centralizada para gerenciar dados nutricionais, nosso projeto proporciona inúmeros benefícios, incluindo:
- Melhoria nos resultados de saúde e bem-estar
- Capacidades aprimoradas de rastreamento e análise alimentar
- Maior eficiência no planejamento e preparação de refeições
- Melhor tomada de decisões relacionadas à escolha alimentar
Visão Técnica Geral
Nossa plataforma foi desenvolvida utilizando uma combinação de Python, FastAPI e vários bancos de dados para garantir escalabilidade e desempenho. O projeto é composto por vários serviços, incluindo:
- Alimento Service: Recupera dados de Alimento do banco de dados.
- Auth Service: Verifica as credenciais do usuário e gera JSON Web Tokens (JWTs) seguros.
- Cardapio Service: Fornece uma interface unificada para interação com o banco de dados de cardápios.
- Consumo Service: Agrega dados de consumo de múltiplas tabelas.
- Prato Service: Gerencia pratos (meals) na plataforma, incluindo operações CRUD.
- Refeicao Service.
Note
O aplicativo está organizado em três repositórios principais:
- Frontend (User): Interface do usuário que os clientes finais utilizam.
https://github.com/Gabriell-Braga/NutriCampus_front-end - Backend: Gerencia a lógica do servidor e a integração com o banco de dados.
https://github.com/guigutox/NutriCampus_back-end - Admin Panel: Painel de administração para gerenciar o sistema.
https://github.com/dev-jonathan/admin-nutricampus
| Funcionalidade | Resumo | |
|---|---|---|
| ⚙️ | Arquitetura |
|
| 🔩 | Qualidade do Código |
|
| 📄 | Documentação |
|
| 🔌 | Integrações |
|
| 🧩 | Modularidade |
|
| 🧪 | Testes |
|
| ⚡️ | Performance |
|
| 🛡️ | Segurança |
|
| 📦 | Dependências |
|
└── NutriCampus_back-end/
├── cardapios.json
├── classes.py
├── database.py
├── Dockerfile
├── LICENSE
├── main.py
├── model
│ ├── alimento.py
│ ├── Cardapio.py
│ ├── pydantic
│ ├── refeicao.py
│ └── usuario.py
├── README.md
├── requirements.txt
├── routers
│ ├── alimento_route.py
│ ├── cardapio_route.py
│ ├── prato_route.py
│ ├── refeicao_route.py
│ └── usuario_route.py
├── scraping
│ ├── Cardapio
│ ├── ingredientes
│ ├── receitas
│ ├── TACO
│ └── timer.py
├── scriptsTest
│ ├── chromedriver.exe
│ ├── geminiTest.py
│ └── ollamaTest.py
└── services
├── alimento_service.py
├── auth_service.py
├── cardapio_service.py
├── consumo_service.py
├── prato_service.py
├── refeicao_service.py
└── usuario_service.py└── admin-nutricampus/
├── .github
│ └── workflows
├── angular.json
├── package-lock.json
├── package.json
├── README.md
├── src
│ ├── app
│ ├── assets
│ ├── favicon.ico
│ ├── index.html
│ ├── main.ts
│ └── styles.css
├── tsconfig.app.json
├── tsconfig.json
└── tsconfig.spec.jsonNUTRICAMPUS_BACK-END/
__root__
cardapios.json - **Resumo** O arquivo
cardapios.jsonserve como um arquivo de configuração essencial para toda a arquitetura da base de código, especificamente no contexto de um sistema de gestão de restaurantes.
- Este arquivo JSON fornece uma visão abrangente das ofertas de menu diárias para cada dia da semana, incluindo café da manhã, almoço, jantar e opções adicionais.Em essência, este arquivo alcança os seguintes objetivos:
- Define os planos de refeições para cada dia da semana.
- Especifica os pratos disponíveis em cada categoria (por exemplo, pratos principais, vegetais, arroz, feijão e acompanhamentos).
- Oferece um formato estruturado para fácil acesso e modificação.
Utilizando este arquivo JSON, a base de código pode gerenciar eficientemente o planejamento de menus, o rastreamento de inventário e os processos de pedido, melhorando a experiência geral do usuário.
classes.py - Arquitetura o modelo de dados central do projeto definindo uma classe `Mensagem` que encapsula metadados de mensagens.
- A classe utiliza o `BaseModel` do Pydantic para estabelecer um formato estruturado para mensagens, garantindo consistência e validação em toda a aplicação.
- Este componente fundamental estabelece a base para o desenvolvimento subsequente, possibilitando troca e manipulação eficiente de dados dentro da base de código.database.py - Estabelece uma conexão com o banco de dados PostgreSQL carregando variáveis de ambiente e criando uma instância de engine.
- Fornece um "session maker" e uma classe base para operações ORM, permitindo acesso e manipulação de dados na aplicação.
- Facilita interações seguras e eficientes com o banco de dados, servindo como um componente crucial na arquitetura geral da base de código.Dockerfile - O Dockerfile serve como base para construir um ambiente containerizado para o projeto.
- Ele alcança o objetivo de criar um pacote autônomo que inclui todas as dependências e código da aplicação, permitindo um deployment e gerenciamento eficientes da aplicação FastAPI.
- A imagem Docker resultante permite escalabilidade e distribuição contínuas em diversos ambientes.main.py - Lança o servidor principal da aplicação, ativando endpoints de API para gestão de usuários, planejamento de refeições e coleta de dados nutricionais.
- O arquivo configura uma instância FastAPI com middleware CORS, conexão com o banco de dados e inclusão de rotas de vários módulos.
- Ele também inicializa um timer para agendar tarefas de scraping, garantindo a atualização e precisão dos dados na funcionalidade principal do projeto.requirements.txt - O arquivo de dependências serve como base para a arquitetura do projeto, definindo as dependências necessárias para executar a aplicação.
- Ele garante que todas as bibliotecas e ferramentas necessárias sejam instaladas e estejam atualizadas, proporcionando um ambiente consistente em todas as fases de desenvolvimento, teste e deployment.
- O conteúdo do arquivo descreve o stack técnico do projeto, especificando as versões de cada dependência.
model
alimento.py - O Model Alimento é a entidade principal do banco de dados, representando um item alimentar com várias propriedades nutricionais e relações com outras tabelas.
- Ele agrega dados sobre macronutrientes, micronutrientes e ácidos graxos, servindo como base para análises e relatórios no projeto.
- O modelo permite armazenamento e consultas eficientes de informações nutricionais, suportando insights baseados em dados e processos de tomada de decisão.Cardapio.py - Documenta a criação de um modelo de banco de dados que define a estrutura da tabela "cardapios", que provavelmente armazena informações sobre itens de menu no campus.
- O código estabelece relações entre vários atributos, como nome do campus, data e componentes das refeições.
- Ele possibilita o armazenamento e a recuperação de dados para o sistema de gestão de inventário de alimentos do projeto.refeicao.py - O Model Refeicao é a entidade principal que define a estrutura de dados de uma refeição, estabelecendo relações com outras tabelas como Usuario, Prato, Consumo e Ingrediente.
- Ele captura informações essenciais sobre refeições, incluindo data, tipo e associação de usuários.
- O modelo possibilita a troca de dados entre essas entidades, facilitando um banco de dados abrangente para gerenciamento de dados relacionados a refeições.usuario.py - Documentar a estrutura do modelo é crucial para a arquitetura geral da base de código.
- O arquivo `usuario.py` define uma tabela de banco de dados para usuários, estabelecendo relações entre atributos como nome, email e características físicas como peso e altura.
- Ao impor restrições nesses campos, a integridade dos dados é garantida, permitindo uma gestão precisa de usuários dentro do sistema.pydantic
auth_dto.py - Arquitetura os objetos de transferência de dados de autenticação (DTOs) do projeto, definindo estruturas para armazenar credenciais de usuário e payloads de JSON Web Token (JWT).
- O código estabelece a base para fluxos de autenticação seguros, permitindo a troca de informações sensíveis entre clientes e servidores.
- Ele suporta o uso de tokens JWT com atributos opcionais no payload, facilitando uma lógica de autenticação flexível dentro da base de código mais ampla.refeicao_dto.py - Refina as estruturas de dados do projeto definindo objetos de transferência de dados reutilizáveis (DTOs) para refeição e consumo.
- Alcança uma abordagem padronizada para modelagem de dados complexos, permitindo uma integração mais fácil com outros componentes e reduzindo inconsistências nos dados.
- Suporta escalabilidade e manutenção na arquitetura geral da base de código.usuario_dto.py - Documentar a estrutura do projeto revela que o arquivo `usuario_dto.py` desempenha um papel crucial na definição do objeto de transferência de dados (DTO) para informações de usuário.
- Ele alcança o propósito de padronizar e validar os dados do usuário, garantindo consistência em toda a aplicação.
- Ao fornecer uma representação clara e estruturada dos atributos do usuário, este código possibilita a troca eficiente de dados entre diferentes camadas do sistema, melhorando, em última análise, a manutenção e a escalabilidade do projeto.
routers
alimento_route.py - A criação de rotas é o objetivo principal do arquivo alimento_route.py.
- Define endpoints de API para recuperar dados de alimentos por ID e nome, lidando com entradas inválidas e cenários "não encontrado" com exceções HTTP.
- O código integra-se com o Alimento_Service para buscar dados de um banco de dados ou outra fonte de dados, garantindo consistência e validação em toda a aplicação.cardapio_route.py - Fornece uma interface de API RESTful para gerenciar dados de cardápio, permitindo que os usuários recuperem e filtrem informações por campus, data e refeição.
- O roteador lida com várias solicitações HTTP, incluindo operações GET, para buscar dados específicos do banco de dados usando a classe Cardapio_Service.
- Ele suporta vários parâmetros de filtragem, permitindo consultas flexíveis aos dados de cardápio.prato_route.py - O principal objetivo do arquivo prato_route.py é definir um conjunto de rotas de API para gerenciar pratos (dishes) e ingredientes.
- Ele fornece endpoints para listar, criar, ler, atualizar e excluir pratos e ingredientes, além de mapear ingredientes para pratos específicos.
- O código realiza isso utilizando uma classe PratoService que interage com o banco de dados para executar operações CRUD.refeicao_route.py - Cria um endpoint de API RESTful para gerenciar refeições (meals) e seus consumos associados.
- O roteador lida com operações CRUD para refeições, incluindo a criação de novas, a recuperação de existentes por ID ou data, e a adição de consumos a refeições específicas.
- Também fornece controle de acesso baseado em autenticação de usuário.usuario_route.py - Valida os endpoints de autenticação de usuário.
- O arquivo usuario_route.py define um roteador FastAPI que lida com rotas relacionadas à autenticação de usuários, incluindo login (signin) e cadastro (signup).
- Ele verifica credenciais de usuário, gera tokens e cria novos usuários enquanto aplica regras de validação nos dados de entrada.
- Este código é integral ao mecanismo geral de autenticação do projeto.
scraping
timer.py - Realiza scraping de dados de várias fontes em intervalos programados.
- O arquivo timer.py inicia o processo de scraping executando funções de diferentes módulos, como TACOScraping e CardapioScraping.
- Ele também configura um agendador para executar esses scrapers em intervalos regulares, utilizando um banco de dados PostgreSQL para armazenamento.Cardapio
cardapios.json - **Resumo** O arquivo
cardapios.jsoné um componente crucial para o armazenamento de dados do projeto, fornecendo uma visão geral das ofertas de menu no campus Monte Carmelo.
- Este arquivo JSON serve como um repositório centralizado para os dados de cardápio, permitindo fácil acesso e gestão.Ao integrar este arquivo na arquitetura da base de código, o projeto alcança vários objetivos principais:
- Padronização de Dados: Garante consistência na apresentação dos itens de menu em diferentes plataformas.
- Atualizações Fáceis de Dados: Permite atualizações eficientes nos itens de menu sem necessidade de mudanças manuais em toda a aplicação.
- Melhor Experiência do Usuário: Oferece uma experiência contínua e precisa ao exibir informações atualizadas sobre o menu.
No geral, o arquivo
cardapios.jsondesempenha um papel vital na manutenção da integridade e consistência dos dados dentro da arquitetura do projeto.scrapping.py - **Extração de Dados de Cardápio** O script extrai dados de cardápio de um website usando as bibliotecas BeautifulSoup e requests.
Funcionalidades Principais
- Extrai dados de cardápio de 5 dias (segunda a sexta) para cada campus.
- Salva os dados extraídos em formato JSON.
- Salva os dados no banco de dados utilizando a biblioteca SQLAlchemy.
Estrutura do Código
O código está estruturado em várias funções:
extrair_cardapios: extrai os dados de cardápio do site.salvar_json: salva os dados extraídos em formato JSON.salvar_no_banco: salva os dados no banco de dados.Bibliotecas e Módulos Principais
- BeautifulSoup
- requests
- SQLAlchemy
Nota: O código completo não é fornecido devido ao seu tamanho.
ingredientes
constants.py - Converte quantidades de ingredientes em unidades padronizadas.
- O arquivo constants.py fornece um conjunto de conversões, substituições e plurais para uso em todo o projeto, permitindo o processamento e análise de dados de receitas.
- Ele suporta vários tipos de unidades, incluindo xícaras, gramas, mililitros e outros, facilitando cálculos e comparações precisas.main.py - Realiza scraping de informações de ingredientes de receitas, salvando-os em um banco de dados.
- O principal objetivo do arquivo `main.py` é processar dados de receitas pesquisando links, extraindo ingredientes e armazenando-os no banco de dados.
- Ele garante que cada receita tenha dados únicos de ingredientes antes de prosseguir com o scraping.
- Esse processo ajuda a manter informações de receitas precisas e atualizadas.processador.py - Processa ingredientes extraídos de dados textuais, extraindo componentes relevantes como nome, quantidade, unidade e indicação de sabor.
- A função filtra ingredientes opcionais e trata casos especiais como "a gosto" e substituições unidirecionais.
- Também normaliza unidades e quantidades de acordo com regras predefinidas, retornando um dicionário com as informações processadas.scraper.py - Extrai informações de ingredientes de páginas de receitas usando a API DuckDuckGo e parsing com BeautifulSoup.
- O script pesquisa por uma receita específica, recupera a página correspondente, extrai nomes de ingredientes, os processa e retorna uma lista de ingredientes processados.
- Ele lida com erros e registra eventos importantes durante o processo.
- Esta funcionalidade faz parte de um projeto maior que agrega dados de receitas.utils.py - Analisa o arquivo `utils.py`, que desempenha um papel crucial no processamento e conversão de dados dentro da arquitetura do projeto.
- Oferece funções para avaliar strings de quantidade, converter quantidades para unidades padrão e singularizar nomes de unidades, facilitando a normalização e consistência dos dados na base de código.
- Essas funcionalidades são essenciais para garantir o manuseio de dados preciso e confiável em todo o projeto.receitas
prato.py - Preenche a tabela "Prato" verificando e inserindo pratos existentes nos "Cardápios".
- O script verifica pratos duplicados e cria novos, se necessário, garantindo a consistência dos dados.
- Também atualiza um conjunto de pratos existentes para refletir alterações feitas durante o processo.TACO
modelo_tabelas.py - Define a estrutura do modelo de dados do projeto, fornecendo uma estrutura abrangente para organizar informações nutricionais.
- O arquivo oferece uma abordagem baseada em enumeração para categorizar e armazenar dados relacionados a nutrientes centesimais, ácidos graxos e aminoácidos.
- Estabelece um formato padronizado para armazenar e recuperar esses dados, possibilitando uma gestão eficiente e análise dentro da arquitetura maior da base de código.script.py - Extrai dados da tabela TACO usando camelot e preenche um banco de dados com informações nutricionais.
- O script baixa o arquivo PDF, extrai tabelas relevantes, processa os dados e os insere no banco de dados.
- Também lida com erros e exclui registros existentes antes de inserir novos.
- O processo é repetido se nenhum registro existente for encontrado ou se for forçado a executar.
scriptsTest
geminiTest.py - Gera ingredientes para todos os pratos usando a API Gemini.
- Este script recupera uma lista de ingredientes com suas respectivas quantidades para cada prato, converte unidades em gramas e os salva no banco de dados.
- Ele utiliza o ORM SQLAlchemy para interagir com o banco de dados e a API Gemini para gerar conteúdo.
- O script é executado em loop, processando todos os pratos no banco de dados.ollamaTest.py - Extrai ingredientes de receitas de uma página web usando Selenium e o modelo LLM Ollama.
- O script pesquisa por um termo específico no DuckDuckGo, faz scraping do conteúdo da página com Selenium, extrai a lista de ingredientes, processa-a com o modelo LLM Ollama para gerar informações estruturadas dos ingredientes e imprime os resultados finais.
services
alimento_service.py - Busca dados de Alimento do banco de dados.
- A classe Alimento_Service recupera registros de Alimento por ID e nome, incluindo dados relacionados a graxos, aminoácidos e centesimais.
- Utiliza o ORM SQLAlchemy para interagir com o banco de dados, empregando um sistema de gerenciamento de sessões para recuperação eficiente de dados.
- Este serviço faz parte de um projeto maior que envolve scraping e processamento de dados, provavelmente para análise ou pesquisa nutricional.auth_service.py - Verifica a autenticidade das credenciais do usuário e gera JSON Web Tokens (JWTs) seguros.
- A classe Auth_Service lida com verificação de senhas, hashing e criação de tokens, utilizando variáveis de ambiente para configuração.
- Integra-se com o esquema OAuth2PasswordBearer do FastAPI para autenticar usuários, garantindo controle de acesso seguro e validação de tokens dentro da arquitetura do projeto.cardapio_service.py - A classe Cardapio_Service fornece uma interface unificada para interagir com o banco de dados de cardápios, permitindo a recuperação eficiente de dados com vários filtros, como campus, data e tipo de refeição.
- Ao encapsular operações de banco de dados em uma única classe, a base de código promove modularidade e reutilização, simplificando o acesso aos dados e reduzindo duplicações.consumo_service.py - A classe Consumo_Service agrega dados de consumo em várias tabelas, fornecendo uma visão unificada das informações nutricionais.
- Ela recupera e agrupa dados pela composição das refeições, permitindo que os usuários acompanhem sua ingestão diária.
- O serviço também lida com operações CRUD, possibilitando a criação de novos registros de consumo.
- Ao consolidar dados de várias fontes, facilita consultas eficientes e análises relacionadas à nutrição.prato_service.py - A classe PratoService serve como a interface principal para gerenciar pratos (meals) na arquitetura do banco de dados do projeto.
- Fornece métodos para operações CRUD, incluindo busca, criação, atualização e exclusão de pratos e seus ingredientes associados.
- O serviço atua como um hub central para acesso e manipulação de dados, permitindo uma gestão eficiente de informações relacionadas às refeições em toda a base de código.refeicao_service.py - Fornece uma interface unificada para gerenciar dados de refeições (refeicao) na aplicação, permitindo que os usuários recuperem, criem e consultem refeições com base em vários critérios, como ID de usuário, intervalo de datas e associações de refeições.
- Facilita o acesso e a manipulação de dados por meio de uma API padronizada, promovendo consistência e escalabilidade na arquitetura geral da base de código.usuario_service.py - Fornece uma interface unificada para gerenciar usuários em toda a aplicação, permitindo operações CRUD (Create, Read, Update, Delete) nos dados de usuário.
- Atua como um hub central para funcionalidades relacionadas ao usuário, abstraindo interações com o banco de dados e fornecendo uma maneira padronizada de interagir com o modelo `Usuario`.
- Facilita a recuperação e manipulação eficiente de dados, suportando vários casos de uso em toda a arquitetura do projeto.
Instale o NutriCampus-back-end com um dos métodos abaixo:
Compilando a partir do código-fonte:
- Clone o repositório backend:
❯ git clone https://github.com/guigutox/NutriCampus_back-end.git- Navegue até o diretório:
❯ cd NutriCampus-back-end- Instale as dependências:
❯ pip install -r requirements.txtUsando Docker:
❯ docker build -t /NutriCampus-back-end .Execute a suíte de testes:
❯ pytestInstale o Admin NutriCampus com os passos abaixo, utilizando Angular:
Compilando a partir do código-fonte:
- Clone o repositório admin:
❯ git clone https://github.com/dev-jonathan/admin-nutricampus.git- Navegue até o diretório:
❯ cd admin-nutricampus- Instale as dependências do projeto:
❯ npm install- Inicie o servidor de desenvolvimento Angular:
❯ ng serve- Acesse a aplicação no navegador:
Abra o navegador e acesse: http://localhost:4200.
-
Este Projeto foi desenvolvido por Jonathan, Carlos, Guilherme e Gabriel.
-
Agradecimentos: Caio

