Skip to content

mathewsph2/NUTRIFIT_Spring_Boot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🥗 NutriFit — Sistema de Acompanhamento Nutricional e Treinos

Projeto acadêmico — Disciplina de Programação Orientada a Objetos (POOA)
Faculdade Vianna Júnior · Spring Boot + Thymeleaf + Spring Data JPA


📊 Status de Conclusão do Projeto

Área Status %
Estrutura MVC (controller / service / repository / model / templates) ✅ Completo 100%
Tecnologias obrigatórias (Spring Boot, Thymeleaf, JPA, MySQL) ✅ Completo 100%
Login / Autenticação (Spring Security) ✅ Completo 100%
Controle de acesso por perfil (ADMIN / PERSONAL / NUTRICIONISTA) ✅ Completo 100%
CRUD — Usuário (Nutricionista / Personal / Admin) ✅ Completo 100%
Meu Perfil + Alterar Senha ✅ Completo 100%
CRUD — Cliente ✅ Completo 100%
CRUD — Exercício ✅ Completo 100%
CRUD — Ficha de Treino + Dias + Exercícios ✅ Completo 100%
Registro de treinos realizados ✅ Completo 100%
Avaliações físicas com histórico ✅ Completo 100%
Cálculo de IMC + Meta de Peso ✅ Completo 100%
CRUD — Plano Alimentar ✅ Completo 100%
CRUD — Banco de Alimentos ✅ Completo 100%
Gestão de Refeições e Itens por Plano ✅ Completo 100%
Cálculo de calorias e macros por refeição ✅ Completo 100%
Resumo de Calorias do Dia por cliente ✅ Completo 100%
CRUD — Agendamento ✅ Completo 100%
Agenda do Dia com ações de status ✅ Completo 100%
Agenda da Semana ✅ Completo 100%
Dashboard com indicadores dinâmicos + Agenda do dia ✅ Completo 100%
Validações backend (@Valid, @NotBlank, @Email, RuntimeException) ✅ Completo 100%
Validações frontend (HTML5 + Bootstrap + JS) ✅ Completo 100%
Layout base + Fragments (header/footer reutilizáveis) ✅ Completo 100%
Perfis dev (H2) / prod (MySQL) ✅ Completo 100%
Relacionamentos entre entidades (OneToMany / ManyToOne) ✅ Completo 100%

✅ Checklist de Requisitos

Requisitos Obrigatórios

  • CRUD completo (Usuário, Cliente, Exercício, FichaTreino, PlanoAlimentar, Alimento, Agendamento — 7 entidades com CRUD)
  • Relacionamentos entre entidades (OneToMany / ManyToOne)
  • Interface Web com Thymeleaf
  • Navegação / menus com destaque de página ativa
  • Template base reutilizável (layout/layout.html)
  • Validações backend (@Valid + BindingResult + RuntimeException)
  • Validações frontend (HTML5 + Bootstrap needs-validation + JavaScript)
  • Organização MVC (controller / service / repository / model / templates)
  • Spring Boot + Thymeleaf + Spring Data JPA
  • MySQL com perfil de produção

Funcionalidades

  • Cadastro e gerenciamento de usuários (nutricionistas / personals / admin)
  • Login e autenticação com Spring Security + BCrypt
  • Controle de acesso por perfil (menu dinâmico por papel)
  • Meu Perfil — edição de dados pessoais do usuário logado
  • Alterar Senha — troca de senha com validação da senha atual
  • Cadastro e gerenciamento de clientes
  • Cálculo de IMC e acompanhamento de metas de peso
  • Banco de exercícios com filtros por grupo muscular, equipamento e dificuldade
  • Fichas de treino personalizadas por cliente
  • Registro diário de treinos com progressão de carga
  • Histórico e estatísticas de treino
  • Avaliações físicas com histórico por cliente
  • Banco de alimentos com macronutrientes
  • Planos alimentares por cliente
  • Refeições e itens dentro do plano (com cálculo proporcional de macros)
  • Resumo de calorias do dia por cliente
  • CRUD — Agendamento completo
  • Agenda do dia com cards e ações de status (confirmar, realizar, cancelar)
  • Agenda da semana com visão dos próximos 7 dias
  • Dashboard com indicadores dinâmicos (total de clientes, agendamentos do dia, planos ativos, profissionais) e tabela da agenda do dia

Tecnologias utilizadas

Tecnologia Versão Função
Java 25 Linguagem principal
Spring Boot 4.0.6 Framework base
Spring Security Autenticação e controle de acesso
Spring Web MVC Camada web, controllers e rotas
Spring Data JPA Camada de persistência com Hibernate
Thymeleaf Motor de templates HTML
Thymeleaf Extras Security Controle de exibição por perfil nos templates
H2 Database Banco em memória para desenvolvimento
MySQL Banco relacional para produção
Lombok Redução de boilerplate (getters, setters, construtores)
Maven 3.9+ Gerenciador de dependências e build

Estrutura do projeto

src/main/java/br/edu/vianna/NutriFit/
├── config/
│   └── SecurityConfig.java
├── Controller/
│   ├── agenda/
│   │   └── AgendamentoController.java
│   ├── nutricao/
│   │   ├── AlimentoController.java
│   │   ├── PlanoAlimentarController.java
│   │   └── RefeicaoController.java
│   ├── AvaliacaoFisicaController.java
│   ├── ClienteController.java
│   ├── ExercicioController.java
│   ├── FichaTreinoController.java
│   ├── IndexController.java
│   ├── RegistroTreinoController.java
│   └── UsuarioController.java
├── model/
│   ├── agenda/
│   │   └── Agendamento.java
│   ├── nutricao/
│   │   ├── Alimento.java
│   │   ├── ItemRefeicao.java
│   │   ├── PlanoAlimentar.java
│   │   └── Refeicao.java
│   ├── enums/
│   │   ├── EDificuldade.java
│   │   ├── EEquipamento.java
│   │   ├── EGrupoAlimentar.java
│   │   ├── EGrupoMuscular.java
│   │   ├── EStatusAgendamento.java
│   │   ├── ETipoConsulta.java
│   │   └── ETipoUsuario.java
│   ├── AvaliacaoFisica.java
│   ├── Cliente.java
│   ├── Exercicio.java
│   ├── ExercicioFicha.java
│   ├── FichaTreino.java
│   ├── RegistroExercicio.java
│   ├── RegistroTreino.java
│   ├── TreinoDia.java
│   └── Usuario.java
├── repository/
│   ├── agenda/
│   │   └── AgendamentoRepository.java
│   ├── nutricao/
│   │   ├── AlimentoRepository.java
│   │   ├── ItemRefeicaoRepository.java
│   │   ├── PlanoAlimentarRepository.java
│   │   └── RefeicaoRepository.java
│   ├── AvaliacaoFisicaRepository.java
│   ├── ClienteRepository.java
│   ├── ExercicioRepository.java
│   ├── FichaTreinoRepository.java
│   ├── RegistroTreinoRepository.java
│   └── UsuarioRepository.java
├── service/
│   ├── agenda/
│   │   └── AgendamentoService.java
│   ├── nutricao/
│   │   ├── AlimentoService.java
│   │   ├── ItemRefeicaoService.java
│   │   ├── PlanoAlimentarService.java
│   │   └── RefeicaoService.java
│   ├── AvaliacaoFisicaService.java
│   ├── ClienteService.java
│   ├── ExercicioService.java
│   ├── FichaTreinoService.java
│   ├── NutrifitUserDetailsService.java
│   ├── RegistroTreinoService.java
│   └── UsuarioService.java
└── NutriFitApplication.java

