Skip to content

dev-jonathan/admin-nutricampus

Repository files navigation

Um App de Nutrição Para Restaurantes Universitários!

Tecnologias e Ferramentas:

Python Angular FastAPI NumPy SQLAlchemy Docker pandas Pydantic Jinja


Sumário

Visão Geral

Objetivo do Projeto

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.

Principais Funcionalidades

  • 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:

Funcionalidades

Funcionalidade Resumo
⚙️ Arquitetura
  • Arquitetura monolítica com múltiplos serviços
  • Arquitetura orientada a serviços (SOA) para escalabilidade e manutenção
  • Uso do Docker como plataforma principal de containerização
🔩 Qualidade do Código
  • Adere aos padrões de codificação PEP 8
  • Usa type hints e docstrings para maior legibilidade e documentação do código
  • Inclui testes automatizados utilizando pytest e coverage.py
📄 Documentação
  • Principal linguagem: Python
  • Gerenciador de pacotes: pip
  • Inclui Dockerfile para containerização e comandos de instalação
🔌 Integrações
  • Integrações com bibliotecas como SQLAlchemy, pandas e FastAPI
  • APIs para processamento de dados como cardapios.json
🧩 Modularidade
  • Serviços independentes e fracamente acoplados
  • Uso de injeção de dependências para melhor modularidade
  • Validação de dados e gestão de esquemas com Pydantic
🧪 Testes
  • Testes automatizados usando pytest
  • Testes de unidade, integração e ponta a ponta
⚡️ Performance
  • Otimizado com algoritmos eficientes e cache
  • Programação assíncrona para execução concorrente
🛡️ Segurança
  • Práticas recomendadas de segurança, como criptografia HTTPS
  • Bibliotecas seguras para autenticação e autorização, como PyJWT
📦 Dependências
  • Gerenciamento eficiente com pip e Docker

Estrutura do Frontend e Backend

└── 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.json

Detalhes do Backend

NUTRICAMPUS_BACK-END/
__root__

cardapios.json - **Resumo**

O arquivo cardapios.json serve 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.json desempenha 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

  1. Extrai dados de cardápio de 5 dias (segunda a sexta) para cada campus.
  2. Salva os dados extraídos em formato JSON.
  3. 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.

Começando (Guia de Instalação)

Instalação Backend

Instale o NutriCampus-back-end com um dos métodos abaixo:

Compilando a partir do código-fonte:

  1. Clone o repositório backend:
❯ git clone https://github.com/guigutox/NutriCampus_back-end.git
  1. Navegue até o diretório:
cd NutriCampus-back-end
  1. Instale as dependências:
❯ pip install -r requirements.txt

Usando Docker:

❯ docker build -t /NutriCampus-back-end .

Testes

Execute a suíte de testes:

❯ pytest

Instalação Admin Panel

Instale o Admin NutriCampus com os passos abaixo, utilizando Angular:

Compilando a partir do código-fonte:

  1. Clone o repositório admin:
❯ git clone https://github.com/dev-jonathan/admin-nutricampus.git
  1. Navegue até o diretório:
cd admin-nutricampus
  1. Instale as dependências do projeto:
❯ npm install
  1. Inicie o servidor de desenvolvimento Angular:
❯ ng serve
  1. Acesse a aplicação no navegador:

Abra o navegador e acesse: http://localhost:4200.


Contribuições

  • Este Projeto foi desenvolvido por Jonathan, Carlos, Guilherme e Gabriel.

  • Agradecimentos: Caio


About

Um WebSite Nutricional Para Restaurantes Universitários!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors