Projeto acadêmico — Disciplina de Programação Orientada a Objetos (POOA)
Faculdade Vianna Júnior · Spring Boot + Thymeleaf + Spring Data JPA
| Á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% |
- 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
- 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
| 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 |
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
- Java 25+
- Maven
- MySQL (apenas para perfil de produção)
./mvnw spring-boot:runAcesse: http://localhost:9000
Console H2: http://localhost:9000/h2-console
$env:PROFILE="prod"; .\mvnw spring-boot:runO 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.
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.sqlpor padrão, evitando inserções duplicadas.
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:
- O Hibernate cria as tabelas a partir das entidades;
- O
data.sqlinsere os dados de exemplo.
| Login | Perfil | Senha |
|---|---|---|
admin |
ADMIN | 123456 |
personal |
PERSONAL | 123456 |
nutri |
NUTRICIONISTA | 123456 |
- Banco H2 em memória — não requer instalação
- Tabelas recriadas a cada inicialização (
ddl-auto=create)
- Banco MySQL em
localhost:3306, banconutrifit - Usuário/Senha: configurados no
application-prod.properties
| 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
| Método | Rota | Descrição |
|---|---|---|
| GET | /login |
Tela de login |
| POST | /login |
Processa autenticação |
| GET | /logout |
Encerra sessão |
| Método | Rota | Descrição |
|---|---|---|
| GET | / |
Dashboard com indicadores e agenda do dia |
| 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) |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| Método | Rota | Descrição |
|---|---|---|
| GET | /nutricao/refeicoes/calorias-do-dia |
Resumo de macros do dia por cliente |
| 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 |
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
O sistema utiliza duas camadas complementares de validação:
- Anotações Bean Validation:
@NotBlank,@Email,@Size,@Valid BindingResultnos controllers para capturar erros de bindingRuntimeExceptionnos services para regras de negócio (ex: nome duplicado, CPF já cadastrado, senha incorreta)- Padrão
try/catchno controller commodel.addAttribute("erro")+return "form"para preservar os dados digitados
- Atributos HTML5:
required,minlength,maxlength,min,max,step,type="email",type="date",th:maxpara datas futuras - Bootstrap
needs-validation+was-validatedpara estilização dos campos invalid-feedbackcom 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
- Alterar Senha: compara nova senha e confirmação em tempo real com
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.
- Cadastrar alimentos no Banco de Alimentos com valores por porção (kcal, proteínas, carboidratos, gorduras)
- Criar um Plano Alimentar vinculado ao cliente e ao nutricionista responsável
- Dentro do plano, adicionar Refeições com horário sugerido
- Dentro de cada refeição, adicionar Alimentos com a quantidade em gramas — o sistema calcula automaticamente os macros proporcionais
- Acompanhar o total de calorias e macros do dia na tela Calorias do Dia
caloriasCalculadas = (alimento.calorias / alimento.porcao) * quantidadeInformada
O mesmo cálculo se aplica a proteínas, carboidratos e gorduras.
PROTEINA · CARBOIDRATO · GORDURA · FRUTA · VEGETAL · LATICINIOS · LEGUMINOSA · CEREAL · BEBIDA · OUTRO
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.
- 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.
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.
O mesmo formulário serve para cadastrar e editar (a distinção é feita pela presença do id). Os campos são:
| 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
@NotBlanke é verificado com@Valid+BindingResultno controller — se houver erro, o formulário é reexibido; - Nome único: o
ExercicioService.cadastrarverifica se já existe um exercício com o mesmo nome (existsByNome) e, em caso de duplicata, lança umaRuntimeExceptioncom 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).
- 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).
Regra de negócio principal — ficha ativa única: ao cadastrar uma nova ficha, o FichaTreinoService.cadastrar desativa automaticamente a ficha anterior do mesmo cliente (findByClienteAndAtivoTrue → setAtivo(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.
- 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.
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.
- 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.
Regras de negócio:
- Treino único por dia: o
jaTreinouHojeimpede registrar dois treinos no mesmo dia para o mesmo cliente; - Validação de consistência: o
validarDadosRegistroverifica se cargas, séries e repetições foram enviadas e têm tamanhos compatíveis, lançandoRuntimeExceptionem 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).
- 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.
| 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 |
Gerencia consultas e atendimentos entre profissionais e clientes, com controle de status e visões por dia e semana.
- Criar um Agendamento informando cliente, profissional, data/hora, tipo e local
- Acompanhar a Agenda do Dia com cards e botões de ação (confirmar, realizar, cancelar)
- Visualizar a Agenda da Semana com todos os agendamentos dos próximos 7 dias
AGENDADO → CONFIRMADO → REALIZADO / CANCELADO
CONSULTA_NUTRICIONAL · AVALIACAO_FISICA · TREINO · RETORNO · OUTRO
- 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.