src/main/resources/
├── templates/
│   ├── agendamento/
│   │   ├── form.html
│   │   ├── hoje.html
│   │   ├── lista.html
│   │   └── semana.html
│   ├── avaliacao/
│   │   ├── form.html
│   │   └── historico.html
│   ├── cliente/
│   │   ├── form.html
│   │   ├── imc.html
│   │   └── lista.html
│   ├── exercicio/
│   │   ├── form.html
│   │   └── lista.html
│   ├── ficha/
│   │   ├── detalhe.html
│   │   ├── form.html
│   │   └── lista.html
│   ├── fragments/
│   │   ├── footer.html
│   │   └── header.html
│   ├── layout/
│   │   └── layout.html
│   ├── nutricao/
│   │   ├── alimento/
│   │   │   ├── form.html
│   │   │   └── lista.html
│   │   ├── plano/
│   │   │   ├── detalhe.html
│   │   │   ├── form.html
│   │   │   └── lista.html
│   │   └── calorias-dia.html
│   ├── treino/
│   │   ├── historico.html
│   │   ├── lista.html
│   │   ├── registrar.html
│   │   └── selecionar.html
│   ├── usuario/
│   │   ├── form.html
│   │   ├── lista.html
│   │   ├── perfil.html
│   │   └── senha.html
│   ├── index.html
│   └── login.html
├── application.properties
├── application-dev.properties
└── application-prod.properties

Como executar

Pré-requisitos

  • Java 25+
  • Maven
  • MySQL (apenas para perfil de produção)

Desenvolvimento (H2 em memória)

./mvnw spring-boot:run

Acesse: http://localhost:9000
Console H2: http://localhost:9000/h2-console

Produção (MySQL)

$env:PROFILE="prod"; .\mvnw spring-boot:run

Carga inicial de dados (Seed)

O projeto possui um arquivo src/main/resources/data.sql que popula o banco automaticamente na inicialização, com:

  • 3 usuários de teste (um de cada perfil: ADMIN, PERSONAL e NUTRICIONISTA), todos com a senha 123456;
  • 72 alimentos do banco de alimentos, com valores nutricionais reais extraídos da Tabela Brasileira de Composição de Alimentos (TACO) — 4ª edição, NEPA/UNICAMP, 2011.

Como funciona

O Spring Boot detecta automaticamente o arquivo data.sql e executa seus comandos INSERT quando a aplicação sobe. Como o perfil de desenvolvimento usa o banco H2 em memória com ddl-auto=create (que recria as tabelas a cada inicialização), o banco sempre sobe limpo e é repopulado pelo seed — sem necessidade de cadastrar nada manualmente para testar o sistema.

O seed roda apenas no perfil dev (H2). No perfil de produção (MySQL) o Spring ignora o data.sql por padrão, evitando inserções duplicadas.

Ajuste necessário: ordem de criação das tabelas

Quando o schema é gerado pelo Hibernate (via ddl-auto), o Spring Boot, por padrão, executa o data.sql antes de as tabelas existirem — o que causaria erro de "tabela não encontrada". Para corrigir a ordem, foi adicionada a seguinte linha no application-dev.properties:

spring.jpa.defer-datasource-initialization=true

Essa configuração adia a execução do data.sql para depois que o Hibernate cria as tabelas. Assim, a ordem fica correta:

  1. O Hibernate cria as tabelas a partir das entidades;
  2. O data.sql insere os dados de exemplo.

Credenciais de acesso (perfil dev)

Login Perfil Senha
admin ADMIN 123456
personal PERSONAL 123456
nutri NUTRICIONISTA 123456

Perfis de ambiente

Dev (application-dev.properties)

  • Banco H2 em memória — não requer instalação
  • Tabelas recriadas a cada inicialização (ddl-auto=create)

Prod (application-prod.properties)

  • Banco MySQL em localhost:3306, banco nutrifit
  • Usuário/Senha: configurados no application-prod.properties

🔐 Controle de Acesso

Perfil Acesso
ADMIN Tudo, incluindo gerenciamento de usuários
PERSONAL Clientes, fichas de treino, exercícios, avaliações, agenda
NUTRICIONISTA Clientes, nutrição (planos, alimentos, refeições), avaliações, agenda

Todos os perfis têm acesso a:

  • Dashboard (página inicial)
  • Meu Perfil e Alterar Senha
  • Agenda do dia e da semana

🌐 Rotas do Sistema

Autenticação

Método Rota Descrição
GET /login Tela de login
POST /login Processa autenticação
GET /logout Encerra sessão

Dashboard

Método Rota Descrição
GET / Dashboard com indicadores e agenda do dia

Usuários

Método Rota Descrição
GET /usuarios Lista com filtro por nome e tipo (ADMIN)
GET /usuarios/novo Formulário de cadastro (ADMIN)
GET /usuarios/editar/{id} Formulário de edição (ADMIN)
POST /usuarios/salvar Salva ou atualiza (ADMIN)
POST /usuarios/deletar/{id} Remove o registro (ADMIN)
GET /usuarios/perfil Meu perfil (todos)
POST /usuarios/perfil/salvar Salva alterações do perfil (todos)
GET /usuarios/senha Alterar senha (todos)
POST /usuarios/senha/salvar Salva nova senha (todos)

Clientes

Método Rota Descrição
GET /clientes Lista com filtros
GET /clientes/novo Formulário de cadastro
GET /clientes/editar/{id} Formulário de edição
GET /clientes/imc/{id} Exibe IMC e classificação
POST /clientes/salvar Salva ou atualiza
POST /clientes/deletar/{id} Remove o registro

Exercícios

Método Rota Descrição
GET /exercicios Lista com filtros
GET /exercicios/novo Formulário de cadastro
GET /exercicios/editar/{id} Formulário de edição
POST /exercicios/salvar Salva ou atualiza
POST /exercicios/deletar/{id} Remove o exercício

Fichas de Treino

Método Rota Descrição
GET /fichas Lista fichas
GET /fichas/{id} Detalhe com dias e exercícios
GET /fichas/novo Formulário de cadastro
GET /fichas/editar/{id} Formulário de edição
POST /fichas/salvar Salva ou atualiza
POST /fichas/deletar/{id} Remove ficha
POST /fichas/{fichaId}/dia/salvar Adiciona dia de treino
POST /fichas/dia/deletar/{diaId} Remove dia de treino
POST /fichas/dia/{diaId}/exercicio/salvar Adiciona exercício ao dia
POST /fichas/exercicio/deletar/{id} Remove exercício do dia

Registros de Treino

Método Rota Descrição
GET /treinos Lista geral de registros
GET /treinos/selecionar Seleção de cliente para treinar
GET /treinos/hoje/{clienteId} Treino do dia pré-preenchido
GET /treinos/historico/{clienteId} Histórico e estatísticas
POST /treinos/salvar Salva o registro do treino
POST /treinos/deletar/{id} Remove um registro

Avaliações Físicas

Método Rota Descrição
GET /avaliacoes/historico/{clienteId} Histórico de avaliações do cliente
GET /avaliacoes/nova/{clienteId} Formulário de nova avaliação
POST /avaliacoes/salvar Salva a avaliação
POST /avaliacoes/deletar/{id} Remove a avaliação

Nutrição — Banco de Alimentos

Método Rota Descrição
GET /nutricao/alimentos Lista com filtros
GET /nutricao/alimentos/novo Formulário de cadastro
GET /nutricao/alimentos/editar/{id} Formulário de edição
POST /nutricao/alimentos/salvar Salva ou atualiza
POST /nutricao/alimentos/deletar/{id} Remove o alimento

Nutrição — Planos Alimentares

Método Rota Descrição
GET /nutricao/planos Lista planos com filtro por cliente
GET /nutricao/planos/{id} Detalhe com refeições e macros
GET /nutricao/planos/novo Formulário de cadastro
GET /nutricao/planos/editar/{id} Formulário de edição
POST /nutricao/planos/salvar Salva ou atualiza
POST /nutricao/planos/deletar/{id} Remove o plano
POST /nutricao/planos/{planoId}/refeicao/salvar Adiciona refeição ao plano
POST /nutricao/planos/refeicao/deletar/{refeicaoId} Remove refeição
POST /nutricao/planos/refeicao/{refeicaoId}/item/salvar Adiciona alimento à refeição
POST /nutricao/planos/item/deletar/{itemId} Remove alimento da refeição

Nutrição — Calorias do Dia

Método Rota Descrição
GET /nutricao/refeicoes/calorias-do-dia Resumo de macros do dia por cliente

Agenda

Método Rota Descrição
GET /agendamentos Lista todos os agendamentos
GET /agendamentos/hoje Agenda do dia com ações de status
GET /agendamentos/semana Visão dos próximos 7 dias
GET /agendamentos/novo Formulário de cadastro
GET /agendamentos/editar/{id} Formulário de edição
POST /agendamentos/salvar Salva ou atualiza
POST /agendamentos/confirmar/{id} Muda status para CONFIRMADO
POST /agendamentos/cancelar/{id} Muda status para CANCELADO
POST /agendamentos/realizado/{id} Muda status para REALIZADO
POST /agendamentos/deletar/{id} Remove o agendamento

🖥️ Dashboard

A página inicial exibe, para usuários autenticados:

  • Cards de indicadores — total de clientes, agendamentos do dia, planos alimentares ativos e total de profissionais
  • Tabela da agenda do dia — lista compacta com hora, cliente, profissional, tipo e status dos agendamentos do dia, com botão de acesso à agenda completa

🔒 Estratégia de Validação

O sistema utiliza duas camadas complementares de validação:

Backend (sempre executado)

  • Anotações Bean Validation: @NotBlank, @Email, @Size, @Valid
  • BindingResult nos controllers para capturar erros de binding
  • RuntimeException nos services para regras de negócio (ex: nome duplicado, CPF já cadastrado, senha incorreta)
  • Padrão try/catch no controller com model.addAttribute("erro") + return "form" para preservar os dados digitados

Frontend (experiência do usuário)

  • Atributos HTML5: required, minlength, maxlength, min, max, step, type="email", type="date", th:max para datas futuras
  • Bootstrap needs-validation + was-validated para estilização dos campos
  • invalid-feedback com mensagem contextual por campo
  • JavaScript para validações cruzadas:
    • Alterar Senha: compara nova senha e confirmação em tempo real com setCustomValidity, evitando envio ao servidor quando as senhas não coincidem
    • Plano Alimentar: valida se data de término ≥ data de início antes do envio

🥗 Módulo de Nutrição — Detalhes

Visão Geral

Permite que nutricionistas criem planos alimentares personalizados para cada cliente, organizados em refeições (café da manhã, almoço, jantar etc.), com controle de macronutrientes calculados automaticamente com base na quantidade consumida de cada alimento.

Fluxo de uso

  1. Cadastrar alimentos no Banco de Alimentos com valores por porção (kcal, proteínas, carboidratos, gorduras)
  2. Criar um Plano Alimentar vinculado ao cliente e ao nutricionista responsável
  3. Dentro do plano, adicionar Refeições com horário sugerido
  4. Dentro de cada refeição, adicionar Alimentos com a quantidade em gramas — o sistema calcula automaticamente os macros proporcionais
  5. Acompanhar o total de calorias e macros do dia na tela Calorias do Dia

Cálculo proporcional de macros

caloriasCalculadas = (alimento.calorias / alimento.porcao) * quantidadeInformada

O mesmo cálculo se aplica a proteínas, carboidratos e gorduras.

Grupos alimentares disponíveis

PROTEINA · CARBOIDRATO · GORDURA · FRUTA · VEGETAL · LATICINIOS · LEGUMINOSA · CEREAL · BEBIDA · OUTRO


🏋️ Módulo de Treinos — Detalhes

Visão Geral

Permite que personal trainers montem fichas de treino personalizadas por cliente, organizadas por dia da semana. O cliente registra os treinos diários e o sistema acompanha a evolução de carga ao longo do tempo.

Fluxo de uso

  1. Cadastrar exercícios no Banco de Exercícios

O Banco de Exercícios é o catálogo que alimenta todo o módulo de treinos — é a partir dele que as fichas (manuais ou geradas automaticamente) montam os treinos. Possui um CRUD completo, com listagem filtrável e cadastro validado.

Tela de listagem

Listar exercícios

A listagem exibe todos os exercícios cadastrados, ordenados por nome, e oferece uma busca combinada com quatro critérios:

  • Nome (busca textual parcial);
  • Grupo muscular (peito, costas, perna...);
  • Equipamento;
  • Dificuldade (iniciante, intermediário, avançado).

A filtragem é resolvida no ExercicioService.filtrar(), que aplica o critério informado usando as derived queries do Spring Data JPA (findByGrupoMuscular, findByEquipamento, findByNomeLike, entre outras). Cada exercício é exibido com um selo colorido de dificuldade, cuja cor é decidida no service (cssDificuldade): verde para iniciante, amarelo para intermediário e vermelho para avançado — mantendo a lógica de apresentação fora do template.

Cada linha oferece as ações de editar e excluir, além do botão de novo exercício.

Tela de cadastro

O mesmo formulário serve para cadastrar e editar (a distinção é feita pela presença do id). Os campos são:

Cadastrar exercícios

Campo Tipo Observação
Nome Texto Obrigatório e único
Grupo muscular Seleção (enum) Obrigatório
Equipamento Seleção (enum) Opcional
Dificuldade Seleção (enum) Opcional
Descrição Texto Opcional (até 500 caracteres)
Vídeo / Imagem (URL) Texto Opcional

Regras de negócio e validações:

  • Validação de backend com Bean Validation: o nome usa @NotBlank e é verificado com @Valid + BindingResult no controller — se houver erro, o formulário é reexibido;
  • Nome único: o ExercicioService.cadastrar verifica se já existe um exercício com o mesmo nome (existsByNome) e, em caso de duplicata, lança uma RuntimeException com mensagem amigável, tratada no controller;
  • Enums com @Enumerated(EnumType.STRING): grupo muscular, equipamento e dificuldade são salvos como texto no banco, restringindo os valores possíveis e evitando inconsistências;
  • Exclusão segura: ao excluir um exercício em uso por alguma ficha, o sistema captura o erro e exibe uma mensagem orientando o usuário, em vez de quebrar.

A organização visual segue o template base (layout + fragments), com o menu de navegação destacando a seção ativa, mensagens de sucesso/erro no topo e formulários com validação visual via Bootstrap (needs-validation).

  1. Criar uma Ficha de Treino para o cliente (desativa a anterior automaticamente)

A ficha de treino é o plano de um cliente. No cadastro, informa-se o nome, o objetivo, o cliente e o profissional responsável (selecionados por dropdown).

Cadastrar Ficha de treino

Regra de negócio principal — ficha ativa única: ao cadastrar uma nova ficha, o FichaTreinoService.cadastrar desativa automaticamente a ficha anterior do mesmo cliente (findByClienteAndAtivoTruesetAtivo(false)), marca a nova como ativa e registra a data de início. Isso garante que cada cliente tenha apenas uma ficha ativa por vez, sem o profissional precisar desativar a antiga na mão.

A validação usa @Valid + BindingResult; em caso de erro, o formulário é reexibido preservando os dados digitados.

  1. Adicionar Dias de Treino (A, B, C...) com exercícios, séries, repetições e carga sugerida

Dentro da ficha, organiza-se o treino por dias (Treino A, B, C...), cada um ligado a um dia da semana. Para cada dia, há duas formas de montar:

  • Manual: adicionar exercício por exercício, definindo séries, repetições, carga sugerida e ordem (ExercicioFicha);
  • Automática ⭐ (funcionalidade extra): selecionar os grupos musculares e clicar em "Gerar Treino Sugerido" — o sistema sorteia exercícios de cada grupo (Collections.shuffle) e monta o dia com volume padrão de 3×12.

Adiconar dias de treino ou gerar treino

Esta é a tela onde vive a funcionalidade extra. O detalhamento da geração automática e da progressão de carga está na seção Funcionalidade Extra.

  1. Registrar o Treino do Dia — o sistema detecta o dia da semana e pré-preenche os valores da ficha

Ao registrar, o sistema detecta o dia da semana atual, localiza o treino correspondente na ficha ativa do cliente e pré-preenche a tela com as séries, repetições e cargas prescritas (prepararRegistro). O cliente então ajusta os valores para o que realmente executou e salva.

Registrar treino

Regras de negócio:

  • Treino único por dia: o jaTreinouHoje impede registrar dois treinos no mesmo dia para o mesmo cliente;
  • Validação de consistência: o validarDadosRegistro verifica se cargas, séries e repetições foram enviadas e têm tamanhos compatíveis, lançando RuntimeException em caso de dados inconsistentes;
  • Progressão de carga: se os valores superam o prescrito, o sistema oferece atualizar a ficha (detalhado na seção da funcionalidade extra).

Registrar treino

  1. Acompanhar evolução no Histórico com estatísticas de aderência

O histórico do cliente reúne todos os treinos realizados e exibe estatísticas: total de treinos e percentual de aderência, calculado por volume (séries × repetições realizadas ÷ prescrito, limitado a 100%). Cada registro mostra um selo indicando se o cliente "Seguiu a ficha" ou fez "Ajustes", permitindo acompanhar a constância ao longo do tempo.

Histórico treino

Decisões técnicas do módulo

Decisão Justificativa
Geração automática com sorteio (shuffle) Varia os exercícios a cada geração, diversificando os estímulos do treino
Séries/repetições fixas em 3×12 A progressão acontece pela carga
Carga fora do cálculo de aderência Carga diferente é progressão, não desvio — a métrica não pode punir a evolução
Aderência por volume (séries × reps) Mede constância e esforço de forma proporcional
seguiuFicha em RegistroTreino e RegistroExercicio Rastreia a aderência tanto no nível do treino quanto de cada exercício
CSS e mensagens gerados no service Nenhuma lógica condicional de apresentação fica no template
cascade = CascadeType.ALL nas listas Garante remoção em cascata ao deletar uma ficha
Desativação automática da ficha anterior Ao criar uma nova ficha, a anterior é desativada pelo service, garantindo uma só ficha ativa por cliente

📅 Módulo de Agenda — Detalhes

Visão Geral

Gerencia consultas e atendimentos entre profissionais e clientes, com controle de status e visões por dia e semana.

Fluxo de uso

  1. Criar um Agendamento informando cliente, profissional, data/hora, tipo e local
  2. Acompanhar a Agenda do Dia com cards e botões de ação (confirmar, realizar, cancelar)
  3. Visualizar a Agenda da Semana com todos os agendamentos dos próximos 7 dias

Status disponíveis

AGENDADOCONFIRMADOREALIZADO / CANCELADO

Tipos de consulta

CONSULTA_NUTRICIONAL · AVALIACAO_FISICA · TREINO · RETORNO · OUTRO

Controle de acesso

  • ADMIN: visualiza agendamentos de todos os profissionais
  • PERSONAL / NUTRICIONISTA: visualiza apenas seus próprios agendamentos

Projeto desenvolvido como material de aula, com objetivo de demonstrar a estrutura de uma aplicação web completa com persistência de dados, autenticação, controle de acesso por perfil e suporte a múltiplos ambientes.

About

Sistema web completo em Java com arquitetura MVC. Gerencia acompanhamento nutricional e treinos: cadastro de clientes, fichas de treino, planos alimentares e agenda de consultas. Spring Boot · Spring Security · Thymeleaf · JPA/Hibernate · MySQL · MVC

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors